diff --git a/ParseMe.scala b/ParseMe.scala index 62be61d7543aabe1e040e708dda1bf12b88c4e34..06e6c03b278f693138a65439011ed44d3720c705 100644 --- a/ParseMe.scala +++ b/ParseMe.scala @@ -1,7 +1,6 @@ import scala.collection.immutable.Set object ParseMe { - sealed abstract class Tree case class Node(left: Tree, value: Int, right: Tree) extends Tree case class Leaf() extends Tree diff --git a/src/funcheck/CodeExtraction.scala b/src/funcheck/CodeExtraction.scala index b9877ef63547d7920ccf2d94c276d0f80bde54e5..c9d257546d391a892612b7916dbb7e42891b563f 100644 --- a/src/funcheck/CodeExtraction.scala +++ b/src/funcheck/CodeExtraction.scala @@ -79,16 +79,18 @@ trait CodeExtraction extends Extractors { case ExAbstractClass(o2, sym) => { if(scalaClassNames.contains(o2)) { unit.error(t.pos, "A class with the same name already exists.") + } else { + scalaClassSyms += (sym -> o2) + scalaClassNames += o2 } - scalaClassSyms += (sym -> o2) - scalaClassNames += o2 } case ExCaseClass(o2, sym, tpl) => { if(scalaClassNames.contains(o2)) { unit.error(t.pos, "A class with the same name already exists.") + } else { + scalaClassSyms += (sym -> o2) + scalaClassNames += o2 } - scalaClassSyms += (sym -> o2) - scalaClassNames += o2 // println("***") // println(tpl) // println("***") @@ -133,17 +135,17 @@ trait CodeExtraction extends Extractors { }) // TODO - // resolve all inheritance links (look at // add all fields to case classes - println(classesToClasses) + // println(classesToClasses) + classDefs = classesToClasses.valuesIterator.toList tmpl.body.foreach( _ match { case ExCaseClassSyntheticJunk() => ; - case ExObjectDef(o2, t2) => { objectDefs = extractObjectDef(o2, t2) :: objectDefs } - case ExAbstractClass(o2,sym) => ; //println("That seems to be an abstract class: [[" + o2 + "]]") - case ExCaseClass(_,_,_) => ; //println(o2) + // case ExObjectDef(o2, t2) => { objectDefs = extractObjectDef(o2, t2) :: objectDefs } + case ExAbstractClass(o2,sym) => ; + case ExCaseClass(_,_,_) => ; case ExConstructorDef() => ; case ExMainFunctionDef() => ; case ExFunctionDef(n,p,t,b) => { funDefs = extractFunDef(n,p,t,b) :: funDefs } diff --git a/src/funcheck/Extractors.scala b/src/funcheck/Extractors.scala index b0e1c8d080470a0f4113a80c8e02d05398489a19..72c4d6f785b4a59f108d580e6221f96e6ee331d5 100644 --- a/src/funcheck/Extractors.scala +++ b/src/funcheck/Extractors.scala @@ -76,7 +76,10 @@ trait Extractors { object ExCaseClass { def unapply(cd: ClassDef): Option[(String,Symbol,Tree)] = cd match { case ClassDef(_, name, tparams, impl) if (cd.symbol.isCase && !cd.symbol.isAbstractClass && tparams.isEmpty && impl.body.size >= 8) => { - + impl.children.filter(child => child match { + case DefDef(_, nn, _, _, _, _) => true + case _ => false + }).foreach(child => println(child)) Some((name.toString, cd.symbol, impl)) } case _ => None diff --git a/src/purescala/Definitions.scala b/src/purescala/Definitions.scala index 13792638d00aad627d2c585adeb6a552cc2308ce..48d22082e095bb99703b469d5419f5165b592224 100644 --- a/src/purescala/Definitions.scala +++ b/src/purescala/Definitions.scala @@ -86,19 +86,23 @@ object Definitions { * implicitely define extractors) and explicitely defined unapply methods. */ sealed trait ExtractorTypeDef + /** Abstract classes. */ object AbstractClassDef { def unapply(acd: AbstractClassDef): Option[(Identifier,Option[AbstractClassDef])] = { - Some((acd.id, acd.parent)) + if(acd == null) None else Some((acd.id, acd.parent)) } } - - /** Abstract classes. */ class AbstractClassDef(val id: Identifier, var parent: Option[AbstractClassDef]) extends ClassTypeDef { var fields: VarDecls = Nil val isAbstract = true } /** Case classes. */ + object CaseClassDef { + def unapply(ccd: CaseClassDef): Option[(Identifier,Option[AbstractClassDef],VarDecls)] = { + if(ccd == null) None else Some((ccd.id, ccd.parent, ccd.fields)) + } + } class CaseClassDef(val id: Identifier, var parent: Option[AbstractClassDef]) extends ClassTypeDef with ExtractorTypeDef { var fields: VarDecls = Nil val isAbstract = false diff --git a/src/purescala/PrettyPrinter.scala b/src/purescala/PrettyPrinter.scala index 597d11232696ac31e5d3109d0683ff925e33bcd7..3d302749deabcfc89866ee948e9287e1ae62f990 100644 --- a/src/purescala/PrettyPrinter.scala +++ b/src/purescala/PrettyPrinter.scala @@ -152,6 +152,29 @@ object PrettyPrinter { nsb } + case CaseClassDef(id, parent, varDecls) => { + var nsb = sb + ind(nsb) + nsb.append("case class ") + nsb.append(id) + nsb.append("(") + var c = 0 + val sz = varDecls.size + + varDecls.foreach(vd => { + nsb = pp(vd.tpe, nsb) + nsb.append(" ") + nsb.append(vd.id.toString) + if(c < sz - 1) { + nsb.append(", ") + } + c = c + 1 + }) + nsb.append(")") + parent.foreach(p => nsb.append(" extends " + p.id)) + nsb + } + case FunDef(id, rt, args, body, pre, post) => { var nsb = sb