Gibt es eine bequeme Möglichkeit, ein MethodSymbol
in die linke Seite eines Methodendefinitionsbaums (dh ein DefDef
) in Scala 2.10?
Angenommen, ich möchte ein Makro erstellen, das eine Instanz eines Merkmals übernimmt und alle Methoden dieses Merkmals mit Debugging-Funktionen umschließt. Ich kann folgendes schreiben:
%Vor%Ich habe das langweilige Geschäft, diese Methoden in einer neuen anonymen Klasse zu kleben, die das Merkmal implementiert und dann diese Klasse instanziiert, beseitigt. Sie können ein vollständiges funktionierendes Beispiel finden hier wenn Sie interessiert sind.
Jetzt kann ich das schreiben, zum Beispiel:
%Vor%So funktioniert es, aber nur in sehr einfachen Fällen - es wird nicht, wenn das Merkmal Methoden mit Parameterlisten, mit Zugriffsmodifizierern, Anmerkungen usw. hat.
Was ich wirklich will, ist eine Funktion, die ein Methodensymbol und einen Baum für den neuen Körper übernimmt und ein DefDef
zurückgibt. Ich habe angefangen, eines von Hand zu schreiben, aber es beinhaltet eine Menge kniffliger Sachen wie dieses:
Was nervig, wortreich und fehleranfällig ist. Fehle ich eine bessere Möglichkeit, dies in der neuen Reflection-API zu tun?
Nach meinem besten Wissen gibt es keinen Standardweg von einem Symbol zu einem definierenden Baum.
Ihre beste Wette wäre wahrscheinlich, durch c.enclosingRun.units
zu iterieren und in jedem der unit.body
-Bäume wiederzukommen, während Sie gehen. Wenn Sie ein DefDef
sehen, dessen symbol
gleich Ihrem Symbol ist, haben Sie Ihr Ziel erreicht. upd. Vergiss nicht, duplicate
den definierenden Baum vor der Wiederverwendung zu verwenden!
Diese Technik ist bei weitem nicht die bequemste Sache der Welt, aber sie sollte funktionieren.
Tags und Links scala macros reflection scala-macros scala-2.10