2012-09-18 15 views
9

Poniższe makro, pochodzących z większej przykład, ma stworzyć drzewo, ale nic z odniesieniem do this:Jak odnosić się do załączania "to" w makro 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 

Ale wezwanie do echoThis takich jak

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

nie skompilować z komunikatem

[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 

Jeżeli ustawić -Ymacro-debug-Lite flaga wygenerowanego drzewa to This(newTermName("<local Testing>")).

Odpowiedz

10

Istnieją dwa sposoby osiągnięcia tego, co chcesz:

1) Użyj This(tpnme.EMPTY). Obecnie to się nie kompiluje, więc zamiast tego będziesz musiał użyć This(newTypeName("")), ale w RC1 zostanie to naprawione.

2) Użyj This(c.enclosingClass.symbol.asModule.moduleClass). Obecnie to nie działa, ponieważ https://issues.scala-lang.org/browse/SI-6394, ale w RC1 zostanie to naprawione.

+0

Dzięki za odpowiedź Eugene. To nie wystarczyło, żeby mnie pokonać. IIUC 'c.prefix' jest wyrażeniem drzewa, które odnosi się do' obiektu', w którym zdefiniowane jest makro. –

+0

(ciąg dalszy) 'This()' pobiera symbol i myślę, że szukam symbolu odnoszącego się do klasy otaczającej makro wywołania. Chcę wywołanie 'def echoThis: Wszelkie = makro MacroImpl.echoThis' być taka sama jak ' def echoThis: Wszelkie = this' –

+0

Ok widzę. Pozwól mi pomyśleć: –