From e87bc60e8b9d46c01b9a53bcd901d4cdc3f7b9c5 Mon Sep 17 00:00:00 2001
From: Philippe Suter <philippe.suter@gmail.com>
Date: Thu, 4 Jun 2009 21:18:56 +0000
Subject: [PATCH]

---
 src/funcheck/AnalysisComponent.scala | 23 ++++++++++++++---------
 src/funcheck/purescala/Trees.scala   |  1 +
 2 files changed, 15 insertions(+), 9 deletions(-)

diff --git a/src/funcheck/AnalysisComponent.scala b/src/funcheck/AnalysisComponent.scala
index 2a590e665..153074024 100644
--- a/src/funcheck/AnalysisComponent.scala
+++ b/src/funcheck/AnalysisComponent.scala
@@ -64,18 +64,23 @@ class AnalysisComponent(val global: Global, val pluginInstance: FunCheckPlugin)
       def unsup(s: String): String = "FunCheck: Unsupported construct: " + s
 
       tree match {
-        case ClassDef(mods, name, tparams, impl) => {
-          if(mods.isTrait) unit.error(tree.pos, unsup("trait."))
-        }
+        case c @ ClassDef(mods, name, tparams, impl) => {
+          val s = c.symbol
+          println(s)
+
+          if(s.isTrait)
+            unit.error(tree.pos, unsup("trait."))
+
+          else if(s.isModule) 
+            println("Seems like " + name + " is an object.")
 
+          else if(s.isClass && !(mods.isCase || mods.isAbstract)) 
+            unit.error(tree.pos, unsup("non-abstract, non-case class."))
+          
+        }
         case ValDef(mods, name, tpt, rhs) if mods.isVariable =>
           unit.error(tree.pos, unsup("mutable variable/field."))
-
-        case LabelDef(name, params, rhs) => ;
-           // used for tailcalls and like
-           // while/do are desugared to label defs as follows:
-           // while (cond) body ==> LabelDef($L, List(), if (cond) { body; L$() } else ())
-           // do body while (cond) ==> LabelDef($L, List(), body; if (cond) L$() else ())
+        case LabelDef(name, params, rhs) => unit.error(tree.pos, unsup("loop."))
         case Assign(lhs, rhs) => unit.error(tree.pos, unsup("assignment to mutable variable/field."))
         case Return(expr) => unit.error(tree.pos, unsup("return statement."))
         case Try(block, catches, finalizer) => unit.error(tree.pos, unsup("try block."))
diff --git a/src/funcheck/purescala/Trees.scala b/src/funcheck/purescala/Trees.scala
index df50d07fa..6980ba787 100644
--- a/src/funcheck/purescala/Trees.scala
+++ b/src/funcheck/purescala/Trees.scala
@@ -67,6 +67,7 @@ see examples in:
   case class MapType(from: TypeTree, to: TypeTree) extends TypeTree
   case class ClassType(id: Identifier) extends TypeTree
   case class CaseClassType(id: Identifier) extends TypeTree
+  case class OptionType(base: TypeTree) extends TypeTree
 
   // Definitions
 
-- 
GitLab