问题描述
Java 中如何从 JCTree (com.sun.tools.javac.tree.JCTree)
获取父树节点?
例如:
public class MyTreeTranslator extends TreeTranslator {
@Override
public void visitMethodDef(JCTree.JcmethodDecl jcmethodDecl) {
// get jcmethodDecl's parent tree
}
}
解决方法
你不能。树是单向的。唯一的策略是找到关联的“顶部” LABELS = [" Produzione " + postazione + " " + stazione + " "," Cycle time " + postazione + " " + stazione+ " "," Scarti " + postazione + " " + stazione+ " "," Avarie " + postazione + " " + stazione2+ " "," Stati " + postazione + " "]
checkbox_button_group = CheckboxButtonGroup(labels=LABELS,active=[0,0])
并递归遍历它(这需要很长时间),跟踪出身。然后当你找到 JCTree 时,你就有了父级。
-- 编辑 --
仔细观察你的代码段,你不必在这里重复它:完全去掉 JCCompilationUnit
;相反,为方法可以出现的每个位置编写一个 visitMethodDef
方法。目前,仅在类型定义中(visitX
,我认为)。 for-each 通过 each 中定义的所有方法 defs(这将需要一些 visitTypeDef(JCTree.JCTypeDecl)
创造力,或者使用参数化访问者对其调用 instanceof
)。
没办法,但在你的情况下,有很多方法可以找到父树。 因为java中唯一包含方法声明的树类型是类树。
- 只需覆盖
void visitClassDef(JCTree.JCClassDecl jcClassDecl)
。 - 使用
JavacTrees
的api
ProcessingEnvironment environment = ...
JavacTrees trees = JavacTrees.instance(environment);
// someElement get from the annotation processor
TreePath somePath = javacTrees.getPath(someElement);
// get compilation unit
CompilationUnitTree cu = somePath.getCompilationUnit();
// get the path of tree. the tree must attach to the compilation unit.
TreePath path = trees.getPath(cu,tree);
if (path != null) {
Element element = trees.getElement(path);
Element parentElement = element.getEnclosingElement();
// get tree of this parent element.
JCTree treeElement = trees.getTree(parentElement);
}
- 使用
sym
的JCMethodDecl
字段。这个字段实际上就是上面的parentElement
。但有时它可能为空。您可以使用TreeInfo.symbolOf
获取此字段。但是,如果您对 ast 进行了大量更改,则此 api 可能无法正常工作。