1 /*
2 * Copyright (c) 2005, 2024, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26 package com.sun.source.util;
27
28 import com.sun.source.tree.*;
29
30 /**
31 * A TreeVisitor that visits all the child tree nodes.
32 * To visit nodes of a particular type, just override the
33 * corresponding visitXYZ method.
34 * Inside your method, call super.visitXYZ to visit descendant
35 * nodes.
36 *
37 * <p>Here is an example to count the number of identifier nodes in a tree:
38 * <pre>
39 * class CountIdentifiers extends TreeScanner<Integer,Void> {
40 * {@literal @}Override
41 * public Integer visitIdentifier(IdentifierTree node, Void p) {
42 * return 1;
43 * }
44 * {@literal @}Override
45 * public Integer reduce(Integer r1, Integer r2) {
46 * return (r1 == null ? 0 : r1) + (r2 == null ? 0 : r2);
47 * }
48 * }
49 * </pre>
50 *
51 * @implSpec
52 * <p>The default implementation of the visitXYZ methods will determine
53 * a result as follows:
54 * <ul>
55 * <li>If the node being visited has no children, the result will be {@code null}.
56 * <li>If the node being visited has one child, the result will be the
57 * result of calling {@code scan} with that child. The child may be a simple node
58 * or itself a list of nodes.
59 * <li>If the node being visited has more than one child, the result will
60 * be determined by calling {@code scan} with each child in turn, and then combining the
61 * result of each scan after the first with the cumulative result
62 * so far, as determined by the {@link #reduce} method. Each child may be either
63 * a simple node or a list of nodes. The default behavior of the {@code reduce}
64 * method is such that the result of the visitXYZ method will be the result of
65 * the last child scanned.
66 * </ul>
67 *
68 * @param <R> the return type of this visitor's methods. Use {@link
69 * Void} for visitors that do not need to return results.
70 * @param <P> the type of the additional parameter to this visitor's
71 * methods. Use {@code Void} for visitors that do not need an
72 * additional parameter.
73 *
74 * @author Peter von der Ahé
75 * @author Jonathan Gibbons
76 * @since 1.6
77 */
78 public class TreeScanner<R,P> implements TreeVisitor<R,P> {
79 /**
80 * Constructs a {@code TreeScanner}.
81 */
82 public TreeScanner() {}
83
84 /**
85 * Scans a single node.
86 * @param tree the node to be scanned
87 * @param p a parameter value passed to the visit method
88 * @return the result value from the visit method
89 */
90 public R scan(Tree tree, P p) {
91 return (tree == null) ? null : tree.accept(this, p);
92 }
93
94 private R scanAndReduce(Tree node, P p, R r) {
95 return reduce(scan(node, p), r);
96 }
97
98 /**
99 * Scans a sequence of nodes.
100 * @param nodes the nodes to be scanned
101 * @param p a parameter value to be passed to the visit method for each node
102 * @return the combined return value from the visit methods.
103 * The values are combined using the {@link #reduce reduce} method.
104 */
105 public R scan(Iterable<? extends Tree> nodes, P p) {
106 R r = null;
107 if (nodes != null) {
108 boolean first = true;
109 for (Tree node : nodes) {
110 r = (first ? scan(node, p) : scanAndReduce(node, p, r));
111 first = false;
112 }
113 }
114 return r;
115 }
116
117 private R scanAndReduce(Iterable<? extends Tree> nodes, P p, R r) {
118 return reduce(scan(nodes, p), r);
119 }
120
121 /**
122 * Reduces two results into a combined result.
123 * The default implementation is to return the first parameter.
124 * The general contract of the method is that it may take any action whatsoever.
125 * @param r1 the first of the values to be combined
126 * @param r2 the second of the values to be combined
127 * @return the result of combining the two parameters
128 */
129 public R reduce(R r1, R r2) {
130 return r1;
131 }
132
133
134 /* ***************************************************************************
135 * Visitor methods
136 ****************************************************************************/
137
138 /**
139 * {@inheritDoc}
140 *
141 * @implSpec This implementation scans the children in left to right order.
142 *
143 * @param node {@inheritDoc}
144 * @param p {@inheritDoc}
145 * @return the result of scanning
146 */
147 @Override
148 public R visitCompilationUnit(CompilationUnitTree node, P p) {
149 R r = scan(node.getPackage(), p);
150 r = scanAndReduce(node.getImports(), p, r);
151 r = scanAndReduce(node.getTypeDecls(), p, r);
152 r = scanAndReduce(node.getModule(), p, r);
153 return r;
154 }
155
156 /**
157 * {@inheritDoc}
158 *
159 * @implSpec This implementation scans the children in left to right order.
160 *
161 * @param node {@inheritDoc}
162 * @param p {@inheritDoc}
163 * @return the result of scanning
164 */
165 @Override
166 public R visitPackage(PackageTree node, P p) {
167 R r = scan(node.getAnnotations(), p);
168 r = scanAndReduce(node.getPackageName(), p, r);
169 return r;
170 }
171
172 /**
173 * {@inheritDoc}
174 *
175 * @implSpec This implementation scans the children in left to right order.
176 *
177 * @param node {@inheritDoc}
178 * @param p {@inheritDoc}
179 * @return the result of scanning
180 */
181 @Override
182 public R visitImport(ImportTree node, P p) {
183 return scan(node.getQualifiedIdentifier(), p);
184 }
185
186 /**
187 * {@inheritDoc}
188 *
189 * @implSpec This implementation scans the children in left to right order.
190 *
191 * @param node {@inheritDoc}
192 * @param p {@inheritDoc}
193 * @return the result of scanning
194 */
195 @Override
196 public R visitClass(ClassTree node, P p) {
197 R r = scan(node.getModifiers(), p);
198 r = scanAndReduce(node.getTypeParameters(), p, r);
199 r = scanAndReduce(node.getExtendsClause(), p, r);
200 r = scanAndReduce(node.getImplementsClause(), p, r);
201 r = scanAndReduce(node.getPermitsClause(), p, r);
202 r = scanAndReduce(node.getMembers(), p, r);
203 return r;
204 }
205
206 /**
207 * {@inheritDoc}
208 *
209 * @implSpec This implementation scans the children in left to right order.
210 *
211 * @param node {@inheritDoc}
212 * @param p {@inheritDoc}
213 * @return the result of scanning
214 */
215 @Override
216 public R visitMethod(MethodTree node, P p) {
217 R r = scan(node.getModifiers(), p);
218 r = scanAndReduce(node.getReturnType(), p, r);
219 r = scanAndReduce(node.getTypeParameters(), p, r);
220 r = scanAndReduce(node.getParameters(), p, r);
221 r = scanAndReduce(node.getReceiverParameter(), p, r);
222 r = scanAndReduce(node.getThrows(), p, r);
223 r = scanAndReduce(node.getBody(), p, r);
224 r = scanAndReduce(node.getDefaultValue(), p, r);
225 return r;
226 }
227
228 /**
229 * {@inheritDoc}
230 *
231 * @implSpec This implementation scans the children in left to right order.
232 *
233 * @param node {@inheritDoc}
234 * @param p {@inheritDoc}
235 * @return the result of scanning
236 */
237 @Override
238 public R visitVariable(VariableTree node, P p) {
239 R r = scan(node.getModifiers(), p);
240 r = scanAndReduce(node.getType(), p, r);
241 r = scanAndReduce(node.getNameExpression(), p, r);
242 r = scanAndReduce(node.getInitializer(), p, r);
243 return r;
244 }
245
246 /**
247 * {@inheritDoc}
248 *
249 * @implSpec This implementation returns {@code null}.
250 *
251 * @param node {@inheritDoc}
252 * @param p {@inheritDoc}
253 * @return the result of scanning
254 */
255 @Override
256 public R visitEmptyStatement(EmptyStatementTree node, P p) {
257 return null;
258 }
259
260 /**
261 * {@inheritDoc}
262 *
263 * @implSpec This implementation scans the children in left to right order.
264 *
265 * @param node {@inheritDoc}
266 * @param p {@inheritDoc}
267 * @return the result of scanning
268 */
269 @Override
270 public R visitBlock(BlockTree node, P p) {
271 return scan(node.getStatements(), p);
272 }
273
274 /**
275 * {@inheritDoc}
276 *
277 * @implSpec This implementation scans the children in left to right order.
278 *
279 * @param node {@inheritDoc}
280 * @param p {@inheritDoc}
281 * @return the result of scanning
282 */
283 @Override
284 public R visitDoWhileLoop(DoWhileLoopTree node, P p) {
285 R r = scan(node.getStatement(), p);
286 r = scanAndReduce(node.getCondition(), p, r);
287 return r;
288 }
289
290 /**
291 * {@inheritDoc}
292 *
293 * @implSpec This implementation scans the children in left to right order.
294 *
295 * @param node {@inheritDoc}
296 * @param p {@inheritDoc}
297 * @return the result of scanning
298 */
299 @Override
300 public R visitWhileLoop(WhileLoopTree node, P p) {
301 R r = scan(node.getCondition(), p);
302 r = scanAndReduce(node.getStatement(), p, r);
303 return r;
304 }
305
306 /**
307 * {@inheritDoc}
308 *
309 * @implSpec This implementation scans the children in left to right order.
310 *
311 * @param node {@inheritDoc}
312 * @param p {@inheritDoc}
313 * @return the result of scanning
314 */
315 @Override
316 public R visitForLoop(ForLoopTree node, P p) {
317 R r = scan(node.getInitializer(), p);
318 r = scanAndReduce(node.getCondition(), p, r);
319 r = scanAndReduce(node.getUpdate(), p, r);
320 r = scanAndReduce(node.getStatement(), p, r);
321 return r;
322 }
323
324 /**
325 * {@inheritDoc}
326 *
327 * @implSpec This implementation scans the children in left to right order.
328 *
329 * @param node {@inheritDoc}
330 * @param p {@inheritDoc}
331 * @return the result of scanning
332 */
333 @Override
334 public R visitEnhancedForLoop(EnhancedForLoopTree node, P p) {
335 R r = scan(node.getVariable(), p);
336 r = scanAndReduce(node.getExpression(), p, r);
337 r = scanAndReduce(node.getStatement(), p, r);
338 return r;
339 }
340
341 /**
342 * {@inheritDoc}
343 *
344 * @implSpec This implementation scans the children in left to right order.
345 *
346 * @param node {@inheritDoc}
347 * @param p {@inheritDoc}
348 * @return the result of scanning
349 */
350 @Override
351 public R visitLabeledStatement(LabeledStatementTree node, P p) {
352 return scan(node.getStatement(), p);
353 }
354
355 /**
356 * {@inheritDoc}
357 *
358 * @implSpec This implementation scans the children in left to right order.
359 *
360 * @param node {@inheritDoc}
361 * @param p {@inheritDoc}
362 * @return the result of scanning
363 */
364 @Override
365 public R visitSwitch(SwitchTree node, P p) {
366 R r = scan(node.getExpression(), p);
367 r = scanAndReduce(node.getCases(), p, r);
368 return r;
369 }
370
371 /**
372 * {@inheritDoc}
373 *
374 * @implSpec This implementation scans the children in left to right order.
375 *
376 * @param node {@inheritDoc}
377 * @param p {@inheritDoc}
378 * @return the result of scanning
379 *
380 * @since 14
381 */
382 @Override
383 public R visitSwitchExpression(SwitchExpressionTree node, P p) {
384 R r = scan(node.getExpression(), p);
385 r = scanAndReduce(node.getCases(), p, r);
386 return r;
387 }
388
389 /**
390 * {@inheritDoc}
391 *
392 * @implSpec This implementation scans the children in left to right order.
393 *
394 * @param node {@inheritDoc}
395 * @param p {@inheritDoc}
396 * @return the result of scanning
397 */
398 @Override
399 public R visitCase(CaseTree node, P p) {
400 R r = scan(node.getLabels(), p);
401 r = scanAndReduce(node.getGuard(), p, r);
402 if (node.getCaseKind() == CaseTree.CaseKind.RULE)
403 r = scanAndReduce(node.getBody(), p, r);
404 else
405 r = scanAndReduce(node.getStatements(), p, r);
406 return r;
407 }
408
409 /**
410 * {@inheritDoc}
411 *
412 * @implSpec This implementation scans the children in left to right order.
413 *
414 * @param node {@inheritDoc}
415 * @param p {@inheritDoc}
416 * @return the result of scanning
417 */
418 @Override
419 public R visitSynchronized(SynchronizedTree node, P p) {
420 R r = scan(node.getExpression(), p);
421 r = scanAndReduce(node.getBlock(), p, r);
422 return r;
423 }
424
425 /**
426 * {@inheritDoc}
427 *
428 * @implSpec This implementation scans the children in left to right order.
429 *
430 * @param node {@inheritDoc}
431 * @param p {@inheritDoc}
432 * @return the result of scanning
433 */
434 @Override
435 public R visitTry(TryTree node, P p) {
436 R r = scan(node.getResources(), p);
437 r = scanAndReduce(node.getBlock(), p, r);
438 r = scanAndReduce(node.getCatches(), p, r);
439 r = scanAndReduce(node.getFinallyBlock(), p, r);
440 return r;
441 }
442
443 /**
444 * {@inheritDoc}
445 *
446 * @implSpec This implementation scans the children in left to right order.
447 *
448 * @param node {@inheritDoc}
449 * @param p {@inheritDoc}
450 * @return the result of scanning
451 */
452 @Override
453 public R visitCatch(CatchTree node, P p) {
454 R r = scan(node.getParameter(), p);
455 r = scanAndReduce(node.getBlock(), p, r);
456 return r;
457 }
458
459 /**
460 * {@inheritDoc}
461 *
462 * @implSpec This implementation scans the children in left to right order.
463 *
464 * @param node {@inheritDoc}
465 * @param p {@inheritDoc}
466 * @return the result of scanning
467 */
468 @Override
469 public R visitConditionalExpression(ConditionalExpressionTree node, P p) {
470 R r = scan(node.getCondition(), p);
471 r = scanAndReduce(node.getTrueExpression(), p, r);
472 r = scanAndReduce(node.getFalseExpression(), p, r);
473 return r;
474 }
475
476 /**
477 * {@inheritDoc}
478 *
479 * @implSpec This implementation scans the children in left to right order.
480 *
481 * @param node {@inheritDoc}
482 * @param p {@inheritDoc}
483 * @return the result of scanning
484 */
485 @Override
486 public R visitIf(IfTree node, P p) {
487 R r = scan(node.getCondition(), p);
488 r = scanAndReduce(node.getThenStatement(), p, r);
489 r = scanAndReduce(node.getElseStatement(), p, r);
490 return r;
491 }
492
493 /**
494 * {@inheritDoc}
495 *
496 * @implSpec This implementation scans the children in left to right order.
497 *
498 * @param node {@inheritDoc}
499 * @param p {@inheritDoc}
500 * @return the result of scanning
501 */
502 @Override
503 public R visitExpressionStatement(ExpressionStatementTree node, P p) {
504 return scan(node.getExpression(), p);
505 }
506
507 /**
508 * {@inheritDoc}
509 *
510 * @implSpec This implementation returns {@code null}.
511 *
512 * @param node {@inheritDoc}
513 * @param p {@inheritDoc}
514 * @return the result of scanning
515 */
516 @Override
517 public R visitBreak(BreakTree node, P p) {
518 return null;
519 }
520
521 /**
522 * {@inheritDoc}
523 *
524 * @implSpec This implementation returns {@code null}.
525 *
526 * @param node {@inheritDoc}
527 * @param p {@inheritDoc}
528 * @return the result of scanning
529 */
530 @Override
531 public R visitContinue(ContinueTree node, P p) {
532 return null;
533 }
534
535 /**
536 * {@inheritDoc}
537 *
538 * @implSpec This implementation scans the children in left to right order.
539 *
540 * @param node {@inheritDoc}
541 * @param p {@inheritDoc}
542 * @return the result of scanning
543 */
544 @Override
545 public R visitReturn(ReturnTree node, P p) {
546 return scan(node.getExpression(), p);
547 }
548
549 /**
550 * {@inheritDoc}
551 *
552 * @implSpec This implementation scans the children in left to right order.
553 *
554 * @param node {@inheritDoc}
555 * @param p {@inheritDoc}
556 * @return the result of scanning
557 */
558 @Override
559 public R visitThrow(ThrowTree node, P p) {
560 return scan(node.getExpression(), p);
561 }
562
563 /**
564 * {@inheritDoc}
565 *
566 * @implSpec This implementation scans the children in left to right order.
567 *
568 * @param node {@inheritDoc}
569 * @param p {@inheritDoc}
570 * @return the result of scanning
571 */
572 @Override
573 public R visitAssert(AssertTree node, P p) {
574 R r = scan(node.getCondition(), p);
575 r = scanAndReduce(node.getDetail(), p, r);
576 return r;
577 }
578
579 /**
580 * {@inheritDoc}
581 *
582 * @implSpec This implementation scans the children in left to right order.
583 *
584 * @param node {@inheritDoc}
585 * @param p {@inheritDoc}
586 * @return the result of scanning
587 */
588 @Override
589 public R visitMethodInvocation(MethodInvocationTree node, P p) {
590 R r = scan(node.getTypeArguments(), p);
591 r = scanAndReduce(node.getMethodSelect(), p, r);
592 r = scanAndReduce(node.getArguments(), p, r);
593 return r;
594 }
595
596 /**
597 * {@inheritDoc}
598 *
599 * @implSpec This implementation scans the children in left to right order.
600 *
601 * @param node {@inheritDoc}
602 * @param p {@inheritDoc}
603 * @return the result of scanning
604 */
605 @Override
606 public R visitNewClass(NewClassTree node, P p) {
607 R r = scan(node.getEnclosingExpression(), p);
608 r = scanAndReduce(node.getIdentifier(), p, r);
609 r = scanAndReduce(node.getTypeArguments(), p, r);
610 r = scanAndReduce(node.getArguments(), p, r);
611 r = scanAndReduce(node.getClassBody(), p, r);
612 return r;
613 }
614
615 /**
616 * {@inheritDoc}
617 *
618 * @implSpec This implementation scans the children in left to right order.
619 *
620 * @param node {@inheritDoc}
621 * @param p {@inheritDoc}
622 * @return the result of scanning
623 */
624 @Override
625 public R visitNewArray(NewArrayTree node, P p) {
626 R r = scan(node.getType(), p);
627 r = scanAndReduce(node.getDimensions(), p, r);
628 r = scanAndReduce(node.getInitializers(), p, r);
629 r = scanAndReduce(node.getAnnotations(), p, r);
630 for (Iterable< ? extends Tree> dimAnno : node.getDimAnnotations()) {
631 r = scanAndReduce(dimAnno, p, r);
632 }
633 return r;
634 }
635
636 /**
637 * {@inheritDoc}
638 *
639 * @implSpec This implementation scans the children in left to right order.
640 *
641 * @param node {@inheritDoc}
642 * @param p {@inheritDoc}
643 * @return the result of scanning
644 */
645 @Override
646 public R visitLambdaExpression(LambdaExpressionTree node, P p) {
647 R r = scan(node.getParameters(), p);
648 r = scanAndReduce(node.getBody(), p, r);
649 return r;
650 }
651
652 /**
653 * {@inheritDoc}
654 *
655 * @implSpec This implementation scans the children in left to right order.
656 *
657 * @param node {@inheritDoc}
658 * @param p {@inheritDoc}
659 * @return the result of scanning
660 */
661 @Override
662 public R visitParenthesized(ParenthesizedTree node, P p) {
663 return scan(node.getExpression(), p);
664 }
665
666 /**
667 * {@inheritDoc}
668 *
669 * @implSpec This implementation scans the children in left to right order.
670 *
671 * @param node {@inheritDoc}
672 * @param p {@inheritDoc}
673 * @return the result of scanning
674 */
675 @Override
676 public R visitAssignment(AssignmentTree node, P p) {
677 R r = scan(node.getVariable(), p);
678 r = scanAndReduce(node.getExpression(), p, r);
679 return r;
680 }
681
682 /**
683 * {@inheritDoc}
684 *
685 * @implSpec This implementation scans the children in left to right order.
686 *
687 * @param node {@inheritDoc}
688 * @param p {@inheritDoc}
689 * @return the result of scanning
690 */
691 @Override
692 public R visitCompoundAssignment(CompoundAssignmentTree node, P p) {
693 R r = scan(node.getVariable(), p);
694 r = scanAndReduce(node.getExpression(), p, r);
695 return r;
696 }
697
698 /**
699 * {@inheritDoc}
700 *
701 * @implSpec This implementation scans the children in left to right order.
702 *
703 * @param node {@inheritDoc}
704 * @param p {@inheritDoc}
705 * @return the result of scanning
706 */
707 @Override
708 public R visitUnary(UnaryTree node, P p) {
709 return scan(node.getExpression(), p);
710 }
711
712 /**
713 * {@inheritDoc}
714 *
715 * @implSpec This implementation scans the children in left to right order.
716 *
717 * @param node {@inheritDoc}
718 * @param p {@inheritDoc}
719 * @return the result of scanning
720 */
721 @Override
722 public R visitBinary(BinaryTree node, P p) {
723 R r = scan(node.getLeftOperand(), p);
724 r = scanAndReduce(node.getRightOperand(), p, r);
725 return r;
726 }
727
728 /**
729 * {@inheritDoc}
730 *
731 * @implSpec This implementation scans the children in left to right order.
732 *
733 * @param node {@inheritDoc}
734 * @param p {@inheritDoc}
735 * @return the result of scanning
736 */
737 @Override
738 public R visitTypeCast(TypeCastTree node, P p) {
739 R r = scan(node.getType(), p);
740 r = scanAndReduce(node.getExpression(), p, r);
741 return r;
742 }
743
744 /**
745 * {@inheritDoc}
746 *
747 * @implSpec This implementation scans the children in left to right order.
748 *
749 * @param node {@inheritDoc}
750 * @param p {@inheritDoc}
751 * @return the result of scanning
752 */
753 @Override
754 public R visitInstanceOf(InstanceOfTree node, P p) {
755 R r = scan(node.getExpression(), p);
756 if (node.getPattern() != null) {
757 r = scanAndReduce(node.getPattern(), p, r);
758 } else {
759 r = scanAndReduce(node.getType(), p, r);
760 }
761 return r;
762 }
763
764 /**
765 * {@inheritDoc}
766 *
767 * @implSpec This implementation returns {@code null}.
768 *
769 * @param node {@inheritDoc}
770 * @param p {@inheritDoc}
771 * @return the result of scanning
772 * @since 21
773 */
774 @Override
775 public R visitAnyPattern(AnyPatternTree node, P p) {
776 return null;
777 }
778
779 /**
780 * {@inheritDoc}
781 *
782 * @implSpec This implementation scans the children in left to right order.
783 *
784 * @param node {@inheritDoc}
785 * @param p {@inheritDoc}
786 * @return the result of scanning
787 * @since 14
788 */
789 @Override
790 public R visitBindingPattern(BindingPatternTree node, P p) {
791 return scan(node.getVariable(), p);
792 }
793
794 /**
795 * {@inheritDoc}
796 *
797 * @implSpec This implementation returns {@code null}.
798 *
799 * @param node {@inheritDoc}
800 * @param p {@inheritDoc}
801 * @return the result of scanning
802 * @since 21
803 */
804 @Override
805 public R visitDefaultCaseLabel(DefaultCaseLabelTree node, P p) {
806 return null;
807 }
808
809 /**
810 * {@inheritDoc}
811 *
812 * @implSpec This implementation returns {@code null}.
813 *
814 * @param node {@inheritDoc}
815 * @param p {@inheritDoc}
816 * @return the result of scanning
817 * @since 21
818 */
819 @Override
820 public R visitConstantCaseLabel(ConstantCaseLabelTree node, P p) {
821 return scan(node.getConstantExpression(), p);
822 }
823
824 /**
825 * {@inheritDoc}
826 *
827 * @implSpec This implementation returns {@code null}.
828 *
829 * @param node {@inheritDoc}
830 * @param p {@inheritDoc}
831 * @return the result of scanning
832 * @since 21
833 */
834 @Override
835 public R visitPatternCaseLabel(PatternCaseLabelTree node, P p) {
836 return scan(node.getPattern(), p);
837 }
838
839 /**
840 * {@inheritDoc}
841 *
842 * @implSpec This implementation scans the children in left to right order.
843 *
844 * @param node {@inheritDoc}
845 * @param p {@inheritDoc}
846 * @return the result of scanning
847 * @since 21
848 */
849 @Override
850 public R visitDeconstructionPattern(DeconstructionPatternTree node, P p) {
851 R r = scan(node.getDeconstructor(), p);
852 r = scanAndReduce(node.getNestedPatterns(), p, r);
853 return r;
854 }
855
856 /**
857 * {@inheritDoc} This implementation scans the children in left to right order.
858 *
859 * @param node {@inheritDoc}
860 * @param p {@inheritDoc}
861 * @return the result of scanning
862 */
863 @Override
864 public R visitArrayAccess(ArrayAccessTree node, P p) {
865 R r = scan(node.getExpression(), p);
866 r = scanAndReduce(node.getIndex(), p, r);
867 return r;
868 }
869
870 /**
871 * {@inheritDoc}
872 *
873 * @implSpec This implementation scans the children in left to right order.
874 *
875 * @param node {@inheritDoc}
876 * @param p {@inheritDoc}
877 * @return the result of scanning
878 */
879 @Override
880 public R visitMemberSelect(MemberSelectTree node, P p) {
881 return scan(node.getExpression(), p);
882 }
883
884 /**
885 * {@inheritDoc}
886 *
887 * @implSpec This implementation scans the children in left to right order.
888 *
889 * @param node {@inheritDoc}
890 * @param p {@inheritDoc}
891 * @return the result of scanning
892 */
893 @Override
894 public R visitMemberReference(MemberReferenceTree node, P p) {
895 R r = scan(node.getQualifierExpression(), p);
896 r = scanAndReduce(node.getTypeArguments(), p, r);
897 return r;
898 }
899
900 /**
901 * {@inheritDoc}
902 *
903 * @implSpec This implementation returns {@code null}.
904 *
905 * @param node {@inheritDoc}
906 * @param p {@inheritDoc}
907 * @return the result of scanning
908 */
909 @Override
910 public R visitIdentifier(IdentifierTree node, P p) {
911 return null;
912 }
913
914 /**
915 * {@inheritDoc}
916 *
917 * @implSpec This implementation returns {@code null}.
918 *
919 * @param node {@inheritDoc}
920 * @param p {@inheritDoc}
921 * @return the result of scanning
922 */
923 @Override
924 public R visitLiteral(LiteralTree node, P p) {
925 return null;
926 }
927
928 /**
929 * {@inheritDoc}
930 *
931 * @implSpec This implementation returns {@code null}.
932 *
933 * @param node {@inheritDoc}
934 * @param p {@inheritDoc}
935 * @return the result of scanning
936 */
937 @Override
938 public R visitPrimitiveType(PrimitiveTypeTree node, P p) {
939 return null;
940 }
941
942 /**
943 * {@inheritDoc}
944 *
945 * @implSpec This implementation scans the children in left to right order.
946 *
947 * @param node {@inheritDoc}
948 * @param p {@inheritDoc}
949 * @return the result of scanning
950 */
951 @Override
952 public R visitArrayType(ArrayTypeTree node, P p) {
953 return scan(node.getType(), p);
954 }
955
956 /**
957 * {@inheritDoc}
958 *
959 * @implSpec This implementation scans the children in left to right order.
960 *
961 * @param node {@inheritDoc}
962 * @param p {@inheritDoc}
963 * @return the result of scanning
964 */
965 @Override
966 public R visitParameterizedType(ParameterizedTypeTree node, P p) {
967 R r = scan(node.getType(), p);
968 r = scanAndReduce(node.getTypeArguments(), p, r);
969 return r;
970 }
971
972 /**
973 * {@inheritDoc}
974 *
975 * @implSpec This implementation scans the children in left to right order.
976 *
977 * @param node {@inheritDoc}
978 * @param p {@inheritDoc}
979 * @return the result of scanning
980 */
981 @Override
982 public R visitUnionType(UnionTypeTree node, P p) {
983 return scan(node.getTypeAlternatives(), p);
984 }
985
986 /**
987 * {@inheritDoc}
988 *
989 * @implSpec This implementation scans the children in left to right order.
990 *
991 * @param node {@inheritDoc}
992 * @param p {@inheritDoc}
993 * @return the result of scanning
994 */
995 @Override
996 public R visitIntersectionType(IntersectionTypeTree node, P p) {
997 return scan(node.getBounds(), p);
998 }
999
1000 /**
1001 * {@inheritDoc}
1002 *
1003 * @implSpec This implementation scans the children in left to right order.
1004 *
1005 * @param node {@inheritDoc}
1006 * @param p {@inheritDoc}
1007 * @return the result of scanning
1008 */
1009 @Override
1010 public R visitTypeParameter(TypeParameterTree node, P p) {
1011 R r = scan(node.getAnnotations(), p);
1012 r = scanAndReduce(node.getBounds(), p, r);
1013 return r;
1014 }
1015
1016 /**
1017 * {@inheritDoc}
1018 *
1019 * @implSpec This implementation scans the children in left to right order.
1020 *
1021 * @param node {@inheritDoc}
1022 * @param p {@inheritDoc}
1023 * @return the result of scanning
1024 */
1025 @Override
1026 public R visitWildcard(WildcardTree node, P p) {
1027 return scan(node.getBound(), p);
1028 }
1029
1030 /**
1031 * {@inheritDoc}
1032 *
1033 * @implSpec This implementation scans the children in left to right order.
1034 *
1035 * @param node {@inheritDoc}
1036 * @param p {@inheritDoc}
1037 * @return the result of scanning
1038 */
1039 @Override
1040 public R visitModifiers(ModifiersTree node, P p) {
1041 return scan(node.getAnnotations(), p);
1042 }
1043
1044 /**
1045 * {@inheritDoc}
1046 *
1047 * @implSpec This implementation scans the children in left to right order.
1048 *
1049 * @param node {@inheritDoc}
1050 * @param p {@inheritDoc}
1051 * @return the result of scanning
1052 */
1053 @Override
1054 public R visitAnnotation(AnnotationTree node, P p) {
1055 R r = scan(node.getAnnotationType(), p);
1056 r = scanAndReduce(node.getArguments(), p, r);
1057 return r;
1058 }
1059
1060 /**
1061 * {@inheritDoc}
1062 *
1063 * @implSpec This implementation scans the children in left to right order.
1064 *
1065 * @param node {@inheritDoc}
1066 * @param p {@inheritDoc}
1067 * @return the result of scanning
1068 */
1069 @Override
1070 public R visitAnnotatedType(AnnotatedTypeTree node, P p) {
1071 R r = scan(node.getAnnotations(), p);
1072 r = scanAndReduce(node.getUnderlyingType(), p, r);
1073 return r;
1074 }
1075
1076 /**
1077 * {@inheritDoc}
1078 *
1079 * @implSpec This implementation scans the children in left to right order.
1080 *
1081 * @param node {@inheritDoc}
1082 * @param p {@inheritDoc}
1083 * @return the result of scanning
1084 */
1085 @Override
1086 public R visitModule(ModuleTree node, P p) {
1087 R r = scan(node.getAnnotations(), p);
1088 r = scanAndReduce(node.getName(), p, r);
1089 r = scanAndReduce(node.getDirectives(), p, r);
1090 return r;
1091 }
1092
1093 /**
1094 * {@inheritDoc}
1095 *
1096 * @implSpec This implementation scans the children in left to right order.
1097 *
1098 * @param node {@inheritDoc}
1099 * @param p {@inheritDoc}
1100 * @return the result of scanning
1101 */
1102 @Override
1103 public R visitExports(ExportsTree node, P p) {
1104 R r = scan(node.getPackageName(), p);
1105 r = scanAndReduce(node.getModuleNames(), p, r);
1106 return r;
1107 }
1108
1109 /**
1110 * {@inheritDoc}
1111 *
1112 * @implSpec This implementation scans the children in left to right order.
1113 *
1114 * @param node {@inheritDoc}
1115 * @param p {@inheritDoc}
1116 * @return the result of scanning
1117 */
1118 @Override
1119 public R visitOpens(OpensTree node, P p) {
1120 R r = scan(node.getPackageName(), p);
1121 r = scanAndReduce(node.getModuleNames(), p, r);
1122 return r;
1123 }
1124
1125 /**
1126 * {@inheritDoc}
1127 *
1128 * @implSpec This implementation scans the children in left to right order.
1129 *
1130 * @param node {@inheritDoc}
1131 * @param p {@inheritDoc}
1132 * @return the result of scanning
1133 */
1134 @Override
1135 public R visitProvides(ProvidesTree node, P p) {
1136 R r = scan(node.getServiceName(), p);
1137 r = scanAndReduce(node.getImplementationNames(), p, r);
1138 return r;
1139 }
1140
1141 /**
1142 * {@inheritDoc}
1143 *
1144 * @implSpec This implementation scans the children in left to right order.
1145 *
1146 * @param node {@inheritDoc}
1147 * @param p {@inheritDoc}
1148 * @return the result of scanning
1149 */
1150 @Override
1151 public R visitRequires(RequiresTree node, P p) {
1152 return scan(node.getModuleName(), p);
1153 }
1154
1155 /**
1156 * {@inheritDoc}
1157 *
1158 * @implSpec This implementation scans the children in left to right order.
1159 *
1160 * @param node {@inheritDoc}
1161 * @param p {@inheritDoc}
1162 * @return the result of scanning
1163 */
1164 @Override
1165 public R visitUses(UsesTree node, P p) {
1166 return scan(node.getServiceName(), p);
1167 }
1168
1169 /**
1170 * {@inheritDoc}
1171 *
1172 * @implSpec This implementation returns {@code null}.
1173 *
1174 * @param node {@inheritDoc}
1175 * @param p {@inheritDoc}
1176 * @return the result of scanning
1177 */
1178 @Override
1179 public R visitOther(Tree node, P p) {
1180 return null;
1181 }
1182
1183 /**
1184 * {@inheritDoc}
1185 *
1186 * @implSpec This implementation returns {@code null}.
1187 *
1188 * @param node {@inheritDoc}
1189 * @param p {@inheritDoc}
1190 * @return the result of scanning
1191 */
1192 @Override
1193 public R visitErroneous(ErroneousTree node, P p) {
1194 return null;
1195 }
1196
1197 /**
1198 * {@inheritDoc}
1199 *
1200 * @implSpec This implementation scans the children in left to right order.
1201 *
1202 * @param node {@inheritDoc}
1203 * @param p {@inheritDoc}
1204 * @return the result of scanning
1205 *
1206 * @since 14
1207 */
1208 @Override
1209 public R visitYield(YieldTree node, P p) {
1210 return scan(node.getValue(), p);
1211 }
1212 }