aboutsummaryrefslogtreecommitdiff
path: root/javaparser-core/src/main
diff options
context:
space:
mode:
authorDanny van Bruggen <hexagonaal@gmail.com>2017-10-21 14:31:05 +0200
committerDanny van Bruggen <hexagonaal@gmail.com>2017-10-21 14:31:05 +0200
commitb8bb086861be5513f2ba7994d2b00721781faf73 (patch)
treea992ed34af930073e4a6b7230da2411af4e4538c /javaparser-core/src/main
parentc7311b576dc5c513cbffa19aa8f19f23b6b29efe (diff)
downloadjavaparser-b8bb086861be5513f2ba7994d2b00721781faf73.tar.gz
Add upwards and direct-children-only traversal
Diffstat (limited to 'javaparser-core/src/main')
-rw-r--r--javaparser-core/src/main/java/com/github/javaparser/ast/Node.java6
-rw-r--r--javaparser-core/src/main/java/com/github/javaparser/ast/visitor/TreeVisitor.java60
2 files changed, 65 insertions, 1 deletions
diff --git a/javaparser-core/src/main/java/com/github/javaparser/ast/Node.java b/javaparser-core/src/main/java/com/github/javaparser/ast/Node.java
index 4168fccb8..9996cccf9 100644
--- a/javaparser-core/src/main/java/com/github/javaparser/ast/Node.java
+++ b/javaparser-core/src/main/java/com/github/javaparser/ast/Node.java
@@ -686,7 +686,7 @@ public abstract class Node implements Cloneable, HasParentNode<Node>, Visitable,
public enum TreeTraversal {
- PREORDER, BREADTHFIRST, POSTORDER
+ PREORDER, BREADTHFIRST, POSTORDER, PARENTS, DIRECT_CHILDREN
}
public Iterator<Node> treeIterator(TreeTraversal traversal) {
@@ -697,6 +697,10 @@ public abstract class Node implements Cloneable, HasParentNode<Node>, Visitable,
return new TreeVisitor.PostOrderIterator(this);
case PREORDER:
return new TreeVisitor.PreOrderIterator(this);
+ case DIRECT_CHILDREN:
+ return new TreeVisitor.DirectChildrenIterator(this);
+ case PARENTS:
+ return new TreeVisitor.ParentsVisitor(this);
default:
throw new IllegalArgumentException("Unknown traversal choice.");
}
diff --git a/javaparser-core/src/main/java/com/github/javaparser/ast/visitor/TreeVisitor.java b/javaparser-core/src/main/java/com/github/javaparser/ast/visitor/TreeVisitor.java
index 9d1222126..89d4ce843 100644
--- a/javaparser-core/src/main/java/com/github/javaparser/ast/visitor/TreeVisitor.java
+++ b/javaparser-core/src/main/java/com/github/javaparser/ast/visitor/TreeVisitor.java
@@ -65,6 +65,47 @@ public abstract class TreeVisitor {
}
}
+ public static class DirectChildrenIterator implements Iterator<Node> {
+ private final Iterator<Node> childrenIterator;
+
+ public DirectChildrenIterator(Node node) {
+ childrenIterator = new ArrayList<>(node.getChildNodes()).iterator();
+ }
+
+ @Override
+ public boolean hasNext() {
+ return childrenIterator.hasNext();
+ }
+
+ @Override
+ public Node next() {
+ return childrenIterator.next();
+ }
+ }
+
+ /**
+ * Iterates over the parent of the node, then the parent's parent, then the parent's parent's parent, until running
+ * out of parents.
+ */
+ public static class ParentsVisitor implements Iterator<Node> {
+ private Node node;
+
+ public ParentsVisitor(Node node) {
+ this.node = node;
+ }
+
+ @Override
+ public boolean hasNext() {
+ return node.getParentNode().isPresent();
+ }
+
+ @Override
+ public Node next() {
+ node = node.getParentNode().orElse(null);
+ return node;
+ }
+ }
+
public static class PreOrderIterator implements Iterator<Node> {
private final Stack<Node> stack = new Stack<>();
@@ -178,6 +219,25 @@ public abstract class TreeVisitor {
}
/**
+ * Calls "process" for each direct child node of "node"
+ *
+ * @param node the parent node.
+ */
+ public void visitDirectChildren(Node node) {
+ new DirectChildrenIterator(node).forEachRemaining(this::process);
+ }
+
+ /**
+ * Calls "process" for the parent of "node", then the parent's parent, then the parent's parent's parent, until
+ * running out of parents. <br/>Note that "node" itself is not processed.
+ *
+ * @param node the start node.
+ */
+ public void visitParents(Node node) {
+ new ParentsVisitor(node).forEachRemaining(this::process);
+ }
+
+ /**
* Process the given node.
*
* @param node The current node to process.