# HG changeset patch # User Christian Humer # Date 1383596719 -3600 # Node ID bee224687003cc562efad899f6a495d2cbf174a5 # Parent d9c34e8337f43f802ba3787d0b42dbb6aa3dc20f# Parent 9db9e37ee4b8f779574aa56d59eed65b21c70621 Merge. diff -r 9db9e37ee4b8 -r bee224687003 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 17:18:28 2013 +0100 +++ b/graal/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/NodeUtil.java Mon Nov 04 21:25:19 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) {