Используйте статическое объявление Java в реализации макроса

Я пытаюсь использовать статический метод в классе 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, статических методов, которые я хочу использовать, там нет. Как мне получить доступ к этим статическим методам и использовать их в квазицитатах?

Я использую плагин компилятора macro-paradise версии 2.1.0 для scala 2.10.6.


person mushroom    schedule 28.12.2015    source источник
comment
Статические методы моделируются как методы объекта-компаньона.   -  person som-snytt    schedule 28.12.2015
comment
@som-snytt Как мне добраться до компаньона? Похоже, в API 2.11 я могу делать tpe.companion, но я использую 2.10   -  person mushroom    schedule 28.12.2015


Ответы (1)


Увидев комментарий @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, выполнив companion.typeSignature.declarations

person mushroom    schedule 28.12.2015