在宏实现中使用静态 Java 声明
Use a static Java declaration in macro implementation
我正在尝试在 Java class、T
上使用静态方法,在宏实现中:
def macroImpl[T : c.WeakTypeTag](c: Context): c.Expr[ResultType] = {
import c.universe._
val tpe = weakTypeOf[T]
val someStaticMethod = tpe.declaration(c.universe.newTermName("someStaticMethod")).asMethod
c.Expr[ResultType] { q""" new ResultType {
def myMethod = ${someStaticMethod.name.toTermName}
}"""}
}
这不起作用。当我打印出 tpe
的所有成员和声明时,我想使用的静态方法并不存在。如何访问这些静态方法并在准引用中使用它们?
我正在使用 scala 2.10.6 的 macro-paradise 编译器插件的 2.1.0 版。
看到@som-snytt 的评论后,我研究了如何访问伴随对象。代码最终看起来像这样:
def macroImpl[T : c.WeakTypeTag](c: Context): c.Expr[ResultType] = {
import c.universe._
val tpe = weakTypeOf[T]
val companion = tpe.typeSymbol.companionSymbol
c.Expr[ResultType] { q""" new ResultType {
def myMethod = ${companion.name.toTermName}.someStaticMethod
}"""}
}
我查找伴随符号,然后在准报价中对其调用方法 someStaticMethod
。这似乎做我想做的。
我可以通过 companion.typeSignature.declarations
得到 companion
的声明
我正在尝试在 Java class、T
上使用静态方法,在宏实现中:
def macroImpl[T : c.WeakTypeTag](c: Context): c.Expr[ResultType] = {
import c.universe._
val tpe = weakTypeOf[T]
val someStaticMethod = tpe.declaration(c.universe.newTermName("someStaticMethod")).asMethod
c.Expr[ResultType] { q""" new ResultType {
def myMethod = ${someStaticMethod.name.toTermName}
}"""}
}
这不起作用。当我打印出 tpe
的所有成员和声明时,我想使用的静态方法并不存在。如何访问这些静态方法并在准引用中使用它们?
我正在使用 scala 2.10.6 的 macro-paradise 编译器插件的 2.1.0 版。
看到@som-snytt 的评论后,我研究了如何访问伴随对象。代码最终看起来像这样:
def macroImpl[T : c.WeakTypeTag](c: Context): c.Expr[ResultType] = {
import c.universe._
val tpe = weakTypeOf[T]
val companion = tpe.typeSymbol.companionSymbol
c.Expr[ResultType] { q""" new ResultType {
def myMethod = ${companion.name.toTermName}.someStaticMethod
}"""}
}
我查找伴随符号,然后在准报价中对其调用方法 someStaticMethod
。这似乎做我想做的。
我可以通过 companion.typeSignature.declarations
companion
的声明