2013-01-14 10 views
8

スカラ2.9.xでは、私はtools.nsc.Globalを直接使用して、特定の文字列をクラスにコンパイルして実行しました。scala 2.10で実行時コンパイルエラーの適切なレポートを取得する方法はありますか?

​​

そして、それは完璧に動作します:

Scalaの2.10で、次のようなものに置き換えることが可能です。唯一の問題は、古い(廃止予定の)アプローチでは、StoreReporter(エラーメッセージ、行番号付き)を使用してすべてのコンパイルエラーをきわめて簡単に要約でき、新しいアプローチではコンパイルエラーで例外がスローされることです。

これを証明する方法はありますか?

答えて

2
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] = [email protected] 

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)) 
+0

ご覧のとおり、すべてのエラーに対してNoPositionが返されます。そして、もし私が大量のコードをコンパイルするなら、私は少なくともライン位置をユーザーに報告できるようにしたいと思うでしょう。 – Rogach

+0

参考までに、現在の状況は次のとおりです:https://github.com/Rogach/miltamm/blob/master/src/main/scala/BuildCompiler.scala#L8 – Rogach

+0

このNoPositionに関するチケットを開封してください? –

関連する問題