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