From 54bc9b3aa7b734ee4f689a8e4667c51ae0ff566f Mon Sep 17 00:00:00 2001 From: Manos Koukoutos <emmanouil.koukoutos@epfl.ch> Date: Wed, 26 Aug 2015 14:31:04 +0200 Subject: [PATCH] Correctly parse abstract val's --- .../leon/frontends/scalac/ASTExtractors.scala | 8 +++++++- .../leon/frontends/scalac/CodeExtraction.scala | 18 +++++++++++------- 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/src/main/scala/leon/frontends/scalac/ASTExtractors.scala b/src/main/scala/leon/frontends/scalac/ASTExtractors.scala index 3c4818737..bfc097c37 100644 --- a/src/main/scala/leon/frontends/scalac/ASTExtractors.scala +++ b/src/main/scala/leon/frontends/scalac/ASTExtractors.scala @@ -438,15 +438,21 @@ trait ASTExtractors { object ExFieldDef { /** Matches a definition of a strict field inside a class constructor */ - def unapply(vd : ValDef) : Option[(Symbol, Type, Tree)] = { + def unapply(vd: SymTree) : Option[(Symbol, Type, Tree)] = { val sym = vd.symbol vd match { + // Implemented fields case ValDef(mods, name, tpt, rhs) if ( !sym.isCaseAccessor && !sym.isParamAccessor && !sym.isLazy && !sym.isSynthetic && !sym.isAccessor ) => // Since scalac uses the accessor symbol all over the place, we pass that instead: Some( (sym.getterIn(sym.owner),tpt.tpe,rhs) ) + // Unimplemented fields + case DefDef(_, name, _, _, tpt, _) if ( + sym.isStable && sym.isAccessor && sym.name != nme.CONSTRUCTOR + ) => + Some( (sym, tpt.tpe, EmptyTree)) case _ => None } } diff --git a/src/main/scala/leon/frontends/scalac/CodeExtraction.scala b/src/main/scala/leon/frontends/scalac/CodeExtraction.scala index 4fbecc9cd..87418d2dd 100644 --- a/src/main/scala/leon/frontends/scalac/CodeExtraction.scala +++ b/src/main/scala/leon/frontends/scalac/CodeExtraction.scala @@ -450,10 +450,10 @@ trait CodeExtraction extends ASTExtractors { * and registers $fd as the default value function for this parameter. */ private def registerDefaultMethod( - defs : List[Tree], - matcher : PartialFunction[Tree,Symbol], - index : Int, - fd : FunDef + defs : List[Tree], + matcher : PartialFunction[Tree,Symbol], + index : Int, + fd : FunDef ) { // Search tmpl to find the function that includes this parameter val paramOwner = defs.collectFirst(matcher).get @@ -467,6 +467,9 @@ trait CodeExtraction extends ASTExtractors { } def extractClassDef(sym: Symbol, args: Seq[(Symbol, ValDef)], tmpl: Template): LeonClassDef = { + + //println(s"Extracting $sym") + val id = FreshIdentifier(sym.name.toString).setPos(sym.pos) val tparamsMap = sym.tpe match { @@ -536,7 +539,7 @@ trait CodeExtraction extends ASTExtractors { ccd } - + //println(s"Body of $sym") // We collect the methods and fields for (d <- tmpl.body) d match { @@ -580,6 +583,7 @@ trait CodeExtraction extends ASTExtractors { // normal fields case t @ ExFieldDef(fsym, _, _) => + //println(fsym + "matched as ExFieldDef") // we will be using the accessor method of this field everywhere val fsymAsMethod = fsym val fd = defineFieldFunDef(fsymAsMethod, false, Some(cd))(defCtx) @@ -589,7 +593,8 @@ trait CodeExtraction extends ASTExtractors { cd.registerMethod(fd) - case _ => + case other => + } cd @@ -1483,7 +1488,6 @@ trait CodeExtraction extends ASTExtractors { //println(s"symbol $sym with id ${sym.id}") //println(s"isMethod($sym) == ${isMethod(sym)}") - (rrec, sym.name.decoded, rargs) match { case (null, _, args) => val fd = getFunDef(sym, c.pos) -- GitLab