2013-06-30 150 views

回答

7

如果你类型检查的树,你可以只使用其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) 

可以也把它包在一个表达式,当然,但有没有必要,如果你只是想要的类型。

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],那么您将遇到麻烦。问题是要包装从c.typeCheck返回的树,否则Type只是null。

方法mac只是返回()它打印出Any上限和Int(2)-实际的类型。