From 78b370b57315976c5adf461d8fe4898d1f39abeb Mon Sep 17 00:00:00 2001
From: Philippe Suter <philippe.suter@gmail.com>
Date: Wed, 10 Jun 2009 14:41:48 +0000
Subject: [PATCH]

---
 src/funcheck/AnalysisComponent.scala      | 40 +++++++----------------
 src/funcheck/CodeExtraction.scala         | 29 +++++++++-------
 src/funcheck/{ => purescala}/Common.scala |  2 +-
 3 files changed, 30 insertions(+), 41 deletions(-)
 rename src/funcheck/{ => purescala}/Common.scala (63%)

diff --git a/src/funcheck/AnalysisComponent.scala b/src/funcheck/AnalysisComponent.scala
index 19acd5c7d..286d6f716 100644
--- a/src/funcheck/AnalysisComponent.scala
+++ b/src/funcheck/AnalysisComponent.scala
@@ -5,7 +5,6 @@ import scala.tools.nsc.plugins._
 
 class AnalysisComponent(val global: Global, val pluginInstance: FunCheckPlugin) extends PluginComponent
   with Extractors
-  // all these traits define functions applied during tree traversals
   with CodeExtraction
   with ForallInjection
 {
@@ -17,17 +16,23 @@ class AnalysisComponent(val global: Global, val pluginInstance: FunCheckPlugin)
 
   val phaseName = pluginInstance.name
 
+  private def stopIfErrors: Unit = {
+    if(reporter.hasErrors) {
+      println("There were errors.")
+      exit(0)
+    }
+  }
+
   def newPhase(prev: Phase) = new AnalysisPhase(prev)
 
   class AnalysisPhase(prev: Phase) extends StdPhase(prev) {
-    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(extractCode(unit))).traverse(unit.body)
+
+      extractCode(unit)
 
       if(pluginInstance.stopAfterAnalysis) {
         println("Analysis complete. Now terminating the compiler process.")
@@ -35,34 +40,11 @@ class AnalysisComponent(val global: Global, val pluginInstance: FunCheckPlugin)
       }
     }
 
-    private def stopIfErrors: Unit = {
-      if(reporter.hasErrors) {
-        println("There were errors.")
-        exit(0)
-      }
-    }
-
     /** Weeds out programs containing unsupported features. */
     def firstFilter(unit: CompilationUnit)(tree: Tree): Unit = {
       def unsup(s: String): String = "FunCheck: Unsupported construct: " + s
 
       tree match {
-        case c @ ClassDef(mods, name, tparams, impl) => {
-/*
-          val s = c.symbol
-          
-          println(s)
-
-          if(s.isTrait)
-            unit.error(tree.pos, unsup("trait."))
-
-          else if(s.isModule) 
-            println("Seems like " + name + " is an object.")
-
-          else if(s.isClass && !(mods.isCase || mods.isAbstract)) 
-            unit.error(tree.pos, unsup("non-abstract, non-case class."))
-  */        
-        }
         case ValDef(mods, name, tpt, rhs) if mods.isVariable =>
           unit.error(tree.pos, unsup("mutable variable/field."))
         case LabelDef(name, params, rhs) => unit.error(tree.pos, unsup("loop."))
diff --git a/src/funcheck/CodeExtraction.scala b/src/funcheck/CodeExtraction.scala
index dbe28467e..d371cae6c 100644
--- a/src/funcheck/CodeExtraction.scala
+++ b/src/funcheck/CodeExtraction.scala
@@ -2,7 +2,11 @@ package funcheck
 
 import scala.tools.nsc._
 import scala.tools.nsc.plugins._
+
+import purescala.Definitions._
 import purescala.Trees._
+import purescala.TypeTrees._
+import purescala.Common._
 
 trait CodeExtraction {
   self: AnalysisComponent =>
@@ -36,20 +40,23 @@ trait CodeExtraction {
     case _ => ;
   }
 
-  def extractCode(unit: CompilationUnit)(tree: Tree): Unit = tree match {
-    case d @ DefDef(mods, name, tparams, vparamss, tpt, body) if !d.symbol.isConstructor => {
-      println("In: " + name)
-      println(d.symbol)
-      println(d.mods)
-      
-      
-      toPureScala(unit)(body) match {
-        case Some(t) => println("  the body was extracted as: " + t)
-        case None => println("  the body could not be extracted. Is it pure Scala?")
+  def extractCode(unit: CompilationUnit): Unit = { 
+    def trav(tree: Tree): Unit = tree match {
+      case d @ DefDef(mods, name, tparams, vparamss, tpt, body) if !d.symbol.isConstructor => {
+        println("In: " + name)
+        println(d.symbol)
+        println(d.mods)
+          
+        toPureScala(unit)(body) match {
+          case Some(t) => println("  the body was extracted as: " + t)
+          case None => println("  the body could not be extracted. Is it pure Scala?")
+        }
       }
+      case _ => ;
     }
 
-    case _ => ;
+    (new ForeachTreeTraverser(trav)).traverse(unit.body)
+
   }
 
   /** An exception thrown when non-purescala compatible code is encountered. */
diff --git a/src/funcheck/Common.scala b/src/funcheck/purescala/Common.scala
similarity index 63%
rename from src/funcheck/Common.scala
rename to src/funcheck/purescala/Common.scala
index 1f124e94d..a4a8273e9 100644
--- a/src/funcheck/Common.scala
+++ b/src/funcheck/purescala/Common.scala
@@ -1,4 +1,4 @@
-package funcheck
+package funcheck.purescala
 
 object Common {
   type Identifier = String
-- 
GitLab