在宏实现中使用静态Java声明

时间:2015-12-28 03:40:59

标签: scala scala-macros scala-macro-paradise

我正在尝试在宏类实现中对Java类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的所有成员和声明时,我想要使用的静态方法不存在。如何访问这些静态方法并在quasiquote中使用它们?

我正在使用scala 2.10.6的宏天堂编译器插件2.1.0版。

1 个答案:

答案 0 :(得分: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  
  }"""}
}

我查找伴侣符号,然后在quasiquote中调用方法someStaticMethod。这似乎做我想要的。

我可以通过companion

获取companion.typeSignature.declarations的声明