2013-01-14 7 views
8

In scala 2.9.x ho usato tools.nsc.Global direttamente per compilare una determinata stringa in una classe ed eseguirla.C'è un modo per ottenere il corretto rapporto degli errori di compilazione del runtime in scala 2.10?

In Scala 2.10, è possibile sostituirlo con qualcosa di simile a quanto segue:

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

E funziona perfettamente. L'unico problema è che con un approccio vecchio (deprecato), potrei ottenere un sommario estremamente carino di tutti gli errori di compilazione utilizzando StoreReporter (con messaggi di errore, numeri di riga) e il nuovo approccio lancia solo un'eccezione sull'errore di compilazione.

C'è un modo per reificare quello?

risposta

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

Ma, come vedete, fornisce NoPosition per tutti gli errori. E se dovessi compilare grossi pezzi di codice con, vorrei essere in grado di riportare almeno le posizioni di linea all'utente. – Rogach

+0

Per il riferimento, ecco come è fatto attualmente: https://github.com/Rogach/miltamm/blob/master/src/main/scala/BuildCompiler.scala#L8 – Rogach

+0

Potresti per favore aprire un ticket su questa cosa NoPosition ? –

Problemi correlati