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&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      */
  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      */
  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      */
  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      */
  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      */
  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      */
 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      */
 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      */
 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      */
 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      */
 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      */
 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      */
 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      */
 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      */
 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      */
 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      */
 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      */
 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      */
 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      */
 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      */
 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      */
 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      */
 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      */
 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      */
 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      */
 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      */
 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      */
 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      */
 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      */
 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      */
 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      */
 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      */
 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      */
 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      */
 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      */
 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      */
 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      */
 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     R visitSwitchExpression(SwitchExpressionTree node, P p);
 365 
 366     /**
 367      * Visits a SynchronizedTree node.
 368      * @param node the node being visited
 369      * @param p a parameter value
 370      * @return a result value
 371      */
 372     R visitSynchronized(SynchronizedTree node, P p);
 373 
 374     /**
 375      * Visits a ThrowTree node.
 376      * @param node the node being visited
 377      * @param p a parameter value
 378      * @return a result value
 379      */
 380     R visitThrow(ThrowTree node, P p);
 381 
 382     /**
 383      * Visits a CompilationUnitTree node.
 384      * @param node the node being visited
 385      * @param p a parameter value
 386      * @return a result value
 387      */
 388     R visitCompilationUnit(CompilationUnitTree node, P p);
 389 
 390     /**
 391      * Visits a TryTree node.
 392      * @param node the node being visited
 393      * @param p a parameter value
 394      * @return a result value
 395      */
 396     R visitTry(TryTree node, P p);
 397 
 398     /**
 399      * Visits a ParameterizedTypeTree node.
 400      * @param node the node being visited
 401      * @param p a parameter value
 402      * @return a result value
 403      */
 404     R visitParameterizedType(ParameterizedTypeTree node, P p);
 405 
 406     /**
 407      * Visits a UnionTypeTree node.
 408      * @param node the node being visited
 409      * @param p a parameter value
 410      * @return a result value
 411      */
 412     R visitUnionType(UnionTypeTree node, P p);
 413 
 414     /**
 415      * Visits an IntersectionTypeTree node.
 416      * @param node the node being visited
 417      * @param p a parameter value
 418      * @return a result value
 419      */
 420     R visitIntersectionType(IntersectionTypeTree node, P p);
 421 
 422     /**
 423      * Visits an ArrayTypeTree node.
 424      * @param node the node being visited
 425      * @param p a parameter value
 426      * @return a result value
 427      */
 428     R visitArrayType(ArrayTypeTree node, P p);
 429 
 430     /**
 431      * Visits a TypeCastTree node.
 432      * @param node the node being visited
 433      * @param p a parameter value
 434      * @return a result value
 435      */
 436     R visitTypeCast(TypeCastTree node, P p);
 437 
 438     /**
 439      * Visits a PrimitiveTypeTree node.
 440      * @param node the node being visited
 441      * @param p a parameter value
 442      * @return a result value
 443      */
 444     R visitPrimitiveType(PrimitiveTypeTree node, P p);
 445 
 446     /**
 447      * Visits a TypeParameterTree node.
 448      * @param node the node being visited
 449      * @param p a parameter value
 450      * @return a result value
 451      */
 452     R visitTypeParameter(TypeParameterTree node, P p);
 453 
 454     /**
 455      * Visits an InstanceOfTree node.
 456      * @param node the node being visited
 457      * @param p a parameter value
 458      * @return a result value
 459      */
 460     R visitInstanceOf(InstanceOfTree node, P p);
 461 
 462     /**
 463      * Visits a UnaryTree node.
 464      * @param node the node being visited
 465      * @param p a parameter value
 466      * @return a result value
 467      */
 468     R visitUnary(UnaryTree node, P p);
 469 
 470     /**
 471      * Visits a VariableTree node.
 472      * @param node the node being visited
 473      * @param p a parameter value
 474      * @return a result value
 475      */
 476     R visitVariable(VariableTree node, P p);
 477 
 478     /**
 479      * Visits a WhileLoopTree node.
 480      * @param node the node being visited
 481      * @param p a parameter value
 482      * @return a result value
 483      */
 484     R visitWhileLoop(WhileLoopTree node, P p);
 485 
 486     /**
 487      * Visits a WildcardTypeTree node.
 488      * @param node the node being visited
 489      * @param p a parameter value
 490      * @return a result value
 491      */
 492     R visitWildcard(WildcardTree node, P p);
 493 
 494     /**
 495      * Visits a ModuleTree node.
 496      * @param node the node being visited
 497      * @param p a parameter value
 498      * @return a result value
 499      */
 500     R visitModule(ModuleTree node, P p);
 501 
 502     /**
 503      * Visits an ExportsTree node.
 504      * @param node the node being visited
 505      * @param p a parameter value
 506      * @return a result value
 507      */
 508     R visitExports(ExportsTree node, P p);
 509 
 510     /**
 511      * Visits an OpensTree node.
 512      * @param node the node being visited
 513      * @param p a parameter value
 514      * @return a result value
 515      */
 516     R visitOpens(OpensTree node, P p);
 517 
 518     /**
 519      * Visits a ProvidesTree node.
 520      * @param node the node being visited
 521      * @param p a parameter value
 522      * @return a result value
 523      */
 524     R visitProvides(ProvidesTree node, P p);
 525 
 526     /**
 527      * Visits a RequiresTree node.
 528      * @param node the node being visited
 529      * @param p a parameter value
 530      * @return a result value
 531      */
 532     R visitRequires(RequiresTree node, P p);
 533 
 534     /**
 535      * Visits a UsesTree node.
 536      * @param node the node being visited
 537      * @param p a parameter value
 538      * @return a result value
 539      */
 540     R visitUses(UsesTree node, P p);
 541 
 542     /**
 543      * Visits an unknown type of Tree node.
 544      * This can occur if the language evolves and new kinds
 545      * of nodes are added to the {@code Tree} hierarchy.
 546      * @param node the node being visited
 547      * @param p a parameter value
 548      * @return a result value
 549      */
 550     R visitOther(Tree node, P p);
 551 
 552     /**
 553      * Visits a YieldTree node.
 554      * @param node the node being visited
 555      * @param p a parameter value
 556      * @return a result value
 557      * @since 13
 558      */
 559     R visitYield(YieldTree node, P p);
 560 }