2012-08-25 10 views
10

Wie kann man rekursiv nach einem Element in scala 2.10 ASTs suchen?Suchen in scala 2.10 ASTs

Die Bäume könnten eine Folge der power.trees(code) oder mirror.mkToolBox().parseExpr(code) bearbeiten sein. In 2.10.0-RC1 wurde parseExpr in parse umbenannt. Der konkrete Anwendungsfall, den ich habe, ist das Extrahieren des Codes einer Methode aus einem gegebenen Klassen-/Objektcode nach Methodenname, , aber ich nehme an, dass die Frage relevanter für andere wäre, wenn sie allgemeiner formuliert wäre .

Antwort

5

Vielleicht sollten Sie einen Blick auf https://github.com/scala/scala/blob/2.10.x/src/reflect/scala/reflect/api/Trees.scala#L606 haben, vor allem in den Klassen Traverser, Transformator und die Verfahren zur Substitution (Tree.substituteSymbols, Tree.substituteTypes oder Tree.substituteThis). Wenn Sie eine Methode aus einer Baumstruktur extrahieren möchten, können Sie Traverser verwenden und die Methode traverse überschreiben. In der Methode traverse überprüfen Sie, ob der Knoten der gewünschten Methode entspricht. Wenn ja, bist du fertig. Wenn nicht, rufen Sie super.traverse an.

+1

Der verknüpfte Code ist im Vergleich zur Amtsleitung ziemlich veraltet. Hier sind die richtigen Links: 1) Baum AST-Klassen: https://github.com/scala/scala/blob/2.10.x/src/library/scala/reflect/base/Trees.scala, 2) Transformatoren und Schiebebühnen: https://github.com/scala/scala/blob/2.10.x/src/reflect/scala/reflect/api/Trees.scala#L606 –

+0

Hoppla, danke ... –

+1

Hier ist ein Beispiel für einen Transformator: https://github.com/scala/scala/blob/46d57d47e81c8794a9a3594e080576788cc92324/src/compiler/scala/reflect/reigy/phases/Reshape.scala (der Code würde definitiv eine Bereinigung verwenden, aber es ist zu nett von einem Beispiel, um es zu ignorieren). Beachten Sie die Teile "super.transform" und "copyAttrs". –

Verwandte Themen