2012-08-25 22 views
10

¿Cuál es la mejor forma de buscar recursivamente un elemento en scala 2.10 ASTs?Búsqueda dentro de scala 2.10 ASTs

Los árboles podrían ser el resultado de power.trees(code) o mirror.mkToolBox().parseExpr(code) Editar. En 2.10.0-RC1 parseExpr se ha cambiado el nombre a parse.

El caso de uso concreto que tengo es extraer el código de un método de un código de clase/objeto dado por nombre de método, pero supongo que la pregunta sería más relevante para otros si se formula de una manera más genérica .

Respuesta

5

tal vez debería echar un vistazo a https://github.com/scala/scala/blob/2.10.x/src/reflect/scala/reflect/api/Trees.scala#L606, especialmente en las clases Traverser, el transformador y los métodos de sustitución (Tree.substituteSymbols, Tree.substituteTypes o Tree.substituteThis). Si desea extraer un método de un árbol, puede usar un Traverser y anular el método traverse. En el método de recorrido, verifica si el nodo coincide con el método que desea. Si es así, has terminado. Si no, llame al super.traverse.

+1

El código vinculado es bastante obsoleto en comparación con el enlace troncal. Aquí están los enlaces correctos: 1) árbol clases AST: https://github.com/scala/scala/blob/2.10.x/src/library/scala/reflect/base/Trees.scala, 2) transformadores y travelling: https://github.com/scala/scala/blob/2.10.x/src/reflect/scala/reflect/api/Trees.scala#L606 –

+0

Vaya, gracias ... –

+1

Aquí hay un ejemplo de un transformador: https://github.com/scala/scala/blob/46d57d47e81c8794a9a3594e080576788cc92324/src/compiler/scala/reflect/reify/phases/Reshape.scala (el código definitivamente usaría una limpieza, pero es demasiado lindo como para ignorarlo). Tenga en cuenta las partes 'super.transform' y' copyAttrs'. –

Cuestiones relacionadas