2013-01-14 11 views
8

W scala 2.9.x użyłem tools.nsc.Global bezpośrednio, aby skompilować pewien ciąg do klasy i wykonać go.Czy istnieje sposób, aby uzyskać prawidłowy raport błędów kompilacji środowiska wykonawczego w programie Scala 2.10?

w Scala 2.10, możliwe jest zastąpienie go coś jak następuje:

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

I to działa bez zarzutu. Jedynym problemem jest to, że dzięki starszemu (przestarzałemu) podejściu mogłem uzyskać bardzo ładne podsumowanie wszystkich awarii kompilacji przy użyciu StoreReporter (z komunikatami o błędach, numerach linii), a nowe podejście właśnie zgłasza wyjątek w błędzie kompilacji.

Czy istnieje sposób na potwierdzenie tego?

Odpowiedz

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

Ale, jak widzisz, daje brak pozycji dla wszystkich błędów. A jeśli chciałbym skompilować duże kawałki kodu, chciałbym móc zgłosić użytkownikowi przynajmniej pozycje linii. – Rogach

+0

Oto, jak to zrobić: https://github.com/Rogach/miltamm/blob/master/src/main/scala/BuildCompiler.scala#L8 – Rogach

+0

Czy możesz otworzyć zgłoszenie dotyczące tego problemu? ? –

Powiązane problemy