java - 用JavaParser解析Java代码,找到父节点的语句类型

标签 java nodes statements javaparser

我制作了一个使用JavaParser的小程序[1]解析 Java 代码并识别代码中出现的语句类型。这已成功实现。接下来我想做的(有点棘手)是找到 if-statement 的父节点。 ,并检查父节点的第一条语句是否为 while-loop 。确认上面的说法属实后,我也想查一下这个if-statement是不是是父节点的最后一个子节点。

下面是上述描述的示例:

void example() {
    int x = 1;
    int y = 1;
    while (y < 3) {
        while (x < 4) {
            x++;                
        }
        if (y < 5) {
            y++;  
        }
    }
    x = 0;
}

解析上述代码时我遇到的主要问题是如何获取 if (y < 5 ) 的父节点是 while-loop ( while (y < 3) ),其次,这可能更棘手,是如何识别 if-statement此示例的最后一条语句是我们跳回父级 loop 之前的最后一条语句。 。还有y++;里面if但如果 if 的条件可能会被跳过不正确,所以我不想将其视为父节点的最后一个子节点。我相信我应该做的是检查最后一个“邻居”?我所说的邻居是指第二个while之间的关系和 if在这个例子中,即它们处于同一级别。

到目前为止我的想法已实现:

//find if the if-statement has a parent node
if (currIf.getParentNode().isPresent()) {
    //find if the parent Node is a While loop
    Optional<Node> parent = currIf.getParentNode();
    parent.get().getBegin();
}

通过上面的代码,我可以检查 if-statement 是否有一个父节点,我可以找到第一个 while 的位置但我不知道如何确认它是while statement并实现第二个描述的部分。

更新:

我设法找到如何检查父级是否是 while-loop目前正在尝试找到如何识别 if-statement 的解决方案已是最后一个statement其级别(或层次结构,如果您愿意)。

Optional<WhileStmt> ifParent = currIf.findAncestor(WhileStmt.class);
//find if the if-statement has a parent node
if (ifParent.isPresent()) {
//find if the parent Node is a While loop
        Optional<Node> sameNode = ifParent.get().findFirst(Node.class, n -> n == currIf);
        if (sameNode.isPresent()) {
            System.out.println(sameNode);
        }
}

最佳答案

如果我理解正确的话,您的更新可能会给出错误的结果。是的,如果 WhileStmt 是父级,您的解决方案就可以工作,但它也可以为您提供一个位于树上更远位置的 WhileStmt

为什么你不能做如下的事情?

 boolean parentIsWhileLoop = ifStmtNode.getParent() instanceof WhileStmt;

要确定 ifStmt 是否是最后一个节点,您可以这样做

 Node ifStmtParent = ifStmt.getParent();
 List<Node> ifStmtSibilings = ifStmtParent.getChildNodes();
 Node lastNode = ifStmtSiblings.get(ifStmtSiblings.size() - 1);
 boolean ifStmtIsLast = lastNode == ifStmt;

关于java - 用JavaParser解析Java代码,找到父节点的语句类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60414538/

相关文章:

css 的 Jquery 条件语句?

javascript - 如何根据字段值设置标志 true/false?

java - 将 CDT 时间转换为我的本地时间

java - 我们如何在编译时访问 ByteBuddy 生成的方法?

java - 递归计算中偶发的StackOverflowError

java - 在java上绘制图形

c - 不知道为什么我在这里遇到段错误

java - 在 Java 中使用 JDBC 向用户 ORACLE 授予角色

c - 删除节点时出现无限循环

python - 为什么这个 python if 语句不等于 true?