diff --git a/ParseMe.scala b/ParseMe.scala index ae05f6291bced543d099d314333a4bbb465a8bba..8e737aeb7b35c1bbbd95cdae1793fbcf494d5f48 100644 --- a/ParseMe.scala +++ b/ParseMe.scala @@ -5,20 +5,17 @@ object ParseMe { case class Node(left: Tree, value: Int, right: Tree) extends Tree case class Leaf() extends Tree - def inside(n: Node): Int = getIt().value - def getIt() : Node = Node(Leaf(), 12, Leaf()) def insert(v: Int, t: Tree): Tree = t match { - case Leaf() if v == 5 => Leaf() case Leaf() => Node(Leaf(), v, Leaf()) - case Node(Leaf(), 12, Leaf()) => Leaf() - case _ => Leaf() + case Node(left, v2, right) if v2 > v => Node(insert(v, left), v2, right) + case Node(left, v2, right) if v2 < v => Node(left, v2, insert(v, right)) + case n @ Node(left, v2, right) if v2 == v => n } def emptySet() : Tree = { Leaf() } - def withIf(a: Int) : Int = { if(a < 0) -a else if(a > 0) a+1 else a-1 } ensuring (_ > 17) } diff --git a/src/funcheck/CodeExtraction.scala b/src/funcheck/CodeExtraction.scala index 31e711df0b81884013014fc2bfd141719bb20edd..7b7a536f50a0ea57eccba16f430489f0a8c3a7f4 100644 --- a/src/funcheck/CodeExtraction.scala +++ b/src/funcheck/CodeExtraction.scala @@ -273,8 +273,30 @@ trait CodeExtraction extends Extractors { * errors. */ private def scala2PureScala(unit: CompilationUnit, silent: Boolean)(tree: Tree): Expr = { def rewriteCaseDef(cd: CaseDef): MatchCase = { - def pat2pat(p: Tree): Pattern = { - WildcardPattern(None) + def pat2pat(p: Tree): Pattern = p match { + case Ident(nme.WILDCARD) => WildcardPattern(None) + case b @ Bind(name, Ident(nme.WILDCARD)) => { + val newID = FreshIdentifier(name.toString).setType(scalaType2PureScala(unit,silent)(b.symbol.tpe)) + varSubsts(b.symbol) = (() => Variable(newID)) + WildcardPattern(Some(newID)) + } + case a @ Apply(fn, args) if fn.isType && a.tpe.typeSymbol.isCase && classesToClasses.keySet.contains(a.tpe.typeSymbol) => { + val cd = classesToClasses(a.tpe.typeSymbol).asInstanceOf[CaseClassDef] + assert(args.size == cd.fields.size) + CaseClassPattern(None, cd, args.map(pat2pat(_))) + } + case b @ Bind(name, a @ Apply(fn, args)) if fn.isType && a.tpe.typeSymbol.isCase && classesToClasses.keySet.contains(a.tpe.typeSymbol) => { + val newID = FreshIdentifier(name.toString).setType(scalaType2PureScala(unit,silent)(b.symbol.tpe)) + varSubsts(b.symbol) = (() => Variable(newID)) + val cd = classesToClasses(a.tpe.typeSymbol).asInstanceOf[CaseClassDef] + assert(args.size == cd.fields.size) + CaseClassPattern(Some(newID), cd, args.map(pat2pat(_))) + } + case _ => { + if(!silent) + unit.error(p.pos, "Unsupported pattern.") + throw ImpureCodeEncounteredException(p) + } } if(cd.guard == EmptyTree) { @@ -289,7 +311,10 @@ trait CodeExtraction extends Extractors { case ExBooleanLiteral(v) => BooleanLiteral(v) case ExIdentifier(sym,tpt) => varSubsts.get(sym) match { case Some(fun) => fun() - case None => Variable(FreshIdentifier(sym.name.toString)) // TODO this is SO wrong + case None => { + unit.error(tr.pos, "Unidentified variable.") + throw ImpureCodeEncounteredException(tr) + } } case ExCaseClassConstruction(tpt, args) => { val cctype = scalaType2PureScala(unit, silent)(tpt.tpe) diff --git a/src/purescala/PrettyPrinter.scala b/src/purescala/PrettyPrinter.scala index 8f6a5b9562e6c453912f38acb51ce6080cd9baac..ccd9f6580ee0725c936a8956f1ed949ae8d8813c 100644 --- a/src/purescala/PrettyPrinter.scala +++ b/src/purescala/PrettyPrinter.scala @@ -121,8 +121,20 @@ object PrettyPrinter { def ppc(sb: StringBuffer, p: Pattern): StringBuffer = p match { //case InstanceOfPattern(None, ctd) => //case InstanceOfPattern(Some(id), ctd) => - //case CaseClassPattern(None, ccd, subps) => - //case CaseClassPattern(Some(id), ccd, subps) => + case CaseClassPattern(bndr, ccd, subps) => { + var nsb = sb + bndr.foreach(b => nsb.append(b + " @ ")) + nsb.append(ccd.id).append("(") + var c = 0 + val sz = subps.size + subps.foreach(sp => { + nsb = ppc(nsb, sp) + if(c < sz - 1) + nsb.append(", ") + c = c + 1 + }) + nsb.append(")") + } case WildcardPattern(None) => sb.append("_") case WildcardPattern(Some(id)) => sb.append(id) case _ => sb.append("Pattern?")