Skip to content
Snippets Groups Projects

Move away from experimental changes

Merged Rico Bergmann requested to merge experimental into develop
2 files
+ 28
15
Compare changes
  • Side-by-side
  • Inline

Files

@@ -12,15 +12,24 @@ import scala.reflect.io.{ File, Path }
import scala.tools.nsc.reporters.ConsoleReporter
import scala.tools.nsc.{ GenericRunnerSettings, Global, Settings }
import scala.util.control.Breaks._
import scala.reflect.io.Directory
/** @author Rico Bergmann
*/
class SModelFSWriter extends SModelVisitor {
class SModelFSWriter(
workingDir: File = File(Files.createTempDirectory("model").toFile),
outputDir: Directory = File("output").toDirectory,
keepClassFiles: Boolean = false) extends SModelVisitor {
// TODO enable different output dirs
// TODO enable retaining the .scala files
workingDir.jfile.mkdirs()
outputDir.jfile.mkdirs()
private val baseOutputDir: File = File(Files.createTempDirectory("model").toFile)
private var sFilesToCompile: List[File] = List.empty
println(s"... Temp dir (sources) is $baseOutputDir")
println(s"... Temp dir (sources) is $workingDir")
override def visit(sModel: SModel): Unit = {
println(s"... Wrote files (sources) $sFilesToCompile")
@@ -32,28 +41,32 @@ class SModelFSWriter extends SModelVisitor {
// TODO do we want to reuse the whole classpath? Or just the parts we _actually_ need
compilationSettings.classpath.value = adaptClassPathToOSEnv(fetchCurrentClassPath).distinct.mkString(File.pathSeparator)
println(s"Using classpath ${compilationSettings.classpath.value}")
compilationSettings.outdir.value = baseOutputDir.toAbsolute.toString
compilationSettings.outdir.value = workingDir.toAbsolute.toString
val reporter = new ConsoleReporter(compilationSettings)
val compiler = new Global(compilationSettings, reporter)
val runner = new compiler.Run
runner.compile(sFilesToCompile.map(_.toAbsolute.toString))
println("... Compilation done")
println("... Cleaning up")
sFilesToCompile.foreach {
_.delete
if (!keepClassFiles) {
println("... Cleaning up")
sFilesToCompile.foreach {
_.delete
}
} else {
println("... No clean-up requested")
}
println("... Generating JAR")
// see: https://stackoverflow.com/a/1281295/5161760
val mf = new Manifest
mf.getMainAttributes.put(Attributes.Name.MANIFEST_VERSION, "1.0")
val targetJar = new JarOutputStream(new FileOutputStream("model.jar"), mf)
var filesToAdd: List[java.io.File] = baseOutputDir.jfile.listFiles.toList
val targetJar = new JarOutputStream(new FileOutputStream(outputDir + File.separator + "model.jar"), mf)
var filesToAdd: List[java.io.File] = workingDir.jfile.listFiles.toList
while (filesToAdd.nonEmpty) {
val file = filesToAdd.head
var fname = file.getAbsolutePath.replace(baseOutputDir.jfile.getAbsolutePath + File.separator, "").replaceAll("\\\\", "/")
var fname = file.getAbsolutePath.replace(workingDir.jfile.getAbsolutePath + File.separator, "").replaceAll("\\\\", "/")
println(s"Adding to JAR: $fname")
if (file.isDirectory) {
if (!fname.endsWith("/")) {
@@ -94,7 +107,7 @@ class SModelFSWriter extends SModelVisitor {
override def visit(sClass: SClass): Unit = {
println(s"Writing class $sClass")
val classNameWithPath = baseOutputDir.toAbsolute.toString() + File.separator + pckg2Path(sClass.getPackage) + File.separator + s"${sClass.name}.scala"
val classNameWithPath = workingDir.toAbsolute.toString() + File.separator + pckg2Path(sClass.getPackage) + File.separator + s"${sClass.name}.scala"
val writer = new SClassWriter(sClass)
val classFile = File(classNameWithPath)
Loading