Я создал небольшую программу, которая использует 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);
}
}