2017-05-27 4 views
1

ich ein Tool, das ich schreiben testen möchten, die einige scala Quellcode transformiert, möchte ich, dass der transformierte Code aus einem sbt-Test (mit scalatest) kompiliert überprüfen.Dynamische Kompilierung mit scala 2.12 - von sbt Test

Ich möchte programmatisch Compiler die scala rufen auf einem String mit meiner Quelle (alle in einer eigenständigen Datei ist).

Ich habe einige Fortschritte seit der ersten Frage gemacht. Dieser Code funktioniert in meiner IDE (IntelliJ), aber nicht von einer sbt test Sitzung

import java.io.File 
import scala.reflect.internal.util.BatchSourceFile 
import scala.tools.nsc.{GenericRunnerSettings, Global} 

object Compilation { 
    val settings = new GenericRunnerSettings(System.out.println _) 
// val sbtClasspath = System.getProperty("sbt-classpath") 
// val s = File.pathSeparator 
// val classPath = s".${s}$sbtClasspath" 
// settings.classpath.append(classPath) 
    settings.usejavacp.value = true 
    val global = new Global(settings) 

    def compiles(code: String): Boolean = { 
    val r = new global.Run 
    r.compileSources(List(new BatchSourceFile("<partest>", code))) 
    val errors = global.reporter.hasErrors 
    if (errors) r.reporting.summarizeErrors() 
    !errors 
    } 
} 

Hier ist meine build.sbt

name := "CodinGame-Scala-Kit" 
version := "0.1.0" 
scalaVersion := "2.12.2" 
libraryDependencies += "org.scalatest" %% "scalatest" % "3.0.1" % "test" 
libraryDependencies += "org.scala-lang" % "scala-compiler" % "2.12.2" % "test" 

enablePlugins(JmhPlugin) 

//val sbtcp = taskKey[Unit]("sbt-classpath") 
// 
//sbtcp := { 
// val files: Seq[File] = (fullClasspath in Compile).value.files 
// val sbtClasspath: String = files.map(x => x.getAbsolutePath).mkString(java.io.File.pathSeparator) 
// println("Set SBT classpath to 'sbt-classpath' environment variable") 
// println(sbtClasspath) 
// System.setProperty("sbt-classpath", sbtClasspath) 
//} 
// 
//compile <<= (compile in Compile).dependsOn(sbtcp) 

Der erste Fehler ist

scala.reflect.internal.MissingRequirementError: object scala.annotation.Annotation in compiler mirror not found. 
[info] at scala.reflect.internal.MissingRequirementError$.signal(MissingRequirementError.scala:17) 
[info] at scala.reflect.internal.MissingRequirementError$.notFound(MissingRequirementError.scala:18) 
[info] at scala.reflect.internal.Mirrors$RootsBase.$anonfun$getModuleOrClass$4(Mirrors.scala:54) 
[info] at scala.reflect.internal.Mirrors$RootsBase.getModuleOrClass(Mirrors.scala:54) 
[info] at scala.reflect.internal.Mirrors$RootsBase.getModuleOrClass(Mirrors.scala:45) 
[info] at scala.reflect.internal.Mirrors$RootsBase.getModuleOrClass(Mirrors.scala:66) 
[info] at scala.reflect.internal.Mirrors$RootsBase.getClassByName(Mirrors.scala:101) 
[info] at scala.reflect.internal.Mirrors$RootsBase.getRequiredClass(Mirrors.scala:104) 
[info] at scala.reflect.internal.Mirrors$RootsBase.requiredClass(Mirrors.scala:107) 
[info] at scala.reflect.internal.Definitions$DefinitionsClass.AnnotationClass$lzycompute(Definitions.scala:1141) 

ich hinzugefügt haben, die Linien kommentiert in build.sbt und im Compilation Objekt nach this answer. Es ändert nichts in der IDE.

Ich habe jetzt diesen Fehler auf sbt-Test (kompiliert richtig druckt den Classpath):

scala.reflect.internal.FatalError: class StringContext does not have a member f 
[info] at scala.reflect.internal.Definitions$DefinitionsClass.fatalMissingSymbol(Definitions.scala:1236) 
[info] at scala.reflect.internal.Definitions$DefinitionsClass.$anonfun$getMember$1(Definitions.scala:1259) 
[info] at scala.reflect.internal.Definitions$DefinitionsClass.getMember(Definitions.scala:1254) 
[info] at scala.reflect.internal.Definitions$DefinitionsClass.getMemberMethod(Definitions.scala:1288) 
[info] at scala.reflect.internal.Definitions$DefinitionsClass$RunDefinitions.StringContext_f$lzycompute(Definitions.scala:1477) 
[info] at scala.reflect.internal.Definitions$DefinitionsClass$RunDefinitions.StringContext_f(Definitions.scala:1477) 
[info] at scala.tools.reflect.FastTrack.$anonfun$fastTrackCache$1(FastTrack.scala:53) 
[info] at scala.reflect.internal.SymbolTable$perRunCaches$$anon$1.apply(SymbolTable.scala:395) 
[info] at scala.tools.reflect.FastTrack.contains(FastTrack.scala:20) 
[info] at scala.tools.nsc.typechecker.Namers$Namer.methodSig(Namers.scala:1388) 
+0

Ich verwenden jetzt neuesten sbt mit (0.13.15), die dem letzten Fehler macht einfacher. Könnte mit diesem ähnlichen Fehler verknüpft sein ... https://github.com/scala/bug/issues/10058 –

Antwort

1

Der zweite Ansatz, um die Dinge ähnlich sieht, die für mich gearbeitet hat, Sie sind offensichtlich eine Abhängigkeit irgendwo fehlen. Eine leere Einstellungen funktioniert nicht. Entweder Einstellungen ändern bootclasspath

oder einfach settings.usejavacp.value = true