获取scala repl内部的类型信息
我想解析一段scala代码,包含在String
中,并获得该表达式(String => Type
)的结果reflect.runtime.universe.Type
。我试过:
scala> import scala.tools.nsc.interpreter.IMain
import scala.tools.nsc.interpreter.IMain
scala> new IMain().exprTyper.parse("scala.Option")
warning: there were 1 feature warning(s); re-run with -feature for details
res1: Option[List[_2.repl.global.Tree]] forSome { val _2: scala.tools.nsc.interpreter.IMain#exprTyper.type } = Some(List(scala.Option))
scala> .get.head
warning: there were 1 feature warning(s); re-run with -feature for details
res2: _2.repl.global.Tree forSome { val _2: scala.tools.nsc.interpreter.IMain#exprTyper.type } = scala.Option
scala> .tpe
res3: _2.type#repl.global.Type = null
scala> new IMain().runtimeTypeOfTerm("scala.Option")
warning: there were 1 feature warning(s); re-run with -feature for details
res5: _74.global.Type forSome { val _74: scala.tools.nsc.interpreter.IMain } = <notype>
scala> new IMain().typeOfTerm("scala.Option")
warning: there were 1 feature warning(s); re-run with -feature for details
res6: _75.global.Type forSome { val _75: scala.tools.nsc.interpreter.IMain } = <notype>
可能吗?如果可能,你怎么做?谢谢。
UPD:我已经表达了实际意图和我现在在这个问题上的位置:通过IMain
所以,在徘徊了So之后(特别感谢这个答案),我收敛到以下结果:
scala> def toType(expr: String): Type = {
| import scala.tools.reflect.ToolBox
| import scala.reflect.runtime.{currentMirror => m}
| val tb = m.mkToolBox()
| val exp = tb.parse(expr.trim)
| tb.typeCheck(exp).tpe
| }
toType: (expr: String)reflect.runtime.universe.Type
scala> toType("Option")
res2: reflect.runtime.universe.Type = Option.type
scala> toType("List")
res3: reflect.runtime.universe.Type = scala.collection.immutable.List.type