2012-08-25 11 views
10

Jaki jest najlepszy sposób rekurencyjnego wyszukiwania elementu w scala 2.10 AST?Wyszukiwanie wewnątrz scala 2.10 ASTs

Drzewa mogą być wynikiem power.trees(code) lub mirror.mkToolBox().parseExpr(code) Edytuj. W wersji 2.10.0-RC1 parseExpr zmieniono nazwę na parse.

Konkretnym przypadkiem użycia, który mam, jest wyodrębnianie kodu metody z danego kodu klasy/obiektu według nazwy metody, , ale zakładam, że pytanie byłoby bardziej istotne dla innych, jeśli sformułowane w bardziej ogólny sposób .

Odpowiedz

5

Może powinieneś rzucić okiem na https://github.com/scala/scala/blob/2.10.x/src/reflect/scala/reflect/api/Trees.scala#L606, szczególnie w klasach traverser, transformator i metod podstawienia (Tree.substituteSymbols, Tree.substituteTypes lub Tree.substituteThis). Jeśli chcesz wyodrębnić metodę z drzewa, możesz użyć metody Traverser i zastąpić metodę traverse. W metodzie przechodzenia sprawdzasz, czy węzeł pasuje do wybranej metody. Jeśli tak, skończyłeś. Jeśli nie, zadzwoń pod numer super.traverse.

+1

Połączony kod jest dość przestarzały w porównaniu z pniem. Oto poprawne linki: 1) klasy AST drzewa: https://github.com/scala/scala/blob/2.10.x/src/library/scala/reflect/base/Trees.scala, 2) transformatory i traversers: https://github.com/scala/scala/blob/2.10.x/src/reflect/scala/reflect/api/Trees.scala#L606 –

+0

Ups, thanks ... –

+1

Oto przykład transformatora: https://github.com/scala/scala/blob/46d57d47e81c8794a9a3594e080576788cc92324/src/compiler/scala/reflect/reify/phases/Reshape.scala (kod zdecydowanie użyłby czyszczenia, ale jest zbyt miłym przykładem, aby go zignorować). Zwróć uwagę na części 'super.transform' i' copyAttrs'. –

Powiązane problemy