comparison graal/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/NodeUtil.java @ 12666:d9c34e8337f4

Truffle: cleanup of NodeUtil#findParent; added NodeUtil#findAllParents
author Christian Humer <christian.humer@gmail.com>
date Mon, 04 Nov 2013 21:24:56 +0100
parents be0a33a631fa
children 641f22b1c6b8
comparison
equal deleted inserted replaced
12663:7f507f082daa 12666:d9c34e8337f4
449 } 449 }
450 } 450 }
451 return null; 451 return null;
452 } 452 }
453 453
454 @SuppressWarnings("unchecked") 454 public static <T> T findParent(Node start, Class<T> clazz) {
455 public static <T extends Node> T findParent(final Node start, final Class<T> clazz) { 455 Node parent = start.getParent();
456 assert start != null; 456 if (parent == null) {
457 if (clazz.isInstance(start.getParent())) { 457 return null;
458 return (T) start.getParent(); 458 } else if (clazz.isInstance(parent)) {
459 return clazz.cast(parent);
459 } else { 460 } else {
460 return start.getParent() != null ? findParent(start.getParent(), clazz) : null; 461 return findParent(parent, clazz);
461 } 462 }
462 } 463 }
463 464
464 @SuppressWarnings("unchecked") 465 public static <T> List<T> findAllParents(Node start, Class<T> clazz) {
465 public static <I> I findParentInterface(final Node start, final Class<I> clazz) { 466 List<T> parents = new ArrayList<>();
466 assert start != null; 467 T parent = findParent(start, clazz);
467 if (clazz.isInstance(start.getParent())) { 468 while (parent != null) {
468 return (I) start.getParent(); 469 parents.add(parent);
469 } else { 470 parent = findParent((Node) parent, clazz);
470 return (start.getParent() != null ? findParentInterface(start.getParent(), clazz) : null); 471 }
471 } 472 return parents;
472 } 473 }
473 474
474 @SuppressWarnings("unchecked") 475 public static List<Node> collectNodes(Node parent, Node child) {
476 List<Node> nodes = new ArrayList<>();
477 Node current = child;
478 while (current != null) {
479 nodes.add(current);
480 if (current == parent) {
481 return nodes;
482 }
483 current = current.getParent();
484 }
485 throw new IllegalArgumentException("Node " + parent + " is not a parent of " + child + ".");
486 }
487
475 public static <T> T findFirstNodeInstance(Node root, Class<T> clazz) { 488 public static <T> T findFirstNodeInstance(Node root, Class<T> clazz) {
476 for (Node childNode : findNodeChildren(root)) { 489 for (Node childNode : findNodeChildren(root)) {
477 if (clazz.isInstance(childNode)) { 490 if (clazz.isInstance(childNode)) {
478 return (T) childNode; 491 return clazz.cast(childNode);
479 } else { 492 } else {
480 T node = findFirstNodeInstance(childNode, clazz); 493 T node = findFirstNodeInstance(childNode, clazz);
481 if (node != null) { 494 if (node != null) {
482 return node; 495 return node;
483 } 496 }