1 /*
   2  * Copyright (c) 1999, 2024, 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.tools.javac.tree;
  27 
  28 import java.io.IOException;
  29 import java.io.StringWriter;
  30 import java.util.*;
  31 
  32 import javax.lang.model.element.Modifier;
  33 import javax.lang.model.type.TypeKind;
  34 import javax.tools.JavaFileObject;
  35 
  36 import com.sun.source.tree.*;
  37 import com.sun.tools.javac.code.*;
  38 import com.sun.tools.javac.code.Directive.RequiresDirective;
  39 import com.sun.tools.javac.code.Scope.*;
  40 import com.sun.tools.javac.code.Symbol.*;
  41 import com.sun.tools.javac.util.*;
  42 import com.sun.tools.javac.util.DefinedBy.Api;
  43 import com.sun.tools.javac.util.JCDiagnostic.DiagnosticPosition;
  44 import com.sun.tools.javac.util.List;
  45 
  46 import static com.sun.tools.javac.tree.JCTree.Tag.*;
  47 
  48 import javax.tools.JavaFileManager.Location;
  49 
  50 import com.sun.source.tree.ModuleTree.ModuleKind;
  51 import com.sun.tools.javac.code.Directive.ExportsDirective;
  52 import com.sun.tools.javac.code.Directive.OpensDirective;
  53 import com.sun.tools.javac.code.Type.ModuleType;
  54 
  55 /**
  56  * Root class for abstract syntax tree nodes. It provides definitions
  57  * for specific tree nodes as subclasses nested inside.
  58  *
  59  * <p>Each subclass is highly standardized.  It generally contains
  60  * only tree fields for the syntactic subcomponents of the node.  Some
  61  * classes that represent identifier uses or definitions also define a
  62  * Symbol field that denotes the represented identifier.  Classes for
  63  * non-local jumps also carry the jump target as a field.  The root
  64  * class Tree itself defines fields for the tree's type and position.
  65  * No other fields are kept in a tree node; instead parameters are
  66  * passed to methods accessing the node.
  67  *
  68  * <p>Except for the methods defined by com.sun.source, the only
  69  * method defined in subclasses is `visit' which applies a given
  70  * visitor to the tree. The actual tree processing is done by visitor
  71  * classes in other packages. The abstract class Visitor, as well as
  72  * an Factory interface for trees, are defined as inner classes in
  73  * Tree.
  74  *
  75  * <p>To avoid ambiguities with the Tree API in com.sun.source all sub
  76  * classes should, by convention, start with JC (javac).
  77  *
  78  * <p><b>This is NOT part of any supported API.
  79  * If you write code that depends on this, you do so at your own risk.
  80  * This code and its internal interfaces are subject to change or
  81  * deletion without notice.</b>
  82  *
  83  * @see TreeMaker
  84  * @see TreeInfo
  85  * @see TreeTranslator
  86  * @see Pretty
  87  */
  88 public abstract class JCTree implements Tree, Cloneable, DiagnosticPosition {
  89 
  90     /* Tree tag values, identifying kinds of trees */
  91     public enum Tag {
  92         /** For methods that return an invalid tag if a given condition is not met
  93          */
  94         NO_TAG,
  95 
  96         /** Toplevel nodes, of type TopLevel, representing entire source files.
  97         */
  98         TOPLEVEL,
  99 
 100         /** Package level definitions.
 101          */
 102         PACKAGEDEF,
 103 
 104         /** Import clauses, of type Import.
 105          */
 106         IMPORT,
 107 
 108         /** Module import clauses.
 109          */
 110         MODULEIMPORT,
 111 
 112         /** Class definitions, of type ClassDef.
 113          */
 114         CLASSDEF,
 115 
 116         /** Method definitions, of type MethodDef.
 117          */
 118         METHODDEF,
 119 
 120         /** Variable definitions, of type VarDef.
 121          */
 122         VARDEF,
 123 
 124         /** The no-op statement ";", of type Skip
 125          */
 126         SKIP,
 127 
 128         /** Blocks, of type Block.
 129          */
 130         BLOCK,
 131 
 132         /** Do-while loops, of type DoLoop.
 133          */
 134         DOLOOP,
 135 
 136         /** While-loops, of type WhileLoop.
 137          */
 138         WHILELOOP,
 139 
 140         /** For-loops, of type ForLoop.
 141          */
 142         FORLOOP,
 143 
 144         /** Foreach-loops, of type ForeachLoop.
 145          */
 146         FOREACHLOOP,
 147 
 148         /** Labelled statements, of type Labelled.
 149          */
 150         LABELLED,
 151 
 152         /** Switch statements, of type Switch.
 153          */
 154         SWITCH,
 155 
 156         /** Case parts in switch statements/expressions, of type Case.
 157          */
 158         CASE,
 159 
 160         /** Switch expression statements, of type Switch.
 161          */
 162         SWITCH_EXPRESSION,
 163 
 164         /** Synchronized statements, of type Synchronized.
 165          */
 166         SYNCHRONIZED,
 167 
 168         /** Try statements, of type Try.
 169          */
 170         TRY,
 171 
 172         /** Catch clauses in try statements, of type Catch.
 173          */
 174         CATCH,
 175 
 176         /** Conditional expressions, of type Conditional.
 177          */
 178         CONDEXPR,
 179 
 180         /** Conditional statements, of type If.
 181          */
 182         IF,
 183 
 184         /** Expression statements, of type Exec.
 185          */
 186         EXEC,
 187 
 188         /** Break statements, of type Break.
 189          */
 190         BREAK,
 191 
 192         /** Yield statements, of type Yield.
 193          */
 194         YIELD,
 195 
 196         /** Continue statements, of type Continue.
 197          */
 198         CONTINUE,
 199 
 200         /** Return statements, of type Return.
 201          */
 202         RETURN,
 203 
 204         /** Throw statements, of type Throw.
 205          */
 206         THROW,
 207 
 208         /** Assert statements, of type Assert.
 209          */
 210         ASSERT,
 211 
 212         /** Method invocation expressions, of type Apply.
 213          */
 214         APPLY,
 215 
 216         /** Class instance creation expressions, of type NewClass.
 217          */
 218         NEWCLASS,
 219 
 220         /** Array creation expressions, of type NewArray.
 221          */
 222         NEWARRAY,
 223 
 224         /** Lambda expression, of type Lambda.
 225          */
 226         LAMBDA,
 227 
 228         /** Parenthesized subexpressions, of type Parens.
 229          */
 230         PARENS,
 231 
 232         /** Assignment expressions, of type Assign.
 233          */
 234         ASSIGN,
 235 
 236         /** Type cast expressions, of type TypeCast.
 237          */
 238         TYPECAST,
 239 
 240         /** Type test expressions, of type TypeTest.
 241          */
 242         TYPETEST,
 243 
 244         /** Patterns.
 245          */
 246         ANYPATTERN,
 247         BINDINGPATTERN,
 248         RECORDPATTERN,
 249 
 250         /* Case labels.
 251          */
 252         DEFAULTCASELABEL,
 253         CONSTANTCASELABEL,
 254         PATTERNCASELABEL,
 255 
 256         /** Indexed array expressions, of type Indexed.
 257          */
 258         INDEXED,
 259 
 260         /** Selections, of type Select.
 261          */
 262         SELECT,
 263 
 264         /** Member references, of type Reference.
 265          */
 266         REFERENCE,
 267 
 268         /** Simple identifiers, of type Ident.
 269          */
 270         IDENT,
 271 
 272         /** Literals, of type Literal.
 273          */
 274         LITERAL,
 275 
 276         /** Basic type identifiers, of type TypeIdent.
 277          */
 278         TYPEIDENT,
 279 
 280         /** Array types, of type TypeArray.
 281          */
 282         TYPEARRAY,
 283 
 284         /** Parameterized types, of type TypeApply.
 285          */
 286         TYPEAPPLY,
 287 
 288         /** Union types, of type TypeUnion.
 289          */
 290         TYPEUNION,
 291 
 292         /** Intersection types, of type TypeIntersection.
 293          */
 294         TYPEINTERSECTION,
 295 
 296         /** Formal type parameters, of type TypeParameter.
 297          */
 298         TYPEPARAMETER,
 299 
 300         /** Type argument.
 301          */
 302         WILDCARD,
 303 
 304         /** Bound kind: extends, super, exact, or unbound
 305          */
 306         TYPEBOUNDKIND,
 307 
 308         /** metadata: Annotation.
 309          */
 310         ANNOTATION,
 311 
 312         /** metadata: Type annotation.
 313          */
 314         TYPE_ANNOTATION,
 315 
 316         /** metadata: Modifiers
 317          */
 318         MODIFIERS,
 319 
 320         /** An annotated type tree.
 321          */
 322         ANNOTATED_TYPE,
 323 
 324         /** Error trees, of type Erroneous.
 325          */
 326         ERRONEOUS,
 327 
 328         /** Unary operators, of type Unary.
 329          */
 330         POS,                             // +
 331         NEG,                             // -
 332         NOT,                             // !
 333         COMPL,                           // ~
 334         PREINC,                          // ++ _
 335         PREDEC,                          // -- _
 336         POSTINC,                         // _ ++
 337         POSTDEC,                         // _ --
 338 
 339         /** unary operator for null reference checks, only used internally.
 340          */
 341         NULLCHK,
 342 
 343         /** Binary operators, of type Binary.
 344          */
 345         OR,                              // ||
 346         AND,                             // &&
 347         BITOR,                           // |
 348         BITXOR,                          // ^
 349         BITAND,                          // &
 350         EQ,                              // ==
 351         NE,                              // !=
 352         LT,                              // <
 353         GT,                              // >
 354         LE,                              // <=
 355         GE,                              // >=
 356         SL,                              // <<
 357         SR,                              // >>
 358         USR,                             // >>>
 359         PLUS,                            // +
 360         MINUS,                           // -
 361         MUL,                             // *
 362         DIV,                             // /
 363         MOD,                             // %
 364 
 365         /** Assignment operators, of type Assignop.
 366          */
 367         BITOR_ASG(BITOR),                // |=
 368         BITXOR_ASG(BITXOR),              // ^=
 369         BITAND_ASG(BITAND),              // &=
 370 
 371         SL_ASG(SL),                      // <<=
 372         SR_ASG(SR),                      // >>=
 373         USR_ASG(USR),                    // >>>=
 374         PLUS_ASG(PLUS),                  // +=
 375         MINUS_ASG(MINUS),                // -=
 376         MUL_ASG(MUL),                    // *=
 377         DIV_ASG(DIV),                    // /=
 378         MOD_ASG(MOD),                    // %=
 379 
 380         MODULEDEF,
 381         EXPORTS,
 382         OPENS,
 383         PROVIDES,
 384         REQUIRES,
 385         USES,
 386 
 387         /** A synthetic let expression, of type LetExpr.
 388          */
 389         LETEXPR;                         // ala scheme
 390 
 391         private final Tag noAssignTag;
 392 
 393         private static final int numberOfOperators = MOD.ordinal() - POS.ordinal() + 1;
 394 
 395         private Tag(Tag noAssignTag) {
 396             this.noAssignTag = noAssignTag;
 397         }
 398 
 399         private Tag() {
 400             this(null);
 401         }
 402 
 403         public static int getNumberOfOperators() {
 404             return numberOfOperators;
 405         }
 406 
 407         public Tag noAssignOp() {
 408             if (noAssignTag != null)
 409                 return noAssignTag;
 410             throw new AssertionError("noAssignOp() method is not available for non assignment tags");
 411         }
 412 
 413         public boolean isPostUnaryOp() {
 414             return (this == POSTINC || this == POSTDEC);
 415         }
 416 
 417         public boolean isIncOrDecUnaryOp() {
 418             return (this == PREINC || this == PREDEC || this == POSTINC || this == POSTDEC);
 419         }
 420 
 421         public boolean isAssignop() {
 422             return noAssignTag != null;
 423         }
 424 
 425         public int operatorIndex() {
 426             return (this.ordinal() - POS.ordinal());
 427         }
 428     }
 429 
 430     /* The (encoded) position in the source file. @see util.Position.
 431      */
 432     public int pos;
 433 
 434     /* The type of this node.
 435      */
 436     public Type type;
 437 
 438     /* The tag of this node -- one of the constants declared above.
 439      */
 440     public abstract Tag getTag();
 441 
 442     /* Returns true if the tag of this node is equals to tag.
 443      */
 444     public boolean hasTag(Tag tag) {
 445         return tag == getTag();
 446     }
 447 
 448     /** Convert a tree to a pretty-printed string. */
 449     @Override
 450     public String toString() {
 451         StringWriter s = new StringWriter();
 452         try {
 453             new Pretty(s, false).printExpr(this);
 454         }
 455         catch (IOException e) {
 456             // should never happen, because StringWriter is defined
 457             // never to throw any IOExceptions
 458             throw new AssertionError(e);
 459         }
 460         return s.toString();
 461     }
 462 
 463     /** Set position field and return this tree.
 464      */
 465     public JCTree setPos(int pos) {
 466         this.pos = pos;
 467         return this;
 468     }
 469 
 470     /** Set type field and return this tree.
 471      */
 472     public JCTree setType(Type type) {
 473         this.type = type;
 474         return this;
 475     }
 476 
 477     /** Visit this tree with a given visitor.
 478      */
 479     public abstract void accept(Visitor v);
 480 
 481     @DefinedBy(Api.COMPILER_TREE)
 482     public abstract <R,D> R accept(TreeVisitor<R,D> v, D d);
 483 
 484     /** Return a shallow copy of this tree.
 485      */
 486     @Override
 487     public Object clone() {
 488         try {
 489             return super.clone();
 490         } catch(CloneNotSupportedException e) {
 491             throw new RuntimeException(e);
 492         }
 493     }
 494 
 495     /** Get a default position for this tree node.
 496      */
 497     public DiagnosticPosition pos() {
 498         return this;
 499     }
 500 
 501     // for default DiagnosticPosition
 502     public JCTree getTree() {
 503         return this;
 504     }
 505 
 506     // for default DiagnosticPosition
 507     public int getStartPosition() {
 508         return TreeInfo.getStartPos(this);
 509     }
 510 
 511     // for default DiagnosticPosition
 512     public int getPreferredPosition() {
 513         return pos;
 514     }
 515 
 516     // for default DiagnosticPosition
 517     public int getEndPosition(EndPosTable endPosTable) {
 518         return TreeInfo.getEndPos(this, endPosTable);
 519     }
 520 
 521     /**
 522      * Everything in one source file is kept in a {@linkplain JCCompilationUnit} structure.
 523      */
 524     public static class JCCompilationUnit extends JCTree implements CompilationUnitTree {
 525         /** All definitions in this file (ClassDef, Import, and Skip) */
 526         public List<JCTree> defs;
 527         /** The source file name. */
 528         public JavaFileObject sourcefile;
 529         /** The module to which this compilation unit belongs. */
 530         public ModuleSymbol modle;
 531         /** The location in which this compilation unit was found. */
 532         public Location locn;
 533         /** The package to which this compilation unit belongs. */
 534         public PackageSymbol packge;
 535         /** A scope containing top level classes. */
 536         public WriteableScope toplevelScope;
 537         /** A scope for all named imports. */
 538         public NamedImportScope namedImportScope;
 539         /** A scope for all import-on-demands. */
 540         public StarImportScope starImportScope;
 541         /** A scope for all single module imports. */
 542         public StarImportScope moduleImportScope;
 543         /** Line starting positions, defined only if option -g is set. */
 544         public Position.LineMap lineMap = null;
 545         /** A table that stores all documentation comments indexed by the tree
 546          * nodes they refer to. defined only if option -s is set. */
 547         public DocCommentTable docComments = null;
 548         /* An object encapsulating ending positions of source ranges indexed by
 549          * the tree nodes they belong to. Defined only if option -Xjcov is set. */
 550         public EndPosTable endPositions = null;
 551         protected JCCompilationUnit(List<JCTree> defs) {
 552             this.defs = defs;
 553         }
 554         @Override
 555         public void accept(Visitor v) { v.visitTopLevel(this); }
 556 
 557         @DefinedBy(Api.COMPILER_TREE)
 558         public Kind getKind() { return Kind.COMPILATION_UNIT; }
 559 
 560         public JCModuleDecl getModuleDecl() {
 561             for (JCTree tree : defs) {
 562                 if (tree.hasTag(MODULEDEF)) {
 563                     return (JCModuleDecl) tree;
 564                 }
 565             }
 566 
 567             return null;
 568         }
 569 
 570         @DefinedBy(Api.COMPILER_TREE)
 571         public JCModuleDecl getModule() {
 572             return getModuleDecl();
 573         }
 574 
 575         @DefinedBy(Api.COMPILER_TREE)
 576         public JCPackageDecl getPackage() {
 577             // PackageDecl must be the first entry if it exists
 578             if (!defs.isEmpty() && defs.head.hasTag(PACKAGEDEF))
 579                 return (JCPackageDecl)defs.head;
 580             return null;
 581         }
 582         @DefinedBy(Api.COMPILER_TREE)
 583         public List<JCAnnotation> getPackageAnnotations() {
 584             JCPackageDecl pd = getPackage();
 585             return pd != null ? pd.getAnnotations() : List.nil();
 586         }
 587         @DefinedBy(Api.COMPILER_TREE)
 588         public ExpressionTree getPackageName() {
 589             JCPackageDecl pd = getPackage();
 590             return pd != null ? pd.getPackageName() : null;
 591         }
 592 
 593         @DefinedBy(Api.COMPILER_TREE)
 594         public List<JCImportBase> getImports() {
 595             ListBuffer<JCImportBase> imports = new ListBuffer<>();
 596             for (JCTree tree : defs) {
 597                 if (tree instanceof JCImportBase imp)
 598                     imports.append(imp);
 599                 else if (!tree.hasTag(PACKAGEDEF) && !tree.hasTag(SKIP))
 600                     break;
 601             }
 602             return imports.toList();
 603         }
 604         @DefinedBy(Api.COMPILER_TREE)
 605         public JavaFileObject getSourceFile() {
 606             return sourcefile;
 607         }
 608         @DefinedBy(Api.COMPILER_TREE)
 609         public Position.LineMap getLineMap() {
 610             return lineMap;
 611         }
 612         @DefinedBy(Api.COMPILER_TREE)
 613         public List<JCTree> getTypeDecls() {
 614             List<JCTree> typeDefs;
 615             for (typeDefs = defs; !typeDefs.isEmpty(); typeDefs = typeDefs.tail) {
 616                 if (!typeDefs.head.hasTag(MODULEDEF)
 617                         && !typeDefs.head.hasTag(PACKAGEDEF)
 618                         && !typeDefs.head.hasTag(IMPORT)
 619                         && !typeDefs.head.hasTag(MODULEIMPORT)) {
 620                     break;
 621                 }
 622             }
 623             return typeDefs;
 624         }
 625         @Override @DefinedBy(Api.COMPILER_TREE)
 626         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
 627             return v.visitCompilationUnit(this, d);
 628         }
 629 
 630         @Override
 631         public Tag getTag() {
 632             return TOPLEVEL;
 633         }
 634     }
 635 
 636     /**
 637      * Package definition.
 638      */
 639     public static class JCPackageDecl extends JCTree implements PackageTree {
 640         public List<JCAnnotation> annotations;
 641         /** The tree representing the package clause. */
 642         public JCExpression pid;
 643         public PackageSymbol packge;
 644         public JCPackageDecl(List<JCAnnotation> annotations, JCExpression pid) {
 645             this.annotations = annotations;
 646             this.pid = pid;
 647         }
 648         @Override
 649         public void accept(Visitor v) { v.visitPackageDef(this); }
 650         @DefinedBy(Api.COMPILER_TREE)
 651         public Kind getKind() {
 652             return Kind.PACKAGE;
 653         }
 654         @DefinedBy(Api.COMPILER_TREE)
 655         public List<JCAnnotation> getAnnotations() {
 656             return annotations;
 657         }
 658         @DefinedBy(Api.COMPILER_TREE)
 659         public JCExpression getPackageName() {
 660             return pid;
 661         }
 662         @Override @DefinedBy(Api.COMPILER_TREE)
 663         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
 664             return v.visitPackage(this, d);
 665         }
 666         @Override
 667         public Tag getTag() {
 668             return PACKAGEDEF;
 669         }
 670     }
 671 
 672     public static abstract class JCImportBase extends JCTree implements ImportTree {
 673 
 674         @DefinedBy(Api.COMPILER_TREE)
 675         public Kind getKind() { return Kind.IMPORT; }
 676         @Override @DefinedBy(Api.COMPILER_TREE)
 677         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
 678             return v.visitImport(this, d);
 679         }
 680 
 681         public abstract JCTree getQualifiedIdentifier();
 682     }
 683 
 684     /**
 685      * An import clause.
 686      */
 687     public static class JCImport extends JCImportBase {
 688         public boolean staticImport;
 689         /** The imported class(es). */
 690         public JCFieldAccess qualid;
 691         public com.sun.tools.javac.code.Scope importScope;
 692         protected JCImport(JCFieldAccess qualid, boolean importStatic) {
 693             this.qualid = qualid;
 694             this.staticImport = importStatic;
 695         }
 696         @Override
 697         public void accept(Visitor v) { v.visitImport(this); }
 698 
 699         @DefinedBy(Api.COMPILER_TREE)
 700         public boolean isStatic() { return staticImport; }
 701         @DefinedBy(Api.COMPILER_TREE)
 702         public boolean isModule() { return false; }
 703         @DefinedBy(Api.COMPILER_TREE)
 704         public JCFieldAccess getQualifiedIdentifier() { return qualid; }
 705 
 706         @Override
 707         public Tag getTag() {
 708             return IMPORT;
 709         }
 710     }
 711 
 712     /**
 713      * A module import clause.
 714      */
 715     public static class JCModuleImport extends JCImportBase {
 716         /** The module name. */
 717         public JCExpression module;
 718         protected JCModuleImport(JCExpression module) {
 719             this.module = module;
 720         }
 721         @Override
 722         public void accept(Visitor v) { v.visitModuleImport(this); }
 723 
 724         @DefinedBy(Api.COMPILER_TREE)
 725         public boolean isStatic() { return false; }
 726         @DefinedBy(Api.COMPILER_TREE)
 727         public boolean isModule() { return true; }
 728         @DefinedBy(Api.COMPILER_TREE)
 729         public JCExpression getQualifiedIdentifier() { return module; }
 730 
 731         @DefinedBy(Api.COMPILER_TREE)
 732         public Kind getKind() { return Kind.IMPORT; }
 733         @Override @DefinedBy(Api.COMPILER_TREE)
 734         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
 735             return v.visitImport(this, d);
 736         }
 737 
 738         @Override
 739         public Tag getTag() {
 740             return MODULEIMPORT;
 741         }
 742     }
 743 
 744     public abstract static class JCStatement extends JCTree implements StatementTree {
 745         @Override
 746         public JCStatement setType(Type type) {
 747             super.setType(type);
 748             return this;
 749         }
 750         @Override
 751         public JCStatement setPos(int pos) {
 752             super.setPos(pos);
 753             return this;
 754         }
 755     }
 756 
 757     public abstract static class JCCaseLabel extends JCTree implements CaseLabelTree {
 758     }
 759 
 760     public abstract static class JCExpression extends JCTree implements ExpressionTree {
 761         @Override
 762         public JCExpression setType(Type type) {
 763             super.setType(type);
 764             return this;
 765         }
 766         @Override
 767         public JCExpression setPos(int pos) {
 768             super.setPos(pos);
 769             return this;
 770         }
 771 
 772         public boolean isPoly() { return false; }
 773         public boolean isStandalone() { return true; }
 774 
 775     }
 776 
 777     /**
 778      * Common supertype for all poly expression trees (lambda, method references,
 779      * conditionals, method and constructor calls)
 780      */
 781     public abstract static class JCPolyExpression extends JCExpression {
 782 
 783         /**
 784          * A poly expression can only be truly 'poly' in certain contexts
 785          */
 786         public enum PolyKind {
 787             /** poly expression to be treated as a standalone expression */
 788             STANDALONE,
 789             /** true poly expression */
 790             POLY
 791         }
 792 
 793         /** is this poly expression a 'true' poly expression? */
 794         public PolyKind polyKind;
 795 
 796         @Override public boolean isPoly() { return polyKind == PolyKind.POLY; }
 797         @Override public boolean isStandalone() { return polyKind == PolyKind.STANDALONE; }
 798     }
 799 
 800     /**
 801      * Common supertype for all functional expression trees (lambda and method references)
 802      */
 803     public abstract static class JCFunctionalExpression extends JCPolyExpression {
 804 
 805         public JCFunctionalExpression() {
 806             //a functional expression is always a 'true' poly
 807             polyKind = PolyKind.POLY;
 808         }
 809 
 810         /** list of target types inferred for this functional expression. */
 811         public Type target;
 812         /** The owner of this functional expression. */
 813         public Symbol owner;
 814 
 815         public Type getDescriptorType(Types types) {
 816             return target != null ? types.findDescriptorType(target) : types.createErrorType(null);
 817         }
 818     }
 819 
 820     /**
 821      * A class definition.
 822      */
 823     public static class JCClassDecl extends JCStatement implements ClassTree {
 824         /** the modifiers */
 825         public JCModifiers mods;
 826         /** the name of the class */
 827         public Name name;
 828         /** formal class parameters */
 829         public List<JCTypeParameter> typarams;
 830         /** the classes this class extends */
 831         public JCExpression extending;
 832         /** the interfaces implemented by this class */
 833         public List<JCExpression> implementing;
 834         /** the subclasses allowed to extend this class, if sealed */
 835         public List<JCExpression> permitting;
 836         /** all variables and methods defined in this class */
 837         public List<JCTree> defs;
 838         /** the symbol */
 839         public ClassSymbol sym;
 840         protected JCClassDecl(JCModifiers mods,
 841                            Name name,
 842                            List<JCTypeParameter> typarams,
 843                            JCExpression extending,
 844                            List<JCExpression> implementing,
 845                            List<JCExpression> permitting,
 846                            List<JCTree> defs,
 847                            ClassSymbol sym)
 848         {
 849             this.mods = mods;
 850             this.name = name;
 851             this.typarams = typarams;
 852             this.extending = extending;
 853             this.implementing = implementing;
 854             this.permitting = permitting;
 855             this.defs = defs;
 856             this.sym = sym;
 857         }
 858         @Override
 859         public void accept(Visitor v) { v.visitClassDef(this); }
 860 
 861         @DefinedBy(Api.COMPILER_TREE)
 862         public Kind getKind() {
 863             if ((mods.flags & Flags.ANNOTATION) != 0)
 864                 return Kind.ANNOTATION_TYPE;
 865             else if ((mods.flags & Flags.INTERFACE) != 0)
 866                 return Kind.INTERFACE;
 867             else if ((mods.flags & Flags.ENUM) != 0)
 868                 return Kind.ENUM;
 869             else if ((mods.flags & Flags.RECORD) != 0)
 870                 return Kind.RECORD;
 871             else
 872                 return Kind.CLASS;
 873         }
 874 
 875         @DefinedBy(Api.COMPILER_TREE)
 876         public JCModifiers getModifiers() { return mods; }
 877         @DefinedBy(Api.COMPILER_TREE)
 878         public Name getSimpleName() { return name; }
 879         @DefinedBy(Api.COMPILER_TREE)
 880         public List<JCTypeParameter> getTypeParameters() {
 881             return typarams;
 882         }
 883         @DefinedBy(Api.COMPILER_TREE)
 884         public JCExpression getExtendsClause() { return extending; }
 885         @DefinedBy(Api.COMPILER_TREE)
 886         public List<JCExpression> getImplementsClause() {
 887             return implementing;
 888         }
 889         @DefinedBy(Api.COMPILER_TREE)
 890         public List<JCExpression> getPermitsClause() {
 891             return permitting;
 892         }
 893         @DefinedBy(Api.COMPILER_TREE)
 894         public List<JCTree> getMembers() {
 895             return defs;
 896         }
 897         @Override @DefinedBy(Api.COMPILER_TREE)
 898         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
 899             return v.visitClass(this, d);
 900         }
 901 
 902         @Override
 903         public Tag getTag() {
 904             return CLASSDEF;
 905         }
 906     }
 907 
 908     /**
 909      * A method definition.
 910      */
 911     public static class JCMethodDecl extends JCTree implements MethodTree {
 912         /** method modifiers */
 913         public JCModifiers mods;
 914         /** method name */
 915         public Name name;
 916         /** type of method return value */
 917         public JCExpression restype;
 918         /** type parameters */
 919         public List<JCTypeParameter> typarams;
 920         /** receiver parameter */
 921         public JCVariableDecl recvparam;
 922         /** value parameters */
 923         public List<JCVariableDecl> params;
 924         /** exceptions thrown by this method */
 925         public List<JCExpression> thrown;
 926         /** statements in the method */
 927         public JCBlock body;
 928         /** default value, for annotation types */
 929         public JCExpression defaultValue;
 930         /** method symbol */
 931         public MethodSymbol sym;
 932         /** does this method completes normally */
 933         public boolean completesNormally;
 934 
 935         protected JCMethodDecl(JCModifiers mods,
 936                             Name name,
 937                             JCExpression restype,
 938                             List<JCTypeParameter> typarams,
 939                             JCVariableDecl recvparam,
 940                             List<JCVariableDecl> params,
 941                             List<JCExpression> thrown,
 942                             JCBlock body,
 943                             JCExpression defaultValue,
 944                             MethodSymbol sym)
 945         {
 946             this.mods = mods;
 947             this.name = name;
 948             this.restype = restype;
 949             this.typarams = typarams;
 950             this.params = params;
 951             this.recvparam = recvparam;
 952             // TODO: do something special if the given type is null?
 953             // receiver != null ? receiver : List.<JCTypeAnnotation>nil());
 954             this.thrown = thrown;
 955             this.body = body;
 956             this.defaultValue = defaultValue;
 957             this.sym = sym;
 958         }
 959         @Override
 960         public void accept(Visitor v) { v.visitMethodDef(this); }
 961 
 962         @DefinedBy(Api.COMPILER_TREE)
 963         public Kind getKind() { return Kind.METHOD; }
 964         @DefinedBy(Api.COMPILER_TREE)
 965         public JCModifiers getModifiers() { return mods; }
 966         @DefinedBy(Api.COMPILER_TREE)
 967         public Name getName() { return name; }
 968         @DefinedBy(Api.COMPILER_TREE)
 969         public JCTree getReturnType() { return restype; }
 970         @DefinedBy(Api.COMPILER_TREE)
 971         public List<JCTypeParameter> getTypeParameters() {
 972             return typarams;
 973         }
 974         @DefinedBy(Api.COMPILER_TREE)
 975         public List<JCVariableDecl> getParameters() {
 976             return params;
 977         }
 978         @DefinedBy(Api.COMPILER_TREE)
 979         public JCVariableDecl getReceiverParameter() { return recvparam; }
 980         @DefinedBy(Api.COMPILER_TREE)
 981         public List<JCExpression> getThrows() {
 982             return thrown;
 983         }
 984         @DefinedBy(Api.COMPILER_TREE)
 985         public JCBlock getBody() { return body; }
 986         @DefinedBy(Api.COMPILER_TREE)
 987         public JCTree getDefaultValue() { // for annotation types
 988             return defaultValue;
 989         }
 990         @Override @DefinedBy(Api.COMPILER_TREE)
 991         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
 992             return v.visitMethod(this, d);
 993         }
 994 
 995         @Override
 996         public Tag getTag() {
 997             return METHODDEF;
 998         }
 999   }
