diff --git a/src/funcheck/AnalysisComponent.scala b/src/funcheck/AnalysisComponent.scala index 2a590e665436ee5a7d8144fbe9d7d91cd062776e..15307402474e04f42c6f2066f8f241ad07bd7cef 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 df50d07facb3b49231d9ee5d436f6bbbde34b492..6980ba7873810640a9ff52964e55247462c5f2a9 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