2015-12-28 43 views
0

我試圖用一個靜態方法的Java類,T,在宏實現:使用靜態Java聲明中宏實現

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中使用它們?

我使用宏天堂編譯器插件的版本2.1.0爲scala 2.10.6。

+1

靜態方法建模爲同伴對象的方法得到的companion聲明。 –

+0

@ som-snytt我如何找到同伴?它看起來像在2.11 API中可以做'tpe.companion',但我使用的是2.10 – mushroom

回答

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.typeSignature.declarations