From b3d58c37f6c6f4cfffb41ef625ae36108635173f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Ali=20Sinan=20K=C3=B6ksal?= <alisinan@gmail.com>
Date: Mon, 28 Mar 2011 14:41:02 +0000
Subject: [PATCH] Move cp files into their own package

---
 project/build/funcheck.scala          | 62 ++++++++++++++++++++++++++-
 src/funcheck/CP.scala                 |  2 +-
 src/funcheck/CPComponent.scala        |  4 +-
 src/funcheck/CPPlugin.scala           |  3 +-
 src/funcheck/CallTransformation.scala |  6 +--
 src/funcheck/CodeGeneration.scala     | 10 ++---
 src/funcheck/Serialization.scala      |  2 +-
 7 files changed, 75 insertions(+), 14 deletions(-)

diff --git a/project/build/funcheck.scala b/project/build/funcheck.scala
index 705da8b7e..99836681a 100644
--- a/project/build/funcheck.scala
+++ b/project/build/funcheck.scala
@@ -9,7 +9,7 @@ class FunCheckProject(info: ProjectInfo) extends DefaultProject(info) with FileT
 
   lazy val purescala      = project(".", "PureScala Definitions", new PureScalaProject(_))
   lazy val plugin         = project(".", "FunCheck Plugin", new PluginProject(_), purescala, multisetsLib)
-  // lazy val cp             = project(".", "Constraint programming plugin", new CPProject(_), purescala, multisetsLib, plugin)
+  lazy val cpPlugin       = project(".", "Constraint programming plugin", new CPPluginProject(_), purescala, multisetsLib, plugin)
   lazy val multisetsLib   = project(".", "Multiset Placeholder Library", new MultisetsLibProject(_))
   lazy val multisets      = project(".", "Multiset Solver", new MultisetsProject(_), plugin, purescala, multisetsLib)
   lazy val orderedsets    = project(".", "Ordered Sets Solver", new OrderedSetsProject(_), plugin, purescala)
@@ -18,7 +18,7 @@ class FunCheckProject(info: ProjectInfo) extends DefaultProject(info) with FileT
   lazy val extensionJars : List[Path] = multisetsLib.jarPath :: multisets.jarPath :: orderedsets.jarPath :: setconstraints.jarPath :: Nil
 
   val scriptPath: Path = "." / "funcheck"
-  val cpScriptPath: Path = "." / "scalac-cp"
+  val cpScriptPath: Path = "." / "cp"
 
   lazy val all = task { None } dependsOn(generateScript) describedAs("Compile everything and produce a script file.")
 
@@ -68,6 +68,51 @@ class FunCheckProject(info: ProjectInfo) extends DefaultProject(info) with FileT
     }
   }) dependsOn(plugin.`package`) describedAs("Produce the runner script.")
 
