1 /*
2  * Copyright (c) 2005, 2019, 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.tree;
27 
28 import jdk.internal.javac.PreviewFeature;
29 
30 /**
31  * A visitor of trees, in the style of the visitor design pattern.
32  * Classes implementing this interface are used to operate
33  * on a tree when the kind of tree is unknown at compile time.
34  * When a visitor is passed to an tree's {@link Tree#accept
35  * accept} method, the <code>visit<i>Xyz</i></code> method most applicable
36  * to that tree is invoked.
37  *
38  * <p> Classes implementing this interface may or may not throw a
39  * {@code NullPointerException} if the additional parameter {@code p}
40  * is {@code null}; see documentation of the implementing class for
41  * details.
42  *
43  * <p> <b>WARNING:</b> It is possible that methods will be added to
44  * this interface to accommodate new, currently unknown, language
45  * structures added to future versions of the Java programming
46  * language.  Therefore, visitor classes directly implementing this
47  * interface may be source incompatible with future versions of the
48  * platform.
49  *
50  * @param <R> the return type of this visitor's methods.  Use {@link
51  *            Void} for visitors that do not need to return results.
52  * @param <P> the type of the additional parameter to this visitor's
53  *            methods.  Use {@code Void} for visitors that do not need an
54  *            additional parameter.
55  *
56  * @author Peter von der Ah&eacute;
57  * @author Jonathan Gibbons
58  *
59  * @since 1.6
60  */
61 public interface TreeVisitor<R,P> {
62     /**
63      * Visits an AnnotatedTypeTree node.
64      * @param node the node being visited
65      * @param p a parameter value
66      * @return a result value
67      */
visitAnnotatedType(AnnotatedTypeTree node, P p)68     R visitAnnotatedType(AnnotatedTypeTree node, P p);
69 
70     /**
71      * Visits an AnnotatedTree node.
72      * @param node the node being visited
73      * @param p a parameter value
74      * @return a result value
75      */
visitAnnotation(AnnotationTree node, P p)76     R visitAnnotation(AnnotationTree node, P p);
77 
78     /**
79      * Visits a MethodInvocationTree node.
80      * @param node the node being visited
81      * @param p a parameter value
82      * @return a result value
83      */
visitMethodInvocation(MethodInvocationTree node, P p)84     R visitMethodInvocation(MethodInvocationTree node, P p);
85 
86     /**
87      * Visits an AssertTree node.
88      * @param node the node being visited
89      * @param p a parameter value
90      * @return a result value
91      */
visitAssert(AssertTree node, P p)92     R visitAssert(AssertTree node, P p);
93 
94     /**
95      * Visits an AssignmentTree node.
96      * @param node the node being visited
97      * @param p a parameter value
98      * @return a result value
99      */
visitAssignment(AssignmentTree node, P p)100     R visitAssignment(AssignmentTree node, P p);
101 
102     /**
103      * Visits a CompoundAssignmentTree node.
104      * @param node the node being visited
105      * @param p a parameter value
106      * @return a result value
107      */
visitCompoundAssignment(CompoundAssignmentTree node, P p)108     R visitCompoundAssignment(CompoundAssignmentTree node, P p);
109 
110     /**
111      * Visits a BinaryTree node.
112      * @param node the node being visited
113      * @param p a parameter value
114      * @return a result value
115      */
visitBinary(BinaryTree node, P p)116     R visitBinary(BinaryTree node, P p);
117 
118     /**
119      * Visits a BlockTree node.
120      * @param node the node being visited
121      * @param p a parameter value
122      * @return a result value
123      */
visitBlock(BlockTree node, P p)124     R visitBlock(BlockTree node, P p);
125 
126     /**
127      * Visits a BreakTree node.
128      * @param node the node being visited
129      * @param p a parameter value
130      * @return a result value
131      */
visitBreak(BreakTree node, P p)132     R visitBreak(BreakTree node, P p);
133 
134     /**
135      * Visits a CaseTree node.
136      * @param node the node being visited
137      * @param p a parameter value
138      * @return a result value
139      */
visitCase(CaseTree node, P p)140     R visitCase(CaseTree node, P p);
141 
142     /**
143      * Visits a CatchTree node.
144      * @param node the node being visited
145      * @param p a parameter value
146      * @return a result value
147      */
visitCatch(CatchTree node, P p)148     R visitCatch(CatchTree node, P p);
149 
150     /**
151      * Visits a ClassTree node.
152      * @param node the node being visited
153      * @param p a parameter value
154      * @return a result value
155      */
visitClass(ClassTree node, P p)156     R visitClass(ClassTree node, P p);
157 
158     /**
159      * Visits a ConditionalExpressionTree node.
160      * @param node the node being visited
161      * @param p a parameter value
162      * @return a result value
163      */
visitConditionalExpression(ConditionalExpressionTree node, P p)164     R visitConditionalExpression(ConditionalExpressionTree node, P p);
165 
166     /**
167      * Visits a ContinueTree node.
168      * @param node the node being visited
169      * @param p a parameter value
170      * @return a result value
171      */
visitContinue(ContinueTree node, P p)172     R visitContinue(ContinueTree node, P p);
173 
174     /**
175      * Visits a DoWhileTree node.
176      * @param node the node being visited
177      * @param p a parameter value
178      * @return a result value
179      */
visitDoWhileLoop(DoWhileLoopTree node, P p)180     R visitDoWhileLoop(DoWhileLoopTree node, P p);
181 
182     /**
183      * Visits an ErroneousTree node.
184      * @param node the node being visited
185      * @param p a parameter value
186      * @return a result value
187      */
visitErroneous(ErroneousTree node, P p)188     R visitErroneous(ErroneousTree node, P p);
189 
190     /**
191      * Visits an ExpressionStatementTree node.
192      * @param node the node being visited
193      * @param p a parameter value
194      * @return a result value
195      */
visitExpressionStatement(ExpressionStatementTree node, P p)196     R visitExpressionStatement(ExpressionStatementTree node, P p);
197 
198     /**
199      * Visits an EnhancedForLoopTree node.
200      * @param node the node being visited
201      * @param p a parameter value
202      * @return a result value
203      */
visitEnhancedForLoop(EnhancedForLoopTree node, P p)204     R visitEnhancedForLoop(EnhancedForLoopTree node, P p);
205 
206     /**
207      * Visits a ForLoopTree node.
208      * @param node the node being visited
209      * @param p a parameter value
210      * @return a result value
211      */
visitForLoop(ForLoopTree node, P p)212     R visitForLoop(ForLoopTree node, P p);
213 
214     /**
215      * Visits an IdentifierTree node.
216      * @param node the node being visited
217      * @param p a parameter value
218      * @return a result value
219      */
visitIdentifier(IdentifierTree node, P p)220     R visitIdentifier(IdentifierTree node, P p);
221 
222     /**
223      * Visits an IfTree node.
224      * @param node the node being visited
225      * @param p a parameter value
226      * @return a result value
227      */
visitIf(IfTree node, P p)228     R visitIf(IfTree node, P p);
229 
230     /**
231      * Visits an ImportTree node.
232      * @param node the node being visited
233      * @param p a parameter value
234      * @return a result value
235      */
visitImport(ImportTree node, P p)236     R visitImport(ImportTree node, P p);
237 
238     /**
239      * Visits an ArrayAccessTree node.
240      * @param node the node being visited
241      * @param p a parameter value
242      * @return a result value
243      */
visitArrayAccess(ArrayAccessTree node, P p)244     R visitArrayAccess(ArrayAccessTree node, P p);
245 
246     /**
247      * Visits a LabeledStatementTree node.
248      * @param node the node being visited
249      * @param p a parameter value
250      * @return a result value
251      */
visitLabeledStatement(LabeledStatementTree node, P p)252     R visitLabeledStatement(LabeledStatementTree node, P p);
253 
254     /**
255      * Visits a LiteralTree node.
256      * @param node the node being visited
257      * @param p a parameter value
258      * @return a result value
259      */
visitLiteral(LiteralTree node, P p)260     R visitLiteral(LiteralTree node, P p);
261 
262     /**
263      * Visits an BindingPattern node.
264      * @param node the node being visited
265      * @param p a parameter value
266      * @return a result value
267      * @since 16
268      */
visitBindingPattern(BindingPatternTree node, P p)269     R visitBindingPattern(BindingPatternTree node, P p);
270 
271     /**
272      * Visits a DefaultCaseLabelTree node.
273      * @param node the node being visited
274      * @param p a parameter value
275      * @return a result value
276      * @since 17
277      */
278     @PreviewFeature(feature=PreviewFeature.Feature.SWITCH_PATTERN_MATCHING, reflective=true)
visitDefaultCaseLabel(DefaultCaseLabelTree node, P p)279     R visitDefaultCaseLabel(DefaultCaseLabelTree node, P p);
280 
281     /**
282      * Visits a MethodTree node.
283      * @param node the node being visited
284      * @param p a parameter value
285      * @return a result value
286      */
visitMethod(MethodTree node, P p)287     R visitMethod(MethodTree node, P p);
288 
289     /**
290      * Visits a ModifiersTree node.
291      * @param node the node being visited
292      * @param p a parameter value
293      * @return a result value
294      */
visitModifiers(ModifiersTree node, P p)295     R visitModifiers(ModifiersTree node, P p);
296 
297     /**
298      * Visits a NewArrayTree node.
299      * @param node the node being visited
300      * @param p a parameter value
301      * @return a result value
302      */
visitNewArray(NewArrayTree node, P p)303     R visitNewArray(NewArrayTree node, P p);
304 
305     /**
306      * Visits a GuardPatternTree node.
307      * @param node the node being visited
308      * @param p a parameter value
309      * @return a result value
310      * @since 17
311      */
312     @PreviewFeature(feature=PreviewFeature.Feature.SWITCH_PATTERN_MATCHING, reflective=true)
visitGuardedPattern(GuardedPatternTree node, P p)313     R visitGuardedPattern(GuardedPatternTree node, P p);
314 
315     /**
316      * Visits a ParenthesizedPatternTree node.
317      * @param node the node being visited
318      * @param p a parameter value
319      * @return a result value
320      * @since 17
321      */
322     @PreviewFeature(feature=PreviewFeature.Feature.SWITCH_PATTERN_MATCHING, reflective=true)
visitParenthesizedPattern(ParenthesizedPatternTree node, P p)323     R visitParenthesizedPattern(ParenthesizedPatternTree node, P p);
324 
325     /**
326      * Visits a NewClassTree node.
327      * @param node the node being visited
328      * @param p a parameter value
329      * @return a result value
330      */
visitNewClass(NewClassTree node, P p)331     R visitNewClass(NewClassTree node, P p);
332 
333     /**
334      * Visits a LambdaExpressionTree node.
335      * @param node the node being visited
336      * @param p a parameter value
337      * @return a result value
338      */
visitLambdaExpression(LambdaExpressionTree node, P p)339     R visitLambdaExpression(LambdaExpressionTree node, P p);
340 
341     /**
342      * Visits a PackageTree node.
343      * @param node the node being visited
344      * @param p a parameter value
345      * @return a result value
346      */
visitPackage(PackageTree node, P p)347     R visitPackage(PackageTree node, P p);
348 
349     /**
350      * Visits a ParenthesizedTree node.
351      * @param node the node being visited
352      * @param p a parameter value
353      * @return a result value
354      */
visitParenthesized(ParenthesizedTree node, P p)355     R visitParenthesized(ParenthesizedTree node, P p);
356 
357     /**
358      * Visits a ReturnTree node.
359      * @param node the node being visited
360      * @param p a parameter value
361      * @return a result value
362      */
visitReturn(ReturnTree node, P p)363     R visitReturn(ReturnTree node, P p);
364 
365     /**
366      * Visits a MemberSelectTree node.
367      * @param node the node being visited
368      * @param p a parameter value
369      * @return a result value
370      */
visitMemberSelect(MemberSelectTree node, P p)371     R visitMemberSelect(MemberSelectTree node, P p);
372 
373     /**
374      * Visits a MemberReferenceTree node.
375      * @param node the node being visited
376      * @param p a parameter value
377      * @return a result value
378      */
visitMemberReference(MemberReferenceTree node, P p)379     R visitMemberReference(MemberReferenceTree node, P p);
380 
381     /**
382      * Visits an EmptyStatementTree node.
383      * @param node the node being visited
384      * @param p a parameter value
385      * @return a result value
386      */
visitEmptyStatement(EmptyStatementTree node, P p)387     R visitEmptyStatement(EmptyStatementTree node, P p);
388 
389     /**
390      * Visits a SwitchTree node.
391      * @param node the node being visited
392      * @param p a parameter value
393      * @return a result value
394      */
visitSwitch(SwitchTree node, P p)395     R visitSwitch(SwitchTree node, P p);
396 
397     /**
398      * Visits a SwitchExpressionTree node.
399      *
400      * @param node the node being visited
401      * @param p a parameter value
402      * @return a result value
403      * @since 12
404      */
visitSwitchExpression(SwitchExpressionTree node, P p)405     R visitSwitchExpression(SwitchExpressionTree node, P p);
406 
407     /**
408      * Visits a SynchronizedTree node.
409      * @param node the node being visited
410      * @param p a parameter value
411      * @return a result value
412      */
visitSynchronized(SynchronizedTree node, P p)413     R visitSynchronized(SynchronizedTree node, P p);
414 
415     /**
416      * Visits a ThrowTree node.
417      * @param node the node being visited
418      * @param p a parameter value
419      * @return a result value
420      */
visitThrow(ThrowTree node, P p)421     R visitThrow(ThrowTree node, P p);
422 
423     /**
424      * Visits a CompilationUnitTree node.
425      * @param node the node being visited
426      * @param p a parameter value
427      * @return a result value
428      */
visitCompilationUnit(CompilationUnitTree node, P p)429     R visitCompilationUnit(CompilationUnitTree node, P p);
430 
431     /**
432      * Visits a TryTree node.
433      * @param node the node being visited
434      * @param p a parameter value
435      * @return a result value
436      */
visitTry(TryTree node, P p)437     R visitTry(TryTree node, P p);
438 
439     /**
440      * Visits a ParameterizedTypeTree node.
441      * @param node the node being visited
442      * @param p a parameter value
443      * @return a result value
444      */
visitParameterizedType(ParameterizedTypeTree node, P p)445     R visitParameterizedType(ParameterizedTypeTree node, P p);
446 
447     /**
448      * Visits a UnionTypeTree node.
449      * @param node the node being visited
450      * @param p a parameter value
451      * @return a result value
452      */
visitUnionType(UnionTypeTree node, P p)453     R visitUnionType(UnionTypeTree node, P p);
454 
455     /**
456      * Visits an IntersectionTypeTree node.
457      * @param node the node being visited
458      * @param p a parameter value
459      * @return a result value
460      */
visitIntersectionType(IntersectionTypeTree node, P p)461     R visitIntersectionType(IntersectionTypeTree node, P p);
462 
463     /**
464      * Visits an ArrayTypeTree node.
465      * @param node the node being visited
466      * @param p a parameter value
467      * @return a result value
468      */
visitArrayType(ArrayTypeTree node, P p)469     R visitArrayType(ArrayTypeTree node, P p);
470 
471     /**
472      * Visits a TypeCastTree node.
473      * @param node the node being visited
474      * @param p a parameter value
475      * @return a result value
476      */
visitTypeCast(TypeCastTree node, P p)477     R visitTypeCast(TypeCastTree node, P p);
478 
479     /**
480      * Visits a PrimitiveTypeTree node.
481      * @param node the node being visited
482      * @param p a parameter value
483      * @return a result value
484      */
visitPrimitiveType(PrimitiveTypeTree node, P p)485     R visitPrimitiveType(PrimitiveTypeTree node, P p);
486 
487     /**
488      * Visits a TypeParameterTree node.
489      * @param node the node being visited
490      * @param p a parameter value
491      * @return a result value
492      */
visitTypeParameter(TypeParameterTree node, P p)493     R visitTypeParameter(TypeParameterTree node, P p);
494 
495     /**
496      * Visits an InstanceOfTree node.
497      * @param node the node being visited
498      * @param p a parameter value
499      * @return a result value
500      */
visitInstanceOf(InstanceOfTree node, P p)501     R visitInstanceOf(InstanceOfTree node, P p);
502 
503     /**
504      * Visits a UnaryTree node.
505      * @param node the node being visited
506      * @param p a parameter value
507      * @return a result value
508      */
visitUnary(UnaryTree node, P p)509     R visitUnary(UnaryTree node, P p);
510 
511     /**
512      * Visits a VariableTree node.
513      * @param node the node being visited
514      * @param p a parameter value
515      * @return a result value
516      */
visitVariable(VariableTree node, P p)517     R visitVariable(VariableTree node, P p);
518 
519     /**
520      * Visits a WhileLoopTree node.
521      * @param node the node being visited
522      * @param p a parameter value
523      * @return a result value
524      */
visitWhileLoop(WhileLoopTree node, P p)525     R visitWhileLoop(WhileLoopTree node, P p);
526 
527     /**
528      * Visits a WildcardTypeTree node.
529      * @param node the node being visited
530      * @param p a parameter value
531      * @return a result value
532      */
visitWildcard(WildcardTree node, P p)533     R visitWildcard(WildcardTree node, P p);
534 
535     /**
536      * Visits a ModuleTree node.
537      * @param node the node being visited
538      * @param p a parameter value
539      * @return a result value
540      */
visitModule(ModuleTree node, P p)541     R visitModule(ModuleTree node, P p);
542 
543     /**
544      * Visits an ExportsTree node.
545      * @param node the node being visited
546      * @param p a parameter value
547      * @return a result value
548      */
visitExports(ExportsTree node, P p)549     R visitExports(ExportsTree node, P p);
550 
551     /**
552      * Visits an OpensTree node.
553      * @param node the node being visited
554      * @param p a parameter value
555      * @return a result value
556      */
visitOpens(OpensTree node, P p)557     R visitOpens(OpensTree node, P p);
558 
559     /**
560      * Visits a ProvidesTree node.
561      * @param node the node being visited
562      * @param p a parameter value
563      * @return a result value
564      */
visitProvides(ProvidesTree node, P p)565     R visitProvides(ProvidesTree node, P p);
566 
567     /**
568      * Visits a RequiresTree node.
569      * @param node the node being visited
570      * @param p a parameter value
571      * @return a result value
572      */
visitRequires(RequiresTree node, P p)573     R visitRequires(RequiresTree node, P p);
574 
575     /**
576      * Visits a UsesTree node.
577      * @param node the node being visited
578      * @param p a parameter value
579      * @return a result value
580      */
visitUses(UsesTree node, P p)581     R visitUses(UsesTree node, P p);
582 
583     /**
584      * Visits an unknown type of Tree node.
585      * This can occur if the language evolves and new kinds
586      * of nodes are added to the {@code Tree} hierarchy.
587      * @param node the node being visited
588      * @param p a parameter value
589      * @return a result value
590      */
visitOther(Tree node, P p)591     R visitOther(Tree node, P p);
592 
593     /**
594      * Visits a YieldTree node.
595      * @param node the node being visited
596      * @param p a parameter value
597      * @return a result value
598      * @since 13
599      */
visitYield(YieldTree node, P p)600     R visitYield(YieldTree node, P p);
601 }
602