TreeVisitor.java revision 3294:9adfb22ff08f
143504Sjkh/*
23027Srgrimes * Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved.
326103Sjkh * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
46718Sphk *
526103Sjkh * This code is free software; you can redistribute it and/or modify it
640277Sjdp * under the terms of the GNU General Public License version 2 only, as
726103Sjkh * published by the Free Software Foundation.  Oracle designates this
826103Sjkh * particular file as subject to the "Classpath" exception as provided
926103Sjkh * by Oracle in the LICENSE file that accompanied this code.
106718Sphk *
1126103Sjkh * This code is distributed in the hope that it will be useful, but WITHOUT
1219746Sandreas * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
1319746Sandreas * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
1426103Sjkh * version 2 for more details (a copy is included in the LICENSE file that
1526331Sjoerg * accompanied this code).
1626331Sjoerg *
1726331Sjoerg * You should have received a copy of the GNU General Public License version
1826331Sjoerg * 2 along with this work; if not, write to the Free Software Foundation,
1926331Sjoerg * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
2037531Sdes *
2126331Sjoerg * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
2229104Sjkh * or visit www.oracle.com if you need additional information or have any
2326331Sjoerg * questions.
2415786Sjkh */
258034Sphk
2623257Sjoergpackage com.sun.source.tree;
278034Sphk
2835213Smsmith/**
2935213Smsmith * A visitor of trees, in the style of the visitor design pattern.
3035213Smsmith * Classes implementing this interface are used to operate
3135213Smsmith * on a tree when the kind of tree is unknown at compile time.
3235213Smsmith * When a visitor is passed to an tree's {@link Tree#accept
3335213Smsmith * accept} method, the <tt>visit<i>XYZ</i></tt> method most applicable
3435213Smsmith * to that tree is invoked.
3538281Sjkh *
3638795Sjkh * <p> Classes implementing this interface may or may not throw a
3738281Sjkh * {@code NullPointerException} if the additional parameter {@code p}
3832718Sjkh * is {@code null}; see documentation of the implementing class for
3932718Sjkh * details.
4042041Sjkh *
4139273Sjhay * <p> <b>WARNING:</b> It is possible that methods will be added to
4236687Sjkoshy * this interface to accommodate new, currently unknown, language
4336687Sjkoshy * structures added to future versions of the Java&trade; programming
4441919Sjkh * language.  Therefore, visitor classes directly implementing this
4541919Sjkh * interface may be source incompatible with future versions of the
4641979Sjkh * platform.
4741979Sjkh *
4827626Sjkh * @param <R> the return type of this visitor's methods.  Use {@link
4940839Sjkh *            Void} for visitors that do not need to return results.
5040839Sjkh * @param <P> the type of the additional parameter to this visitor's
5140839Sjkh *            methods.  Use {@code Void} for visitors that do not need an
526718Sphk *            additional parameter.
5326761Sjkh *
5426761Sjkh * @author Peter von der Ah&eacute;
5526788Sjkh * @author Jonathan Gibbons
5627170Sjkh *
5726788Sjkh * @since 1.6
5826761Sjkh */
5926788Sjkhpublic interface TreeVisitor<R,P> {
6016156Sjkh    /**
617107Sphk     * Visits an AnnotatedTypeTree node.
6212661Speter     * @param node the node being visited
6312661Speter     * @param p a parameter value
6412661Speter     * @return a result value
6512661Speter     */
6612661Speter    R visitAnnotatedType(AnnotatedTypeTree node, P p);
6726103Sjkh
684324Sphk    /**
697940Sphk     * Visits an AnnotatedTree node.
707940Sphk     * @param node the node being visited
717954Sphk     * @param p a parameter value
7240022Sjkh     * @return a result value
7340022Sjkh     */
7440022Sjkh    R visitAnnotation(AnnotationTree node, P p);
7540022Sjkh
7643392Sjkh    /**
7743464Sjkh     * Visits a MethodInvocationTree node.
7840345Sjkh     * @param node the node being visited
7937749Sjkh     * @param p a parameter value
8024864Sjoerg     * @return a result value
8140022Sjkh     */
8240022Sjkh    R visitMethodInvocation(MethodInvocationTree node, P p);
8343464Sjkh
8443392Sjkh    /**
8542502Sjkh     * Visits an AssertTree node.
8642502Sjkh     * @param node the node being visited
8742502Sjkh     * @param p a parameter value
8843392Sjkh     * @return a result value
8943392Sjkh     */
9040022Sjkh    R visitAssert(AssertTree node, P p);
9140022Sjkh
9240022Sjkh    /**
933884Sphk     * Visits an AssignmentTree node.
9440022Sjkh     * @param node the node being visited
9540022Sjkh     * @param p a parameter value
9640022Sjkh     * @return a result value
9734782Sjhay     */
9834782Sjhay    R visitAssignment(AssignmentTree node, P p);
9926761Sjkh
1006718Sphk    /**
10123257Sjoerg     * Visits a CompoundAssignmentTree node.
10223257Sjoerg     * @param node the node being visited
10323257Sjoerg     * @param p a parameter value
10424842Sjoerg     * @return a result value
10523750Sjkh     */
1063884Sphk    R visitCompoundAssignment(CompoundAssignmentTree node, P p);
10732843Sjkh
10832843Sjkh    /**
10932843Sjkh     * Visits a BinaryTree node.
11024864Sjoerg     * @param node the node being visited
11125415Sdanny     * @param p a parameter value
11225415Sdanny     * @return a result value
11324864Sjoerg     */
11424864Sjoerg    R visitBinary(BinaryTree node, P p);
11524864Sjoerg
11624864Sjoerg    /**
11724864Sjoerg     * Visits a BlockTree node.
11824864Sjoerg     * @param node the node being visited
11924864Sjoerg     * @param p a parameter value
12024864Sjoerg     * @return a result value
12124864Sjoerg     */
12224864Sjoerg    R visitBlock(BlockTree node, P p);
12324864Sjoerg
12424864Sjoerg    /**
12526761Sjkh     * Visits a BreakTree node.
12626761Sjkh     * @param node the node being visited
1278663Sphk     * @param p a parameter value
1288663Sphk     * @return a result value
12927348Sjkh     */
13026813Sjkh    R visitBreak(BreakTree node, P p);
13126813Sjkh
13226813Sjkh    /**
13326813Sjkh     * Visits a CaseTree node.
13426813Sjkh     * @param node the node being visited
13513352Sphk     * @param p a parameter value
13627070Sjkh     * @return a result value
13727070Sjkh     */
1386723Sphk    R visitCase(CaseTree node, P p);
13913352Sphk
1408497Srgrimes    /**
14136742Sjdp     * Visits a CatchTree node.
14236742Sjdp     * @param node the node being visited
14336742Sjdp     * @param p a parameter value
14436777Sjdp     * @return a result value
14513124Sjoerg     */
1468497Srgrimes    R visitCatch(CatchTree node, P p);
14713124Sjoerg
14813352Sphk    /**
14913352Sphk     * Visits a ClassTree node.
15042355Sjkh     * @param node the node being visited
15138929Sjkh     * @param p a parameter value
15224864Sjoerg     * @return a result value
15324864Sjoerg     */
15424864Sjoerg    R visitClass(ClassTree node, P p);
15524864Sjoerg
1566718Sphk    /**
15718091Spst     * Visits a ConditionalExpressionTree node.
15839132Sphk     * @param node the node being visited
1596718Sphk     * @param p a parameter value
16018091Spst     * @return a result value
16139132Sphk     */
1626718Sphk    R visitConditionalExpression(ConditionalExpressionTree node, P p);
16318091Spst
16418091Spst    /**
16517392Spst     * Visits a ContinueTree node.
16638355Sjkh     * @param node the node being visited
16738355Sjkh     * @param p a parameter value
16838355Sjkh     * @return a result value
16924842Sjoerg     */
17039132Sphk    R visitContinue(ContinueTree node, P p);
17118091Spst
17226103Sjkh    /**
17339132Sphk     * Visits a DoWhileTree node.
17441979Sjkh     * @param node the node being visited
17523633Sjkh     * @param p a parameter value
17626103Sjkh     * @return a result value
17713352Sphk     */
17813352Sphk    R visitDoWhileLoop(DoWhileLoopTree node, P p);
17913352Sphk
18039132Sphk    /**
18113352Sphk     * Visits an ErroneousTree node.
18239132Sphk     * @param node the node being visited
18313352Sphk     * @param p a parameter value
18424842Sjoerg     * @return a result value
18539132Sphk     */
18613352Sphk    R visitErroneous(ErroneousTree node, P p);
18726103Sjkh
18839132Sphk    /**
18913352Sphk     * Visits an ExpressionStatementTree node.
19023633Sjkh     * @param node the node being visited
19126103Sjkh     * @param p a parameter value
19226761Sjkh     * @return a result value
1938034Sphk     */
19413352Sphk    R visitExpressionStatement(ExpressionStatementTree node, P p);
19541310Sjkh
19638844Sjkh    /**
19718499Spst     * Visits an EnhancedForLoopTree node.
1988367Sjkh     * @param node the node being visited
1998367Sjkh     * @param p a parameter value
20039956Sjkh     * @return a result value
20139854Sjkh     */
20226761Sjkh    R visitEnhancedForLoop(EnhancedForLoopTree node, P p);
20323912Sjoerg
20434782Sjhay    /**
20538841Sjkh     * Visits a ForLoopTree node.
20623912Sjoerg     * @param node the node being visited
20723909Sjoerg     * @param p a parameter value
20823912Sjoerg     * @return a result value
20924842Sjoerg     */
21024842Sjoerg    R visitForLoop(ForLoopTree node, P p);
21123909Sjoerg
21226813Sjkh    /**
21326813Sjkh     * Visits an IdentifierTree node.
21426813Sjkh     * @param node the node being visited
21536687Sjkoshy     * @param p a parameter value
21636687Sjkoshy     * @return a result value
21736687Sjkoshy     */
21826909Sjkh    R visitIdentifier(IdentifierTree node, P p);
21926909Sjkh
22026909Sjkh    /**
22127030Spst     * Visits an IfTree node.
22227030Spst     * @param node the node being visited
22327030Spst     * @param p a parameter value
22427030Spst     * @return a result value
22527030Spst     */
22627030Spst    R visitIf(IfTree node, P p);
22723434Sjoerg
22823434Sjoerg    /**
22932843Sjkh     * Visits an ImportTree node.
23042298Sjkh     * @param node the node being visited
23142298Sjkh     * @param p a parameter value
23213352Sphk     * @return a result value
23342298Sjkh     */
23442298Sjkh    R visitImport(ImportTree node, P p);
23513352Sphk
23613352Sphk    /**
23742298Sjkh     * Visits an ArrayAccessTree node.
23813352Sphk     * @param node the node being visited
23942298Sjkh     * @param p a parameter value
24042298Sjkh     * @return a result value
24121008Sjkh     */
24221008Sjkh    R visitArrayAccess(ArrayAccessTree node, P p);
2438371Sjkh
24421036Sjkh    /**
24539956Sjkh     * Visits a LabeledStatementTree node.
24613352Sphk     * @param node the node being visited
2478367Sjkh     * @param p a parameter value
2488367Sjkh     * @return a result value
2498367Sjkh     */
2506718Sphk    R visitLabeledStatement(LabeledStatementTree node, P p);
25123633Sjkh
2524734Sphk    /**
25323257Sjoerg     * Visits a LiteralTree node.
2546718Sphk     * @param node the node being visited
25523257Sjoerg     * @param p a parameter value
25642588Sjoerg     * @return a result value
25723257Sjoerg     */
2586718Sphk    R visitLiteral(LiteralTree node, P p);
2596718Sphk
2607063Sphk    /**
2616718Sphk     * Visits a MethodTree node.
26213370Sphk     * @param node the node being visited
26326761Sjkh     * @param p a parameter value
26413352Sphk     * @return a result value
26513352Sphk     */
2666718Sphk    R visitMethod(MethodTree node, P p);
26713352Sphk
2686718Sphk    /**
26913352Sphk     * Visits a ModifiersTree node.
2707252Sphk     * @param node the node being visited
27113352Sphk     * @param p a parameter value
2726718Sphk     * @return a result value
2737063Sphk     */
2746718Sphk    R visitModifiers(ModifiersTree node, P p);
2756718Sphk
2763027Srgrimes    /**
2776718Sphk     * Visits a NewArrayTree node.
2786718Sphk     * @param node the node being visited
27926799Sjkh     * @param p a parameter value
28024842Sjoerg     * @return a result value
28130034Sjkh     */
28230034Sjkh    R visitNewArray(NewArrayTree node, P p);
28324842Sjoerg
28424842Sjoerg    /**
28524842Sjoerg     * Visits a NewClassTree node.
28624842Sjoerg     * @param node the node being visited
28724842Sjoerg     * @param p a parameter value
28842588Sjoerg     * @return a result value
28924842Sjoerg     */
29024842Sjoerg    R visitNewClass(NewClassTree node, P p);
29124842Sjoerg
29224842Sjoerg    /**
29316156Sjkh     * Visits a LambdaExpressionTree node.
29416156Sjkh     * @param node the node being visited
29516156Sjkh     * @param p a parameter value
29616156Sjkh     * @return a result value
29716156Sjkh     */
29816156Sjkh    R visitLambdaExpression(LambdaExpressionTree node, P p);
29916156Sjkh
3006718Sphk    /**
3016123Sache     * Visits a PackageTree node.
3027732Sphk     * @param node the node being visited
3036718Sphk     * @param p a parameter value
30419506Sjoerg     * @return a result value
30519506Sjoerg     */
30619506Sjoerg    R visitPackage(PackageTree node, P p);
3076718Sphk
30829223Sjkh    /**
30929223Sjkh     * Visits a ParenthesizedTree node.
3107954Sphk     * @param node the node being visited
3117954Sphk     * @param p a parameter value
31219506Sjoerg     * @return a result value
31326761Sjkh     */
3147954Sphk    R visitParenthesized(ParenthesizedTree node, P p);
3157954Sphk
3167954Sphk    /**
31737150Sbrian     * Visits a ReturnTree node.
31837150Sbrian     * @param node the node being visited
31932589Sbrian     * @param p a parameter value
3207954Sphk     * @return a result value
32119362Sjoerg     */
3226123Sache    R visitReturn(ReturnTree node, P p);
3236718Sphk
3243884Sphk    /**
32513391Sphk     * Visits a MemberSelectTree node.
32613391Sphk     * @param node the node being visited
32713391Sphk     * @param p a parameter value
3286718Sphk     * @return a result value
32918852Sjkh     */
33037175Sbrian    R visitMemberSelect(MemberSelectTree node, P p);
33114085Sjoerg
33214085Sjoerg    /**
33314085Sjoerg     * Visits a MemberReferenceTree node.
33414085Sjoerg     * @param node the node being visited
33526761Sjkh     * @param p a parameter value
33626761Sjkh     * @return a result value
33726761Sjkh     */
33826761Sjkh    R visitMemberReference(MemberReferenceTree node, P p);
33938635Sjb
34026765Sjkh    /**
34126761Sjkh     * Visits an EmptyStatementTree node.
34226761Sjkh     * @param node the node being visited
34326761Sjkh     * @param p a parameter value
34413621Sjoerg     * @return a result value
34513621Sjoerg     */
34613621Sjoerg    R visitEmptyStatement(EmptyStatementTree node, P p);
34739175Sjkh
34813621Sjoerg    /**
34913621Sjoerg     * Visits a SwitchTree node.
35013621Sjoerg     * @param node the node being visited
35113621Sjoerg     * @param p a parameter value
35214079Sjoerg     * @return a result value
35313391Sphk     */
3547664Sphk    R visitSwitch(SwitchTree node, P p);
35526788Sjkh
3566718Sphk    /**
3576718Sphk     * Visits a SynchronizedTree node.
35813391Sphk     * @param node the node being visited
35926761Sjkh     * @param p a parameter value
36013391Sphk     * @return a result value
3616718Sphk     */
3628714Sjkh    R visitSynchronized(SynchronizedTree node, P p);
3638714Sjkh
3648714Sjkh    /**
3658714Sjkh     * Visits a ThrowTree node.
3668714Sjkh     * @param node the node being visited
36713391Sphk     * @param p a parameter value
36813391Sphk     * @return a result value
36913391Sphk     */
3708714Sjkh    R visitThrow(ThrowTree node, P p);
3718714Sjkh
3728881Srgrimes    /**
37326761Sjkh     * Visits a CompilationUnitTree node.
37413391Sphk     * @param node the node being visited
37513391Sphk     * @param p a parameter value
3768720Sjkh     * @return a result value
3778714Sjkh     */
3788714Sjkh    R visitCompilationUnit(CompilationUnitTree node, P p);
37913391Sphk
38013391Sphk    /**
38113391Sphk     * Visits a TryTree node.
3828714Sjkh     * @param node the node being visited
38326909Sjkh     * @param p a parameter value
38413352Sphk     * @return a result value
3858714Sjkh     */
38630101Sjkh    R visitTry(TryTree node, P p);
38713391Sphk
38813391Sphk    /**
3898714Sjkh     * Visits a ParameterizedTypeTree node.
39013391Sphk     * @param node the node being visited
3918714Sjkh     * @param p a parameter value
3928714Sjkh     * @return a result value
39312661Speter     */
39413352Sphk    R visitParameterizedType(ParameterizedTypeTree node, P p);
39512661Speter
39613391Sphk    /**
39713391Sphk     * Visits a UnionTypeTree node.
39813391Sphk     * @param node the node being visited
39913391Sphk     * @param p a parameter value
40012661Speter     * @return a result value
40112661Speter     */
4028714Sjkh    R visitUnionType(UnionTypeTree node, P p);
40313391Sphk
40430076Smarkm    /**
40530109Sjkh     * Visits an IntersectionTypeTree node.
4068714Sjkh     * @param node the node being visited
40726909Sjkh     * @param p a parameter value
4088720Sjkh     * @return a result value
4098714Sjkh     */
4108881Srgrimes    R visitIntersectionType(IntersectionTypeTree node, P p);
4118778Sjkh
4128778Sjkh    /**
4138778Sjkh     * Visits an ArrayTypeTree node.
4148778Sjkh     * @param node the node being visited
4158778Sjkh     * @param p a parameter value
4168778Sjkh     * @return a result value
4178778Sjkh     */
4188778Sjkh    R visitArrayType(ArrayTypeTree node, P p);
4198778Sjkh
4208778Sjkh    /**
4218778Sjkh     * Visits a TypeCastTree node.
4228778Sjkh     * @param node the node being visited
4238778Sjkh     * @param p a parameter value
4248778Sjkh     * @return a result value
42518702Sjkh     */
4268778Sjkh    R visitTypeCast(TypeCastTree node, P p);
4278778Sjkh
4288778Sjkh    /**
42922268Sjkh     * Visits a PrimitiveTypeTree node.
4308806Sphk     * @param node the node being visited
43113418Sphk     * @param p a parameter value
4328806Sphk     * @return a result value
43334139Sjkh     */
4348778Sjkh    R visitPrimitiveType(PrimitiveTypeTree node, P p);
43520485Sjkh
4368806Sphk    /**
4379202Srgrimes     * Visits a TypeParameterTree node.
4389202Srgrimes     * @param node the node being visited
4399202Srgrimes     * @param p a parameter value
4409202Srgrimes     * @return a result value
44119333Sjkh     */
44243238Sjkh    R visitTypeParameter(TypeParameterTree node, P p);
44340840Sjkh
44441020Sjkh    /**
44540968Sjkh     * Visits an InstanceOfTree node.
44642389Sjkh     * @param node the node being visited
44742389Sjkh     * @param p a parameter value
44816977Sjkh     * @return a result value
44942300Sjkh     */
45042300Sjkh    R visitInstanceOf(InstanceOfTree node, P p);
45116977Sjkh
45242299Sjkh    /**
45343392Sjkh     * Visits a UnaryTree node.
45443392Sjkh     * @param node the node being visited
45543238Sjkh     * @param p a parameter value
45642300Sjkh     * @return a result value
45742300Sjkh     */
45842300Sjkh    R visitUnary(UnaryTree node, P p);
45943464Sjkh
46042300Sjkh    /**
46140047Sjkh     * Visits a VariableTree node.
4628720Sjkh     * @param node the node being visited
4633993Sphk     * @param p a parameter value
46413391Sphk     * @return a result value
46515972Sjkh     */
46613391Sphk    R visitVariable(VariableTree node, P p);
4678714Sjkh
46842300Sjkh    /**
46942300Sjkh     * Visits a WhileLoopTree node.
47042300Sjkh     * @param node the node being visited
47142300Sjkh     * @param p a parameter value
47223257Sjoerg     * @return a result value
47342261Sjkh     */
4748806Sphk    R visitWhileLoop(WhileLoopTree node, P p);
47519571Sjoerg
47642300Sjkh    /**
47719818Sjoerg     * Visits a WildcardTypeTree node.
47819818Sjoerg     * @param node the node being visited
47913391Sphk     * @param p a parameter value
48042300Sjkh     * @return a result value
48119571Sjoerg     */
48242300Sjkh    R visitWildcard(WildcardTree node, P p);
48323257Sjoerg
48442300Sjkh    /**
48542300Sjkh     * Visits a ModuleTree node.
48642300Sjkh     * @param node the node being visited
48742300Sjkh     * @param p a parameter value
48842300Sjkh     * @return a result value
48942300Sjkh     */
49023633Sjkh    R visitModule(ModuleTree node, P p);
49142300Sjkh
49223633Sjkh    /**
49315972Sjkh     * Visits an ExportsTree node.
4947052Sphk     * @param node the node being visited
49513391Sphk     * @param p a parameter value
49613391Sphk     * @return a result value
49713391Sphk     */
4987063Sphk    R visitExports(ExportsTree node, P p);
49942300Sjkh
50042300Sjkh    /**
50142300Sjkh     * Visits a ProvidesTree node.
50242300Sjkh     * @param node the node being visited
50342300Sjkh     * @param p a parameter value
50442300Sjkh     * @return a result value
50527291Sjkh     */
50642300Sjkh    R visitProvides(ProvidesTree node, P p);
50727291Sjkh
5087052Sphk    /**
50913391Sphk     * Visits a RequiresTree node.
51013391Sphk     * @param node the node being visited
51113391Sphk     * @param p a parameter value
5127100Sphk     * @return a result value
51342300Sjkh     */
51442300Sjkh    R visitRequires(RequiresTree node, P p);
51542300Sjkh
51642300Sjkh    /**
51742312Sjkh     * Visits a UsesTree node.
51842300Sjkh     * @param node the node being visited
5197100Sphk     * @param p a parameter value
5207100Sphk     * @return a result value
52121010Sjkh     */
5227732Sphk    R visitUses(UsesTree node, P p);
52323750Sjkh
5247100Sphk    /**
5257100Sphk     * Visits an unknown type of Tree node.
52642300Sjkh     * This can occur if the language evolves and new kinds
52742300Sjkh     * of nodes are added to the {@code Tree} hierarchy.
52842300Sjkh     * @param node the node being visited
52942300Sjkh     * @param p a parameter value
53042300Sjkh     * @return a result value
53124842Sjoerg     */
53242300Sjkh    R visitOther(Tree node, P p);
53342300Sjkh}
53427348Sjkh