# HG changeset patch # User Christian Humer # Date 1383596696 -3600 # Node ID d9c34e8337f43f802ba3787d0b42dbb6aa3dc20f # Parent 7f507f082daa6443e14c8e1fe246f0b842f1efe1 Truffle: cleanup of NodeUtil#findParent; added NodeUtil#findAllParents diff -r 7f507f082daa -r d9c34e8337f4 graal/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/NodeUtil.java --- a/graal/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/NodeUtil.java Mon Nov 04 16:12:48 2013 +0100 +++ b/graal/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/NodeUtil.java Mon Nov 04 21:24:56 2013 +0100 @@ -451,31 +451,44 @@ return null; } - @SuppressWarnings("unchecked") - public static T findParent(final Node start, final Class clazz) { - assert start != null; - if (clazz.isInstance(start.getParent())) { - return (T) start.getParent(); + public static T findParent(Node start, Class clazz) { + Node parent = start.getParent(); + if (parent == null) { + return null; + } else if (clazz.isInstance(parent)) { + return clazz.cast(parent); } else { - return start.getParent() != null ? findParent(start.getParent(), clazz) : null; + return findParent(parent, clazz); } } - @SuppressWarnings("unchecked") - public static I findParentInterface(final Node start, final Class clazz) { - assert start != null; - if (clazz.isInstance(start.getParent())) { - return (I) start.getParent(); - } else { - return (start.getParent() != null ? findParentInterface(start.getParent(), clazz) : null); + public static List findAllParents(Node start, Class clazz) { + List parents = new ArrayList<>(); + T parent = findParent(start, clazz); + while (parent != null) { + parents.add(parent); + parent = findParent((Node) parent, clazz); } + return parents; } - @SuppressWarnings("unchecked") + public static List collectNodes(Node parent, Node child) { + List nodes = new ArrayList<>(); + Node current = child; + while (current != null) { + nodes.add(current); + if (current == parent) { + return nodes; + } + current = current.getParent(); + } + throw new IllegalArgumentException("Node " + parent + " is not a parent of " + child + "."); + } + public static T findFirstNodeInstance(Node root, Class clazz) { for (Node childNode : findNodeChildren(root)) { if (clazz.isInstance(childNode)) { - return (T) childNode; + return clazz.cast(childNode); } else { T node = findFirstNodeInstance(childNode, clazz); if (node != null) {