1 /*
2  * Copyright (c) 2005, 2017, 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&trade; 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 a MethodTree node.
262      * @param node the node being visited
263      * @param p a parameter value
264      * @return a result value
265      */
visitMethod(MethodTree node, P p)266     R visitMethod(MethodTree node, P p);
267 
268     /**
269      * Visits a ModifiersTree node.
270      * @param node the node being visited
271      * @param p a parameter value
272      * @return a result value
273      */
visitModifiers(ModifiersTree node, P p)274     R visitModifiers(ModifiersTree node, P p);
275 
276     /**
277      * Visits a NewArrayTree node.
278      * @param node the node being visited
279      * @param p a parameter value
280      * @return a result value
281      */
visitNewArray(NewArrayTree node, P p)282     R visitNewArray(NewArrayTree node, P p);
283 
284     /**
285      * Visits a NewClassTree node.
286      * @param node the node being visited
287      * @param p a parameter value
288      * @return a result value
289      */
visitNewClass(NewClassTree node, P p)290     R visitNewClass(NewClassTree node, P p);
291 
292     /**
293      * Visits a LambdaExpressionTree node.
294      * @param node the node being visited
295      * @param p a parameter value
296      * @return a result value
297      */
visitLambdaExpression(LambdaExpressionTree node, P p)298     R visitLambdaExpression(LambdaExpressionTree node, P p);
299 
300     /**
301      * Visits a PackageTree node.
302      * @param node the node being visited
303      * @param p a parameter value
304      * @return a result value
305      */
visitPackage(PackageTree node, P p)306     R visitPackage(PackageTree node, P p);
307 
308     /**
309      * Visits a ParenthesizedTree node.
310      * @param node the node being visited
311      * @param p a parameter value
312      * @return a result value
313      */
visitParenthesized(ParenthesizedTree node, P p)314     R visitParenthesized(ParenthesizedTree node, P p);
315 
316     /**
317      * Visits a ReturnTree node.
318      * @param node the node being visited
319      * @param p a parameter value
320      * @return a result value
321      */
visitReturn(ReturnTree node, P p)322     R visitReturn(ReturnTree node, P p);
323 
324     /**
325      * Visits a MemberSelectTree node.
326      * @param node the node being visited
327      * @param p a parameter value
328      * @return a result value
329      */
visitMemberSelect(MemberSelectTree node, P p)330     R visitMemberSelect(MemberSelectTree node, P p);
331 
332     /**
333      * Visits a MemberReferenceTree node.
334      * @param node the node being visited
335      * @param p a parameter value
336      * @return a result value
337      */
visitMemberReference(MemberReferenceTree node, P p)338     R visitMemberReference(MemberReferenceTree node, P p);
339 
340     /**
341      * Visits an EmptyStatementTree node.
342      * @param node the node being visited
343      * @param p a parameter value
344      * @return a result value
345      */
visitEmptyStatement(EmptyStatementTree node, P p)346     R visitEmptyStatement(EmptyStatementTree node, P p);
347 
348     /**
349      * Visits a SwitchTree node.
350      * @param node the node being visited
351      * @param p a parameter value
352      * @return a result value
353      */
visitSwitch(SwitchTree node, P p)354     R visitSwitch(SwitchTree node, P p);
355 
356     /**
357      * Visits a SwitchExpressionTree node.
358      *
359      * @param node the node being visited
360      * @param p a parameter value
361      * @return a result value
362      * @since 12
363      *
364      * @deprecated
365      * This method is modeling switch expressions,
366      * which are part of a preview feature and may be removed
367      * if the preview feature is removed.
368      */
369     @Deprecated(forRemoval=true, since="12")
370     @SuppressWarnings("removal")
visitSwitchExpression(SwitchExpressionTree node, P p)371     R visitSwitchExpression(SwitchExpressionTree node, P p);
372 
373     /**
374      * Visits a SynchronizedTree node.
375      * @param node the node being visited
376      * @param p a parameter value
377      * @return a result value
378      */
visitSynchronized(SynchronizedTree node, P p)379     R visitSynchronized(SynchronizedTree node, P p);
380 
381     /**
382      * Visits a ThrowTree node.
383      * @param node the node being visited
384      * @param p a parameter value
385      * @return a result value
386      */
visitThrow(ThrowTree node, P p)387     R visitThrow(ThrowTree node, P p);
388 
389     /**
390      * Visits a CompilationUnitTree node.
391      * @param node the node being visited
392      * @param p a parameter value
393      * @return a result value
394      */
visitCompilationUnit(CompilationUnitTree node, P p)395     R visitCompilationUnit(CompilationUnitTree node, P p);
396 
397     /**
398      * Visits a TryTree node.
399      * @param node the node being visited
400      * @param p a parameter value
401      * @return a result value
402      */
visitTry(TryTree node, P p)403     R visitTry(TryTree node, P p);
404 
405     /**
406      * Visits a ParameterizedTypeTree node.
407      * @param node the node being visited
408      * @param p a parameter value
409      * @return a result value
410      */
visitParameterizedType(ParameterizedTypeTree node, P p)411     R visitParameterizedType(ParameterizedTypeTree node, P p);
412 
413     /**
414      * Visits a UnionTypeTree node.
415      * @param node the node being visited
416      * @param p a parameter value
417      * @return a result value
418      */
visitUnionType(UnionTypeTree node, P p)419     R visitUnionType(UnionTypeTree node, P p);
420 
421     /**
422      * Visits an IntersectionTypeTree node.
423      * @param node the node being visited
424      * @param p a parameter value
425      * @return a result value
426      */
visitIntersectionType(IntersectionTypeTree node, P p)427     R visitIntersectionType(IntersectionTypeTree node, P p);
428 
429     /**
430      * Visits an ArrayTypeTree node.
431      * @param node the node being visited
432      * @param p a parameter value
433      * @return a result value
434      */
visitArrayType(ArrayTypeTree node, P p)435     R visitArrayType(ArrayTypeTree node, P p);
436 
437     /**
438      * Visits a TypeCastTree node.
439      * @param node the node being visited
440      * @param p a parameter value
441      * @return a result value
442      */
visitTypeCast(TypeCastTree node, P p)443     R visitTypeCast(TypeCastTree node, P p);
444 
445     /**
446      * Visits a PrimitiveTypeTree node.
447      * @param node the node being visited
448      * @param p a parameter value
449      * @return a result value
450      */
visitPrimitiveType(PrimitiveTypeTree node, P p)451     R visitPrimitiveType(PrimitiveTypeTree node, P p);
452 
453     /**
454      * Visits a TypeParameterTree node.
455      * @param node the node being visited
456      * @param p a parameter value
457      * @return a result value
458      */
visitTypeParameter(TypeParameterTree node, P p)459     R visitTypeParameter(TypeParameterTree node, P p);
460 
461     /**
462      * Visits an InstanceOfTree node.
463      * @param node the node being visited
464      * @param p a parameter value
465      * @return a result value
466      */
visitInstanceOf(InstanceOfTree node, P p)467     R visitInstanceOf(InstanceOfTree node, P p);
468 
469     /**
470      * Visits a UnaryTree node.
471      * @param node the node being visited
472      * @param p a parameter value
473      * @return a result value
474      */
visitUnary(UnaryTree node, P p)475     R visitUnary(UnaryTree node, P p);
476 
477     /**
478      * Visits a VariableTree node.
479      * @param node the node being visited
480      * @param p a parameter value
481      * @return a result value
482      */
visitVariable(VariableTree node, P p)483     R visitVariable(VariableTree node, P p);
484 
485     /**
486      * Visits a WhileLoopTree node.
487      * @param node the node being visited
488      * @param p a parameter value
489      * @return a result value
490      */
visitWhileLoop(WhileLoopTree node, P p)491     R visitWhileLoop(WhileLoopTree node, P p);
492 
493     /**
494      * Visits a WildcardTypeTree node.
495      * @param node the node being visited
496      * @param p a parameter value
497      * @return a result value
498      */
visitWildcard(WildcardTree node, P p)499     R visitWildcard(WildcardTree node, P p);
500 
501     /**
502      * Visits a ModuleTree node.
503      * @param node the node being visited
504      * @param p a parameter value
505      * @return a result value
506      */
visitModule(ModuleTree node, P p)507     R visitModule(ModuleTree node, P p);
508 
509     /**
510      * Visits an ExportsTree node.
511      * @param node the node being visited
512      * @param p a parameter value
513      * @return a result value
514      */
visitExports(ExportsTree node, P p)515     R visitExports(ExportsTree node, P p);
516 
517     /**
518      * Visits an OpensTree node.
519      * @param node the node being visited
520      * @param p a parameter value
521      * @return a result value
522      */
visitOpens(OpensTree node, P p)523     R visitOpens(OpensTree node, P p);
524 
525     /**
526      * Visits a ProvidesTree node.
527      * @param node the node being visited
528      * @param p a parameter value
529      * @return a result value
530      */
visitProvides(ProvidesTree node, P p)531     R visitProvides(ProvidesTree node, P p);
532 
533     /**
534      * Visits a RequiresTree node.
535      * @param node the node being visited
536      * @param p a parameter value
537      * @return a result value
538      */
visitRequires(RequiresTree node, P p)539     R visitRequires(RequiresTree node, P p);
540 
541     /**
542      * Visits a UsesTree node.
543      * @param node the node being visited
544      * @param p a parameter value
545      * @return a result value
546      */
visitUses(UsesTree node, P p)547     R visitUses(UsesTree node, P p);
548 
549     /**
550      * Visits an unknown type of Tree node.
551      * This can occur if the language evolves and new kinds
552      * of nodes are added to the {@code Tree} hierarchy.
553      * @param node the node being visited
554      * @param p a parameter value
555      * @return a result value
556      */
visitOther(Tree node, P p)557     R visitOther(Tree node, P p);
558 }
559