2013-01-14 13 views
8

Trong scala 2.9.x tôi đã sử dụng tools.nsc.Global trực tiếp để biên dịch chuỗi nhất định vào một lớp và thực thi nó.Có cách nào để có được báo cáo thích hợp về lỗi biên dịch thời gian chạy trong scala 2.10 không?

Trong scala 2.10, nó có thể thay thế nó bằng một cái gì đó như sau:

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

Và nó hoạt động hoàn hảo. Vấn đề duy nhất là với cách tiếp cận cũ (không được chấp nhận), tôi có thể tóm tắt tất cả các lỗi biên dịch bằng cách sử dụng StoreReporter (với thông báo lỗi, số dòng) và cách tiếp cận mới chỉ ném ngoại lệ về lỗi biên dịch.

Có cách nào để sửa lại điều đó không?

Trả lời

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

Nhưng, như bạn thấy, nó cung cấp NoPosition cho tất cả các lỗi. Và nếu tôi sẽ biên dịch các đoạn mã lớn với, tôi muốn có thể báo cáo ít nhất vị trí dòng cho người dùng. – Rogach

+0

Để tham khảo, dưới đây là cách thực hiện: https://github.com/Rogach/miltamm/blob/master/src/main/scala/BuildCompiler.scala#L8 – Rogach

+0

Bạn có thể mở một vé về điều NoPosition này không ? –

Các vấn đề liên quan