2014-02-10 55 views

回答

2

您的宏可能會在樹,其中包括任意import prefix.Foo擴大,所以你問如果可以查詢封閉樹:如果我發出一個名字Foo,你將如何進行類型檢查呢?

symbol.fullName是你的答案。

val t = c.typeCheck(q"??? : Foo").tpe.typeSymbol.fullName 

或在2.11中使用c.typecheck

或者,如果你不能找到scaladoc ...

val k = c.asInstanceOf[scala.reflect.macros.contexts.Context] 
locally { 
    import k.universe._ 
    val n = k.callsiteTyper.typed(q"??? : Foo").tpe.typeSymbol.fullName 
    println(n) 
} 

特拉維斯布朗 尤金Burmakro [原文]當你需要他嗎?

+0

是的的確的確有可能在宏觀擴展中對樹進行類型檢查。在公共API中有一個特殊的方法叫做c.typeCheck,所以不需要投射。在Scala 2.10中,typeCheck只能用於術語,並且需要一個小的解決方法來檢查類型:http://stackoverflow.com/questions/21680630/adding-extra-trait-to-object-using-scala-macro-annotation/ 21682269。在Scala 2.11中,類型檢測將有一個專用的類型模式。 –

+0

@EugeneBurmako謝謝!我先試着c.typecheck,一定是做錯了。 –

+2

對不起 - 我的午餐時間只有一個答案 - 最大規則,我今天[已經用於我的](http://stackoverflow.com/a/21684752/334519)。 –

相關問題