1000 
1001     /**
1002      * A variable definition.
1003      */
1004     public static class JCVariableDecl extends JCStatement implements VariableTree {
1005         /** variable modifiers */
1006         public JCModifiers mods;
1007         /** variable name */
1008         public Name name;
1009         /** variable name expression */
1010         public JCExpression nameexpr;
1011         /** type of the variable */
1012         public JCExpression vartype;
1013         /** variable's initial value */
1014         public JCExpression init;
1015         /** symbol */
1016         public VarSymbol sym;
1017         /** explicit start pos */
1018         public int startPos = Position.NOPOS;
1019         /** declared using `var` */
1020         private boolean declaredUsingVar;
1021 
1022         protected JCVariableDecl(JCModifiers mods,
1023                          Name name,
1024                          JCExpression vartype,
1025                          JCExpression init,
1026                          VarSymbol sym) {
1027             this(mods, name, vartype, init, sym, false);
1028         }
1029 
1030         protected JCVariableDecl(JCModifiers mods,
1031                                  Name name,
1032                                  JCExpression vartype,
1033                                  JCExpression init,
1034                                  VarSymbol sym,
1035                                  boolean declaredUsingVar) {
1036             this.mods = mods;
1037             this.name = name;
1038             this.vartype = vartype;
1039             this.init = init;
1040             this.sym = sym;
1041             this.declaredUsingVar = declaredUsingVar;
1042         }
1043 
1044         protected JCVariableDecl(JCModifiers mods,
1045                          JCExpression nameexpr,
1046                          JCExpression vartype) {
1047             this(mods, null, vartype, null, null, false);
1048             this.nameexpr = nameexpr;
1049             if (nameexpr.hasTag(Tag.IDENT)) {
1050                 this.name = ((JCIdent)nameexpr).name;
1051             } else {
1052                 // Only other option is qualified name x.y.this;
1053                 this.name = ((JCFieldAccess)nameexpr).name;
1054             }
1055         }
1056 
1057         public boolean isImplicitlyTyped() {
1058             return vartype == null;
1059         }
1060 
1061         public boolean declaredUsingVar() {
1062             return declaredUsingVar;
1063         }
1064 
1065         @Override
1066         public void accept(Visitor v) { v.visitVarDef(this); }
1067 
1068         @DefinedBy(Api.COMPILER_TREE)
1069         public Kind getKind() { return Kind.VARIABLE; }
1070         @DefinedBy(Api.COMPILER_TREE)
1071         public JCModifiers getModifiers() { return mods; }
1072         @DefinedBy(Api.COMPILER_TREE)
1073         public Name getName() { return name; }
1074         @DefinedBy(Api.COMPILER_TREE)
1075         public JCExpression getNameExpression() { return nameexpr; }
1076         @DefinedBy(Api.COMPILER_TREE)
1077         public JCTree getType() { return vartype; }
1078         @DefinedBy(Api.COMPILER_TREE)
1079         public JCExpression getInitializer() {
1080             return init;
1081         }
1082         @Override @DefinedBy(Api.COMPILER_TREE)
1083         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
1084             return v.visitVariable(this, d);
1085         }
1086 
1087         @Override
1088         public Tag getTag() {
1089             return VARDEF;
1090         }
1091     }
1092 
1093     /**
1094      * A no-op statement ";".
1095      */
1096     public static class JCSkip extends JCStatement implements EmptyStatementTree {
1097         protected JCSkip() {
1098         }
1099         @Override
1100         public void accept(Visitor v) { v.visitSkip(this); }
1101 
1102         @DefinedBy(Api.COMPILER_TREE)
1103         public Kind getKind() { return Kind.EMPTY_STATEMENT; }
1104         @Override @DefinedBy(Api.COMPILER_TREE)
1105         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
1106             return v.visitEmptyStatement(this, d);
1107         }
1108 
1109         @Override
1110         public Tag getTag() {
1111             return SKIP;
1112         }
1113     }
1114 
1115     /**
1116      * A statement block.
1117      */
1118     public static class JCBlock extends JCStatement implements BlockTree {
1119         /** flags */
1120         public long flags;
1121         /** statements */
1122         public List<JCStatement> stats;
1123         /** Position of closing brace, optional. */
1124         public int endpos = Position.NOPOS;
1125         /** If this block contains record pattern, it is necessary to catch
1126          *  exceptions from the deconstructors and wrap them.
1127          * The {@code patternMatchingCatch} keeps the list of the deconstructor
1128          * invocations, and the additional catch block that wraps the exceptions.
1129          */
1130         public PatternMatchingCatch patternMatchingCatch;
1131         protected JCBlock(long flags, List<JCStatement> stats) {
1132             this.stats = stats;
1133             this.flags = flags;
1134         }
1135         @Override
1136         public void accept(Visitor v) { v.visitBlock(this); }
1137 
1138         @DefinedBy(Api.COMPILER_TREE)
1139         public Kind getKind() { return Kind.BLOCK; }
1140         @DefinedBy(Api.COMPILER_TREE)
1141         public List<JCStatement> getStatements() {
1142             return stats;
1143         }
1144         @DefinedBy(Api.COMPILER_TREE)
1145         public boolean isStatic() { return (flags & Flags.STATIC) != 0; }
1146         @Override @DefinedBy(Api.COMPILER_TREE)
1147         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
1148             return v.visitBlock(this, d);
1149         }
1150 
1151         @Override
1152         public Tag getTag() {
1153             return BLOCK;
1154         }
1155 
1156         public record PatternMatchingCatch(JCCatch handler, Set<JCMethodInvocation> calls2Handle) {}
1157     }
1158 
1159     /**
1160      * A do loop
1161      */
1162     public static class JCDoWhileLoop extends JCStatement implements DoWhileLoopTree {
1163         public JCStatement body;
1164         public JCExpression cond;
1165         protected JCDoWhileLoop(JCStatement body, JCExpression cond) {
1166             this.body = body;
1167             this.cond = cond;
1168         }
1169         @Override
1170         public void accept(Visitor v) { v.visitDoLoop(this); }
1171 
1172         @DefinedBy(Api.COMPILER_TREE)
1173         public Kind getKind() { return Kind.DO_WHILE_LOOP; }
1174         @DefinedBy(Api.COMPILER_TREE)
1175         public JCExpression getCondition() { return cond; }
1176         @DefinedBy(Api.COMPILER_TREE)
1177         public JCStatement getStatement() { return body; }
1178         @Override @DefinedBy(Api.COMPILER_TREE)
1179         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
1180             return v.visitDoWhileLoop(this, d);
1181         }
1182 
1183         @Override
1184         public Tag getTag() {
1185             return DOLOOP;
1186         }
1187     }
1188 
1189     /**
1190      * A while loop
1191      */
1192     public static class JCWhileLoop extends JCStatement implements WhileLoopTree {
1193         public JCExpression cond;
1194         public JCStatement body;
1195         protected JCWhileLoop(JCExpression cond, JCStatement body) {
1196             this.cond = cond;
1197             this.body = body;
1198         }
1199         @Override
1200         public void accept(Visitor v) { v.visitWhileLoop(this); }
1201 
1202         @DefinedBy(Api.COMPILER_TREE)
1203         public Kind getKind() { return Kind.WHILE_LOOP; }
1204         @DefinedBy(Api.COMPILER_TREE)
1205         public JCExpression getCondition() { return cond; }
1206         @DefinedBy(Api.COMPILER_TREE)
1207         public JCStatement getStatement() { return body; }
1208         @Override @DefinedBy(Api.COMPILER_TREE)
1209         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
1210             return v.visitWhileLoop(this, d);
1211         }
1212 
1213         @Override
1214         public Tag getTag() {
1215             return WHILELOOP;
1216         }
1217     }
1218 
1219     /**
1220      * A for loop.
1221      */
1222     public static class JCForLoop extends JCStatement implements ForLoopTree {
1223         public List<JCStatement> init;
1224         public JCExpression cond;
1225         public List<JCExpressionStatement> step;
1226         public JCStatement body;
1227         protected JCForLoop(List<JCStatement> init,
1228                           JCExpression cond,
1229                           List<JCExpressionStatement> update,
1230                           JCStatement body)
1231         {
1232             this.init = init;
1233             this.cond = cond;
1234             this.step = update;
1235             this.body = body;
1236         }
1237         @Override
1238         public void accept(Visitor v) { v.visitForLoop(this); }
1239 
1240         @DefinedBy(Api.COMPILER_TREE)
1241         public Kind getKind() { return Kind.FOR_LOOP; }
1242         @DefinedBy(Api.COMPILER_TREE)
1243         public JCExpression getCondition() { return cond; }
1244         @DefinedBy(Api.COMPILER_TREE)
1245         public JCStatement getStatement() { return body; }
1246         @DefinedBy(Api.COMPILER_TREE)
1247         public List<JCStatement> getInitializer() {
1248             return init;
1249         }
1250         @DefinedBy(Api.COMPILER_TREE)
1251         public List<JCExpressionStatement> getUpdate() {
1252             return step;
1253         }
1254         @Override @DefinedBy(Api.COMPILER_TREE)
1255         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
1256             return v.visitForLoop(this, d);
1257         }
1258 
1259         @Override
1260         public Tag getTag() {
1261             return FORLOOP;
1262         }
1263     }
1264 
1265     /**
1266      * The enhanced for loop.
1267      */
1268     public static class JCEnhancedForLoop extends JCStatement implements EnhancedForLoopTree {
1269         public JCVariableDecl var;
1270         public JCExpression expr;
1271         public JCStatement body;
1272         protected JCEnhancedForLoop(JCVariableDecl var, JCExpression expr, JCStatement body) {
1273             this.var = var;
1274             this.expr = expr;
1275             this.body = body;
1276         }
1277         @Override
1278         public void accept(Visitor v) { v.visitForeachLoop(this); }
1279 
1280         @DefinedBy(Api.COMPILER_TREE)
1281         public Kind getKind() { return Kind.ENHANCED_FOR_LOOP; }
1282         @DefinedBy(Api.COMPILER_TREE)
1283         public JCVariableDecl getVariable() { return var; }
1284         @DefinedBy(Api.COMPILER_TREE)
1285         public JCExpression getExpression() { return expr; }
1286         @DefinedBy(Api.COMPILER_TREE)
1287         public JCStatement getStatement() { return body; }
1288         @Override @DefinedBy(Api.COMPILER_TREE)
1289         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
1290             return v.visitEnhancedForLoop(this, d);
1291         }
1292         @Override
1293         public Tag getTag() {
1294             return FOREACHLOOP;
1295         }
1296     }
1297 
1298     /**
1299      * A labelled expression or statement.
1300      */
1301     public static class JCLabeledStatement extends JCStatement implements LabeledStatementTree {
1302         public Name label;
1303         public JCStatement body;
1304         protected JCLabeledStatement(Name label, JCStatement body) {
1305             this.label = label;
1306             this.body = body;
1307         }
1308         @Override
1309         public void accept(Visitor v) { v.visitLabelled(this); }
1310         @DefinedBy(Api.COMPILER_TREE)
1311         public Kind getKind() { return Kind.LABELED_STATEMENT; }
1312         @DefinedBy(Api.COMPILER_TREE)
1313         public Name getLabel() { return label; }
1314         @DefinedBy(Api.COMPILER_TREE)
1315         public JCStatement getStatement() { return body; }
1316         @Override @DefinedBy(Api.COMPILER_TREE)
1317         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
1318             return v.visitLabeledStatement(this, d);
1319         }
1320         @Override
1321         public Tag getTag() {
1322             return LABELLED;
1323         }
1324     }
1325 
1326     /**
1327      * A "switch ( ) { }" construction.
1328      */
1329     public static class JCSwitch extends JCStatement implements SwitchTree {
1330         public JCExpression selector;
1331         public List<JCCase> cases;
1332         /** Position of closing brace, optional. */
1333         public int endpos = Position.NOPOS;
1334         public boolean hasUnconditionalPattern;
1335         public boolean isExhaustive;
1336         public boolean patternSwitch;
1337         public boolean wasEnumSelector;
1338         protected JCSwitch(JCExpression selector, List<JCCase> cases) {
1339             this.selector = selector;
1340             this.cases = cases;
1341         }
1342         @Override
1343         public void accept(Visitor v) { v.visitSwitch(this); }
1344 
1345         @DefinedBy(Api.COMPILER_TREE)
1346         public Kind getKind() { return Kind.SWITCH; }
1347         @DefinedBy(Api.COMPILER_TREE)
1348         public JCExpression getExpression() { return selector; }
1349         @DefinedBy(Api.COMPILER_TREE)
1350         public List<JCCase> getCases() { return cases; }
1351         @Override @DefinedBy(Api.COMPILER_TREE)
1352         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
1353             return v.visitSwitch(this, d);
1354         }
1355         @Override
1356         public Tag getTag() {
1357             return SWITCH;
1358         }
1359     }
1360 
1361     /**
1362      * A "case  :" of a switch.
1363      */
1364     public static class JCCase extends JCStatement implements CaseTree {
1365         //as CaseKind is deprecated for removal (as it is part of a preview feature),
1366         //using indirection through these fields to avoid unnecessary @SuppressWarnings:
1367         public static final CaseKind STATEMENT = CaseKind.STATEMENT;
1368         public static final CaseKind RULE = CaseKind.RULE;
1369         public final CaseKind caseKind;
1370         public List<JCCaseLabel> labels;
1371         public JCExpression guard;
1372         public List<JCStatement> stats;
1373         public JCTree body;
1374         public boolean completesNormally;
1375         protected JCCase(CaseKind caseKind, List<JCCaseLabel> labels,
1376                          JCExpression guard,
1377                          List<JCStatement> stats, JCTree body) {
1378             Assert.checkNonNull(labels);
1379             Assert.check(labels.isEmpty() || labels.head != null);
1380             this.caseKind = caseKind;
1381             this.labels = labels;
1382             this.guard = guard;
1383             this.stats = stats;
1384             this.body = body;
1385         }
1386         @Override
1387         public void accept(Visitor v) { v.visitCase(this); }
1388 
1389         @Override @DefinedBy(Api.COMPILER_TREE)
1390         public Kind getKind() { return Kind.CASE; }
1391         @Override @Deprecated @DefinedBy(Api.COMPILER_TREE)
1392         public JCExpression getExpression() { return getExpressions().head; }
1393 
1394         @Override @DefinedBy(Api.COMPILER_TREE)
1395         public List<JCExpression> getExpressions() {
1396             return labels.stream()
1397                          .filter(p -> p.hasTag(CONSTANTCASELABEL))
1398                          .map(p -> ((JCConstantCaseLabel) p).expr)
1399                          .collect(List.collector());
1400         }
1401 
1402         @Override @DefinedBy(Api.COMPILER_TREE)
1403         public List<JCCaseLabel> getLabels() { return labels; }
1404         @Override @DefinedBy(Api.COMPILER_TREE)
1405         public JCExpression getGuard() { return guard; }
1406         @Override @DefinedBy(Api.COMPILER_TREE)
1407         public List<JCStatement> getStatements() {
1408             return caseKind == CaseKind.STATEMENT ? stats : null;
1409         }
1410         @Override @DefinedBy(Api.COMPILER_TREE)
1411         public JCTree getBody() { return body; }
1412         @Override @DefinedBy(Api.COMPILER_TREE)
1413         public CaseKind getCaseKind() {
1414             return caseKind;
1415         }
1416         @Override @DefinedBy(Api.COMPILER_TREE)
1417         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
1418             return v.visitCase(this, d);
1419         }
1420         @Override
1421         public Tag getTag() {
1422             return CASE;
1423         }
1424     }
1425 
1426     /**
1427      * A "switch ( ) { }" construction.
1428      */
1429     public static class JCSwitchExpression extends JCPolyExpression implements SwitchExpressionTree {
1430         public JCExpression selector;
1431         public List<JCCase> cases;
1432         /** Position of closing brace, optional. */
1433         public int endpos = Position.NOPOS;
1434         public boolean hasUnconditionalPattern;
1435         public boolean isExhaustive;
1436         public boolean patternSwitch;
1437         public boolean wasEnumSelector;
1438         protected JCSwitchExpression(JCExpression selector, List<JCCase> cases) {
1439             this.selector = selector;
1440             this.cases = cases;
1441         }
1442         @Override
1443         public void accept(Visitor v) { v.visitSwitchExpression(this); }
1444 
1445         @DefinedBy(Api.COMPILER_TREE)
1446         public Kind getKind() { return Kind.SWITCH_EXPRESSION; }
1447         @DefinedBy(Api.COMPILER_TREE)
1448         public JCExpression getExpression() { return selector; }
1449         @DefinedBy(Api.COMPILER_TREE)
1450         public List<JCCase> getCases() { return cases; }
1451         @Override @DefinedBy(Api.COMPILER_TREE)
1452         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
1453             return v.visitSwitchExpression(this, d);
1454         }
1455         @Override
1456         public Tag getTag() {
1457             return SWITCH_EXPRESSION;
1458         }
1459     }
1460 
1461     /**
1462      * A synchronized block.
1463      */
1464     public static class JCSynchronized extends JCStatement implements SynchronizedTree {
1465         public JCExpression lock;
1466         public JCBlock body;
1467         protected JCSynchronized(JCExpression lock, JCBlock body) {
1468             this.lock = lock;
1469             this.body = body;
1470         }
1471         @Override
1472         public void accept(Visitor v) { v.visitSynchronized(this); }
1473 
1474         @DefinedBy(Api.COMPILER_TREE)
1475         public Kind getKind() { return Kind.SYNCHRONIZED; }
1476         @DefinedBy(Api.COMPILER_TREE)
1477         public JCExpression getExpression() { return lock; }
1478         @DefinedBy(Api.COMPILER_TREE)
1479         public JCBlock getBlock() { return body; }
1480         @Override @DefinedBy(Api.COMPILER_TREE)
1481         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
1482             return v.visitSynchronized(this, d);
1483         }
1484         @Override
1485         public Tag getTag() {
1486             return SYNCHRONIZED;
1487         }
1488     }
1489 
1490     /**
1491      * A "try { } catch ( ) { } finally { }" block.
1492      */
1493     public static class JCTry extends JCStatement implements TryTree {
1494         public JCBlock body;
1495         public List<JCCatch> catchers;
1496         public JCBlock finalizer;
1497         public List<JCTree> resources;
1498         public boolean finallyCanCompleteNormally;
1499         protected JCTry(List<JCTree> resources,
1500                         JCBlock body,
1501                         List<JCCatch> catchers,
1502                         JCBlock finalizer) {
1503             this.body = body;
1504             this.catchers = catchers;
1505             this.finalizer = finalizer;
1506             this.resources = resources;
1507         }
1508         @Override
1509         public void accept(Visitor v) { v.visitTry(this); }
1510 
1511         @DefinedBy(Api.COMPILER_TREE)
1512         public Kind getKind() { return Kind.TRY; }
1513         @DefinedBy(Api.COMPILER_TREE)
1514         public JCBlock getBlock() { return body; }
1515         @DefinedBy(Api.COMPILER_TREE)
1516         public List<JCCatch> getCatches() {
1517             return catchers;
1518         }
1519         @DefinedBy(Api.COMPILER_TREE)
1520         public JCBlock getFinallyBlock() { return finalizer; }
1521         @Override @DefinedBy(Api.COMPILER_TREE)
1522         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
1523             return v.visitTry(this, d);
1524         }
1525         @Override @DefinedBy(Api.COMPILER_TREE)
1526         public List<JCTree> getResources() {
1527             return resources;
1528         }
1529         @Override
1530         public Tag getTag() {
1531             return TRY;
1532         }
1533     }
1534 
1535     /**
1536      * A catch block.
1537      */
1538     public static class JCCatch extends JCTree implements CatchTree {
1539         public JCVariableDecl param;
1540         public JCBlock body;
1541         protected JCCatch(JCVariableDecl param, JCBlock body) {
1542             this.param = param;
1543             this.body = body;
1544         }
1545         @Override
1546         public void accept(Visitor v) { v.visitCatch(this); }
1547 
1548         @DefinedBy(Api.COMPILER_TREE)
1549         public Kind getKind() { return Kind.CATCH; }
1550         @DefinedBy(Api.COMPILER_TREE)
1551         public JCVariableDecl getParameter() { return param; }
1552         @DefinedBy(Api.COMPILER_TREE)
1553         public JCBlock getBlock() { return body; }
1554         @Override @DefinedBy(Api.COMPILER_TREE)
1555         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
1556             return v.visitCatch(this, d);
1557         }
1558         @Override
1559         public Tag getTag() {
1560             return CATCH;
1561         }
1562     }
1563 
1564     /**
1565      * A ( ) ? ( ) : ( ) conditional expression
1566      */
1567     public static class JCConditional extends JCPolyExpression implements ConditionalExpressionTree {
1568         public JCExpression cond;
1569         public JCExpression truepart;
1570         public JCExpression falsepart;
1571         protected JCConditional(JCExpression cond,
1572                               JCExpression truepart,
1573                               JCExpression falsepart)
1574         {
1575             this.cond = cond;
1576             this.truepart = truepart;
1577             this.falsepart = falsepart;
1578         }
1579         @Override
1580         public void accept(Visitor v) { v.visitConditional(this); }
1581 
1582         @DefinedBy(Api.COMPILER_TREE)
1583         public Kind getKind() { return Kind.CONDITIONAL_EXPRESSION; }
1584         @DefinedBy(Api.COMPILER_TREE)
1585         public JCExpression getCondition() { return cond; }
1586         @DefinedBy(Api.COMPILER_TREE)
1587         public JCExpression getTrueExpression() { return truepart; }
1588         @DefinedBy(Api.COMPILER_TREE)
1589         public JCExpression getFalseExpression() { return falsepart; }
1590         @Override @DefinedBy(Api.COMPILER_TREE)
1591         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
1592             return v.visitConditionalExpression(this, d);
1593         }
1594         @Override
1595         public Tag getTag() {
1596             return CONDEXPR;
1597         }
1598     }
1599 
1600     /**
1601      * An "if ( ) { } else { }" block
1602      */
1603     public static class JCIf extends JCStatement implements IfTree {
1604         public JCExpression cond;
1605         public JCStatement thenpart;
1606         public JCStatement elsepart;
1607         protected JCIf(JCExpression cond,
1608                      JCStatement thenpart,
1609                      JCStatement elsepart)
1610         {
1611             this.cond = cond;
1612             this.thenpart = thenpart;
1613             this.elsepart = elsepart;
1614         }
1615         @Override
1616         public void accept(Visitor v) { v.visitIf(this); }
1617 
1618         @DefinedBy(Api.COMPILER_TREE)
1619         public Kind getKind() { return Kind.IF; }
1620         @DefinedBy(Api.COMPILER_TREE)
1621         public JCExpression getCondition() { return cond; }
1622         @DefinedBy(Api.COMPILER_TREE)
1623         public JCStatement getThenStatement() { return thenpart; }
1624         @DefinedBy(Api.COMPILER_TREE)
1625         public JCStatement getElseStatement() { return elsepart; }
1626         @Override @DefinedBy(Api.COMPILER_TREE)
1627         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
1628             return v.visitIf(this, d);
1629         }
1630         @Override
1631         public Tag getTag() {
1632             return IF;
1633         }
1634     }
1635 
1636     /**
1637      * an expression statement
1638      */
1639     public static class JCExpressionStatement extends JCStatement implements ExpressionStatementTree {
1640         /** expression structure */
1641         public JCExpression expr;
1642         protected JCExpressionStatement(JCExpression expr)
1643         {
1644             this.expr = expr;
1645         }
1646         @Override
1647         public void accept(Visitor v) { v.visitExec(this); }
1648 
1649         @DefinedBy(Api.COMPILER_TREE)
1650         public Kind getKind() { return Kind.EXPRESSION_STATEMENT; }
1651         @DefinedBy(Api.COMPILER_TREE)
1652         public JCExpression getExpression() { return expr; }
1653         @Override @DefinedBy(Api.COMPILER_TREE)
1654         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
1655             return v.visitExpressionStatement(this, d);
1656         }
1657         @Override
1658         public Tag getTag() {
1659             return EXEC;
1660         }
1661 
1662         /** Convert a expression-statement tree to a pretty-printed string. */
1663         @Override
1664         public String toString() {
1665             StringWriter s = new StringWriter();
1666             try {
1667                 new Pretty(s, false).printStat(this);
1668             }
1669             catch (IOException e) {
1670                 // should never happen, because StringWriter is defined
1671                 // never to throw any IOExceptions
1672                 throw new AssertionError(e);
1673             }
1674             return s.toString();
1675         }
1676     }
1677 
1678     /**
1679      * A break from a loop or switch.
1680      */
1681     public static class JCBreak extends JCStatement implements BreakTree {
1682         public Name label;
1683         public JCTree target;
1684         protected JCBreak(Name label, JCTree target) {
1685             this.label = label;
1686             this.target = target;
1687         }
1688         @Override
1689         public void accept(Visitor v) { v.visitBreak(this); }
1690         public boolean isValueBreak() {
1691             return target != null && target.hasTag(SWITCH_EXPRESSION);
1692         }
1693 
1694         @DefinedBy(Api.COMPILER_TREE)
1695         public Kind getKind() { return Kind.BREAK; }
1696         @DefinedBy(Api.COMPILER_TREE)
1697         public Name getLabel() {
1698             return label;
1699         }
1700         @Override @DefinedBy(Api.COMPILER_TREE)
1701         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
1702             return v.visitBreak(this, d);
1703         }
1704         @Override
1705         public Tag getTag() {
1706             return BREAK;
1707         }
1708     }
1709 
1710     /**
1711      * A break-with from a switch expression.
1712      */
1713     public static class JCYield extends JCStatement implements YieldTree {
1714         public JCExpression value;
1715         public JCTree target;
1716         protected JCYield(JCExpression value, JCTree target) {
1717             this.value = value;
1718             this.target = target;
1719         }
1720         @Override
1721         public void accept(Visitor v) { v.visitYield(this); }
1722         @DefinedBy(Api.COMPILER_TREE)
1723         public Kind getKind() { return Kind.YIELD; }
1724         @DefinedBy(Api.COMPILER_TREE)
1725         public JCExpression getValue() { return value; }
1726         @Override @DefinedBy(Api.COMPILER_TREE)
1727         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
1728             return v.visitYield(this, d);
1729         }
1730         @Override
1731         public Tag getTag() {
1732             return YIELD;
1733         }
1734     }
1735 
1736     /**
1737      * A continue of a loop.
1738      */
1739     public static class JCContinue extends JCStatement implements ContinueTree {
1740         public Name label;
1741         public JCTree target;
1742         protected JCContinue(Name label, JCTree target) {
1743             this.label = label;
1744             this.target = target;
1745         }
1746         @Override
1747         public void accept(Visitor v) { v.visitContinue(this); }
1748 
1749         @DefinedBy(Api.COMPILER_TREE)
1750         public Kind getKind() { return Kind.CONTINUE; }
1751         @DefinedBy(Api.COMPILER_TREE)
1752         public Name getLabel() { return label; }
1753         @Override @DefinedBy(Api.COMPILER_TREE)
1754         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
1755             return v.visitContinue(this, d);
1756         }
1757         @Override
1758         public Tag getTag() {
1759             return CONTINUE;
1760         }
1761     }
1762 
1763     /**
1764      * A return statement.
1765      */
1766     public static class JCReturn extends JCStatement implements ReturnTree {
1767         public JCExpression expr;
1768         protected JCReturn(JCExpression expr) {
1769             this.expr = expr;
1770         }
1771         @Override
1772         public void accept(Visitor v) { v.visitReturn(this); }
1773 
1774         @DefinedBy(Api.COMPILER_TREE)
1775         public Kind getKind() { return Kind.RETURN; }
1776         @DefinedBy(Api.COMPILER_TREE)
1777         public JCExpression getExpression() { return expr; }
1778         @Override @DefinedBy(Api.COMPILER_TREE)
1779         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
1780             return v.visitReturn(this, d);
1781         }
1782         @Override
1783         public Tag getTag() {
1784             return RETURN;
1785         }
1786     }
1787 
1788     /**
1789      * A throw statement.
1790      */
1791     public static class JCThrow extends JCStatement implements ThrowTree {
1792         public JCExpression expr;
1793         protected JCThrow(JCExpression expr) {
1794             this.expr = expr;
1795         }
1796         @Override
1797         public void accept(Visitor v) { v.visitThrow(this); }
1798 
1799         @DefinedBy(Api.COMPILER_TREE)
1800         public Kind getKind() { return Kind.THROW; }
1801         @DefinedBy(Api.COMPILER_TREE)
1802         public JCExpression getExpression() { return expr; }
1803         @Override @DefinedBy(Api.COMPILER_TREE)
1804         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
1805             return v.visitThrow(this, d);
1806         }
1807         @Override
1808         public Tag getTag() {
1809             return THROW;
1810         }
1811     }
1812 
1813     /**
1814      * An assert statement.
1815      */
1816     public static class JCAssert extends JCStatement implements AssertTree {
1817         public JCExpression cond;
1818         public JCExpression detail;
1819         protected JCAssert(JCExpression cond, JCExpression detail) {
1820             this.cond = cond;
1821             this.detail = detail;
1822         }
1823         @Override
1824         public void accept(Visitor v) { v.visitAssert(this); }
1825 
1826         @DefinedBy(Api.COMPILER_TREE)
1827         public Kind getKind() { return Kind.ASSERT; }
1828         @DefinedBy(Api.COMPILER_TREE)
1829         public JCExpression getCondition() { return cond; }
1830         @DefinedBy(Api.COMPILER_TREE)
1831         public JCExpression getDetail() { return detail; }
1832         @Override @DefinedBy(Api.COMPILER_TREE)
1833         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
1834             return v.visitAssert(this, d);
1835         }
1836         @Override
1837         public Tag getTag() {
1838             return ASSERT;
1839         }
1840     }
1841 
1842     /**
1843      * A method invocation
1844      */
1845     public static class JCMethodInvocation extends JCPolyExpression implements MethodInvocationTree {
1846         public List<JCExpression> typeargs;
1847         public JCExpression meth;
1848         public List<JCExpression> args;
1849         public Type varargsElement;
1850         protected JCMethodInvocation(List<JCExpression> typeargs,
1851                         JCExpression meth,
1852                         List<JCExpression> args)
1853         {
1854             this.typeargs = (typeargs == null) ? List.nil()
1855                                                : typeargs;
1856             this.meth = meth;
1857             this.args = args;
1858         }
1859         @Override
1860         public void accept(Visitor v) { v.visitApply(this); }
1861 
1862         @DefinedBy(Api.COMPILER_TREE)
1863         public Kind getKind() { return Kind.METHOD_INVOCATION; }
1864         @DefinedBy(Api.COMPILER_TREE)
1865         public List<JCExpression> getTypeArguments() {
1866             return typeargs;
1867         }
1868         @DefinedBy(Api.COMPILER_TREE)
1869         public JCExpression getMethodSelect() { return meth; }
1870         @DefinedBy(Api.COMPILER_TREE)
1871         public List<JCExpression> getArguments() {
1872             return args;
1873         }
1874         @Override @DefinedBy(Api.COMPILER_TREE)
1875         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
1876             return v.visitMethodInvocation(this, d);
1877         }
1878         @Override
1879         public JCMethodInvocation setType(Type type) {
1880             super.setType(type);
1881             return this;
1882         }
1883         @Override
1884         public Tag getTag() {
1885             return(APPLY);
1886         }
1887     }
1888 
1889     /**
1890      * A new(...) operation.
1891      */
1892     public static class JCNewClass extends JCPolyExpression implements NewClassTree {
1893         public JCExpression encl;
1894         public List<JCExpression> typeargs;
1895         public JCExpression clazz;
1896         public List<JCExpression> args;
1897         public JCClassDecl def;
1898         public Symbol constructor;
1899         public Type varargsElement;
1900         public Type constructorType;
1901         protected JCNewClass(JCExpression encl,
1902                            List<JCExpression> typeargs,
1903                            JCExpression clazz,
1904                            List<JCExpression> args,
1905                            JCClassDecl def)
1906         {
1907             this.encl = encl;
1908             this.typeargs = (typeargs == null) ? List.nil()
1909                                                : typeargs;
1910             this.clazz = clazz;
1911             this.args = args;
1912             this.def = def;
1913         }
1914         @Override
1915         public void accept(Visitor v) { v.visitNewClass(this); }
1916 
1917         @DefinedBy(Api.COMPILER_TREE)
1918         public Kind getKind() { return Kind.NEW_CLASS; }
1919         @DefinedBy(Api.COMPILER_TREE)
1920         public JCExpression getEnclosingExpression() { // expr.new C< ... > ( ... )
1921             return encl;
1922         }
1923         @DefinedBy(Api.COMPILER_TREE)
1924         public List<JCExpression> getTypeArguments() {
1925             return typeargs;
1926         }
1927         @DefinedBy(Api.COMPILER_TREE)
1928         public JCExpression getIdentifier() { return clazz; }
1929         @DefinedBy(Api.COMPILER_TREE)
1930         public List<JCExpression> getArguments() {
1931             return args;
1932         }
1933         @DefinedBy(Api.COMPILER_TREE)
1934         public JCClassDecl getClassBody() { return def; }
1935         @Override @DefinedBy(Api.COMPILER_TREE)
1936         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
1937             return v.visitNewClass(this, d);
1938         }
1939         @Override
1940         public Tag getTag() {
1941             return NEWCLASS;
1942         }
1943 
1944         public boolean classDeclRemoved() {
1945             return false;
1946         }
1947     }
1948 
1949     /**
1950      * A new[...] operation.
1951      */
1952     public static class JCNewArray extends JCExpression implements NewArrayTree {
1953         public JCExpression elemtype;
1954         public List<JCExpression> dims;
1955         // type annotations on inner-most component
1956         public List<JCAnnotation> annotations;
1957         // type annotations on dimensions
1958         public List<List<JCAnnotation>> dimAnnotations;
1959         public List<JCExpression> elems;
1960         protected JCNewArray(JCExpression elemtype,
1961                            List<JCExpression> dims,
1962                            List<JCExpression> elems)
1963         {
1964             this.elemtype = elemtype;
1965             this.dims = dims;
1966             this.annotations = List.nil();
1967             this.dimAnnotations = List.nil();
1968             this.elems = elems;
1969         }
1970         @Override
1971         public void accept(Visitor v) { v.visitNewArray(this); }
1972 
1973         @DefinedBy(Api.COMPILER_TREE)
1974         public Kind getKind() { return Kind.NEW_ARRAY; }
1975         @DefinedBy(Api.COMPILER_TREE)
1976         public JCExpression getType() { return elemtype; }
1977         @DefinedBy(Api.COMPILER_TREE)
1978         public List<JCExpression> getDimensions() {
1979             return dims;
1980         }
1981         @DefinedBy(Api.COMPILER_TREE)
1982         public List<JCExpression> getInitializers() {
1983             return elems;
1984         }
1985         @Override @DefinedBy(Api.COMPILER_TREE)
1986         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
1987             return v.visitNewArray(this, d);
1988         }
1989         @Override
1990         public Tag getTag() {
1991             return NEWARRAY;
1992         }
1993 
1994         @Override @DefinedBy(Api.COMPILER_TREE)
1995         public List<JCAnnotation> getAnnotations() {
1996             return annotations;
1997         }
1998 
1999         @Override @DefinedBy(Api.COMPILER_TREE)
2000         public List<List<JCAnnotation>> getDimAnnotations() {
2001             return dimAnnotations;
2002         }
2003     }
2004 
2005     /**
2006      * A lambda expression.
2007      */
2008     public static class JCLambda extends JCFunctionalExpression implements LambdaExpressionTree {
2009 
2010         public enum ParameterKind {
2011             IMPLICIT,
2012             EXPLICIT
2013         }
2014 
2015         public List<JCVariableDecl> params;
2016         public JCTree body;
2017         public boolean canCompleteNormally = true;
2018         public ParameterKind paramKind;
2019         public boolean wasMethodReference;
2020 
2021         public JCLambda(List<JCVariableDecl> params,
2022                         JCTree body) {
2023             this.params = params;
2024             this.body = body;
2025             if (params.isEmpty() ||
2026                 params.head.vartype != null) {
2027                 paramKind = ParameterKind.EXPLICIT;
2028             } else {
2029                 paramKind = ParameterKind.IMPLICIT;
2030             }
2031         }
2032         @Override
2033         public Tag getTag() {
2034             return LAMBDA;
2035         }
2036         @Override
2037         public void accept(Visitor v) {
2038             v.visitLambda(this);
2039         }
2040         @Override @DefinedBy(Api.COMPILER_TREE)
2041         public <R, D> R accept(TreeVisitor<R, D> v, D d) {
2042             return v.visitLambdaExpression(this, d);
2043         }
2044         @DefinedBy(Api.COMPILER_TREE)
2045         public Kind getKind() {
2046             return Kind.LAMBDA_EXPRESSION;
2047         }
2048         @DefinedBy(Api.COMPILER_TREE)
2049         public JCTree getBody() {
2050             return body;
2051         }
2052         @DefinedBy(Api.COMPILER_TREE)
2053         public java.util.List<? extends VariableTree> getParameters() {
2054             return params;
2055         }
2056         @Override
2057         public JCLambda setType(Type type) {
2058             super.setType(type);
2059             return this;
2060         }
2061         @Override @DefinedBy(Api.COMPILER_TREE)
2062         public BodyKind getBodyKind() {
2063             return body.hasTag(BLOCK) ?
2064                     BodyKind.STATEMENT :
2065                     BodyKind.EXPRESSION;
2066         }
2067     }
2068 
2069     /**
2070      * A parenthesized subexpression ( ... )
2071      */
2072     public static class JCParens extends JCExpression implements ParenthesizedTree {
2073         public JCExpression expr;
2074         protected JCParens(JCExpression expr) {
2075             this.expr = expr;
2076         }
2077         @Override
2078         public void accept(Visitor v) { v.visitParens(this); }
2079 
2080         @DefinedBy(Api.COMPILER_TREE)
2081         public Kind getKind() { return Kind.PARENTHESIZED; }
2082         @DefinedBy(Api.COMPILER_TREE)
2083         public JCExpression getExpression() { return expr; }
2084         @Override @DefinedBy(Api.COMPILER_TREE)
2085         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
2086             return v.visitParenthesized(this, d);
2087         }
2088         @Override
2089         public Tag getTag() {
2090             return PARENS;
2091         }
2092     }
2093 
2094     /**
2095      * A assignment with "=".
2096      */
2097     public static class JCAssign extends JCExpression implements AssignmentTree {
2098         public JCExpression lhs;
2099         public JCExpression rhs;
2100         protected JCAssign(JCExpression lhs, JCExpression rhs) {
2101             this.lhs = lhs;
2102             this.rhs = rhs;
2103         }
2104         @Override
2105         public void accept(Visitor v) { v.visitAssign(this); }
2106 
2107         @DefinedBy(Api.COMPILER_TREE)
2108         public Kind getKind() { return Kind.ASSIGNMENT; }
2109         @DefinedBy(Api.COMPILER_TREE)
2110         public JCExpression getVariable() { return lhs; }
2111         @DefinedBy(Api.COMPILER_TREE)
2112         public JCExpression getExpression() { return rhs; }
2113         @Override @DefinedBy(Api.COMPILER_TREE)
2114         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
2115             return v.visitAssignment(this, d);
2116         }
2117         @Override
2118         public Tag getTag() {
2119             return ASSIGN;
2120         }
2121     }
2122 
2123     public abstract static class JCOperatorExpression extends JCExpression {
2124         public enum OperandPos {
2125             LEFT,
2126             RIGHT
2127         }
2128 
2129         protected Tag opcode;
2130         public OperatorSymbol operator;
2131 
2132         public OperatorSymbol getOperator() {
2133             return operator;
2134         }
2135 
2136         @Override
2137         public Tag getTag() {
2138             return opcode;
2139         }
2140 
2141         public abstract JCExpression getOperand(OperandPos pos);
2142     }
2143 
2144     /**
2145      * An assignment with "+=", "|=" ...
2146      */
2147     public static class JCAssignOp extends JCOperatorExpression implements CompoundAssignmentTree {
2148         public JCExpression lhs;
2149         public JCExpression rhs;
2150         protected JCAssignOp(Tag opcode, JCTree lhs, JCTree rhs, OperatorSymbol operator) {
2151             this.opcode = opcode;
2152             this.lhs = (JCExpression)lhs;
2153             this.rhs = (JCExpression)rhs;
2154             this.operator = operator;
2155         }
2156         @Override
2157         public void accept(Visitor v) { v.visitAssignop(this); }
2158 
2159         @DefinedBy(Api.COMPILER_TREE)
2160         public Kind getKind() { return TreeInfo.tagToKind(getTag()); }
2161         @DefinedBy(Api.COMPILER_TREE)
2162         public JCExpression getVariable() { return lhs; }
2163         @DefinedBy(Api.COMPILER_TREE)
2164         public JCExpression getExpression() { return rhs; }
2165         @Override @DefinedBy(Api.COMPILER_TREE)
2166         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
2167             return v.visitCompoundAssignment(this, d);
2168         }
2169         @Override
2170         public JCExpression getOperand(OperandPos pos) {
2171             return pos == OperandPos.LEFT ? lhs : rhs;
2172         }
2173     }
2174 
2175     /**
2176      * A unary operation.
2177      */
2178     public static class JCUnary extends JCOperatorExpression implements UnaryTree {
2179         public JCExpression arg;
2180         protected JCUnary(Tag opcode, JCExpression arg) {
2181             this.opcode = opcode;
2182             this.arg = arg;
2183         }
2184         @Override
2185         public void accept(Visitor v) { v.visitUnary(this); }
2186 
2187         @DefinedBy(Api.COMPILER_TREE)
2188         public Kind getKind() { return TreeInfo.tagToKind(getTag()); }
2189         @DefinedBy(Api.COMPILER_TREE)
2190         public JCExpression getExpression() { return arg; }
2191         @Override @DefinedBy(Api.COMPILER_TREE)
2192         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
2193             return v.visitUnary(this, d);
2194         }
2195         public void setTag(Tag tag) {
2196             opcode = tag;
2197         }
2198         @Override
2199         public JCExpression getOperand(OperandPos pos) {
2200             return arg;
2201         }
2202     }
2203 
2204     /**
2205      * A binary operation.
2206      */
2207     public static class JCBinary extends JCOperatorExpression implements BinaryTree {
2208         public JCExpression lhs;
2209         public JCExpression rhs;
2210         protected JCBinary(Tag opcode,
2211                          JCExpression lhs,
2212                          JCExpression rhs,
2213                          OperatorSymbol operator) {
2214             this.opcode = opcode;
2215             this.lhs = lhs;
2216             this.rhs = rhs;
2217             this.operator = operator;
2218         }
2219         @Override
2220         public void accept(Visitor v) { v.visitBinary(this); }
2221 
2222         @DefinedBy(Api.COMPILER_TREE)
2223         public Kind getKind() { return TreeInfo.tagToKind(getTag()); }
2224         @DefinedBy(Api.COMPILER_TREE)
2225         public JCExpression getLeftOperand() { return lhs; }
2226         @DefinedBy(Api.COMPILER_TREE)
2227         public JCExpression getRightOperand() { return rhs; }
2228         @Override @DefinedBy(Api.COMPILER_TREE)
2229         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
2230             return v.visitBinary(this, d);
2231         }
2232         @Override
2233         public JCExpression getOperand(OperandPos pos) {
2234             return pos == OperandPos.LEFT ? lhs : rhs;
2235         }
2236     }
2237 
2238     /**
2239      * A type cast.
2240      */
2241     public static class JCTypeCast extends JCExpression implements TypeCastTree {
2242         public JCTree clazz;
2243         public JCExpression expr;
2244         protected JCTypeCast(JCTree clazz, JCExpression expr) {
2245             this.clazz = clazz;
2246             this.expr = expr;
2247         }
2248         @Override
2249         public void accept(Visitor v) { v.visitTypeCast(this); }
2250 
2251         @DefinedBy(Api.COMPILER_TREE)
2252         public Kind getKind() { return Kind.TYPE_CAST; }
2253         @DefinedBy(Api.COMPILER_TREE)
2254         public JCTree getType() { return clazz; }
2255         @DefinedBy(Api.COMPILER_TREE)
2256         public JCExpression getExpression() { return expr; }
2257         @Override @DefinedBy(Api.COMPILER_TREE)
2258         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
2259             return v.visitTypeCast(this, d);
2260         }
2261         @Override
2262         public Tag getTag() {
2263             return TYPECAST;
2264         }
2265     }
2266 
2267     /**
2268      * A type test.
2269      */
2270     public static class JCInstanceOf extends JCExpression implements InstanceOfTree {
2271         public JCExpression expr;
2272         public JCTree pattern;
2273         /**{@code true} if this instanceof test should have
2274          * value {@code true} when the {@code expr} is {@code null}.*/
2275         public boolean allowNull;
2276         public Type erasedExprOriginalType;
2277 
2278         protected JCInstanceOf(JCExpression expr, JCTree pattern) {
2279             this.expr = expr;
2280             this.pattern = pattern;
2281         }
2282         @Override
2283         public void accept(Visitor v) { v.visitTypeTest(this); }
2284 
2285         @DefinedBy(Api.COMPILER_TREE)
2286         public Kind getKind() { return Kind.INSTANCE_OF; }
2287         @DefinedBy(Api.COMPILER_TREE)
2288         public JCTree getType() { return pattern instanceof JCPattern ? pattern.hasTag(BINDINGPATTERN) ? ((JCBindingPattern) pattern).var.vartype : null : pattern; }
2289 
2290         @Override @DefinedBy(Api.COMPILER_TREE)
2291         public JCPattern getPattern() {
2292             return pattern instanceof JCPattern jcPattern ? jcPattern : null;
2293         }
2294 
2295         @DefinedBy(Api.COMPILER_TREE)
2296         public JCExpression getExpression() { return expr; }
2297         @Override @DefinedBy(Api.COMPILER_TREE)
2298         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
2299             return v.visitInstanceOf(this, d);
2300         }
2301         @Override
2302         public Tag getTag() {
2303             return TYPETEST;
2304         }
2305     }
2306 
2307     /**
2308      * Pattern matching forms.
2309      */
2310     public abstract static class JCPattern extends JCTree
2311             implements PatternTree {
2312     }
2313 
2314     public static class JCAnyPattern extends JCPattern
2315             implements AnyPatternTree {
2316 
2317         protected JCAnyPattern() {
2318         }
2319 
2320         @Override
2321         public void accept(Visitor v) {
2322             v.visitAnyPattern(this);
2323         }
2324 
2325         @DefinedBy(Api.COMPILER_TREE)
2326         public Kind getKind() {
2327             return Kind.ANY_PATTERN;
2328         }
2329 
2330         @Override
2331         @DefinedBy(Api.COMPILER_TREE)
2332         public <R, D> R accept(TreeVisitor<R, D> v, D d) {
2333             return v.visitAnyPattern(this, d);
2334         }
2335 
2336         @Override
2337         public Tag getTag() {
2338             return ANYPATTERN;
2339         }
2340     }
2341 
2342     public static class JCBindingPattern extends JCPattern
2343             implements BindingPatternTree {
2344         public JCVariableDecl var;
2345 
2346         protected JCBindingPattern(JCVariableDecl var) {
2347             this.var = var;
2348         }
2349 
2350         @Override @DefinedBy(Api.COMPILER_TREE)
2351         public VariableTree getVariable() {
2352             return var;
2353         }
2354 
2355         @Override
2356         public void accept(Visitor v) {
2357             v.visitBindingPattern(this);
2358         }
2359 
2360         @DefinedBy(Api.COMPILER_TREE)
2361         public Kind getKind() {
2362             return Kind.BINDING_PATTERN;
2363         }
2364 
2365         @Override
2366         @DefinedBy(Api.COMPILER_TREE)
2367         public <R, D> R accept(TreeVisitor<R, D> v, D d) {
2368             return v.visitBindingPattern(this, d);
2369         }
2370 
2371         @Override
2372         public Tag getTag() {
2373             return BINDINGPATTERN;
2374         }
2375     }
2376 
2377     public static class JCDefaultCaseLabel extends JCCaseLabel
2378             implements DefaultCaseLabelTree {
2379 
2380         protected JCDefaultCaseLabel() {
2381         }
2382 
2383         @Override
2384         public void accept(Visitor v) {
2385             v.visitDefaultCaseLabel(this);
2386         }
2387 
2388         @DefinedBy(Api.COMPILER_TREE)
2389         public Kind getKind() {
2390             return Kind.DEFAULT_CASE_LABEL;
2391         }
2392 
2393         @Override
2394         @DefinedBy(Api.COMPILER_TREE)
2395         public <R, D> R accept(TreeVisitor<R, D> v, D d) {
2396             return v.visitDefaultCaseLabel(this, d);
2397         }
2398 
2399         @Override
2400         public Tag getTag() {
2401             return DEFAULTCASELABEL;
2402         }
2403 
2404     }
2405 
2406     public static class JCConstantCaseLabel extends JCCaseLabel
2407             implements ConstantCaseLabelTree {
2408 
2409         public JCExpression expr;
2410 
2411         protected JCConstantCaseLabel(JCExpression expr) {
2412             this.expr = expr;
2413         }
2414 
2415         @Override @DefinedBy(Api.COMPILER_TREE)
2416         public JCExpression getConstantExpression() {
2417             return expr;
2418         }
2419 
2420         @Override
2421         public void accept(Visitor v) {
2422             v.visitConstantCaseLabel(this);
2423         }
2424 
2425         @DefinedBy(Api.COMPILER_TREE)
2426         public Kind getKind() {
2427             return Kind.CONSTANT_CASE_LABEL;
2428         }
2429 
2430         @Override
2431         @DefinedBy(Api.COMPILER_TREE)
2432         public <R, D> R accept(TreeVisitor<R, D> v, D d) {
2433             return v.visitConstantCaseLabel(this, d);
2434         }
2435 
2436         @Override
2437         public Tag getTag() {
2438             return CONSTANTCASELABEL;
2439         }
2440 
2441     }
2442 
2443     public static class JCPatternCaseLabel extends JCCaseLabel
2444             implements PatternCaseLabelTree {
2445 
2446         public JCPattern pat;
2447         public JCExpression syntheticGuard;
2448 
2449         protected JCPatternCaseLabel(JCPattern pat) {
2450             this.pat = pat;
2451         }
2452 
2453         @Override @DefinedBy(Api.COMPILER_TREE)
2454         public JCPattern getPattern() {
2455             return pat;
2456         }
2457 
2458         @Override
2459         public void accept(Visitor v) {
2460             v.visitPatternCaseLabel(this);
2461         }
2462 
2463         @DefinedBy(Api.COMPILER_TREE)
2464         public Kind getKind() {
2465             return Kind.PATTERN_CASE_LABEL;
2466         }
2467 
2468         @Override
2469         @DefinedBy(Api.COMPILER_TREE)
2470         public <R, D> R accept(TreeVisitor<R, D> v, D d) {
2471             return v.visitPatternCaseLabel(this, d);
2472         }
2473 
2474         @Override
2475         public Tag getTag() {
2476             return PATTERNCASELABEL;
2477         }
2478 
2479     }
2480 
2481     public static class JCRecordPattern extends JCPattern
2482             implements DeconstructionPatternTree {
2483         public JCExpression deconstructor;
2484         public List<JCPattern> nested;
2485         public ClassSymbol record;
2486         public List<Type> fullComponentTypes;
2487 
2488         protected JCRecordPattern(JCExpression deconstructor, List<JCPattern> nested) {
2489             this.deconstructor = deconstructor;
2490             this.nested = nested;
2491         }
2492 
2493         @DefinedBy(Api.COMPILER_TREE)
2494         public Name getBinding() {
2495             return null;
2496         }
2497 
2498         @Override @DefinedBy(Api.COMPILER_TREE)
2499         public ExpressionTree getDeconstructor() {
2500             return deconstructor;
2501         }
2502 
2503         @Override @DefinedBy(Api.COMPILER_TREE)
2504         public List<? extends JCPattern> getNestedPatterns() {
2505             return nested;
2506         }
2507 
2508         @Override
2509         public void accept(Visitor v) {
2510             v.visitRecordPattern(this);
2511         }
2512 
2513         @DefinedBy(Api.COMPILER_TREE)
2514         public Kind getKind() {
2515             return Kind.DECONSTRUCTION_PATTERN;
2516         }
2517 
2518         @Override
2519         @DefinedBy(Api.COMPILER_TREE)
2520         public <R, D> R accept(TreeVisitor<R, D> v, D d) {
2521             return v.visitDeconstructionPattern(this, d);
2522         }
2523 
2524         @Override
2525         public Tag getTag() {
2526             return RECORDPATTERN;
2527         }
2528 
2529     }
2530 
2531     /**
2532      * An array selection
2533      */
2534     public static class JCArrayAccess extends JCExpression implements ArrayAccessTree {
2535         public JCExpression indexed;
2536         public JCExpression index;
2537         protected JCArrayAccess(JCExpression indexed, JCExpression index) {
2538             this.indexed = indexed;
2539             this.index = index;
2540         }
2541         @Override
2542         public void accept(Visitor v) { v.visitIndexed(this); }
2543 
2544         @DefinedBy(Api.COMPILER_TREE)
2545         public Kind getKind() { return Kind.ARRAY_ACCESS; }
2546         @DefinedBy(Api.COMPILER_TREE)
2547         public JCExpression getExpression() { return indexed; }
2548         @DefinedBy(Api.COMPILER_TREE)
2549         public JCExpression getIndex() { return index; }
2550         @Override @DefinedBy(Api.COMPILER_TREE)
2551         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
2552             return v.visitArrayAccess(this, d);
2553         }
2554         @Override
2555         public Tag getTag() {
2556             return INDEXED;
2557         }
2558     }
2559 
2560     /**
2561      * Selects through packages and classes
2562      */
2563     public static class JCFieldAccess extends JCExpression implements MemberSelectTree {
2564         /** selected Tree hierarchy */
2565         public JCExpression selected;
2566         /** name of field to select thru */
2567         public Name name;
2568         /** symbol of the selected class */
2569         public Symbol sym;
2570         protected JCFieldAccess(JCExpression selected, Name name, Symbol sym) {
2571             this.selected = selected;
2572             this.name = name;
2573             this.sym = sym;
2574         }
2575         @Override
2576         public void accept(Visitor v) { v.visitSelect(this); }
2577 
2578         @DefinedBy(Api.COMPILER_TREE)
2579         public Kind getKind() { return Kind.MEMBER_SELECT; }
2580         @DefinedBy(Api.COMPILER_TREE)
2581         public JCExpression getExpression() { return selected; }
2582         @Override @DefinedBy(Api.COMPILER_TREE)
2583         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
2584             return v.visitMemberSelect(this, d);
2585         }
2586         @DefinedBy(Api.COMPILER_TREE)
2587         public Name getIdentifier() { return name; }
2588         @Override
2589         public Tag getTag() {
2590             return SELECT;
2591         }
2592     }
2593 
2594     /**
2595      * Selects a member expression.
2596      */
2597     public static class JCMemberReference extends JCFunctionalExpression implements MemberReferenceTree {
2598 
2599         public ReferenceMode mode;
2600         public ReferenceKind kind;
2601         public Name name;
2602         public JCExpression expr;
2603         public List<JCExpression> typeargs;
2604         public Symbol sym;
2605         public Type varargsElement;
2606         public PolyKind refPolyKind;
2607         public boolean ownerAccessible;
2608         private OverloadKind overloadKind;
2609         public Type referentType;
2610 
2611         public enum OverloadKind {
2612             OVERLOADED,
2613             UNOVERLOADED,
2614             ERROR
2615         }
2616 
2617         /**
2618          * Javac-dependent classification for member references, based
2619          * on relevant properties w.r.t. code-generation
2620          */
2621         public enum ReferenceKind {
2622             /** super # instMethod */
2623             SUPER(ReferenceMode.INVOKE, false),
2624             /** Type # instMethod */
2625             UNBOUND(ReferenceMode.INVOKE, true),
2626             /** Type # staticMethod */
2627             STATIC(ReferenceMode.INVOKE, false),
2628             /** Expr # instMethod */
2629             BOUND(ReferenceMode.INVOKE, false),
2630             /** Inner # new */
2631             IMPLICIT_INNER(ReferenceMode.NEW, false),
2632             /** Toplevel # new */
2633             TOPLEVEL(ReferenceMode.NEW, false),
2634             /** ArrayType # new */
2635             ARRAY_CTOR(ReferenceMode.NEW, false);
2636 
2637             final ReferenceMode mode;
2638             final boolean unbound;
2639 
2640             private ReferenceKind(ReferenceMode mode, boolean unbound) {
2641                 this.mode = mode;
2642                 this.unbound = unbound;
2643             }
2644 
2645             public boolean isUnbound() {
2646                 return unbound;
2647             }
2648         }
2649 
2650         public JCMemberReference(ReferenceMode mode, Name name, JCExpression expr, List<JCExpression> typeargs) {
2651             this.mode = mode;
2652             this.name = name;
2653             this.expr = expr;
2654             this.typeargs = typeargs;
2655         }
2656         @Override
2657         public void accept(Visitor v) { v.visitReference(this); }
2658 
2659         @DefinedBy(Api.COMPILER_TREE)
2660         public Kind getKind() { return Kind.MEMBER_REFERENCE; }
2661         @Override @DefinedBy(Api.COMPILER_TREE)
2662         public ReferenceMode getMode() { return mode; }
2663         @Override @DefinedBy(Api.COMPILER_TREE)
2664         public JCExpression getQualifierExpression() { return expr; }
2665         @Override @DefinedBy(Api.COMPILER_TREE)
2666         public Name getName() { return name; }
2667         @Override @DefinedBy(Api.COMPILER_TREE)
2668         public List<JCExpression> getTypeArguments() { return typeargs; }
2669 
2670         @Override @DefinedBy(Api.COMPILER_TREE)
2671         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
2672             return v.visitMemberReference(this, d);
2673         }
2674         @Override
2675         public Tag getTag() {
2676             return REFERENCE;
2677         }
2678         public boolean hasKind(ReferenceKind kind) {
2679             return this.kind == kind;
2680         }
2681 
2682         /**
2683          * @return the overloadKind
2684          */
2685         public OverloadKind getOverloadKind() {
2686             return overloadKind;
2687         }
2688 
2689         /**
2690          * @param overloadKind the overloadKind to set
2691          */
2692         public void setOverloadKind(OverloadKind overloadKind) {
2693             this.overloadKind = overloadKind;
2694         }
2695     }
2696 
2697     /**
2698      * An identifier
2699      */
2700     public static class JCIdent extends JCExpression implements IdentifierTree {
2701         /** the name */
2702         public Name name;
2703         /** the symbol */
2704         public Symbol sym;
2705         protected JCIdent(Name name, Symbol sym) {
2706             this.name = name;
2707             this.sym = sym;
2708         }
2709         @Override
2710         public void accept(Visitor v) { v.visitIdent(this); }
2711 
2712         @DefinedBy(Api.COMPILER_TREE)
2713         public Kind getKind() { return Kind.IDENTIFIER; }
2714         @DefinedBy(Api.COMPILER_TREE)
2715         public Name getName() { return name; }
2716         @Override @DefinedBy(Api.COMPILER_TREE)
2717         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
2718             return v.visitIdentifier(this, d);
2719         }
2720         @Override
2721         public Tag getTag() {
2722             return IDENT;
2723         }
2724     }
2725 
2726     /**
2727      * A constant value given literally.
2728      */
2729     public static class JCLiteral extends JCExpression implements LiteralTree {
2730         public TypeTag typetag;
2731         /** value representation */
2732         public Object value;
2733         protected JCLiteral(TypeTag typetag, Object value) {
2734             this.typetag = typetag;
2735             this.value = value;
2736         }
2737         @Override
2738         public void accept(Visitor v) { v.visitLiteral(this); }
2739 
2740         @DefinedBy(Api.COMPILER_TREE)
2741         public Kind getKind() {
2742             return typetag.getKindLiteral();
2743         }
2744 
2745         @DefinedBy(Api.COMPILER_TREE)
2746         public Object getValue() {
2747             switch (typetag) {
2748                 case BOOLEAN:
2749                     int bi = (Integer) value;
2750                     return (bi != 0);
2751                 case CHAR:
2752                     int ci = (Integer) value;
2753                     char c = (char) ci;
2754                     if (c != ci)
2755                         throw new AssertionError("bad value for char literal");
2756                     return c;
2757                 default:
2758                     return value;
2759             }
2760         }
2761         @Override @DefinedBy(Api.COMPILER_TREE)
2762         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
2763             return v.visitLiteral(this, d);
2764         }
2765         @Override
2766         public JCLiteral setType(Type type) {
2767             super.setType(type);
2768             return this;
2769         }
2770         @Override
2771         public Tag getTag() {
2772             return LITERAL;
2773         }
2774     }
2775 
2776     /**
2777      * Identifies a basic type.
2778      * @see TypeTag
2779      */
2780     public static class JCPrimitiveTypeTree extends JCExpression implements PrimitiveTypeTree {
2781         /** the basic type id */
2782         public TypeTag typetag;
2783         protected JCPrimitiveTypeTree(TypeTag typetag) {
2784             this.typetag = typetag;
2785         }
2786         @Override
2787         public void accept(Visitor v) { v.visitTypeIdent(this); }
2788 
2789         @DefinedBy(Api.COMPILER_TREE)
2790         public Kind getKind() { return Kind.PRIMITIVE_TYPE; }
2791         @DefinedBy(Api.COMPILER_TREE)
2792         public TypeKind getPrimitiveTypeKind() {
2793             return typetag.getPrimitiveTypeKind();
2794         }
2795 
2796         @Override @DefinedBy(Api.COMPILER_TREE)
2797         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
2798             return v.visitPrimitiveType(this, d);
2799         }
2800         @Override
2801         public Tag getTag() {
2802             return TYPEIDENT;
2803         }
2804     }
2805 
2806     /**
2807      * An array type, A[]
2808      */
2809     public static class JCArrayTypeTree extends JCExpression implements ArrayTypeTree {
2810         public JCExpression elemtype;
2811         protected JCArrayTypeTree(JCExpression elemtype) {
2812             this.elemtype = elemtype;
2813         }
2814         @Override
2815         public void accept(Visitor v) { v.visitTypeArray(this); }
2816 
2817         @DefinedBy(Api.COMPILER_TREE)
2818         public Kind getKind() { return Kind.ARRAY_TYPE; }
2819         @DefinedBy(Api.COMPILER_TREE)
2820         public JCTree getType() { return elemtype; }
2821         @Override @DefinedBy(Api.COMPILER_TREE)
2822         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
2823             return v.visitArrayType(this, d);
2824         }
2825         @Override
2826         public Tag getTag() {
2827             return TYPEARRAY;
2828         }
2829     }
2830 
2831     /**
2832      * A parameterized type, {@literal T<...>}
2833      */
2834     public static class JCTypeApply extends JCExpression implements ParameterizedTypeTree {
2835         public JCExpression clazz;
2836         public List<JCExpression> arguments;
2837         protected JCTypeApply(JCExpression clazz, List<JCExpression> arguments) {
2838             this.clazz = clazz;
2839             this.arguments = arguments;
2840         }
2841         @Override
2842         public void accept(Visitor v) { v.visitTypeApply(this); }
2843 
2844         @DefinedBy(Api.COMPILER_TREE)
2845         public Kind getKind() { return Kind.PARAMETERIZED_TYPE; }
2846         @DefinedBy(Api.COMPILER_TREE)
2847         public JCTree getType() { return clazz; }
2848         @DefinedBy(Api.COMPILER_TREE)
2849         public List<JCExpression> getTypeArguments() {
2850             return arguments;
2851         }
2852         @Override @DefinedBy(Api.COMPILER_TREE)
2853         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
2854             return v.visitParameterizedType(this, d);
2855         }
2856         @Override
2857         public Tag getTag() {
2858             return TYPEAPPLY;
2859         }
2860     }
2861 
2862     /**
2863      * A union type, T1 | T2 | ... Tn (used in multicatch statements)
2864      */
2865     public static class JCTypeUnion extends JCExpression implements UnionTypeTree {
2866 
2867         public List<JCExpression> alternatives;
2868 
2869         protected JCTypeUnion(List<JCExpression> components) {
2870             this.alternatives = components;
2871         }
2872         @Override
2873         public void accept(Visitor v) { v.visitTypeUnion(this); }
2874 
2875         @DefinedBy(Api.COMPILER_TREE)
2876         public Kind getKind() { return Kind.UNION_TYPE; }
2877 
2878         @DefinedBy(Api.COMPILER_TREE)
2879         public List<JCExpression> getTypeAlternatives() {
2880             return alternatives;
2881         }
2882         @Override @DefinedBy(Api.COMPILER_TREE)
2883         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
2884             return v.visitUnionType(this, d);
2885         }
2886         @Override
2887         public Tag getTag() {
2888             return TYPEUNION;
2889         }
2890     }
2891 
2892     /**
2893      * An intersection type, {@code T1 & T2 & ... Tn} (used in cast expressions)
2894      */
2895     public static class JCTypeIntersection extends JCExpression implements IntersectionTypeTree {
2896 
2897         public List<JCExpression> bounds;
2898 
2899         protected JCTypeIntersection(List<JCExpression> bounds) {
2900             this.bounds = bounds;
2901         }
2902         @Override
2903         public void accept(Visitor v) { v.visitTypeIntersection(this); }
2904 
2905         @DefinedBy(Api.COMPILER_TREE)
2906         public Kind getKind() { return Kind.INTERSECTION_TYPE; }
2907 
2908         @DefinedBy(Api.COMPILER_TREE)
2909         public List<JCExpression> getBounds() {
2910             return bounds;
2911         }
2912         @Override @DefinedBy(Api.COMPILER_TREE)
2913         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
2914             return v.visitIntersectionType(this, d);
2915         }
2916         @Override
2917         public Tag getTag() {
2918             return TYPEINTERSECTION;
2919         }
2920     }
2921 
2922     /**
2923      * A formal class parameter.
2924      */
2925     public static class JCTypeParameter extends JCTree implements TypeParameterTree {
2926         /** name */
2927         public Name name;
2928         /** bounds */
2929         public List<JCExpression> bounds;
2930         /** type annotations on type parameter */
2931         public List<JCAnnotation> annotations;
2932         protected JCTypeParameter(Name name, List<JCExpression> bounds, List<JCAnnotation> annotations) {
2933             this.name = name;
2934             this.bounds = bounds;
2935             this.annotations = annotations;
2936         }
2937         @Override
2938         public void accept(Visitor v) { v.visitTypeParameter(this); }
2939 
2940         @DefinedBy(Api.COMPILER_TREE)
2941         public Kind getKind() { return Kind.TYPE_PARAMETER; }
2942         @DefinedBy(Api.COMPILER_TREE)
2943         public Name getName() { return name; }
2944         @DefinedBy(Api.COMPILER_TREE)
2945         public List<JCExpression> getBounds() {
2946             return bounds;
2947         }
2948         @DefinedBy(Api.COMPILER_TREE)
2949         public List<JCAnnotation> getAnnotations() {
2950             return annotations;
2951         }
2952         @Override @DefinedBy(Api.COMPILER_TREE)
2953         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
2954             return v.visitTypeParameter(this, d);
2955         }
2956         @Override
2957         public Tag getTag() {
2958             return TYPEPARAMETER;
2959         }
2960     }
2961 
2962     public static class JCWildcard extends JCExpression implements WildcardTree {
2963         public TypeBoundKind kind;
2964         public JCTree inner;
2965         protected JCWildcard(TypeBoundKind kind, JCTree inner) {
2966             this.kind = Assert.checkNonNull(kind);
2967             this.inner = inner;
2968         }
2969         @Override
2970         public void accept(Visitor v) { v.visitWildcard(this); }
2971 
2972         @DefinedBy(Api.COMPILER_TREE)
2973         public Kind getKind() {
2974             switch (kind.kind) {
2975             case UNBOUND:
2976                 return Kind.UNBOUNDED_WILDCARD;
2977             case EXTENDS:
2978                 return Kind.EXTENDS_WILDCARD;
2979             case SUPER:
2980                 return Kind.SUPER_WILDCARD;
2981             default:
2982                 throw new AssertionError("Unknown wildcard bound " + kind);
2983             }
2984         }
2985         @DefinedBy(Api.COMPILER_TREE)
2986         public JCTree getBound() { return inner; }
2987         @Override @DefinedBy(Api.COMPILER_TREE)
2988         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
2989             return v.visitWildcard(this, d);
2990         }
2991         @Override
2992         public Tag getTag() {
2993             return Tag.WILDCARD;
2994         }
2995     }
2996 
2997     public static class TypeBoundKind extends JCTree {
2998         public BoundKind kind;
2999         protected TypeBoundKind(BoundKind kind) {
3000             this.kind = kind;
3001         }
3002         @Override
3003         public void accept(Visitor v) { v.visitTypeBoundKind(this); }
3004 
3005         @DefinedBy(Api.COMPILER_TREE)
3006         public Kind getKind() {
3007             throw new AssertionError("TypeBoundKind is not part of a public API");
3008         }
3009         @Override @DefinedBy(Api.COMPILER_TREE)
3010         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
3011             throw new AssertionError("TypeBoundKind is not part of a public API");
3012         }
3013         @Override
3014         public Tag getTag() {
3015             return TYPEBOUNDKIND;
3016         }
3017     }
3018 
3019     public static class JCAnnotation extends JCExpression implements AnnotationTree {
3020         // Either Tag.ANNOTATION or Tag.TYPE_ANNOTATION
3021         private Tag tag;
3022 
3023         public JCTree annotationType;
3024         public List<JCExpression> args;
3025         public Attribute.Compound attribute;
3026 
3027         protected JCAnnotation(Tag tag, JCTree annotationType, List<JCExpression> args) {
3028             this.tag = tag;
3029             this.annotationType = annotationType;
3030             this.args = args;
3031         }
3032 
3033         @Override
3034         public void accept(Visitor v) { v.visitAnnotation(this); }
3035 
3036         @DefinedBy(Api.COMPILER_TREE)
3037         public Kind getKind() { return TreeInfo.tagToKind(getTag()); }
3038 
3039         @DefinedBy(Api.COMPILER_TREE)
3040         public JCTree getAnnotationType() { return annotationType; }
3041         @DefinedBy(Api.COMPILER_TREE)
3042         public List<JCExpression> getArguments() {
3043             return args;
3044         }
3045         @Override @DefinedBy(Api.COMPILER_TREE)
3046         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
3047             return v.visitAnnotation(this, d);
3048         }
3049         @Override
3050         public Tag getTag() {
3051             return tag;
3052         }
3053     }
3054 
3055     public static class JCModifiers extends JCTree implements com.sun.source.tree.ModifiersTree {
3056         public long flags;
3057         public List<JCAnnotation> annotations;
3058         protected JCModifiers(long flags, List<JCAnnotation> annotations) {
3059             this.flags = flags;
3060             this.annotations = annotations;
3061         }
3062         @Override
3063         public void accept(Visitor v) { v.visitModifiers(this); }
3064 
3065         @DefinedBy(Api.COMPILER_TREE)
3066         public Kind getKind() { return Kind.MODIFIERS; }
3067         @DefinedBy(Api.COMPILER_TREE)
3068         public Set<Modifier> getFlags() {
3069             return Flags.asModifierSet(flags);
3070         }
3071         @DefinedBy(Api.COMPILER_TREE)
3072         public List<JCAnnotation> getAnnotations() {
3073             return annotations;
3074         }
3075         @Override @DefinedBy(Api.COMPILER_TREE)
3076         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
3077             return v.visitModifiers(this, d);
3078         }
3079         @Override
3080         public Tag getTag() {
3081             return MODIFIERS;
3082         }
3083     }
3084 
3085     public static class JCAnnotatedType extends JCExpression implements com.sun.source.tree.AnnotatedTypeTree {
3086         // type annotations
3087         public List<JCAnnotation> annotations;
3088         public JCExpression underlyingType;
3089 
3090         protected JCAnnotatedType(List<JCAnnotation> annotations, JCExpression underlyingType) {
3091             Assert.check(annotations != null && annotations.nonEmpty());
3092             this.annotations = annotations;
3093             this.underlyingType = underlyingType;
3094         }
3095         @Override
3096         public void accept(Visitor v) { v.visitAnnotatedType(this); }
3097 
3098         @DefinedBy(Api.COMPILER_TREE)
3099         public Kind getKind() { return Kind.ANNOTATED_TYPE; }
3100         @DefinedBy(Api.COMPILER_TREE)
3101         public List<JCAnnotation> getAnnotations() {
3102             return annotations;
3103         }
3104         @DefinedBy(Api.COMPILER_TREE)
3105         public JCExpression getUnderlyingType() {
3106             return underlyingType;
3107         }
3108         @Override @DefinedBy(Api.COMPILER_TREE)
3109         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
3110             return v.visitAnnotatedType(this, d);
3111         }
3112         @Override
3113         public Tag getTag() {
3114             return ANNOTATED_TYPE;
3115         }
3116     }
3117 
3118     public abstract static class JCDirective extends JCTree
3119         implements DirectiveTree {
3120     }
3121 
3122     public static class JCModuleDecl extends JCTree implements ModuleTree {
3123         public JCModifiers mods;
3124         public ModuleType type;
3125         private final ModuleKind kind;
3126         public JCExpression qualId;
3127         public List<JCDirective> directives;
3128         public ModuleSymbol sym;
3129 
3130         protected JCModuleDecl(JCModifiers mods, ModuleKind kind,
3131                 JCExpression qualId, List<JCDirective> directives) {
3132             this.mods = mods;
3133             this.kind = kind;
3134             this.qualId = qualId;
3135             this.directives = directives;
3136         }
3137 
3138         @Override
3139         public void accept(Visitor v) { v.visitModuleDef(this); }
3140 
3141         @Override @DefinedBy(Api.COMPILER_TREE)
3142         public Kind getKind() {
3143             return Kind.MODULE;
3144         }
3145 
3146         @Override @DefinedBy(Api.COMPILER_TREE)
3147         public List<? extends AnnotationTree> getAnnotations() {
3148             return mods.annotations;
3149         }
3150 
3151         @Override @DefinedBy(Api.COMPILER_TREE)
3152         public ModuleKind getModuleType() {
3153             return kind;
3154         }
3155 
3156         @Override @DefinedBy(Api.COMPILER_TREE)
3157         public JCExpression getName() {
3158             return qualId;
3159         }
3160 
3161         @Override @DefinedBy(Api.COMPILER_TREE)
3162         public List<JCDirective> getDirectives() {
3163             return directives;
3164         }
3165 
3166         @Override @DefinedBy(Api.COMPILER_TREE)
3167         public <R, D> R accept(TreeVisitor<R, D> v, D d) {
3168             return v.visitModule(this, d);
3169         }
3170 
3171         @Override
3172         public Tag getTag() {
3173             return MODULEDEF;
3174         }
3175     }
3176 
3177     public static class JCExports extends JCDirective
3178             implements ExportsTree {
3179         public JCExpression qualid;
3180         public List<JCExpression> moduleNames;
3181         public ExportsDirective directive;
3182 
3183         protected JCExports(JCExpression qualId, List<JCExpression> moduleNames) {
3184             this.qualid = qualId;
3185             this.moduleNames = moduleNames;
3186         }
3187 
3188         @Override
3189         public void accept(Visitor v) { v.visitExports(this); }
3190 
3191         @Override @DefinedBy(Api.COMPILER_TREE)
3192         public Kind getKind() {
3193             return Kind.EXPORTS;
3194         }
3195 
3196         @Override @DefinedBy(Api.COMPILER_TREE)
3197         public JCExpression getPackageName() {
3198             return qualid;
3199         }
3200 
3201         @Override @DefinedBy(Api.COMPILER_TREE)
3202         public List<JCExpression> getModuleNames() {
3203             return moduleNames;
3204         }
3205 
3206         @Override @DefinedBy(Api.COMPILER_TREE)
3207         public <R, D> R accept(TreeVisitor<R, D> v, D d) {
3208             return v.visitExports(this, d);
3209         }
3210 
3211         @Override
3212         public Tag getTag() {
3213             return Tag.EXPORTS;
3214         }
3215     }
3216 
3217     public static class JCOpens extends JCDirective
3218             implements OpensTree {
3219         public JCExpression qualid;
3220         public List<JCExpression> moduleNames;
3221         public OpensDirective directive;
3222 
3223         protected JCOpens(JCExpression qualId, List<JCExpression> moduleNames) {
3224             this.qualid = qualId;
3225             this.moduleNames = moduleNames;
3226         }
3227 
3228         @Override
3229         public void accept(Visitor v) { v.visitOpens(this); }
3230 
3231         @Override @DefinedBy(Api.COMPILER_TREE)
3232         public Kind getKind() {
3233             return Kind.OPENS;
3234         }
3235 
3236         @Override @DefinedBy(Api.COMPILER_TREE)
3237         public JCExpression getPackageName() {
3238             return qualid;
3239         }
3240 
3241         @Override @DefinedBy(Api.COMPILER_TREE)
3242         public List<JCExpression> getModuleNames() {
3243             return moduleNames;
3244         }
3245 
3246         @Override @DefinedBy(Api.COMPILER_TREE)
3247         public <R, D> R accept(TreeVisitor<R, D> v, D d) {
3248             return v.visitOpens(this, d);
3249         }
3250 
3251         @Override
3252         public Tag getTag() {
3253             return Tag.OPENS;
3254         }
3255     }
3256 
3257     public static class JCProvides extends JCDirective
3258             implements ProvidesTree {
3259         public JCExpression serviceName;
3260         public List<JCExpression> implNames;
3261 
3262         protected JCProvides(JCExpression serviceName, List<JCExpression> implNames) {
3263             this.serviceName = serviceName;
3264             this.implNames = implNames;
3265         }
3266 
3267         @Override
3268         public void accept(Visitor v) { v.visitProvides(this); }
3269 
3270         @Override @DefinedBy(Api.COMPILER_TREE)
3271         public Kind getKind() {
3272             return Kind.PROVIDES;
3273         }
3274 
3275         @Override @DefinedBy(Api.COMPILER_TREE)
3276         public <R, D> R accept(TreeVisitor<R, D> v, D d) {
3277             return v.visitProvides(this, d);
3278         }
3279 
3280         @Override @DefinedBy(Api.COMPILER_TREE)
3281         public JCExpression getServiceName() {
3282             return serviceName;
3283         }
3284 
3285         @Override @DefinedBy(Api.COMPILER_TREE)
3286         public List<JCExpression> getImplementationNames() {
3287             return implNames;
3288         }
3289 
3290         @Override
3291         public Tag getTag() {
3292             return PROVIDES;
3293         }
3294     }
3295 
3296     public static class JCRequires extends JCDirective
3297             implements RequiresTree {
3298         public boolean isTransitive;
3299         public boolean isStaticPhase;
3300         public JCExpression moduleName;
3301         public RequiresDirective directive;
3302 
3303         protected JCRequires(boolean isTransitive, boolean isStaticPhase, JCExpression moduleName) {
3304             this.isTransitive = isTransitive;
3305             this.isStaticPhase = isStaticPhase;
3306             this.moduleName = moduleName;
3307         }
3308 
3309         @Override
3310         public void accept(Visitor v) { v.visitRequires(this); }
3311 
3312         @Override @DefinedBy(Api.COMPILER_TREE)
3313         public Kind getKind() {
3314             return Kind.REQUIRES;
3315         }
3316 
3317         @Override @DefinedBy(Api.COMPILER_TREE)
3318         public <R, D> R accept(TreeVisitor<R, D> v, D d) {
3319             return v.visitRequires(this, d);
3320         }
3321 
3322         @Override @DefinedBy(Api.COMPILER_TREE)
3323         public boolean isTransitive() {
3324             return isTransitive;
3325         }
3326 
3327         @Override @DefinedBy(Api.COMPILER_TREE)
3328         public boolean isStatic() {
3329             return isStaticPhase;
3330         }
3331 
3332         @Override @DefinedBy(Api.COMPILER_TREE)
3333         public JCExpression getModuleName() {
3334             return moduleName;
3335         }
3336 
3337         @Override
3338         public Tag getTag() {
3339             return REQUIRES;
3340         }
3341     }
3342 
3343     public static class JCUses extends JCDirective
3344             implements UsesTree {
3345         public JCExpression qualid;
3346 
3347         protected JCUses(JCExpression qualId) {
3348             this.qualid = qualId;
3349         }
3350 
3351         @Override
3352         public void accept(Visitor v) { v.visitUses(this); }
3353 
3354         @Override @DefinedBy(Api.COMPILER_TREE)
3355         public Kind getKind() {
3356             return Kind.USES;
3357         }
3358 
3359         @Override @DefinedBy(Api.COMPILER_TREE)
3360         public JCExpression getServiceName() {
3361             return qualid;
3362         }
3363 
3364         @Override @DefinedBy(Api.COMPILER_TREE)
3365         public <R, D> R accept(TreeVisitor<R, D> v, D d) {
3366             return v.visitUses(this, d);
3367         }
3368 
3369         @Override
3370         public Tag getTag() {
3371             return USES;
3372         }
3373     }
3374 
3375     public static class JCErroneous extends JCExpression
3376             implements ErroneousTree {
3377         public List<? extends JCTree> errs;
3378         protected JCErroneous(List<? extends JCTree> errs) {
3379             this.errs = errs;
3380         }
3381         @Override
3382         public void accept(Visitor v) { v.visitErroneous(this); }
3383 
3384         @DefinedBy(Api.COMPILER_TREE)
3385         public Kind getKind() { return Kind.ERRONEOUS; }
3386 
3387         @DefinedBy(Api.COMPILER_TREE)
3388         public List<? extends JCTree> getErrorTrees() {
3389             return errs;
3390         }
3391 
3392         @Override @DefinedBy(Api.COMPILER_TREE)
3393         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
3394             return v.visitErroneous(this, d);
3395         }
3396         @Override
3397         public Tag getTag() {
3398             return ERRONEOUS;
3399         }
3400     }
3401 
3402     /** (let int x = 3; in x+2) */
3403     public static class LetExpr extends JCExpression {
3404         public List<JCStatement> defs;
3405         public JCExpression expr;
3406         /**true if a expr should be run through Gen.genCond:*/
3407         public boolean needsCond;
3408         protected LetExpr(List<JCStatement> defs, JCExpression expr) {
3409             this.defs = defs;
3410             this.expr = expr;
3411         }
3412         @Override
3413         public void accept(Visitor v) { v.visitLetExpr(this); }
3414 
3415         @DefinedBy(Api.COMPILER_TREE)
3416         public Kind getKind() {
3417             throw new AssertionError("LetExpr is not part of a public API");
3418         }
3419         @Override @DefinedBy(Api.COMPILER_TREE)
3420         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
3421             throw new AssertionError("LetExpr is not part of a public API");
3422         }
3423         @Override
3424         public Tag getTag() {
3425             return LETEXPR;
3426         }
3427     }
3428 
3429     /** An interface for tree factories
3430      */
3431     public interface Factory {
3432         JCCompilationUnit TopLevel(List<JCTree> defs);
3433         JCPackageDecl PackageDecl(List<JCAnnotation> annotations,
3434                                   JCExpression pid);
3435         JCImport Import(JCFieldAccess qualid, boolean staticImport);
3436         JCClassDecl ClassDef(JCModifiers mods,
3437                           Name name,
3438                           List<JCTypeParameter> typarams,
3439                           JCExpression extending,
3440                           List<JCExpression> implementing,
3441                           List<JCTree> defs);
3442         JCMethodDecl MethodDef(JCModifiers mods,
3443                             Name name,
3444                             JCExpression restype,
3445                             List<JCTypeParameter> typarams,
3446                             JCVariableDecl recvparam,
3447                             List<JCVariableDecl> params,
3448                             List<JCExpression> thrown,
3449                             JCBlock body,
3450                             JCExpression defaultValue);
3451         JCVariableDecl VarDef(JCModifiers mods,
3452                       Name name,
3453                       JCExpression vartype,
3454                       JCExpression init);
3455         JCSkip Skip();
3456         JCBlock Block(long flags, List<JCStatement> stats);
3457         JCDoWhileLoop DoLoop(JCStatement body, JCExpression cond);
3458         JCWhileLoop WhileLoop(JCExpression cond, JCStatement body);
3459         JCForLoop ForLoop(List<JCStatement> init,
3460                         JCExpression cond,
3461                         List<JCExpressionStatement> step,
3462                         JCStatement body);
3463         JCEnhancedForLoop ForeachLoop(JCVariableDecl var, JCExpression expr, JCStatement body);
3464         JCLabeledStatement Labelled(Name label, JCStatement body);
3465         JCSwitch Switch(JCExpression selector, List<JCCase> cases);
3466         JCSwitchExpression SwitchExpression(JCExpression selector, List<JCCase> cases);
3467         JCCase Case(CaseTree.CaseKind caseKind, List<JCCaseLabel> labels, JCExpression guard,
3468                     List<JCStatement> stats, JCTree body);
3469         JCSynchronized Synchronized(JCExpression lock, JCBlock body);
3470         JCTry Try(JCBlock body, List<JCCatch> catchers, JCBlock finalizer);
3471         JCTry Try(List<JCTree> resources,
3472                   JCBlock body,
3473                   List<JCCatch> catchers,
3474                   JCBlock finalizer);
3475         JCCatch Catch(JCVariableDecl param, JCBlock body);
3476         JCConditional Conditional(JCExpression cond,
3477                                 JCExpression thenpart,
3478                                 JCExpression elsepart);
3479         JCIf If(JCExpression cond, JCStatement thenpart, JCStatement elsepart);
3480         JCExpressionStatement Exec(JCExpression expr);
3481         JCBreak Break(Name label);
3482         JCYield Yield(JCExpression value);
3483         JCContinue Continue(Name label);
3484         JCReturn Return(JCExpression expr);
3485         JCThrow Throw(JCExpression expr);
3486         JCAssert Assert(JCExpression cond, JCExpression detail);
3487         JCMethodInvocation Apply(List<JCExpression> typeargs,
3488                     JCExpression fn,
3489                     List<JCExpression> args);
3490         JCNewClass NewClass(JCExpression encl,
3491                           List<JCExpression> typeargs,
3492                           JCExpression clazz,
3493                           List<JCExpression> args,
3494                           JCClassDecl def);
3495         JCNewArray NewArray(JCExpression elemtype,
3496                           List<JCExpression> dims,
3497                           List<JCExpression> elems);
3498         JCParens Parens(JCExpression expr);
3499         JCAssign Assign(JCExpression lhs, JCExpression rhs);
3500         JCAssignOp Assignop(Tag opcode, JCTree lhs, JCTree rhs);
3501         JCUnary Unary(Tag opcode, JCExpression arg);
3502         JCBinary Binary(Tag opcode, JCExpression lhs, JCExpression rhs);
3503         JCTypeCast TypeCast(JCTree expr, JCExpression type);
3504         JCInstanceOf TypeTest(JCExpression expr, JCTree clazz);
3505         JCBindingPattern BindingPattern(JCVariableDecl var);
3506         JCArrayAccess Indexed(JCExpression indexed, JCExpression index);
3507         JCFieldAccess Select(JCExpression selected, Name selector);
3508         JCIdent Ident(Name idname);
3509         JCLiteral Literal(TypeTag tag, Object value);
3510         JCPrimitiveTypeTree TypeIdent(TypeTag typetag);
3511         JCArrayTypeTree TypeArray(JCExpression elemtype);
3512         JCTypeApply TypeApply(JCExpression clazz, List<JCExpression> arguments);
3513         JCTypeParameter TypeParameter(Name name, List<JCExpression> bounds);
3514         JCWildcard Wildcard(TypeBoundKind kind, JCTree type);
3515         TypeBoundKind TypeBoundKind(BoundKind kind);
3516         JCAnnotation Annotation(JCTree annotationType, List<JCExpression> args);
3517         JCModifiers Modifiers(long flags, List<JCAnnotation> annotations);
3518         JCErroneous Erroneous(List<? extends JCTree> errs);
3519         JCModuleDecl ModuleDef(JCModifiers mods, ModuleKind kind, JCExpression qualId, List<JCDirective> directives);
3520         JCExports Exports(JCExpression qualId, List<JCExpression> moduleNames);
3521         JCOpens Opens(JCExpression qualId, List<JCExpression> moduleNames);
3522         JCProvides Provides(JCExpression serviceName, List<JCExpression> implNames);
3523         JCRequires Requires(boolean isTransitive, boolean isStaticPhase, JCExpression qualId);
3524         JCUses Uses(JCExpression qualId);
3525         LetExpr LetExpr(List<JCStatement> defs, JCExpression expr);
3526     }
3527 
3528     /** A generic visitor class for trees.
3529      */
3530     public abstract static class Visitor {
3531         public void visitTopLevel(JCCompilationUnit that)    { visitTree(that); }
3532         public void visitPackageDef(JCPackageDecl that)      { visitTree(that); }
3533         public void visitImport(JCImport that)               { visitTree(that); }
3534         public void visitModuleImport(JCModuleImport that)   { visitTree(that); }
3535         public void visitClassDef(JCClassDecl that)          { visitTree(that); }
3536         public void visitMethodDef(JCMethodDecl that)        { visitTree(that); }
3537         public void visitVarDef(JCVariableDecl that)         { visitTree(that); }
3538         public void visitSkip(JCSkip that)                   { visitTree(that); }
3539         public void visitBlock(JCBlock that)                 { visitTree(that); }
3540         public void visitDoLoop(JCDoWhileLoop that)          { visitTree(that); }
3541         public void visitWhileLoop(JCWhileLoop that)         { visitTree(that); }
3542         public void visitForLoop(JCForLoop that)             { visitTree(that); }
3543         public void visitForeachLoop(JCEnhancedForLoop that) { visitTree(that); }
3544         public void visitLabelled(JCLabeledStatement that)   { visitTree(that); }
3545         public void visitSwitch(JCSwitch that)               { visitTree(that); }
3546         public void visitCase(JCCase that)                   { visitTree(that); }
3547         public void visitSwitchExpression(JCSwitchExpression that)               { visitTree(that); }
3548         public void visitSynchronized(JCSynchronized that)   { visitTree(that); }
3549         public void visitTry(JCTry that)                     { visitTree(that); }
3550         public void visitCatch(JCCatch that)                 { visitTree(that); }
3551         public void visitConditional(JCConditional that)     { visitTree(that); }
3552         public void visitIf(JCIf that)                       { visitTree(that); }
3553         public void visitExec(JCExpressionStatement that)    { visitTree(that); }
3554         public void visitBreak(JCBreak that)                 { visitTree(that); }
3555         public void visitYield(JCYield that)                 { visitTree(that); }
3556         public void visitContinue(JCContinue that)           { visitTree(that); }
3557         public void visitReturn(JCReturn that)               { visitTree(that); }
3558         public void visitThrow(JCThrow that)                 { visitTree(that); }
3559         public void visitAssert(JCAssert that)               { visitTree(that); }
3560         public void visitApply(JCMethodInvocation that)      { visitTree(that); }
3561         public void visitNewClass(JCNewClass that)           { visitTree(that); }
3562         public void visitNewArray(JCNewArray that)           { visitTree(that); }
3563         public void visitLambda(JCLambda that)               { visitTree(that); }
3564         public void visitParens(JCParens that)               { visitTree(that); }
3565         public void visitAssign(JCAssign that)               { visitTree(that); }
3566         public void visitAssignop(JCAssignOp that)           { visitTree(that); }
3567         public void visitUnary(JCUnary that)                 { visitTree(that); }
3568         public void visitBinary(JCBinary that)               { visitTree(that); }
3569         public void visitTypeCast(JCTypeCast that)           { visitTree(that); }
3570         public void visitTypeTest(JCInstanceOf that)         { visitTree(that); }
3571         public void visitAnyPattern(JCAnyPattern that)       { visitTree(that); }
3572         public void visitBindingPattern(JCBindingPattern that) { visitTree(that); }
3573         public void visitDefaultCaseLabel(JCDefaultCaseLabel that) { visitTree(that); }
3574         public void visitConstantCaseLabel(JCConstantCaseLabel that) { visitTree(that); }
3575         public void visitPatternCaseLabel(JCPatternCaseLabel that) { visitTree(that); }
3576         public void visitRecordPattern(JCRecordPattern that) { visitTree(that); }
3577         public void visitIndexed(JCArrayAccess that)         { visitTree(that); }
3578         public void visitSelect(JCFieldAccess that)          { visitTree(that); }
3579         public void visitReference(JCMemberReference that)   { visitTree(that); }
3580         public void visitIdent(JCIdent that)                 { visitTree(that); }
3581         public void visitLiteral(JCLiteral that)             { visitTree(that); }
3582         public void visitTypeIdent(JCPrimitiveTypeTree that) { visitTree(that); }
3583         public void visitTypeArray(JCArrayTypeTree that)     { visitTree(that); }
3584         public void visitTypeApply(JCTypeApply that)         { visitTree(that); }
3585         public void visitTypeUnion(JCTypeUnion that)         { visitTree(that); }
3586         public void visitTypeIntersection(JCTypeIntersection that)  { visitTree(that); }
3587         public void visitTypeParameter(JCTypeParameter that) { visitTree(that); }
3588         public void visitWildcard(JCWildcard that)           { visitTree(that); }
3589         public void visitTypeBoundKind(TypeBoundKind that)   { visitTree(that); }
3590         public void visitAnnotation(JCAnnotation that)       { visitTree(that); }
3591         public void visitModifiers(JCModifiers that)         { visitTree(that); }
3592         public void visitAnnotatedType(JCAnnotatedType that) { visitTree(that); }
3593         public void visitErroneous(JCErroneous that)         { visitTree(that); }
3594         public void visitModuleDef(JCModuleDecl that)        { visitTree(that); }
3595         public void visitExports(JCExports that)             { visitTree(that); }
3596         public void visitOpens(JCOpens that)                 { visitTree(that); }
3597         public void visitProvides(JCProvides that)           { visitTree(that); }
3598         public void visitRequires(JCRequires that)           { visitTree(that); }
3599         public void visitUses(JCUses that)                   { visitTree(that); }
3600         public void visitLetExpr(LetExpr that)               { visitTree(that); }
3601 
3602         public void visitTree(JCTree that)                   { Assert.error(); }
3603     }
3604 
3605 }