2012-09-18 17 views
9

La macro siguiente, extraído de un ejemplo más extenso, se supone que crear un árbol con nada más que una referencia a this:¿Cómo me refiero a adjuntar "esto" en una macro de Scala?

def echoThisImpl(c:Context): c.Expr[Any] = { 
    import c.universe._ 

    val selfTree = This(c.enclosingClass.symbol) 
    c.Expr[AnyRef](selfTree) 
} 

def echoThis: Any = macro CallMacro.echoThisImpl 

Pero una llamada a echoThis como

object Testing extends App { 
    val thisValue = CallMacro.echoThis 
    println(thisValue) 
} 

falla al compilar , con el mensaje

[error] /home/rafael/dev/scala/goose/goose-macros/src/test/scala/Testing.scala:8: type mismatch; 
[error] found : <noprefix> 
[error] required: Any 
[error] val thisValue = CallMacro.echoThis 

Si fijo el -Ymacro-debug-lite marca el árbol generado es This(newTermName("<local Testing>")).

Respuesta

10

Hay dos opciones de lograr lo que quiere:

1) Uso This(tpnme.EMPTY). Actualmente esto no se compila, por lo que tendrá que usar This(newTypeName("")) en su lugar, pero en RC1 esto se solucionará.

2) Use This(c.enclosingClass.symbol.asModule.moduleClass). Actualmente esto no funciona, debido a https://issues.scala-lang.org/browse/SI-6394, pero en RC1 esto se solucionará.

+0

Gracias por responder Eugene. No fue suficiente para hacerme pasar. IIUC 'c.prefix' es una expresión para el árbol que hace referencia al' objeto' donde se define la macro. –

+0

(continuación) 'This()' toma un símbolo, y creo que estoy buscando el símbolo que hace referencia a la clase adjunta de la macro llamada. Quiero la llamada 'def echo this: Cualquier = macro MacroImpl.echoThis' a ser el mismo que ' def echo this: Cualquier = this' –

+0

Está bien que ver. Déjame pensar –

Cuestiones relacionadas