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)
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 –