Mercurial > hg > truffle
comparison graal/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/NodeUtil.java @ 19607:73811d1b4cd0
Truffle: add NodeUtil.forEachChild
author | Andreas Woess <andreas.woess@oracle.com> |
---|---|
date | Fri, 27 Feb 2015 14:57:27 +0100 |
parents | 67d9e635102f |
children | f682b9e6ca07 |
comparison
equal
deleted
inserted
replaced
19606:d344d76b7b6d | 19607:73811d1b4cd0 |
---|---|
694 } | 694 } |
695 } | 695 } |
696 return false; | 696 return false; |
697 } | 697 } |
698 | 698 |
699 /** | |
700 * Executes a closure for every non-null child of the parent node. | |
701 * | |
702 * @return {@code true} if all children were visited, {@code false} otherwise | |
703 */ | |
704 public static boolean forEachChild(Node parent, NodeVisitor visitor) { | |
705 Objects.requireNonNull(visitor); | |
706 NodeClass parentNodeClass = NodeClass.get(parent.getClass()); | |
707 | |
708 for (NodeField field : parentNodeClass.getChildFields()) { | |
709 Object child = field.getObject(parent); | |
710 if (child != null) { | |
711 if (!visitor.visit((Node) child)) { | |
712 return false; | |
713 } | |
714 } | |
715 } | |
716 | |
717 for (NodeField field : parentNodeClass.getChildrenFields()) { | |
718 Object arrayObject = field.getObject(parent); | |
719 if (arrayObject != null) { | |
720 Object[] array = (Object[]) arrayObject; | |
721 for (int i = 0; i < array.length; i++) { | |
722 Object child = array[i]; | |
723 if (child != null) { | |
724 if (!visitor.visit((Node) child)) { | |
725 return false; | |
726 } | |
727 } | |
728 } | |
729 } | |
730 } | |
731 | |
732 return true; | |
733 } | |
734 | |
699 /** Returns all declared fields in the class hierarchy. */ | 735 /** Returns all declared fields in the class hierarchy. */ |
700 private static Field[] getAllFields(Class<? extends Object> clazz) { | 736 private static Field[] getAllFields(Class<? extends Object> clazz) { |
701 Field[] declaredFields = clazz.getDeclaredFields(); | 737 Field[] declaredFields = clazz.getDeclaredFields(); |
702 if (clazz.getSuperclass() != null) { | 738 if (clazz.getSuperclass() != null) { |
703 return concat(getAllFields(clazz.getSuperclass()), declaredFields); | 739 return concat(getAllFields(clazz.getSuperclass()), declaredFields); |