scala.tools.nsc.Global не компилируется после первой ошибки компиляции
Я реализовал динамическую компиляцию шаблонов Twirl и наткнулся на странную проблему - пример scala.tools.nsc.Global
работает, пока не выйдет из строя один раз с плохим исходным файлом Любые дальнейшие попытки скомпилировать действительный файл терпят неудачу, он не производит .class
двоичные файлы. Я на Scala 2.11.8.
Как я могу отладить и исправить это?
Вот как я создаю экземпляр Global
:
private def createScalaCompiler(compileErrors: mutable.ListBuffer[CompilationError]): Global = {
val additionalClassPathEntry: String =
List(twirlCompilerClass, this.getClass).flatMap(_.getClassLoader.asInstanceOf[URLClassLoader].getURLs.map(_.getFile)).distinct.mkString(":")
val settings = new Settings()
settings.debug.tryToSet(Nil)
settings.verbose.tryToSet(Nil)
val scalaObjectSource = Class.forName("scala.Int").getProtectionDomain.getCodeSource
if (scalaObjectSource != null) {
val compilerPath = Class.forName("scala.tools.nsc.Interpreter").getProtectionDomain.getCodeSource.getLocation
val libPath = scalaObjectSource.getLocation
val pathList = List(compilerPath, libPath)
val origBootclasspath = settings.bootclasspath.value
settings.bootclasspath.value = ((origBootclasspath :: pathList) ::: Some(additionalClassPathEntry).toList) mkString File.pathSeparator
settings.outdir.value = generatedClasses.getAbsolutePath
}
val compiler: Global = new Global(settings, new ConsoleReporter(settings) {
override def printMessage(pos: Position, msg: String): Unit = {
pos match {
case NoPosition =>
println(msg)
case _ =>
compileErrors.append(CompilationError(msg, pos.line, pos.point))
}
}
})
compiler
}
который я использую следующим образом
val compileErrors = new mutable.ListBuffer[CompilationError]
val compiler = createScalaCompiler(compileErrors)
затем экземпляр compiler
используется несколько раз в функции, аналогичной
def compileScalaFile(fakePath: String, content: String) {
val run = new compiler.Run
val sourceFile = new BatchSourceFile(new VirtualFile(fakePath), content)
run.compileSources(List(sourceFile))
}
Как видите, я включил подробное ведение журнала. Интересно, что компиляция действительного кода Scala не приводит к выводу в журнал,
Мне кажется, что compiler
переходит в сломанное состояние Как я могу сбросить его, не воссоздавая его с нуля (что занимает много времени в производстве)?