[英]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.