使用Compiler Tree API解析if else语句

时间:2015-03-26 15:06:29

标签: java netbeans abstract-syntax-tree netbeans-platform

我正在尝试使用Tree API找到一种在netbeans中解析java代码源的方法,我通过这个guide学习了如何访问高级语言元素(类,方法,字段......)。 / p>

我正在寻找的是一种解析if语句(开始)的方法,因为我之后尝试将替换类型代码与状态策略重构。得到if条件对我来说非常重要。任何帮助都将深表感谢。

1 个答案:

答案 0 :(得分:0)

在深入了解编译器树API文档后,我发现如何在我的案例中访问低级代码所选if语句的条件,这里是一段代码片段

  @Override
    public Void visitIf(IfTree node, Void p) {
        try {
            JTextComponent editor = EditorRegistry.lastFocusedComponent();
            if (editor.getDocument() == info.getDocument()) {
                InputOutput io = IOProvider.getDefault().getIO("Analysis of " + info.getFileObject().getName(),
                        true);
                ExpressionTree exTree = node.getCondition();
                if (exTree.getKind() == Tree.Kind.PARENTHESIZED) {
                    ParenthesizedTree parTree = (ParenthesizedTree) exTree;
                    BinaryTree conditionTree = (BinaryTree) parTree.getExpression();
                    ExpressionTree identTree = conditionTree.getLeftOperand();
                    if (identTree.getKind() == Tree.Kind.IDENTIFIER) {
                        Name name = ((IdentifierTree) identTree).getName();
                        io.getOut().println("Hurray, this is the name of the identifier in the left operand: " + name.toString());
                    }


           io.getOut().close();
                }
            } catch (IOException ex) {
                Exceptions.printStackTrace(ex);
            }
            return null;        
}

值得庆幸的是,代码命名很直观,否则文档没什么帮助。使用println进行调试对于了解接下来要处理的树类非常有用。