如何从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中唯一包含方法声明的树类型是类树。

  1. 只需覆盖 void visitClassDef(JCTree.JCClassDecl jcClassDecl)
  2. 使用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);
}
  1. 使用 symJCMethodDecl 字段。这个字段实际上就是上面的parentElement。但有时它可能为空。您可以使用 TreeInfo.symbolOf 获取此字段。但是,如果您对 ast 进行了大量更改,则此 api 可能无法正常工作。