diff --git a/src/funcheck/AnalysisComponent.scala b/src/funcheck/AnalysisComponent.scala index 0502cf070c2dde4c0716e34815db13c37030f54f..dab29a18cda858e27c8febbb1f6340f1f2438491 100644 --- a/src/funcheck/AnalysisComponent.scala +++ b/src/funcheck/AnalysisComponent.scala @@ -3,9 +3,12 @@ package funcheck import scala.tools.nsc._ import scala.tools.nsc.plugins._ -class AnalysisComponent(val global: Global, val pluginInstance: FunCheckPlugin) extends PluginComponent with Extractors { +class AnalysisComponent(val global: Global, val pluginInstance: FunCheckPlugin) extends PluginComponent + with Extractors + // all these traits define functions applied during tree traversals + with CodeExtraction +{ import global._ - import global.definitions._ // when we use 2.8.x, swap the following two lines val runsAfter = "refchecks" @@ -19,8 +22,8 @@ class AnalysisComponent(val global: Global, val pluginInstance: FunCheckPlugin) import StructuralExtractors._ def apply(unit: CompilationUnit): Unit = { - (new ForeachTreeTraverser(firstFilter(unit))).traverse(unit.body) - stopIfErrors + // (new ForeachTreeTraverser(firstFilter(unit))).traverse(unit.body) + // stopIfErrors (new ForeachTreeTraverser(findContracts)).traverse(unit.body) stopIfErrors (new ForeachTreeTraverser(mircoTraverser(unit))).traverse(unit.body) @@ -38,31 +41,6 @@ class AnalysisComponent(val global: Global, val pluginInstance: FunCheckPlugin) } } - private def findContracts(tree: Tree): Unit = tree match { - case DefDef(/*mods*/ _, name, /*tparams*/ _, /*vparamss*/ _, /*tpt*/ _, body) => { - var realBody = body - var reqCont: Option[Tree] = None - var ensCont: Option[Function] = None - - body match { - case EnsuredExpression(body2, contract) => realBody = body2; ensCont = Some(contract) - case _ => ; - } - - realBody match { - case RequiredExpression(body3, contract) => realBody = body3; reqCont = Some(contract) - case _ => ; - } - - println("In: " + name) - println(" Requires clause: " + reqCont) - println(" Ensures clause: " + ensCont) - println(" Body: " + realBody) - } - - case _ => ; - } - def mircoTraverser(unit: CompilationUnit)(tree: Tree): Unit = { lazy val genAnnot: Symbol = definitions.getClass("funcheck.lib.Specs.generator") diff --git a/src/funcheck/CodeExtraction.scala b/src/funcheck/CodeExtraction.scala new file mode 100644 index 0000000000000000000000000000000000000000..256132b29879d2c84c8fff74e3e4e804d995bc15 --- /dev/null +++ b/src/funcheck/CodeExtraction.scala @@ -0,0 +1,38 @@ +package funcheck + +import scala.tools.nsc._ +import scala.tools.nsc.plugins._ + +trait CodeExtraction { + self: Extractors => + + val global: Global + + import global._ + import StructuralExtractors._ + + def findContracts(tree: Tree): Unit = tree match { + case DefDef(/*mods*/ _, name, /*tparams*/ _, /*vparamss*/ _, /*tpt*/ _, body) => { + var realBody = body + var reqCont: Option[Tree] = None + var ensCont: Option[Function] = None + + body match { + case EnsuredExpression(body2, contract) => realBody = body2; ensCont = Some(contract) + case _ => ; + } + + realBody match { + case RequiredExpression(body3, contract) => realBody = body3; reqCont = Some(contract) + case _ => ; + } + + println("In: " + name) + println(" Requires clause: " + reqCont) + println(" Ensures clause: " + ensCont) + println(" Body: " + realBody) + } + + case _ => ; + } +}