Разобрать код Java с помощью JavaParser и найти тип оператора родительских узлов - PullRequest
0 голосов
/ 26 февраля 2020

Я создал небольшую программу, которая использует 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 последним * 1037. * его уровня (или иерархии, если вы предпочитаете).

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);
        }
}

1 Ответ

0 голосов
/ 05 марта 2020

Ваше обновление может дать вам неправильный результат, если я правильно понимаю. Да, ваше решение будет работать, если 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...