0

I am trying to use a static method on a Java class, T, in a macro implementation:

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

This does not work. When I print out all the members and declarations of tpe, the static methods that I want to use are not there. How do I access these static methods and use them in the quasiquote?

I am using version 2.1.0 of the macro-paradise compiler plugin for scala 2.10.6.

mushroom
  • 6,201
  • 5
  • 36
  • 63

1 Answers1

0

After seeing @som-snytt's comment, I investigated how to access the companion object. The code ended up looking something like this:

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

I look up the companion symbol and then call the method someStaticMethod on it in the quasiquote. This seems to do what I want.

I can get the declarations of companion by doing companion.typeSignature.declarations

mushroom
  • 6,201
  • 5
  • 36
  • 63