在Scala 2.10的抽象语法树中进行搜索

10

如何在Scala 2.10 AST中递归搜索元素?

这些树可能是power.trees(code)mirror.mkToolBox().parseExpr(code)的结果。 编辑。在2.10.0-RC1中,parseExpr已重命名为parse

我具体想要做的是通过方法名从给定类/对象代码中提取方法的代码,但我认为如果问题以更通用的方式表达,对其他人的帮助也会更大。

1个回答

5
也许您应该查看https://github.com/scala/scala/blob/2.10.x/src/reflect/scala/reflect/api/Trees.scala#L606,特别是Traverser类、Transformer类和替换方法(Tree.substituteSymbols, Tree.substituteTypesTree.substituteThis)。如果您想从树中提取一个方法,可以使用Traverser并重写traverse方法。在traverse方法中,检查节点是否与所需的方法匹配。如果匹配,您就完成了。如果不匹配,则调用super.traverse

1
链接的代码与主干相比已经相当过时了。这里是正确的链接:1)树形AST类:https://github.com/scala/scala/blob/2.10.x/src/library/scala/reflect/base/Trees.scala,2)转换器和遍历器:https://github.com/scala/scala/blob/2.10.x/src/reflect/scala/reflect/api/Trees.scala#L606 - Eugene Burmako
1
以下是一个变换器的示例:https://github.com/scala/scala/blob/46d57d47e81c8794a9a3594e080576788cc92324/src/compiler/scala/reflect/reify/phases/Reshape.scala(代码肯定需要整理,但这太好的示例以至于不能忽略它)。请注意 super.transformcopyAttrs 部分。 - Eugene Burmako
另外,“TreeSubstituter”在API中没有暴露。在适当的情况下,请使用“Tree.substituteSymbols”、“Tree.substituteTypes”或“Tree.substituteThis”(或编写自己的转换器)。 - Eugene Burmako
感谢您的建议,我已经相应地更新了我的答案。 - Kim Stebel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接