From c869436534e963d4e053ebd5414bf785a34858cf Mon Sep 17 00:00:00 2001
From: Philippe Suter <philippe.suter@gmail.com>
Date: Mon, 24 May 2010 20:14:17 +0000
Subject: [PATCH] switching to SSH because scalac is too slow on this machine

---
 ParseMe.scala                     |  1 -
 src/funcheck/CodeExtraction.scala | 20 +++++++++++---------
 src/funcheck/Extractors.scala     |  5 ++++-
 src/purescala/Definitions.scala   | 10 +++++++---
 src/purescala/PrettyPrinter.scala | 23 +++++++++++++++++++++++
 5 files changed, 45 insertions(+), 14 deletions(-)

diff --git a/ParseMe.scala b/ParseMe.scala
index 62be61d75..06e6c03b2 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 b9877ef63..c9d257546 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 b0e1c8d08..72c4d6f78 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 13792638d..48d22082e 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 597d11232..3d302749d 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
 
-- 
GitLab