2013-01-14 21 views
8

स्कैला 2.9.x में मैंने tools.nsc.Global का उपयोग सीधे कुछ स्ट्रिंग को कक्षा में संकलित करने और इसे निष्पादित करने के लिए किया था।क्या स्कैला 2.10 में रनटाइम संकलन त्रुटियों की उचित रिपोर्ट प्राप्त करने का कोई तरीका है?

स्केला 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")) 

और यह दोषरहित काम करता है। एकमात्र समस्या यह है कि पुराने (बहिष्कृत) दृष्टिकोण के साथ, मैं स्टोररपोर्टर (त्रुटि संदेशों, रेखा संख्याओं के साथ) का उपयोग करके सभी संकलन विफलताओं का बेहद सुंदर सारांश प्राप्त कर सकता हूं, और नया दृष्टिकोण संकलन त्रुटि पर अपवाद फेंकता है।

क्या इसका पुनर्मूल्यांकन करने का कोई तरीका है?

उत्तर

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

क्या आप इस नोपोजिशन चीज़ के बारे में टिकट खोल सकते हैं ? –

संबंधित मुद्दे