使用JavaParser解析Java代码并找到父节点的语句类型

问题描述 投票:0回答:1

我制作了一个小程序,它使用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-loopwhile (y < 3)),其次,可能更棘手的是如何识别此示例的if-statement是我们跳回到父级loop之前的最后一条语句。 y++;内部也有if,但是如果if的条件不成立,则可能会跳过它,因此我不想将其视为父节点的最后一个子节点。我相信我应该做的是检查最后一个“邻居”?邻居的意思是该示例的第二个whileif之间的关系,即它们处于同一级别。

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

//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);
        }
}
java nodes statements javaparser
1个回答
0
投票

如果我正确理解,您的更新可能会给您错误的结果。是的,如果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;
© www.soinside.com 2019 - 2024. All rights reserved.