[英]Infer a type of a tree in a scala macro
在宏内部,我如何要求编译器推断构造树的类型? 我只找到Context.typeCheck,但它只检查类型但不返回结果。
如果您已对树进行了类型检查,则可以使用其tpe
方法:
scala> def impl(c: Context) = c.literal(c.typeCheck(c parse "1+1").tpe.toString)
impl: (c: scala.reflect.macros.Context)c.Expr[String]
scala> def mac = macro impl
mac: String
scala> println(mac)
Int(2)
当然,你也可以将它包装在一个表达式中,但是如果你只是想要这个类型就没有必要。
我想通了,我希望这可以节省别人的麻烦
import reflect.macros.Context
import language.experimental.macros
def impl(c: Context) = {
val tree = c.parse("1+1")
val expr = c.Expr[Any](c.typeCheck(tree))
println(expr.staticType)
println(expr.actualType)
c.literalUnit
}
def mac = macro impl
通过包装到Expr中,您可以查询实际类型。 任何都可以提供合法的上限。 没有它,感染类型将是Expr [Nothing],你会遇到麻烦。 catch是包装从c.typeCheck返回的树,否则Type只是null。
方法mac
只返回()bu打印出Any
-upper bound和Int(2)
- 实际类型。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.