diff --git a/src/funcheck/AnalysisComponent.scala b/src/funcheck/AnalysisComponent.scala index 15307402474e04f42c6f2066f8f241ad07bd7cef..fbe462a710a7fc46c4b4eea0a5ce87bbcf2ea950 100644 --- a/src/funcheck/AnalysisComponent.scala +++ b/src/funcheck/AnalysisComponent.scala @@ -66,6 +66,7 @@ class AnalysisComponent(val global: Global, val pluginInstance: FunCheckPlugin) tree match { case c @ ClassDef(mods, name, tparams, impl) => { val s = c.symbol + println(s) if(s.isTrait) diff --git a/src/funcheck/purescala/Trees.scala b/src/funcheck/purescala/Trees.scala index 3b134bac09f830c51a0f6b69bf86ba021b9b25c2..4f26db4218d86ce57e3f13c3b92987170ed09fe7 100644 --- a/src/funcheck/purescala/Trees.scala +++ b/src/funcheck/purescala/Trees.scala @@ -66,15 +66,14 @@ see examples in: } case class SimpleCase(pattern: Pattern, rhs: Expr) extends MatchCase - case class GuardedCase(pattern: Pattern, guard: Expr, rhs: Expr) extends MatchCase + case class GuardedCase(pattern: Pattern, guard: Expr, rhs: Expr) extends MatchCase { + assert(guard.getType == BooleanType) + } sealed abstract class Pattern - // c: Class - case class InstanceOfPattern(binder: Option[Identifier], klass: ClassDef) extends Pattern - // c @ Constructor(...) - case class ConstructorPattern(binder: Option[Identifier]) extends Pattern - // c @ _ - case class WildcardPattern(binder: Option[Identifier]) extends Pattern + case class InstanceOfPattern(binder: Option[Identifier], classTypeDef: ClassTypeDef) extends Pattern // c: Class + case class WildcardPattern(binder: Option[Identifier]) extends Pattern // c @ _ + case class ExtractorPattern(binder: Option[Identifier], subPatterns: Seq[Pattern]) extends Pattern // c @ Extractor(...,...) // I suggest we skip Seq stars for now. /* Propositional logic */ @@ -240,8 +239,14 @@ see examples in: type VarDecls = Seq[VarDecl] sealed abstract class Definition(name : Identifier) - case class CaseClassDef(name : Identifier, fields : VarDecls) extends Definition(name) - case class ClassDef(name : Identifier, fields : VarDecls) extends Definition(name) + + /** Useful because case classes and classes are somewhat unified in some + * patterns (of pattern-matching, that is) */ + trait ClassTypeDef + + case class CaseClassDef(name : Identifier, fields : VarDecls) extends Definition(name) with ClassTypeDef + case class ClassDef(name : Identifier, fields : VarDecls) extends Definition(name) with ClassTypeDef + case class ValDef(name : Identifier, value : Expr) extends Definition(name) case class FunDef(name : Identifier, args : VarDecls, body : Expr) extends Definition(name) { lazy val argTypes : Seq[TypeTree] = args.map(_._2)