【问题标题】:Is there a way to get proper report of runtime compilation errors in scala 2.10?有没有办法在 scala 2.10 中正确报告运行时编译错误?
【发布时间】:2013-01-14 12:48:18
【问题描述】:

在 scala 2.9.x 中,我直接使用tools.nsc.Global 将某些字符串编译成一个类并执行它。

在 scala 2.10 中,可以将其替换为以下内容:

import scala.reflect.runtime._;
val cm = universe.runtimeMirror(getClass.getClassLoader)
import scala.tools.reflect.ToolBox;
val tb = cm.mkToolBox()
tb.eval(tb.parse("class C; new C"))

而且它完美无瑕。唯一的问题是,使用旧(已弃用)方法,我可以使用 StoreReporter 获得所有编译失败的非常漂亮的摘要(带有错误消息、行号),而新方法只会在编译错误时引发异常。

有什么办法可以证明这一点吗?

【问题讨论】:

    标签: scala reflection toolbox scala-2.10


    【解决方案1】:
    scala> import scala.reflect.runtime._
    import scala.reflect.runtime._
    
    scala> val cm = universe.runtimeMirror(getClass.getClassLoader)
    cm: reflect.runtime.universe.Mirror = JavaMirror with ...
    
    scala> import scala.tools.reflect.ToolBox
    import scala.tools.reflect.ToolBox
    
    scala> val tb = cm.mkToolBox()
    tb: scala.tools.reflect.ToolBox[reflect.runtime.universe.type] = scala.tools.reflect.ToolBoxFactory$ToolBoxImpl@712fe0c0
    
    scala> tb.eval(tb.parse("class C; new D"))
    scala.tools.reflect.ToolBoxError: reflective compilation has failed: 
    
    not found: type D
      at scala.tools.reflect.ToolBoxFactory$ToolBoxImpl$ToolBoxGlobal.throwIfErrors(ToolBoxFactory.scala:312)
      at scala.tools.reflect.ToolBoxFactory$ToolBoxImpl$ToolBoxGlobal.compile(ToolBoxFactory.scala:248)
      at scala.tools.reflect.ToolBoxFactory$ToolBoxImpl.compile(ToolBoxFactory.scala:407)
      at scala.tools.reflect.ToolBoxFactory$ToolBoxImpl.eval(ToolBoxFactory.scala:410)
      ...
    
    scala> tb.frontEnd.infos
    res1: ... = Set(Info(NoPosition,not found: type D,ERROR))
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多