diff --git a/src/funcheck/CodeExtraction.scala b/src/funcheck/CodeExtraction.scala index 9dca1024a59f4d1fa26bcfadc0500e260492ab4b..3fd4b0397a4573f518e006eb7f2fb414cc9202d1 100644 --- a/src/funcheck/CodeExtraction.scala +++ b/src/funcheck/CodeExtraction.scala @@ -70,21 +70,48 @@ trait CodeExtraction extends Extractors { val scalaClassSyms: scala.collection.mutable.Map[Symbol,Identifier] = scala.collection.mutable.Map.empty[Symbol,Identifier] + val scalaClassNames: scala.collection.mutable.Set[Identifier] = + scala.collection.mutable.Set.empty[Identifier] // we need the new type definitions before we can do anything... - tmpl.body.foreach( - _ match { + tmpl.body.foreach(t => + t match { case ExAbstractClass(o2, sym) => { + if(scalaClassNames.contains(o2)) { + unit.error(t.pos, "A class with the same name already exists.") + } scalaClassSyms += (sym -> o2) + scalaClassNames += o2 } case ExCaseClass(o2, sym) => { + if(scalaClassNames.contains(o2)) { + unit.error(t.pos, "A class with the same name already exists.") + } scalaClassSyms += (sym -> o2) + scalaClassNames += o2 } case _ => ; } ) - println(scalaClassSyms) + stopIfErrors + + val classesToClasses: scala.collection.mutable.Map[Symbol,ClassTypeDef] = + scala.collection.mutable.Map.empty[Symbol,ClassTypeDef] + + scalaClassSyms.foreach(p => { + if(p._1.isAbstractClass) { + classesToClasses += (p._1 -> new AbstractClassDef(p._2, None)) + } else if(p._1.isCase) { + classesToClasses += (p._1 -> new CaseClassDef(p._2, None)) + } + }) + + // TODO + // resolve all inheritance links (look at + // add all fields to case classes + + println(classesToClasses) tmpl.body.foreach( _ match { diff --git a/src/purescala/Definitions.scala b/src/purescala/Definitions.scala index 6dd35e86297e2427daa4dd8ffccba9d316d68c3d..13792638d00aad627d2c585adeb6a552cc2308ce 100644 --- a/src/purescala/Definitions.scala +++ b/src/purescala/Definitions.scala @@ -77,7 +77,8 @@ object Definitions { * patterns (of pattern-matching, that is) */ sealed trait ClassTypeDef extends Definition { val id: Identifier - val parent: Option[AbstractClassDef] + var parent: Option[AbstractClassDef] + val isAbstract: Boolean // val fields: VarDecls } @@ -85,18 +86,29 @@ object Definitions { * implicitely define extractors) and explicitely defined unapply methods. */ sealed trait ExtractorTypeDef + object AbstractClassDef { + def unapply(acd: AbstractClassDef): Option[(Identifier,Option[AbstractClassDef])] = { + Some((acd.id, acd.parent)) + } + } + /** Abstract classes. */ - class AbstractClassDef(val id: Identifier, val parent: Option[AbstractClassDef]) extends ClassTypeDef { + class AbstractClassDef(val id: Identifier, var parent: Option[AbstractClassDef]) extends ClassTypeDef { var fields: VarDecls = Nil + val isAbstract = true } /** Case classes. */ - class CaseClassDef(val id: Identifier, val parent: Option[AbstractClassDef]) extends ClassTypeDef with ExtractorTypeDef { + class CaseClassDef(val id: Identifier, var parent: Option[AbstractClassDef]) extends ClassTypeDef with ExtractorTypeDef { var fields: VarDecls = Nil + val isAbstract = false } /** "Regular" classes */ - case class ClassDef(id: Identifier, parent: Option[AbstractClassDef], fields: VarDecls) extends ClassTypeDef + class ClassDef(val id: Identifier, var parent: Option[AbstractClassDef]) extends ClassTypeDef { + var fields: VarDecls = Nil + val isAbstract = false + } /** Values */ case class ValDef(varDecl: VarDecl, value: Expr) extends Definition { diff --git a/src/purescala/PrettyPrinter.scala b/src/purescala/PrettyPrinter.scala index 5442e0c8cc32c85d21e63227d55e69c2111943f7..a46028e521e2c86b3fc061396a10f3d98363ab01 100644 --- a/src/purescala/PrettyPrinter.scala +++ b/src/purescala/PrettyPrinter.scala @@ -143,6 +143,15 @@ object PrettyPrinter { ind(nsb); nsb.append("}\n") } + case AbstractClassDef(id, parent) => { + var nsb = sb + ind(nsb) + nsb.append("sealed abstract class ") + nsb.append(id) + parent.foreach(p => nsb.append("extends " + p.id + " ")) + nsb + } + case FunDef(id, rt, args, body, pre, post) => { var nsb = sb