+  lazy val generateCpScript = genCPScript
+  def genCPScript = fileTask(cpScriptPath ::Nil)({
+    log.info("Generating runner script")
+    try {
+      val nl = System.getProperty("line.separator")
+      val f = cpScriptPath.asFile
+      val fw = new java.io.FileWriter(f)
+      fw.write("#!/bin/bash" + nl)
+      fw.write("FUNCHECKCLASSPATH=\"")
+      fw.write(buildLibraryJar.absolutePath + ":")
+      fw.write(buildCompilerJar.absolutePath + ":")
+      fw.write(purescala.jarPath.absolutePath + ":")
+      fw.write(plugin.jarPath.absolutePath + ":")
+      fw.write(("lib" / "z3.jar").absolutePath)
+      fw.write("\"" + nl + nl)
+      fw.write("for f in " + extensionJars.map(_.absolutePath).map(n => "\"" + n + "\"").mkString(" ") + "; do" + nl)
+      fw.write("  if [ -e ${f} ]" + nl)
+      fw.write("  then" + nl)
+      fw.write("    FUNCHECKCLASSPATH=${FUNCHECKCLASSPATH}:${f}" + nl)
+      fw.write("  fi" + nl)
+      fw.write("done" + nl + nl)
+      fw.write("SCALACCLASSPATH=\"")
+      fw.write(multisetsLib.jarPath.absolutePath + ":")
+      fw.write(plugin.jarPath.absolutePath + ":")
+      fw.write(purescala.jarPath.absolutePath + ":")
+      fw.write(cpPlugin.jarPath.absolutePath)
+      fw.write("\"" + nl + nl)
+      fw.write("LD_LIBRARY_PATH=" + ("." / "lib-bin").absolutePath + " \\" + nl)
+      // fw.write("scala -classpath ${FUNCHECKCLASSPATH}:${SCALACCLASSPATH}" + " \\" + nl)
+      // fw.write("funcheck.Main -cp " + plugin.jarPath.absolutePath + " $@" + nl)
+      fw.write("java -Xmx1024M \\" + nl)
+      // This is a hack :(
+      val libStr = (buildLibraryJar.absolutePath).toString
+      fw.write("    -Dscala.home=" + libStr.substring(0, libStr.length-21) + " \\" + nl)
+
+      fw.write("    -classpath ${FUNCHECKCLASSPATH} \\" + nl)
+      fw.write("  scala.tools.nsc.Main -Xplugin:" + cpPlugin.jarPath.absolutePath + " -classpath ${SCALACCLASSPATH} $@" + nl)
+      fw.close
+      f.setExecutable(true)
+      None
+    } catch {
+      case e => Some("There was an error while generating the CP script file: " + e.getLocalizedMessage)
+    }
+  }) dependsOn(cpPlugin.`package`) describedAs("Produce the CP runner script.")
+
   lazy val cleanScript = clnScript
   def clnScript = task {
     log.info("Deleting runner script")
@@ -75,6 +120,13 @@ class FunCheckProject(info: ProjectInfo) extends DefaultProject(info) with FileT
     None
   }
 
+  lazy val cleanCpScript = clnCPScript
+  def clnCPScript = task {
+    log.info("Deleting CP runner script")
+    cpScriptPath.asFile.delete
+    None
+  }
+
   sealed abstract class PersonalizedProject(info: ProjectInfo) extends DefaultProject(info) {
     override def dependencyPath = "lib"
     override def outputDirectoryName = "bin" 
@@ -91,6 +143,12 @@ class FunCheckProject(info: ProjectInfo) extends DefaultProject(info) with FileT
     override def unmanagedClasspath = super.unmanagedClasspath +++ purescala.jarPath +++ multisetsLib.jarPath
     override def mainResourcesPath   = "resources" / "funcheck"
   }
