Mercurial > hg > graal-jvmci-8
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 } |