如何解决如何从Java中的JCTree获取父树对象?
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 可能无法正常工作。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。