Scala 如何将宏中的短类型名解析为完整类型名

Scala 如何将宏中的短类型名解析为完整类型名,scala,scala-2.10,scala-macros,Scala,Scala 2.10,Scala Macros,在宏中是否有一种使用当前上下文完全扩展类型名的方法?例如: context.resolveShortTypeNameToFullTypeName("Foo") = "com.acme.Foo" 您的宏可能会在包含任意import prefix.Foo的树中展开,因此您询问是否可以查询该封闭树:如果我发出一个名称Foo,您将如何打字检查它 symbol.fullName是您的答案 val t = c.typeCheck(q"??? : Foo").tpe.typeSymbol.fullName

在宏中是否有一种使用当前上下文完全扩展类型名的方法?例如:

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)
}

当你需要Travis Brown Eugene Burmakro[sic]时,他在哪里?

是的,确实可以在宏扩展中对树进行类型检查。在公共API中甚至有一种特殊的方法叫做c.typeCheck,因此不需要强制转换。在Scala 2.10中,typeCheck只能与术语一起使用,并且需要一个小的变通方法来检查类型:。在Scala 2.11中,类型检查将有一个专用的类型模式。@EugeneBurmako谢谢!我先尝试了c.typecheck,一定是做错了什么。对不起,我午餐休息时有一个答案上限规则,我今天就要这么做了。@som snytt。我们在2.11中稍微更改了名称-现在是c.typecheck,而不是Scala2.10中的c.typecheck。