2
在宏內部有使用當前上下文完全展開類型名稱的方法嗎?比如像:如何在宏中將短類型名稱解析爲完整類型名稱
context.resolveShortTypeNameToFullTypeName("Foo") = "com.acme.Foo"
在宏內部有使用當前上下文完全展開類型名稱的方法嗎?比如像:如何在宏中將短類型名稱解析爲完整類型名稱
context.resolveShortTypeNameToFullTypeName("Foo") = "com.acme.Foo"
您的宏可能會在樹,其中包括任意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 [原文]當你需要他嗎?
是的的確的確有可能在宏觀擴展中對樹進行類型檢查。在公共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中,類型檢測將有一個專用的類型模式。 –
@EugeneBurmako謝謝!我先試着c.typecheck,一定是做錯了。 –
對不起 - 我的午餐時間只有一個答案 - 最大規則,我今天[已經用於我的](http://stackoverflow.com/a/21684752/334519)。 –