51 * </ul>
52 *
53 * <p>Here is an example to count the number of identifier nodes in a tree:
54 * <pre>
55 * class CountIdentifiers extends TreeScanner<Integer,Void> {
56 * {@literal @}Override
57 * public Integer visitIdentifier(IdentifierTree node, Void p) {
58 * return 1;
59 * }
60 * {@literal @}Override
61 * public Integer reduce(Integer r1, Integer r2) {
62 * return (r1 == null ? 0 : r1) + (r2 == null ? 0 : r2);
63 * }
64 * }
65 * </pre>
66 *
67 * @author Peter von der Ahé
68 * @author Jonathan Gibbons
69 * @since 1.6
70 */
71 public class TreeScanner<R,P> implements TreeVisitor<R,P> {
72
73 /** Scan a single node.
74 */
75 public R scan(Tree node, P p) {
76 return (node == null) ? null : node.accept(this, p);
77 }
78
79 private R scanAndReduce(Tree node, P p, R r) {
80 return reduce(scan(node, p), r);
81 }
82
83 /** Scan a list of nodes.
84 */
85 public R scan(Iterable<? extends Tree> nodes, P p) {
86 R r = null;
87 if (nodes != null) {
88 boolean first = true;
89 for (Tree node : nodes) {
90 r = (first ? scan(node, p) : scanAndReduce(node, p, r));
|
51 * </ul>
52 *
53 * <p>Here is an example to count the number of identifier nodes in a tree:
54 * <pre>
55 * class CountIdentifiers extends TreeScanner<Integer,Void> {
56 * {@literal @}Override
57 * public Integer visitIdentifier(IdentifierTree node, Void p) {
58 * return 1;
59 * }
60 * {@literal @}Override
61 * public Integer reduce(Integer r1, Integer r2) {
62 * return (r1 == null ? 0 : r1) + (r2 == null ? 0 : r2);
63 * }
64 * }
65 * </pre>
66 *
67 * @author Peter von der Ahé
68 * @author Jonathan Gibbons
69 * @since 1.6
70 */
71 @jdk.Supported
72 public class TreeScanner<R,P> implements TreeVisitor<R,P> {
73
74 /** Scan a single node.
75 */
76 public R scan(Tree node, P p) {
77 return (node == null) ? null : node.accept(this, p);
78 }
79
80 private R scanAndReduce(Tree node, P p, R r) {
81 return reduce(scan(node, p), r);
82 }
83
84 /** Scan a list of nodes.
85 */
86 public R scan(Iterable<? extends Tree> nodes, P p) {
87 R r = null;
88 if (nodes != null) {
89 boolean first = true;
90 for (Tree node : nodes) {
91 r = (first ? scan(node, p) : scanAndReduce(node, p, r));
|