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 переходит в сломанное состояние Как я могу сбросить его, не воссоздавая его с нуля (что занимает много времени в производстве)?

0 ответов

Другие вопросы по тегам