+  class CPPluginProject(info: ProjectInfo) extends PersonalizedProject(info) {
+    override def outputPath = "bin" / "cp"
+    override def mainScalaSourcePath = "src" / "cp"
+    override def unmanagedClasspath = super.unmanagedClasspath +++ purescala.jarPath +++ multisetsLib.jarPath +++ plugin.jarPath
+    override def mainResourcesPath   = "resources" / "cp"
+  }
   class MultisetsLibProject(info: ProjectInfo) extends PersonalizedProject(info) {
     override def outputPath = "bin" / "multisets-lib"
     override def mainScalaSourcePath = "src" / "multisets-lib"
diff --git a/src/funcheck/CP.scala b/src/funcheck/CP.scala
index 7d217e843..8b7d0ec1f 100644
--- a/src/funcheck/CP.scala
+++ b/src/funcheck/CP.scala
@@ -1,4 +1,4 @@
-package funcheck
+package cp
 
 object CP {
   final class NotImplementedException extends Exception
diff --git a/src/funcheck/CPComponent.scala b/src/funcheck/CPComponent.scala
index c7e016be8..00eee9725 100644
--- a/src/funcheck/CPComponent.scala
+++ b/src/funcheck/CPComponent.scala
@@ -1,7 +1,8 @@
-package funcheck
+package cp
 
 import scala.tools.nsc._
 import scala.tools.nsc.plugins._
+import funcheck.CodeExtraction
 
 class CPComponent(val global: Global, val pluginInstance: CPPlugin)
   extends PluginComponent
@@ -27,6 +28,7 @@ class CPComponent(val global: Global, val pluginInstance: CPPlugin)
       //global ref to freshName creator
       fresh = unit.fresh
 
+      println("Starting CP phase")
       val prog: purescala.Definitions.Program = extractCode(unit)
       val filename = writeProgram(prog)
       println("Program extracted and written into: " + filename)
diff --git a/src/funcheck/CPPlugin.scala b/src/funcheck/CPPlugin.scala
index 386b5083c..1ec9b6a28 100644
--- a/src/funcheck/CPPlugin.scala
+++ b/src/funcheck/CPPlugin.scala
@@ -1,8 +1,9 @@
-package funcheck
+package cp
 
 import scala.tools.nsc
 import scala.tools.nsc.{Global,Phase}
 import scala.tools.nsc.plugins.{Plugin,PluginComponent}
+import funcheck.PluginBase
 
 /** This class is the entry point for the plugin. */
 class CPPlugin(val global: Global) extends PluginBase {
diff --git a/src/funcheck/CallTransformation.scala b/src/funcheck/CallTransformation.scala
index 160120d72..5f93a11e4 100644
--- a/src/funcheck/CallTransformation.scala
+++ b/src/funcheck/CallTransformation.scala
@@ -1,4 +1,4 @@
-package funcheck
+package cp
 
 import scala.tools.nsc.transform.TypingTransformers
 import purescala.FairZ3Solver
@@ -13,8 +13,8 @@ trait CallTransformation
   self: CPComponent =>
   import global._
 
-  private lazy val funcheckPackage = definitions.getModule("funcheck")
-  private lazy val cpDefinitionsModule = definitions.getModule("funcheck.CP")
+  private lazy val cpPackage = definitions.getModule("cp")
+  private lazy val cpDefinitionsModule = definitions.getModule("cp.CP")
 
 
   def transformCalls(unit: CompilationUnit, prog: Program, programFilename: String) : Unit =
diff --git a/src/funcheck/CodeGeneration.scala b/src/funcheck/CodeGeneration.scala
index addd2cefe..62b66a688 100644
--- a/src/funcheck/CodeGeneration.scala
+++ b/src/funcheck/CodeGeneration.scala
@@ -1,4 +1,4 @@
-package funcheck
+package cp
 
 import purescala.Trees._
 
@@ -6,9 +6,9 @@ trait CodeGeneration {
   self: CallTransformation =>
   import global._
 
-  private lazy val funcheckPackage = definitions.getModule("funcheck")
+  private lazy val cpPackage = definitions.getModule("cp")
 
-  private lazy val serializationModule = definitions.getModule("funcheck.Serialization")
+  private lazy val serializationModule = definitions.getModule("cp.Serialization")
   private lazy val getProgramFunction = definitions.getMember(serializationModule, "getProgram")
   private lazy val getExprFunction = definitions.getMember(serializationModule, "getExpr")
 
@@ -36,7 +36,7 @@ trait CodeGeneration {
           Apply(
             Select(
               Select(
-                Ident(funcheckPackage),
+                Ident(cpPackage),
                 serializationModule
               ) ,
               getProgramFunction
@@ -55,7 +55,7 @@ trait CodeGeneration {
           Apply(
             Select(
               Select(
-                Ident(funcheckPackage),
+                Ident(cpPackage),
                 serializationModule
               ),
               getExprFunction
diff --git a/src/funcheck/Serialization.scala b/src/funcheck/Serialization.scala
index e10581c00..12b43e341 100644
--- a/src/funcheck/Serialization.scala
+++ b/src/funcheck/Serialization.scala
@@ -1,4 +1,4 @@
-package funcheck
+package cp
 
 trait Serialization {
   import java.io.{FileInputStream,FileOutputStream,ObjectInputStream,ObjectOutputStream,File}
-- 
GitLab