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 sealed class JCFunctionalExpression extends JCPolyExpression
 804                                                                permits JCLambda, JCMemberReference {
 805 
 806         public JCFunctionalExpression() {
 807             //a functional expression is always a 'true' poly
 808             polyKind = PolyKind.POLY;
 809         }
 810 
 811         /** list of target types inferred for this functional expression. */
 812         public Type target;
 813         /** The owner of this functional expression. */
 814         public Symbol owner;
 815         /** code reflection specific metadata. */
 816         public MethodSymbol codeModel;
 817 
 818         public Type getDescriptorType(Types types) {
 819             if (target == null) {
 820                 return types.createErrorType(null);
 821             } else if (target.hasTag(TypeTag.METHOD)) {
 822                 // this is a quoted expression
 823                 return target;
 824             } else {
 825                 return types.findDescriptorType(target);
 826             }
 827         }
 828     }
 829 
 830     /**
 831      * A class definition.
 832      */
 833     public static class JCClassDecl extends JCStatement implements ClassTree {
 834         /** the modifiers */
 835         public JCModifiers mods;
 836         /** the name of the class */
 837         public Name name;
 838         /** formal class parameters */
 839         public List<JCTypeParameter> typarams;
 840         /** the classes this class extends */
 841         public JCExpression extending;
 842         /** the interfaces implemented by this class */
 843         public List<JCExpression> implementing;
 844         /** the subclasses allowed to extend this class, if sealed */
 845         public List<JCExpression> permitting;
 846         /** all variables and methods defined in this class */
 847         public List<JCTree> defs;
 848         /** the symbol */
 849         public ClassSymbol sym;
 850         protected JCClassDecl(JCModifiers mods,
 851                            Name name,
 852                            List<JCTypeParameter> typarams,
 853                            JCExpression extending,
 854                            List<JCExpression> implementing,
 855                            List<JCExpression> permitting,
 856                            List<JCTree> defs,
 857                            ClassSymbol sym)
 858         {
 859             this.mods = mods;
 860             this.name = name;
 861             this.typarams = typarams;
 862             this.extending = extending;
 863             this.implementing = implementing;
 864             this.permitting = permitting;
 865             this.defs = defs;
 866             this.sym = sym;
 867         }
 868         @Override
 869         public void accept(Visitor v) { v.visitClassDef(this); }
 870 
 871         @DefinedBy(Api.COMPILER_TREE)
 872         public Kind getKind() {
 873             if ((mods.flags & Flags.ANNOTATION) != 0)
 874                 return Kind.ANNOTATION_TYPE;
 875             else if ((mods.flags & Flags.INTERFACE) != 0)
 876                 return Kind.INTERFACE;
 877             else if ((mods.flags & Flags.ENUM) != 0)
 878                 return Kind.ENUM;
 879             else if ((mods.flags & Flags.RECORD) != 0)
 880                 return Kind.RECORD;
 881             else
 882                 return Kind.CLASS;
 883         }
 884 
 885         @DefinedBy(Api.COMPILER_TREE)
 886         public JCModifiers getModifiers() { return mods; }
 887         @DefinedBy(Api.COMPILER_TREE)
 888         public Name getSimpleName() { return name; }
 889         @DefinedBy(Api.COMPILER_TREE)
 890         public List<JCTypeParameter> getTypeParameters() {
 891             return typarams;
 892         }
 893         @DefinedBy(Api.COMPILER_TREE)
 894         public JCExpression getExtendsClause() { return extending; }
 895         @DefinedBy(Api.COMPILER_TREE)
 896         public List<JCExpression> getImplementsClause() {
 897             return implementing;
 898         }
 899         @DefinedBy(Api.COMPILER_TREE)
 900         public List<JCExpression> getPermitsClause() {
 901             return permitting;
 902         }
 903         @DefinedBy(Api.COMPILER_TREE)
 904         public List<JCTree> getMembers() {
 905             return defs;
 906         }
 907         @Override @DefinedBy(Api.COMPILER_TREE)
 908         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
 909             return v.visitClass(this, d);
 910         }
 911 
 912         @Override
 913         public Tag getTag() {
 914             return CLASSDEF;
 915         }
 916     }
 917 
 918     /**
 919      * A method definition.
 920      */
 921     public static class JCMethodDecl extends JCTree implements MethodTree {
 922         /** method modifiers */
 923         public JCModifiers mods;
 924         /** method name */
 925         public Name name;
 926         /** type of method return value */
 927         public JCExpression restype;
 928         /** type parameters */
 929         public List<JCTypeParameter> typarams;
 930         /** receiver parameter */
 931         public JCVariableDecl recvparam;
 932         /** value parameters */
 933         public List<JCVariableDecl> params;
 934         /** exceptions thrown by this method */
 935         public List<JCExpression> thrown;
 936         /** statements in the method */
 937         public JCBlock body;
 938         /** default value, for annotation types */
 939         public JCExpression defaultValue;
 940         /** method symbol */
 941         public MethodSymbol sym;
 942         /** does this method completes normally */
 943         public boolean completesNormally;
 944 
 945         protected JCMethodDecl(JCModifiers mods,
 946                             Name name,
 947                             JCExpression restype,
 948                             List<JCTypeParameter> typarams,
 949                             JCVariableDecl recvparam,
 950                             List<JCVariableDecl> params,
 951                             List<JCExpression> thrown,
 952                             JCBlock body,
 953                             JCExpression defaultValue,
 954                             MethodSymbol sym)
 955         {
 956             this.mods = mods;
 957             this.name = name;
 958             this.restype = restype;
 959             this.typarams = typarams;
 960             this.params = params;
 961             this.recvparam = recvparam;
 962             // TODO: do something special if the given type is null?
 963             // receiver != null ? receiver : List.<JCTypeAnnotation>nil());
 964             this.thrown = thrown;
 965             this.body = body;
 966             this.defaultValue = defaultValue;
 967             this.sym = sym;
 968         }
 969         @Override
 970         public void accept(Visitor v) { v.visitMethodDef(this); }
 971 
 972         @DefinedBy(Api.COMPILER_TREE)
 973         public Kind getKind() { return Kind.METHOD; }
 974         @DefinedBy(Api.COMPILER_TREE)
 975         public JCModifiers getModifiers() { return mods; }
 976         @DefinedBy(Api.COMPILER_TREE)
 977         public Name getName() { return name; }
 978         @DefinedBy(Api.COMPILER_TREE)
 979         public JCTree getReturnType() { return restype; }
 980         @DefinedBy(Api.COMPILER_TREE)
 981         public List<JCTypeParameter> getTypeParameters() {
 982             return typarams;
 983         }
 984         @DefinedBy(Api.COMPILER_TREE)
 985         public List<JCVariableDecl> getParameters() {
 986             return params;
 987         }
 988         @DefinedBy(Api.COMPILER_TREE)
 989         public JCVariableDecl getReceiverParameter() { return recvparam; }
 990         @DefinedBy(Api.COMPILER_TREE)
 991         public List<JCExpression> getThrows() {
 992             return thrown;
 993         }
 994         @DefinedBy(Api.COMPILER_TREE)
 995         public JCBlock getBody() { return body; }
 996         @DefinedBy(Api.COMPILER_TREE)
 997         public JCTree getDefaultValue() { // for annotation types
 998             return defaultValue;
 999         }
1000         @Override @DefinedBy(Api.COMPILER_TREE)
1001         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
1002             return v.visitMethod(this, d);
1003         }
1004 
1005         @Override
1006         public Tag getTag() {
1007             return METHODDEF;
1008         }
1009   }
1010 
1011     /**
1012      * A variable definition.
1013      */
1014     public static class JCVariableDecl extends JCStatement implements VariableTree {
1015         /** variable modifiers */
1016         public JCModifiers mods;
1017         /** variable name */
1018         public Name name;
1019         /** variable name expression */
1020         public JCExpression nameexpr;
1021         /** type of the variable */
1022         public JCExpression vartype;
1023         /** variable's initial value */
1024         public JCExpression init;
1025         /** symbol */
1026         public VarSymbol sym;
1027         /** explicit start pos */
1028         public int startPos = Position.NOPOS;
1029         /** declared using `var` */
1030         private boolean declaredUsingVar;
1031 
1032         protected JCVariableDecl(JCModifiers mods,
1033                          Name name,
1034                          JCExpression vartype,
1035                          JCExpression init,
1036                          VarSymbol sym) {
1037             this(mods, name, vartype, init, sym, false);
1038         }
1039 
1040         protected JCVariableDecl(JCModifiers mods,
1041                                  Name name,
1042                                  JCExpression vartype,
1043                                  JCExpression init,
1044                                  VarSymbol sym,
1045                                  boolean declaredUsingVar) {
1046             this.mods = mods;
1047             this.name = name;
1048             this.vartype = vartype;
1049             this.init = init;
1050             this.sym = sym;
1051             this.declaredUsingVar = declaredUsingVar;
1052         }
1053 
1054         protected JCVariableDecl(JCModifiers mods,
1055                          JCExpression nameexpr,
1056                          JCExpression vartype) {
1057             this(mods, null, vartype, null, null, false);
1058             this.nameexpr = nameexpr;
1059             if (nameexpr.hasTag(Tag.IDENT)) {
1060                 this.name = ((JCIdent)nameexpr).name;
1061             } else {
1062                 // Only other option is qualified name x.y.this;
1063                 this.name = ((JCFieldAccess)nameexpr).name;
1064             }
1065         }
1066 
1067         public boolean isImplicitlyTyped() {
1068             return vartype == null;
1069         }
1070 
1071         public boolean declaredUsingVar() {
1072             return declaredUsingVar;
1073         }
1074 
1075         @Override
1076         public void accept(Visitor v) { v.visitVarDef(this); }
1077 
1078         @DefinedBy(Api.COMPILER_TREE)
1079         public Kind getKind() { return Kind.VARIABLE; }
1080         @DefinedBy(Api.COMPILER_TREE)
1081         public JCModifiers getModifiers() { return mods; }
1082         @DefinedBy(Api.COMPILER_TREE)
1083         public Name getName() { return name; }
1084         @DefinedBy(Api.COMPILER_TREE)
1085         public JCExpression getNameExpression() { return nameexpr; }
1086         @DefinedBy(Api.COMPILER_TREE)
1087         public JCTree getType() { return vartype; }
1088         @DefinedBy(Api.COMPILER_TREE)
1089         public JCExpression getInitializer() {
1090             return init;
1091         }
1092         @Override @DefinedBy(Api.COMPILER_TREE)
1093         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
1094             return v.visitVariable(this, d);
1095         }
1096 
1097         @Override
1098         public Tag getTag() {
1099             return VARDEF;
1100         }
1101     }
1102 
1103     /**
1104      * A no-op statement ";".
1105      */
1106     public static class JCSkip extends JCStatement implements EmptyStatementTree {
1107         protected JCSkip() {
1108         }
1109         @Override
1110         public void accept(Visitor v) { v.visitSkip(this); }
1111 
1112         @DefinedBy(Api.COMPILER_TREE)
1113         public Kind getKind() { return Kind.EMPTY_STATEMENT; }
1114         @Override @DefinedBy(Api.COMPILER_TREE)
1115         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
1116             return v.visitEmptyStatement(this, d);
1117         }
1118 
1119         @Override
1120         public Tag getTag() {
1121             return SKIP;
1122         }
1123     }
1124 
1125     /**
1126      * A statement block.
1127      */
1128     public static class JCBlock extends JCStatement implements BlockTree {
1129         /** flags */
1130         public long flags;
1131         /** statements */
1132         public List<JCStatement> stats;
1133         /** Position of closing brace, optional. */
1134         public int endpos = Position.NOPOS;
1135         /** If this block contains record pattern, it is necessary to catch
1136          *  exceptions from the deconstructors and wrap them.
1137          * The {@code patternMatchingCatch} keeps the list of the deconstructor
1138          * invocations, and the additional catch block that wraps the exceptions.
1139          */
1140         public PatternMatchingCatch patternMatchingCatch;
1141         protected JCBlock(long flags, List<JCStatement> stats) {
1142             this.stats = stats;
1143             this.flags = flags;
1144         }
1145         @Override
1146         public void accept(Visitor v) { v.visitBlock(this); }
1147 
1148         @DefinedBy(Api.COMPILER_TREE)
1149         public Kind getKind() { return Kind.BLOCK; }
1150         @DefinedBy(Api.COMPILER_TREE)
1151         public List<JCStatement> getStatements() {
1152             return stats;
1153         }
1154         @DefinedBy(Api.COMPILER_TREE)
1155         public boolean isStatic() { return (flags & Flags.STATIC) != 0; }
1156         @Override @DefinedBy(Api.COMPILER_TREE)
1157         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
1158             return v.visitBlock(this, d);
1159         }
1160 
1161         @Override
1162         public Tag getTag() {
1163             return BLOCK;
1164         }
1165 
1166         public record PatternMatchingCatch(JCCatch handler, Set<JCMethodInvocation> calls2Handle) {}
1167     }
1168 
1169     /**
1170      * A do loop
1171      */
1172     public static class JCDoWhileLoop extends JCStatement implements DoWhileLoopTree {
1173         public JCStatement body;
1174         public JCExpression cond;
1175         protected JCDoWhileLoop(JCStatement body, JCExpression cond) {
1176             this.body = body;
1177             this.cond = cond;
1178         }
1179         @Override
1180         public void accept(Visitor v) { v.visitDoLoop(this); }
1181 
1182         @DefinedBy(Api.COMPILER_TREE)
1183         public Kind getKind() { return Kind.DO_WHILE_LOOP; }
1184         @DefinedBy(Api.COMPILER_TREE)
1185         public JCExpression getCondition() { return cond; }
1186         @DefinedBy(Api.COMPILER_TREE)
1187         public JCStatement getStatement() { return body; }
1188         @Override @DefinedBy(Api.COMPILER_TREE)
1189         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
1190             return v.visitDoWhileLoop(this, d);
1191         }
1192 
1193         @Override
1194         public Tag getTag() {
1195             return DOLOOP;
1196         }
1197     }
1198 
1199     /**
1200      * A while loop
1201      */
1202     public static class JCWhileLoop extends JCStatement implements WhileLoopTree {
1203         public JCExpression cond;
1204         public JCStatement body;
1205         protected JCWhileLoop(JCExpression cond, JCStatement body) {
1206             this.cond = cond;
1207             this.body = body;
1208         }
1209         @Override
1210         public void accept(Visitor v) { v.visitWhileLoop(this); }
1211 
1212         @DefinedBy(Api.COMPILER_TREE)
1213         public Kind getKind() { return Kind.WHILE_LOOP; }
1214         @DefinedBy(Api.COMPILER_TREE)
1215         public JCExpression getCondition() { return cond; }
1216         @DefinedBy(Api.COMPILER_TREE)
1217         public JCStatement getStatement() { return body; }
1218         @Override @DefinedBy(Api.COMPILER_TREE)
1219         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
1220             return v.visitWhileLoop(this, d);
1221         }
1222 
1223         @Override
1224         public Tag getTag() {
1225             return WHILELOOP;
1226         }
1227     }
1228 
1229     /**
1230      * A for loop.
1231      */
1232     public static class JCForLoop extends JCStatement implements ForLoopTree {
1233         public List<JCStatement> init;
1234         public JCExpression cond;
1235         public List<JCExpressionStatement> step;
1236         public JCStatement body;
1237         protected JCForLoop(List<JCStatement> init,
1238                           JCExpression cond,
1239                           List<JCExpressionStatement> update,
1240                           JCStatement body)
1241         {
1242             this.init = init;
1243             this.cond = cond;
1244             this.step = update;
1245             this.body = body;
1246         }
1247         @Override
1248         public void accept(Visitor v) { v.visitForLoop(this); }
1249 
1250         @DefinedBy(Api.COMPILER_TREE)
1251         public Kind getKind() { return Kind.FOR_LOOP; }
1252         @DefinedBy(Api.COMPILER_TREE)
1253         public JCExpression getCondition() { return cond; }
1254         @DefinedBy(Api.COMPILER_TREE)
1255         public JCStatement getStatement() { return body; }
1256         @DefinedBy(Api.COMPILER_TREE)
1257         public List<JCStatement> getInitializer() {
1258             return init;
1259         }
1260         @DefinedBy(Api.COMPILER_TREE)
1261         public List<JCExpressionStatement> getUpdate() {
1262             return step;
1263         }
1264         @Override @DefinedBy(Api.COMPILER_TREE)
1265         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
1266             return v.visitForLoop(this, d);
1267         }
1268 
1269         @Override
1270         public Tag getTag() {
1271             return FORLOOP;
1272         }
1273     }
1274 
1275     /**
1276      * The enhanced for loop.
1277      */
1278     public static class JCEnhancedForLoop extends JCStatement implements EnhancedForLoopTree {
1279         public JCVariableDecl var;
1280         public JCExpression expr;
1281         public JCStatement body;
1282         protected JCEnhancedForLoop(JCVariableDecl var, JCExpression expr, JCStatement body) {
1283             this.var = var;
1284             this.expr = expr;
1285             this.body = body;
1286         }
1287         @Override
1288         public void accept(Visitor v) { v.visitForeachLoop(this); }
1289 
1290         @DefinedBy(Api.COMPILER_TREE)
1291         public Kind getKind() { return Kind.ENHANCED_FOR_LOOP; }
1292         @DefinedBy(Api.COMPILER_TREE)
1293         public JCVariableDecl getVariable() { return var; }
1294         @DefinedBy(Api.COMPILER_TREE)
1295         public JCExpression getExpression() { return expr; }
1296         @DefinedBy(Api.COMPILER_TREE)
1297         public JCStatement getStatement() { return body; }
1298         @Override @DefinedBy(Api.COMPILER_TREE)
1299         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
1300             return v.visitEnhancedForLoop(this, d);
1301         }
1302         @Override
1303         public Tag getTag() {
1304             return FOREACHLOOP;
1305         }
1306     }
1307 
1308     /**
1309      * A labelled expression or statement.
1310      */
1311     public static class JCLabeledStatement extends JCStatement implements LabeledStatementTree {
1312         public Name label;
1313         public JCStatement body;
1314         protected JCLabeledStatement(Name label, JCStatement body) {
1315             this.label = label;
1316             this.body = body;
1317         }
1318         @Override
1319         public void accept(Visitor v) { v.visitLabelled(this); }
1320         @DefinedBy(Api.COMPILER_TREE)
1321         public Kind getKind() { return Kind.LABELED_STATEMENT; }
1322         @DefinedBy(Api.COMPILER_TREE)
1323         public Name getLabel() { return label; }
1324         @DefinedBy(Api.COMPILER_TREE)
1325         public JCStatement getStatement() { return body; }
1326         @Override @DefinedBy(Api.COMPILER_TREE)
1327         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
1328             return v.visitLabeledStatement(this, d);
1329         }
1330         @Override
1331         public Tag getTag() {
1332             return LABELLED;
1333         }
1334     }
1335 
1336     /**
1337      * A "switch ( ) { }" construction.
1338      */
1339     public static class JCSwitch extends JCStatement implements SwitchTree {
1340         public JCExpression selector;
1341         public List<JCCase> cases;
1342         /** Position of closing brace, optional. */
1343         public int endpos = Position.NOPOS;
1344         public boolean hasUnconditionalPattern;
1345         public boolean isExhaustive;
1346         public boolean patternSwitch;
1347         public boolean wasEnumSelector;
1348         protected JCSwitch(JCExpression selector, List<JCCase> cases) {
1349             this.selector = selector;
1350             this.cases = cases;
1351         }
1352         @Override
1353         public void accept(Visitor v) { v.visitSwitch(this); }
1354 
1355         @DefinedBy(Api.COMPILER_TREE)
1356         public Kind getKind() { return Kind.SWITCH; }
1357         @DefinedBy(Api.COMPILER_TREE)
1358         public JCExpression getExpression() { return selector; }
1359         @DefinedBy(Api.COMPILER_TREE)
1360         public List<JCCase> getCases() { return cases; }
1361         @Override @DefinedBy(Api.COMPILER_TREE)
1362         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
1363             return v.visitSwitch(this, d);
1364         }
1365         @Override
1366         public Tag getTag() {
1367             return SWITCH;
1368         }
1369     }
1370 
1371     /**
1372      * A "case  :" of a switch.
1373      */
1374     public static class JCCase extends JCStatement implements CaseTree {
1375         //as CaseKind is deprecated for removal (as it is part of a preview feature),
1376         //using indirection through these fields to avoid unnecessary @SuppressWarnings:
1377         public static final CaseKind STATEMENT = CaseKind.STATEMENT;
1378         public static final CaseKind RULE = CaseKind.RULE;
1379         public final CaseKind caseKind;
1380         public List<JCCaseLabel> labels;
1381         public JCExpression guard;
1382         public List<JCStatement> stats;
1383         public JCTree body;
1384         public boolean completesNormally;
1385         protected JCCase(CaseKind caseKind, List<JCCaseLabel> labels,
1386                          JCExpression guard,
1387                          List<JCStatement> stats, JCTree body) {
1388             Assert.checkNonNull(labels);
1389             Assert.check(labels.isEmpty() || labels.head != null);
1390             this.caseKind = caseKind;
1391             this.labels = labels;
1392             this.guard = guard;
1393             this.stats = stats;
1394             this.body = body;
1395         }
1396         @Override
1397         public void accept(Visitor v) { v.visitCase(this); }
1398 
1399         @Override @DefinedBy(Api.COMPILER_TREE)
1400         public Kind getKind() { return Kind.CASE; }
1401         @Override @Deprecated @DefinedBy(Api.COMPILER_TREE)
1402         public JCExpression getExpression() { return getExpressions().head; }
1403 
1404         @Override @DefinedBy(Api.COMPILER_TREE)
1405         public List<JCExpression> getExpressions() {
1406             return labels.stream()
1407                          .filter(p -> p.hasTag(CONSTANTCASELABEL))
1408                          .map(p -> ((JCConstantCaseLabel) p).expr)
1409                          .collect(List.collector());
1410         }
1411 
1412         @Override @DefinedBy(Api.COMPILER_TREE)
1413         public List<JCCaseLabel> getLabels() { return labels; }
1414         @Override @DefinedBy(Api.COMPILER_TREE)
1415         public JCExpression getGuard() { return guard; }
1416         @Override @DefinedBy(Api.COMPILER_TREE)
1417         public List<JCStatement> getStatements() {
1418             return caseKind == CaseKind.STATEMENT ? stats : null;
1419         }
1420         @Override @DefinedBy(Api.COMPILER_TREE)
1421         public JCTree getBody() { return body; }
1422         @Override @DefinedBy(Api.COMPILER_TREE)
1423         public CaseKind getCaseKind() {
1424             return caseKind;
1425         }
1426         @Override @DefinedBy(Api.COMPILER_TREE)
1427         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
1428             return v.visitCase(this, d);
1429         }
1430         @Override
1431         public Tag getTag() {
1432             return CASE;
1433         }
1434     }
1435 
1436     /**
1437      * A "switch ( ) { }" construction.
1438      */
1439     public static class JCSwitchExpression extends JCPolyExpression implements SwitchExpressionTree {
1440         public JCExpression selector;
1441         public List<JCCase> cases;
1442         /** Position of closing brace, optional. */
1443         public int endpos = Position.NOPOS;
1444         public boolean hasUnconditionalPattern;
1445         public boolean isExhaustive;
1446         public boolean patternSwitch;
1447         public boolean wasEnumSelector;
1448         protected JCSwitchExpression(JCExpression selector, List<JCCase> cases) {
1449             this.selector = selector;
1450             this.cases = cases;
1451         }
1452         @Override
1453         public void accept(Visitor v) { v.visitSwitchExpression(this); }
1454 
1455         @DefinedBy(Api.COMPILER_TREE)
1456         public Kind getKind() { return Kind.SWITCH_EXPRESSION; }
1457         @DefinedBy(Api.COMPILER_TREE)
1458         public JCExpression getExpression() { return selector; }
1459         @DefinedBy(Api.COMPILER_TREE)
1460         public List<JCCase> getCases() { return cases; }
1461         @Override @DefinedBy(Api.COMPILER_TREE)
1462         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
1463             return v.visitSwitchExpression(this, d);
1464         }
1465         @Override
1466         public Tag getTag() {
1467             return SWITCH_EXPRESSION;
1468         }
1469     }
1470 
1471     /**
1472      * A synchronized block.
1473      */
1474     public static class JCSynchronized extends JCStatement implements SynchronizedTree {
1475         public JCExpression lock;
1476         public JCBlock body;
1477         protected JCSynchronized(JCExpression lock, JCBlock body) {
1478             this.lock = lock;
1479             this.body = body;
1480         }
1481         @Override
1482         public void accept(Visitor v) { v.visitSynchronized(this); }
1483 
1484         @DefinedBy(Api.COMPILER_TREE)
1485         public Kind getKind() { return Kind.SYNCHRONIZED; }
1486         @DefinedBy(Api.COMPILER_TREE)
1487         public JCExpression getExpression() { return lock; }
1488         @DefinedBy(Api.COMPILER_TREE)
1489         public JCBlock getBlock() { return body; }
1490         @Override @DefinedBy(Api.COMPILER_TREE)
1491         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
1492             return v.visitSynchronized(this, d);
1493         }
1494         @Override
1495         public Tag getTag() {
1496             return SYNCHRONIZED;
1497         }
1498     }
1499 
1500     /**
1501      * A "try { } catch ( ) { } finally { }" block.
1502      */
1503     public static class JCTry extends JCStatement implements TryTree {
1504         public JCBlock body;
1505         public List<JCCatch> catchers;
1506         public JCBlock finalizer;
1507         public List<JCTree> resources;
1508         public boolean finallyCanCompleteNormally;
1509         protected JCTry(List<JCTree> resources,
1510                         JCBlock body,
1511                         List<JCCatch> catchers,
1512                         JCBlock finalizer) {
1513             this.body = body;
1514             this.catchers = catchers;
1515             this.finalizer = finalizer;
1516             this.resources = resources;
1517         }
1518         @Override
1519         public void accept(Visitor v) { v.visitTry(this); }
1520 
1521         @DefinedBy(Api.COMPILER_TREE)
1522         public Kind getKind() { return Kind.TRY; }
1523         @DefinedBy(Api.COMPILER_TREE)
1524         public JCBlock getBlock() { return body; }
1525         @DefinedBy(Api.COMPILER_TREE)
1526         public List<JCCatch> getCatches() {
1527             return catchers;
1528         }
1529         @DefinedBy(Api.COMPILER_TREE)
1530         public JCBlock getFinallyBlock() { return finalizer; }
1531         @Override @DefinedBy(Api.COMPILER_TREE)
1532         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
1533             return v.visitTry(this, d);
1534         }
1535         @Override @DefinedBy(Api.COMPILER_TREE)
1536         public List<JCTree> getResources() {
1537             return resources;
1538         }
1539         @Override
1540         public Tag getTag() {
1541             return TRY;
1542         }
1543     }
1544 
1545     /**
1546      * A catch block.
1547      */
1548     public static class JCCatch extends JCTree implements CatchTree {
1549         public JCVariableDecl param;
1550         public JCBlock body;
1551         protected JCCatch(JCVariableDecl param, JCBlock body) {
1552             this.param = param;
1553             this.body = body;
1554         }
1555         @Override
1556         public void accept(Visitor v) { v.visitCatch(this); }
1557 
1558         @DefinedBy(Api.COMPILER_TREE)
1559         public Kind getKind() { return Kind.CATCH; }
1560         @DefinedBy(Api.COMPILER_TREE)
1561         public JCVariableDecl getParameter() { return param; }
1562         @DefinedBy(Api.COMPILER_TREE)
1563         public JCBlock getBlock() { return body; }
1564         @Override @DefinedBy(Api.COMPILER_TREE)
1565         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
1566             return v.visitCatch(this, d);
1567         }
1568         @Override
1569         public Tag getTag() {
1570             return CATCH;
1571         }
1572     }
1573 
1574     /**
1575      * A ( ) ? ( ) : ( ) conditional expression
1576      */
1577     public static class JCConditional extends JCPolyExpression implements ConditionalExpressionTree {
1578         public JCExpression cond;
1579         public JCExpression truepart;
1580         public JCExpression falsepart;
1581         protected JCConditional(JCExpression cond,
1582                               JCExpression truepart,
1583                               JCExpression falsepart)
1584         {
1585             this.cond = cond;
1586             this.truepart = truepart;
1587             this.falsepart = falsepart;
1588         }
1589         @Override
1590         public void accept(Visitor v) { v.visitConditional(this); }
1591 
1592         @DefinedBy(Api.COMPILER_TREE)
1593         public Kind getKind() { return Kind.CONDITIONAL_EXPRESSION; }
1594         @DefinedBy(Api.COMPILER_TREE)
1595         public JCExpression getCondition() { return cond; }
1596         @DefinedBy(Api.COMPILER_TREE)
1597         public JCExpression getTrueExpression() { return truepart; }
1598         @DefinedBy(Api.COMPILER_TREE)
1599         public JCExpression getFalseExpression() { return falsepart; }
1600         @Override @DefinedBy(Api.COMPILER_TREE)
1601         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
1602             return v.visitConditionalExpression(this, d);
1603         }
1604         @Override
1605         public Tag getTag() {
1606             return CONDEXPR;
1607         }
1608     }
1609 
1610     /**
1611      * An "if ( ) { } else { }" block
1612      */
1613     public static class JCIf extends JCStatement implements IfTree {
1614         public JCExpression cond;
1615         public JCStatement thenpart;
1616         public JCStatement elsepart;
1617         protected JCIf(JCExpression cond,
1618                      JCStatement thenpart,
1619                      JCStatement elsepart)
1620         {
1621             this.cond = cond;
1622             this.thenpart = thenpart;
1623             this.elsepart = elsepart;
1624         }
1625         @Override
1626         public void accept(Visitor v) { v.visitIf(this); }
1627 
1628         @DefinedBy(Api.COMPILER_TREE)
1629         public Kind getKind() { return Kind.IF; }
1630         @DefinedBy(Api.COMPILER_TREE)
1631         public JCExpression getCondition() { return cond; }
1632         @DefinedBy(Api.COMPILER_TREE)
1633         public JCStatement getThenStatement() { return thenpart; }
1634         @DefinedBy(Api.COMPILER_TREE)
1635         public JCStatement getElseStatement() { return elsepart; }
1636         @Override @DefinedBy(Api.COMPILER_TREE)
1637         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
1638             return v.visitIf(this, d);
1639         }
1640         @Override
1641         public Tag getTag() {
1642             return IF;
1643         }
1644     }
1645 
1646     /**
1647      * an expression statement
1648      */
1649     public static class JCExpressionStatement extends JCStatement implements ExpressionStatementTree {
1650         /** expression structure */
1651         public JCExpression expr;
1652         protected JCExpressionStatement(JCExpression expr)
1653         {
1654             this.expr = expr;
1655         }
1656         @Override
1657         public void accept(Visitor v) { v.visitExec(this); }
1658 
1659         @DefinedBy(Api.COMPILER_TREE)
1660         public Kind getKind() { return Kind.EXPRESSION_STATEMENT; }
1661         @DefinedBy(Api.COMPILER_TREE)
1662         public JCExpression getExpression() { return expr; }
1663         @Override @DefinedBy(Api.COMPILER_TREE)
1664         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
1665             return v.visitExpressionStatement(this, d);
1666         }
1667         @Override
1668         public Tag getTag() {
1669             return EXEC;
1670         }
1671 
1672         /** Convert a expression-statement tree to a pretty-printed string. */
1673         @Override
1674         public String toString() {
1675             StringWriter s = new StringWriter();
1676             try {
1677                 new Pretty(s, false).printStat(this);
1678             }
1679             catch (IOException e) {
1680                 // should never happen, because StringWriter is defined
1681                 // never to throw any IOExceptions
1682                 throw new AssertionError(e);
1683             }
1684             return s.toString();
1685         }
1686     }
1687 
1688     /**
1689      * A break from a loop or switch.
1690      */
1691     public static class JCBreak extends JCStatement implements BreakTree {
1692         public Name label;
1693         public JCTree target;
1694         protected JCBreak(Name label, JCTree target) {
1695             this.label = label;
1696             this.target = target;
1697         }
1698         @Override
1699         public void accept(Visitor v) { v.visitBreak(this); }
1700         public boolean isValueBreak() {
1701             return target != null && target.hasTag(SWITCH_EXPRESSION);
1702         }
1703 
1704         @DefinedBy(Api.COMPILER_TREE)
1705         public Kind getKind() { return Kind.BREAK; }
1706         @DefinedBy(Api.COMPILER_TREE)
1707         public Name getLabel() {
1708             return label;
1709         }
1710         @Override @DefinedBy(Api.COMPILER_TREE)
1711         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
1712             return v.visitBreak(this, d);
1713         }
1714         @Override
1715         public Tag getTag() {
1716             return BREAK;
1717         }
1718     }
1719 
1720     /**
1721      * A break-with from a switch expression.
1722      */
1723     public static class JCYield extends JCStatement implements YieldTree {
1724         public JCExpression value;
1725         public JCTree target;
1726         protected JCYield(JCExpression value, JCTree target) {
1727             this.value = value;
1728             this.target = target;
1729         }
1730         @Override
1731         public void accept(Visitor v) { v.visitYield(this); }
1732         @DefinedBy(Api.COMPILER_TREE)
1733         public Kind getKind() { return Kind.YIELD; }
1734         @DefinedBy(Api.COMPILER_TREE)
1735         public JCExpression getValue() { return value; }
1736         @Override @DefinedBy(Api.COMPILER_TREE)
1737         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
1738             return v.visitYield(this, d);
1739         }
1740         @Override
1741         public Tag getTag() {
1742             return YIELD;
1743         }
1744     }
1745 
1746     /**
1747      * A continue of a loop.
1748      */
1749     public static class JCContinue extends JCStatement implements ContinueTree {
1750         public Name label;
1751         public JCTree target;
1752         protected JCContinue(Name label, JCTree target) {
1753             this.label = label;
1754             this.target = target;
1755         }
1756         @Override
1757         public void accept(Visitor v) { v.visitContinue(this); }
1758 
1759         @DefinedBy(Api.COMPILER_TREE)
1760         public Kind getKind() { return Kind.CONTINUE; }
1761         @DefinedBy(Api.COMPILER_TREE)
1762         public Name getLabel() { return label; }
1763         @Override @DefinedBy(Api.COMPILER_TREE)
1764         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
1765             return v.visitContinue(this, d);
1766         }
1767         @Override
1768         public Tag getTag() {
1769             return CONTINUE;
1770         }
1771     }
1772 
1773     /**
1774      * A return statement.
1775      */
1776     public static class JCReturn extends JCStatement implements ReturnTree {
1777         public JCExpression expr;
1778         protected JCReturn(JCExpression expr) {
1779             this.expr = expr;
1780         }
1781         @Override
1782         public void accept(Visitor v) { v.visitReturn(this); }
1783 
1784         @DefinedBy(Api.COMPILER_TREE)
1785         public Kind getKind() { return Kind.RETURN; }
1786         @DefinedBy(Api.COMPILER_TREE)
1787         public JCExpression getExpression() { return expr; }
1788         @Override @DefinedBy(Api.COMPILER_TREE)
1789         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
1790             return v.visitReturn(this, d);
1791         }
1792         @Override
1793         public Tag getTag() {
1794             return RETURN;
1795         }
1796     }
1797 
1798     /**
1799      * A throw statement.
1800      */
1801     public static class JCThrow extends JCStatement implements ThrowTree {
1802         public JCExpression expr;
1803         protected JCThrow(JCExpression expr) {
1804             this.expr = expr;
1805         }
1806         @Override
1807         public void accept(Visitor v) { v.visitThrow(this); }
1808 
1809         @DefinedBy(Api.COMPILER_TREE)
1810         public Kind getKind() { return Kind.THROW; }
1811         @DefinedBy(Api.COMPILER_TREE)
1812         public JCExpression getExpression() { return expr; }
1813         @Override @DefinedBy(Api.COMPILER_TREE)
1814         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
1815             return v.visitThrow(this, d);
1816         }
1817         @Override
1818         public Tag getTag() {
1819             return THROW;
1820         }
1821     }
1822 
1823     /**
1824      * An assert statement.
1825      */
1826     public static class JCAssert extends JCStatement implements AssertTree {
1827         public JCExpression cond;
1828         public JCExpression detail;
1829         protected JCAssert(JCExpression cond, JCExpression detail) {
1830             this.cond = cond;
1831             this.detail = detail;
1832         }
1833         @Override
1834         public void accept(Visitor v) { v.visitAssert(this); }
1835 
1836         @DefinedBy(Api.COMPILER_TREE)
1837         public Kind getKind() { return Kind.ASSERT; }
1838         @DefinedBy(Api.COMPILER_TREE)
1839         public JCExpression getCondition() { return cond; }
1840         @DefinedBy(Api.COMPILER_TREE)
1841         public JCExpression getDetail() { return detail; }
1842         @Override @DefinedBy(Api.COMPILER_TREE)
1843         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
1844             return v.visitAssert(this, d);
1845         }
1846         @Override
1847         public Tag getTag() {
1848             return ASSERT;
1849         }
1850     }
1851 
1852     /**
1853      * A method invocation
1854      */
1855     public static class JCMethodInvocation extends JCPolyExpression implements MethodInvocationTree {
1856         public List<JCExpression> typeargs;
1857         public JCExpression meth;
1858         public List<JCExpression> args;
1859         public Type varargsElement;
1860         protected JCMethodInvocation(List<JCExpression> typeargs,
1861                         JCExpression meth,
1862                         List<JCExpression> args)
1863         {
1864             this.typeargs = (typeargs == null) ? List.nil()
1865                                                : typeargs;
1866             this.meth = meth;
1867             this.args = args;
1868         }
1869         @Override
1870         public void accept(Visitor v) { v.visitApply(this); }
1871 
1872         @DefinedBy(Api.COMPILER_TREE)
1873         public Kind getKind() { return Kind.METHOD_INVOCATION; }
1874         @DefinedBy(Api.COMPILER_TREE)
1875         public List<JCExpression> getTypeArguments() {
1876             return typeargs;
1877         }
1878         @DefinedBy(Api.COMPILER_TREE)
1879         public JCExpression getMethodSelect() { return meth; }
1880         @DefinedBy(Api.COMPILER_TREE)
1881         public List<JCExpression> getArguments() {
1882             return args;
1883         }
1884         @Override @DefinedBy(Api.COMPILER_TREE)
1885         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
1886             return v.visitMethodInvocation(this, d);
1887         }
1888         @Override
1889         public JCMethodInvocation setType(Type type) {
1890             super.setType(type);
1891             return this;
1892         }
1893         @Override
1894         public Tag getTag() {
1895             return(APPLY);
1896         }
1897     }
1898 
1899     /**
1900      * A new(...) operation.
1901      */
1902     public static class JCNewClass extends JCPolyExpression implements NewClassTree {
1903         public JCExpression encl;
1904         public List<JCExpression> typeargs;
1905         public JCExpression clazz;
1906         public List<JCExpression> args;
1907         public JCClassDecl def;
1908         public Symbol constructor;
1909         public Type varargsElement;
1910         public Type constructorType;
1911         protected JCNewClass(JCExpression encl,
1912                            List<JCExpression> typeargs,
1913                            JCExpression clazz,
1914                            List<JCExpression> args,
1915                            JCClassDecl def)
1916         {
1917             this.encl = encl;
1918             this.typeargs = (typeargs == null) ? List.nil()
1919                                                : typeargs;
1920             this.clazz = clazz;
1921             this.args = args;
1922             this.def = def;
1923         }
1924         @Override
1925         public void accept(Visitor v) { v.visitNewClass(this); }
1926 
1927         @DefinedBy(Api.COMPILER_TREE)
1928         public Kind getKind() { return Kind.NEW_CLASS; }
1929         @DefinedBy(Api.COMPILER_TREE)
1930         public JCExpression getEnclosingExpression() { // expr.new C< ... > ( ... )
1931             return encl;
1932         }
1933         @DefinedBy(Api.COMPILER_TREE)
1934         public List<JCExpression> getTypeArguments() {
1935             return typeargs;
1936         }
1937         @DefinedBy(Api.COMPILER_TREE)
1938         public JCExpression getIdentifier() { return clazz; }
1939         @DefinedBy(Api.COMPILER_TREE)
1940         public List<JCExpression> getArguments() {
1941             return args;
1942         }
1943         @DefinedBy(Api.COMPILER_TREE)
1944         public JCClassDecl getClassBody() { return def; }
1945         @Override @DefinedBy(Api.COMPILER_TREE)
1946         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
1947             return v.visitNewClass(this, d);
1948         }
1949         @Override
1950         public Tag getTag() {
1951             return NEWCLASS;
1952         }
1953 
1954         public boolean classDeclRemoved() {
1955             return false;
1956         }
1957     }
1958 
1959     /**
1960      * A new[...] operation.
1961      */
1962     public static class JCNewArray extends JCExpression implements NewArrayTree {
1963         public JCExpression elemtype;
1964         public List<JCExpression> dims;
1965         // type annotations on inner-most component
1966         public List<JCAnnotation> annotations;
1967         // type annotations on dimensions
1968         public List<List<JCAnnotation>> dimAnnotations;
1969         public List<JCExpression> elems;
1970         protected JCNewArray(JCExpression elemtype,
1971                            List<JCExpression> dims,
1972                            List<JCExpression> elems)
1973         {
1974             this.elemtype = elemtype;
1975             this.dims = dims;
1976             this.annotations = List.nil();
1977             this.dimAnnotations = List.nil();
1978             this.elems = elems;
1979         }
1980         @Override
1981         public void accept(Visitor v) { v.visitNewArray(this); }
1982 
1983         @DefinedBy(Api.COMPILER_TREE)
1984         public Kind getKind() { return Kind.NEW_ARRAY; }
1985         @DefinedBy(Api.COMPILER_TREE)
1986         public JCExpression getType() { return elemtype; }
1987         @DefinedBy(Api.COMPILER_TREE)
1988         public List<JCExpression> getDimensions() {
1989             return dims;
1990         }
1991         @DefinedBy(Api.COMPILER_TREE)
1992         public List<JCExpression> getInitializers() {
1993             return elems;
1994         }
1995         @Override @DefinedBy(Api.COMPILER_TREE)
1996         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
1997             return v.visitNewArray(this, d);
1998         }
1999         @Override
2000         public Tag getTag() {
2001             return NEWARRAY;
2002         }
2003 
2004         @Override @DefinedBy(Api.COMPILER_TREE)
2005         public List<JCAnnotation> getAnnotations() {
2006             return annotations;
2007         }
2008 
2009         @Override @DefinedBy(Api.COMPILER_TREE)
2010         public List<List<JCAnnotation>> getDimAnnotations() {
2011             return dimAnnotations;
2012         }
2013     }
2014 
2015     /**
2016      * A lambda expression.
2017      */
2018     public static final class JCLambda extends JCFunctionalExpression implements LambdaExpressionTree {
2019 
2020         public enum ParameterKind {
2021             IMPLICIT,
2022             EXPLICIT
2023         }
2024 
2025         public List<JCVariableDecl> params;
2026         public JCTree body;
2027         public boolean canCompleteNormally = true;
2028         public ParameterKind paramKind;
2029         public boolean wasMethodReference;
2030 
2031         public JCLambda(List<JCVariableDecl> params,
2032                         JCTree body) {
2033             this.params = params;
2034             this.body = body;
2035             if (params.isEmpty() ||
2036                 params.head.vartype != null) {
2037                 paramKind = ParameterKind.EXPLICIT;
2038             } else {
2039                 paramKind = ParameterKind.IMPLICIT;
2040             }
2041         }
2042         @Override
2043         public Tag getTag() {
2044             return LAMBDA;
2045         }
2046         @Override
2047         public void accept(Visitor v) {
2048             v.visitLambda(this);
2049         }
2050         @Override @DefinedBy(Api.COMPILER_TREE)
2051         public <R, D> R accept(TreeVisitor<R, D> v, D d) {
2052             return v.visitLambdaExpression(this, d);
2053         }
2054         @DefinedBy(Api.COMPILER_TREE)
2055         public Kind getKind() {
2056             return Kind.LAMBDA_EXPRESSION;
2057         }
2058         @DefinedBy(Api.COMPILER_TREE)
2059         public JCTree getBody() {
2060             return body;
2061         }
2062         @DefinedBy(Api.COMPILER_TREE)
2063         public java.util.List<? extends VariableTree> getParameters() {
2064             return params;
2065         }
2066         @Override
2067         public JCLambda setType(Type type) {
2068             super.setType(type);
2069             return this;
2070         }
2071         @Override @DefinedBy(Api.COMPILER_TREE)
2072         public BodyKind getBodyKind() {
2073             return body.hasTag(BLOCK) ?
2074                     BodyKind.STATEMENT :
2075                     BodyKind.EXPRESSION;
2076         }
2077     }
2078 
2079     /**
2080      * A parenthesized subexpression ( ... )
2081      */
2082     public static class JCParens extends JCExpression implements ParenthesizedTree {
2083         public JCExpression expr;
2084         protected JCParens(JCExpression expr) {
2085             this.expr = expr;
2086         }
2087         @Override
2088         public void accept(Visitor v) { v.visitParens(this); }
2089 
2090         @DefinedBy(Api.COMPILER_TREE)
2091         public Kind getKind() { return Kind.PARENTHESIZED; }
2092         @DefinedBy(Api.COMPILER_TREE)
2093         public JCExpression getExpression() { return expr; }
2094         @Override @DefinedBy(Api.COMPILER_TREE)
2095         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
2096             return v.visitParenthesized(this, d);
2097         }
2098         @Override
2099         public Tag getTag() {
2100             return PARENS;
2101         }
2102     }
2103 
2104     /**
2105      * A assignment with "=".
2106      */
2107     public static class JCAssign extends JCExpression implements AssignmentTree {
2108         public JCExpression lhs;
2109         public JCExpression rhs;
2110         protected JCAssign(JCExpression lhs, JCExpression rhs) {
2111             this.lhs = lhs;
2112             this.rhs = rhs;
2113         }
2114         @Override
2115         public void accept(Visitor v) { v.visitAssign(this); }
2116 
2117         @DefinedBy(Api.COMPILER_TREE)
2118         public Kind getKind() { return Kind.ASSIGNMENT; }
2119         @DefinedBy(Api.COMPILER_TREE)
2120         public JCExpression getVariable() { return lhs; }
2121         @DefinedBy(Api.COMPILER_TREE)
2122         public JCExpression getExpression() { return rhs; }
2123         @Override @DefinedBy(Api.COMPILER_TREE)
2124         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
2125             return v.visitAssignment(this, d);
2126         }
2127         @Override
2128         public Tag getTag() {
2129             return ASSIGN;
2130         }
2131     }
2132 
2133     public abstract static class JCOperatorExpression extends JCExpression {
2134         public enum OperandPos {
2135             LEFT,
2136             RIGHT
2137         }
2138 
2139         protected Tag opcode;
2140         public OperatorSymbol operator;
2141 
2142         public OperatorSymbol getOperator() {
2143             return operator;
2144         }
2145 
2146         @Override
2147         public Tag getTag() {
2148             return opcode;
2149         }
2150 
2151         public abstract JCExpression getOperand(OperandPos pos);
2152     }
2153 
2154     /**
2155      * An assignment with "+=", "|=" ...
2156      */
2157     public static class JCAssignOp extends JCOperatorExpression implements CompoundAssignmentTree {
2158         public JCExpression lhs;
2159         public JCExpression rhs;
2160         protected JCAssignOp(Tag opcode, JCTree lhs, JCTree rhs, OperatorSymbol operator) {
2161             this.opcode = opcode;
2162             this.lhs = (JCExpression)lhs;
2163             this.rhs = (JCExpression)rhs;
2164             this.operator = operator;
2165         }
2166         @Override
2167         public void accept(Visitor v) { v.visitAssignop(this); }
2168 
2169         @DefinedBy(Api.COMPILER_TREE)
2170         public Kind getKind() { return TreeInfo.tagToKind(getTag()); }
2171         @DefinedBy(Api.COMPILER_TREE)
2172         public JCExpression getVariable() { return lhs; }
2173         @DefinedBy(Api.COMPILER_TREE)
2174         public JCExpression getExpression() { return rhs; }
2175         @Override @DefinedBy(Api.COMPILER_TREE)
2176         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
2177             return v.visitCompoundAssignment(this, d);
2178         }
2179         @Override
2180         public JCExpression getOperand(OperandPos pos) {
2181             return pos == OperandPos.LEFT ? lhs : rhs;
2182         }
2183     }
2184 
2185     /**
2186      * A unary operation.
2187      */
2188     public static class JCUnary extends JCOperatorExpression implements UnaryTree {
2189         public JCExpression arg;
2190         protected JCUnary(Tag opcode, JCExpression arg) {
2191             this.opcode = opcode;
2192             this.arg = arg;
2193         }
2194         @Override
2195         public void accept(Visitor v) { v.visitUnary(this); }
2196 
2197         @DefinedBy(Api.COMPILER_TREE)
2198         public Kind getKind() { return TreeInfo.tagToKind(getTag()); }
2199         @DefinedBy(Api.COMPILER_TREE)
2200         public JCExpression getExpression() { return arg; }
2201         @Override @DefinedBy(Api.COMPILER_TREE)
2202         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
2203             return v.visitUnary(this, d);
2204         }
2205         public void setTag(Tag tag) {
2206             opcode = tag;
2207         }
2208         @Override
2209         public JCExpression getOperand(OperandPos pos) {
2210             return arg;
2211         }
2212     }
2213 
2214     /**
2215      * A binary operation.
2216      */
2217     public static class JCBinary extends JCOperatorExpression implements BinaryTree {
2218         public JCExpression lhs;
2219         public JCExpression rhs;
2220         protected JCBinary(Tag opcode,
2221                          JCExpression lhs,
2222                          JCExpression rhs,
2223                          OperatorSymbol operator) {
2224             this.opcode = opcode;
2225             this.lhs = lhs;
2226             this.rhs = rhs;
2227             this.operator = operator;
2228         }
2229         @Override
2230         public void accept(Visitor v) { v.visitBinary(this); }
2231 
2232         @DefinedBy(Api.COMPILER_TREE)
2233         public Kind getKind() { return TreeInfo.tagToKind(getTag()); }
2234         @DefinedBy(Api.COMPILER_TREE)
2235         public JCExpression getLeftOperand() { return lhs; }
2236         @DefinedBy(Api.COMPILER_TREE)
2237         public JCExpression getRightOperand() { return rhs; }
2238         @Override @DefinedBy(Api.COMPILER_TREE)
2239         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
2240             return v.visitBinary(this, d);
2241         }
2242         @Override
2243         public JCExpression getOperand(OperandPos pos) {
2244             return pos == OperandPos.LEFT ? lhs : rhs;
2245         }
2246     }
2247 
2248     /**
2249      * A type cast.
2250      */
2251     public static class JCTypeCast extends JCExpression implements TypeCastTree {
2252         public JCTree clazz;
2253         public JCExpression expr;
2254         protected JCTypeCast(JCTree clazz, JCExpression expr) {
2255             this.clazz = clazz;
2256             this.expr = expr;
2257         }
2258         @Override
2259         public void accept(Visitor v) { v.visitTypeCast(this); }
2260 
2261         @DefinedBy(Api.COMPILER_TREE)
2262         public Kind getKind() { return Kind.TYPE_CAST; }
2263         @DefinedBy(Api.COMPILER_TREE)
2264         public JCTree getType() { return clazz; }
2265         @DefinedBy(Api.COMPILER_TREE)
2266         public JCExpression getExpression() { return expr; }
2267         @Override @DefinedBy(Api.COMPILER_TREE)
2268         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
2269             return v.visitTypeCast(this, d);
2270         }
2271         @Override
2272         public Tag getTag() {
2273             return TYPECAST;
2274         }
2275     }
2276 
2277     /**
2278      * A type test.
2279      */
2280     public static class JCInstanceOf extends JCExpression implements InstanceOfTree {
2281         public JCExpression expr;
2282         public JCTree pattern;
2283         /**{@code true} if this instanceof test should have
2284          * value {@code true} when the {@code expr} is {@code null}.*/
2285         public boolean allowNull;
2286         public Type erasedExprOriginalType;
2287 
2288         protected JCInstanceOf(JCExpression expr, JCTree pattern) {
2289             this.expr = expr;
2290             this.pattern = pattern;
2291         }
2292         @Override
2293         public void accept(Visitor v) { v.visitTypeTest(this); }
2294 
2295         @DefinedBy(Api.COMPILER_TREE)
2296         public Kind getKind() { return Kind.INSTANCE_OF; }
2297         @DefinedBy(Api.COMPILER_TREE)
2298         public JCTree getType() { return pattern instanceof JCPattern ? pattern.hasTag(BINDINGPATTERN) ? ((JCBindingPattern) pattern).var.vartype : null : pattern; }
2299 
2300         @Override @DefinedBy(Api.COMPILER_TREE)
2301         public JCPattern getPattern() {
2302             return pattern instanceof JCPattern jcPattern ? jcPattern : null;
2303         }
2304 
2305         @DefinedBy(Api.COMPILER_TREE)
2306         public JCExpression getExpression() { return expr; }
2307         @Override @DefinedBy(Api.COMPILER_TREE)
2308         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
2309             return v.visitInstanceOf(this, d);
2310         }
2311         @Override
2312         public Tag getTag() {
2313             return TYPETEST;
2314         }
2315     }
2316 
2317     /**
2318      * Pattern matching forms.
2319      */
2320     public abstract static class JCPattern extends JCTree
2321             implements PatternTree {
2322     }
2323 
2324     public static class JCAnyPattern extends JCPattern
2325             implements AnyPatternTree {
2326 
2327         protected JCAnyPattern() {
2328         }
2329 
2330         @Override
2331         public void accept(Visitor v) {
2332             v.visitAnyPattern(this);
2333         }
2334 
2335         @DefinedBy(Api.COMPILER_TREE)
2336         public Kind getKind() {
2337             return Kind.ANY_PATTERN;
2338         }
2339 
2340         @Override
2341         @DefinedBy(Api.COMPILER_TREE)
2342         public <R, D> R accept(TreeVisitor<R, D> v, D d) {
2343             return v.visitAnyPattern(this, d);
2344         }
2345 
2346         @Override
2347         public Tag getTag() {
2348             return ANYPATTERN;
2349         }
2350     }
2351 
2352     public static class JCBindingPattern extends JCPattern
2353             implements BindingPatternTree {
2354         public JCVariableDecl var;
2355 
2356         protected JCBindingPattern(JCVariableDecl var) {
2357             this.var = var;
2358         }
2359 
2360         @Override @DefinedBy(Api.COMPILER_TREE)
2361         public VariableTree getVariable() {
2362             return var;
2363         }
2364 
2365         @Override
2366         public void accept(Visitor v) {
2367             v.visitBindingPattern(this);
2368         }
2369 
2370         @DefinedBy(Api.COMPILER_TREE)
2371         public Kind getKind() {
2372             return Kind.BINDING_PATTERN;
2373         }
2374 
2375         @Override
2376         @DefinedBy(Api.COMPILER_TREE)
2377         public <R, D> R accept(TreeVisitor<R, D> v, D d) {
2378             return v.visitBindingPattern(this, d);
2379         }
2380 
2381         @Override
2382         public Tag getTag() {
2383             return BINDINGPATTERN;
2384         }
2385     }
2386 
2387     public static class JCDefaultCaseLabel extends JCCaseLabel
2388             implements DefaultCaseLabelTree {
2389 
2390         protected JCDefaultCaseLabel() {
2391         }
2392 
2393         @Override
2394         public void accept(Visitor v) {
2395             v.visitDefaultCaseLabel(this);
2396         }
2397 
2398         @DefinedBy(Api.COMPILER_TREE)
2399         public Kind getKind() {
2400             return Kind.DEFAULT_CASE_LABEL;
2401         }
2402 
2403         @Override
2404         @DefinedBy(Api.COMPILER_TREE)
2405         public <R, D> R accept(TreeVisitor<R, D> v, D d) {
2406             return v.visitDefaultCaseLabel(this, d);
2407         }
2408 
2409         @Override
2410         public Tag getTag() {
2411             return DEFAULTCASELABEL;
2412         }
2413 
2414     }
2415 
2416     public static class JCConstantCaseLabel extends JCCaseLabel
2417             implements ConstantCaseLabelTree {
2418 
2419         public JCExpression expr;
2420 
2421         protected JCConstantCaseLabel(JCExpression expr) {
2422             this.expr = expr;
2423         }
2424 
2425         @Override @DefinedBy(Api.COMPILER_TREE)
2426         public JCExpression getConstantExpression() {
2427             return expr;
2428         }
2429 
2430         @Override
2431         public void accept(Visitor v) {
2432             v.visitConstantCaseLabel(this);
2433         }
2434 
2435         @DefinedBy(Api.COMPILER_TREE)
2436         public Kind getKind() {
2437             return Kind.CONSTANT_CASE_LABEL;
2438         }
2439 
2440         @Override
2441         @DefinedBy(Api.COMPILER_TREE)
2442         public <R, D> R accept(TreeVisitor<R, D> v, D d) {
2443             return v.visitConstantCaseLabel(this, d);
2444         }
2445 
2446         @Override
2447         public Tag getTag() {
2448             return CONSTANTCASELABEL;
2449         }
2450 
2451     }
2452 
2453     public static class JCPatternCaseLabel extends JCCaseLabel
2454             implements PatternCaseLabelTree {
2455 
2456         public JCPattern pat;
2457         public JCExpression syntheticGuard;
2458 
2459         protected JCPatternCaseLabel(JCPattern pat) {
2460             this.pat = pat;
2461         }
2462 
2463         @Override @DefinedBy(Api.COMPILER_TREE)
2464         public JCPattern getPattern() {
2465             return pat;
2466         }
2467 
2468         @Override
2469         public void accept(Visitor v) {
2470             v.visitPatternCaseLabel(this);
2471         }
2472 
2473         @DefinedBy(Api.COMPILER_TREE)
2474         public Kind getKind() {
2475             return Kind.PATTERN_CASE_LABEL;
2476         }
2477 
2478         @Override
2479         @DefinedBy(Api.COMPILER_TREE)
2480         public <R, D> R accept(TreeVisitor<R, D> v, D d) {
2481             return v.visitPatternCaseLabel(this, d);
2482         }
2483 
2484         @Override
2485         public Tag getTag() {
2486             return PATTERNCASELABEL;
2487         }
2488 
2489     }
2490 
2491     public static class JCRecordPattern extends JCPattern
2492             implements DeconstructionPatternTree {
2493         public JCExpression deconstructor;
2494         public List<JCPattern> nested;
2495         public ClassSymbol record;
2496         public List<Type> fullComponentTypes;
2497 
2498         protected JCRecordPattern(JCExpression deconstructor, List<JCPattern> nested) {
2499             this.deconstructor = deconstructor;
2500             this.nested = nested;
2501         }
2502 
2503         @DefinedBy(Api.COMPILER_TREE)
2504         public Name getBinding() {
2505             return null;
2506         }
2507 
2508         @Override @DefinedBy(Api.COMPILER_TREE)
2509         public ExpressionTree getDeconstructor() {
2510             return deconstructor;
2511         }
2512 
2513         @Override @DefinedBy(Api.COMPILER_TREE)
2514         public List<? extends JCPattern> getNestedPatterns() {
2515             return nested;
2516         }
2517 
2518         @Override
2519         public void accept(Visitor v) {
2520             v.visitRecordPattern(this);
2521         }
2522 
2523         @DefinedBy(Api.COMPILER_TREE)
2524         public Kind getKind() {
2525             return Kind.DECONSTRUCTION_PATTERN;
2526         }
2527 
2528         @Override
2529         @DefinedBy(Api.COMPILER_TREE)
2530         public <R, D> R accept(TreeVisitor<R, D> v, D d) {
2531             return v.visitDeconstructionPattern(this, d);
2532         }
2533 
2534         @Override
2535         public Tag getTag() {
2536             return RECORDPATTERN;
2537         }
2538 
2539     }
2540 
2541     /**
2542      * An array selection
2543      */
2544     public static class JCArrayAccess extends JCExpression implements ArrayAccessTree {
2545         public JCExpression indexed;
2546         public JCExpression index;
2547         protected JCArrayAccess(JCExpression indexed, JCExpression index) {
2548             this.indexed = indexed;
2549             this.index = index;
2550         }
2551         @Override
2552         public void accept(Visitor v) { v.visitIndexed(this); }
2553 
2554         @DefinedBy(Api.COMPILER_TREE)
2555         public Kind getKind() { return Kind.ARRAY_ACCESS; }
2556         @DefinedBy(Api.COMPILER_TREE)
2557         public JCExpression getExpression() { return indexed; }
2558         @DefinedBy(Api.COMPILER_TREE)
2559         public JCExpression getIndex() { return index; }
2560         @Override @DefinedBy(Api.COMPILER_TREE)
2561         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
2562             return v.visitArrayAccess(this, d);
2563         }
2564         @Override
2565         public Tag getTag() {
2566             return INDEXED;
2567         }
2568     }
2569 
2570     /**
2571      * Selects through packages and classes
2572      */
2573     public static class JCFieldAccess extends JCExpression implements MemberSelectTree {
2574         /** selected Tree hierarchy */
2575         public JCExpression selected;
2576         /** name of field to select thru */
2577         public Name name;
2578         /** symbol of the selected class */
2579         public Symbol sym;
2580         protected JCFieldAccess(JCExpression selected, Name name, Symbol sym) {
2581             this.selected = selected;
2582             this.name = name;
2583             this.sym = sym;
2584         }
2585         @Override
2586         public void accept(Visitor v) { v.visitSelect(this); }
2587 
2588         @DefinedBy(Api.COMPILER_TREE)
2589         public Kind getKind() { return Kind.MEMBER_SELECT; }
2590         @DefinedBy(Api.COMPILER_TREE)
2591         public JCExpression getExpression() { return selected; }
2592         @Override @DefinedBy(Api.COMPILER_TREE)
2593         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
2594             return v.visitMemberSelect(this, d);
2595         }
2596         @DefinedBy(Api.COMPILER_TREE)
2597         public Name getIdentifier() { return name; }
2598         @Override
2599         public Tag getTag() {
2600             return SELECT;
2601         }
2602     }
2603 
2604     /**
2605      * Selects a member expression.
2606      */
2607     public static non-sealed class JCMemberReference extends JCFunctionalExpression implements MemberReferenceTree {
2608 
2609         public ReferenceMode mode;
2610         public ReferenceKind kind;
2611         public Name name;
2612         public JCExpression expr;
2613         public List<JCExpression> typeargs;
2614         public Symbol sym;
2615         public Type varargsElement;
2616         public PolyKind refPolyKind;
2617         public boolean ownerAccessible;
2618         private OverloadKind overloadKind;
2619         public Type referentType;
2620 
2621         public enum OverloadKind {
2622             OVERLOADED,
2623             UNOVERLOADED,
2624             ERROR
2625         }
2626 
2627         /**
2628          * Javac-dependent classification for member references, based
2629          * on relevant properties w.r.t. code-generation
2630          */
2631         public enum ReferenceKind {
2632             /** super # instMethod */
2633             SUPER(ReferenceMode.INVOKE, false),
2634             /** Type # instMethod */
2635             UNBOUND(ReferenceMode.INVOKE, true),
2636             /** Type # staticMethod */
2637             STATIC(ReferenceMode.INVOKE, false),
2638             /** Expr # instMethod */
2639             BOUND(ReferenceMode.INVOKE, false),
2640             /** Inner # new */
2641             IMPLICIT_INNER(ReferenceMode.NEW, false),
2642             /** Toplevel # new */
2643             TOPLEVEL(ReferenceMode.NEW, false),
2644             /** ArrayType # new */
2645             ARRAY_CTOR(ReferenceMode.NEW, false);
2646 
2647             final ReferenceMode mode;
2648             final boolean unbound;
2649 
2650             private ReferenceKind(ReferenceMode mode, boolean unbound) {
2651                 this.mode = mode;
2652                 this.unbound = unbound;
2653             }
2654 
2655             public boolean isUnbound() {
2656                 return unbound;
2657             }
2658         }
2659 
2660         public JCMemberReference(ReferenceMode mode, Name name, JCExpression expr, List<JCExpression> typeargs) {
2661             this.mode = mode;
2662             this.name = name;
2663             this.expr = expr;
2664             this.typeargs = typeargs;
2665         }
2666         @Override
2667         public void accept(Visitor v) { v.visitReference(this); }
2668 
2669         @DefinedBy(Api.COMPILER_TREE)
2670         public Kind getKind() { return Kind.MEMBER_REFERENCE; }
2671         @Override @DefinedBy(Api.COMPILER_TREE)
2672         public ReferenceMode getMode() { return mode; }
2673         @Override @DefinedBy(Api.COMPILER_TREE)
2674         public JCExpression getQualifierExpression() { return expr; }
2675         @Override @DefinedBy(Api.COMPILER_TREE)
2676         public Name getName() { return name; }
2677         @Override @DefinedBy(Api.COMPILER_TREE)
2678         public List<JCExpression> getTypeArguments() { return typeargs; }
2679 
2680         @Override @DefinedBy(Api.COMPILER_TREE)
2681         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
2682             return v.visitMemberReference(this, d);
2683         }
2684         @Override
2685         public Tag getTag() {
2686             return REFERENCE;
2687         }
2688         public boolean hasKind(ReferenceKind kind) {
2689             return this.kind == kind;
2690         }
2691 
2692         /**
2693          * @return the overloadKind
2694          */
2695         public OverloadKind getOverloadKind() {
2696             return overloadKind;
2697         }
2698 
2699         /**
2700          * @param overloadKind the overloadKind to set
2701          */
2702         public void setOverloadKind(OverloadKind overloadKind) {
2703             this.overloadKind = overloadKind;
2704         }
2705     }
2706 
2707     /**
2708      * An identifier
2709      */
2710     public static class JCIdent extends JCExpression implements IdentifierTree {
2711         /** the name */
2712         public Name name;
2713         /** the symbol */
2714         public Symbol sym;
2715         protected JCIdent(Name name, Symbol sym) {
2716             this.name = name;
2717             this.sym = sym;
2718         }
2719         @Override
2720         public void accept(Visitor v) { v.visitIdent(this); }
2721 
2722         @DefinedBy(Api.COMPILER_TREE)
2723         public Kind getKind() { return Kind.IDENTIFIER; }
2724         @DefinedBy(Api.COMPILER_TREE)
2725         public Name getName() { return name; }
2726         @Override @DefinedBy(Api.COMPILER_TREE)
2727         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
2728             return v.visitIdentifier(this, d);
2729         }
2730         @Override
2731         public Tag getTag() {
2732             return IDENT;
2733         }
2734     }
2735 
2736     /**
2737      * A constant value given literally.
2738      */
2739     public static class JCLiteral extends JCExpression implements LiteralTree {
2740         public TypeTag typetag;
2741         /** value representation */
2742         public Object value;
2743         protected JCLiteral(TypeTag typetag, Object value) {
2744             this.typetag = typetag;
2745             this.value = value;
2746         }
2747         @Override
2748         public void accept(Visitor v) { v.visitLiteral(this); }
2749 
2750         @DefinedBy(Api.COMPILER_TREE)
2751         public Kind getKind() {
2752             return typetag.getKindLiteral();
2753         }
2754 
2755         @DefinedBy(Api.COMPILER_TREE)
2756         public Object getValue() {
2757             switch (typetag) {
2758                 case BOOLEAN:
2759                     int bi = (Integer) value;
2760                     return (bi != 0);
2761                 case CHAR:
2762                     int ci = (Integer) value;
2763                     char c = (char) ci;
2764                     if (c != ci)
2765                         throw new AssertionError("bad value for char literal");
2766                     return c;
2767                 default:
2768                     return value;
2769             }
2770         }
2771         @Override @DefinedBy(Api.COMPILER_TREE)
2772         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
2773             return v.visitLiteral(this, d);
2774         }
2775         @Override
2776         public JCLiteral setType(Type type) {
2777             super.setType(type);
2778             return this;
2779         }
2780         @Override
2781         public Tag getTag() {
2782             return LITERAL;
2783         }
2784     }
2785 
2786     /**
2787      * Identifies a basic type.
2788      * @see TypeTag
2789      */
2790     public static class JCPrimitiveTypeTree extends JCExpression implements PrimitiveTypeTree {
2791         /** the basic type id */
2792         public TypeTag typetag;
2793         protected JCPrimitiveTypeTree(TypeTag typetag) {
2794             this.typetag = typetag;
2795         }
2796         @Override
2797         public void accept(Visitor v) { v.visitTypeIdent(this); }
2798 
2799         @DefinedBy(Api.COMPILER_TREE)
2800         public Kind getKind() { return Kind.PRIMITIVE_TYPE; }
2801         @DefinedBy(Api.COMPILER_TREE)
2802         public TypeKind getPrimitiveTypeKind() {
2803             return typetag.getPrimitiveTypeKind();
2804         }
2805 
2806         @Override @DefinedBy(Api.COMPILER_TREE)
2807         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
2808             return v.visitPrimitiveType(this, d);
2809         }
2810         @Override
2811         public Tag getTag() {
2812             return TYPEIDENT;
2813         }
2814     }
2815 
2816     /**
2817      * An array type, A[]
2818      */
2819     public static class JCArrayTypeTree extends JCExpression implements ArrayTypeTree {
2820         public JCExpression elemtype;
2821         protected JCArrayTypeTree(JCExpression elemtype) {
2822             this.elemtype = elemtype;
2823         }
2824         @Override
2825         public void accept(Visitor v) { v.visitTypeArray(this); }
2826 
2827         @DefinedBy(Api.COMPILER_TREE)
2828         public Kind getKind() { return Kind.ARRAY_TYPE; }
2829         @DefinedBy(Api.COMPILER_TREE)
2830         public JCTree getType() { return elemtype; }
2831         @Override @DefinedBy(Api.COMPILER_TREE)
2832         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
2833             return v.visitArrayType(this, d);
2834         }
2835         @Override
2836         public Tag getTag() {
2837             return TYPEARRAY;
2838         }
2839     }
2840 
2841     /**
2842      * A parameterized type, {@literal T<...>}
2843      */
2844     public static class JCTypeApply extends JCExpression implements ParameterizedTypeTree {
2845         public JCExpression clazz;
2846         public List<JCExpression> arguments;
2847         protected JCTypeApply(JCExpression clazz, List<JCExpression> arguments) {
2848             this.clazz = clazz;
2849             this.arguments = arguments;
2850         }
2851         @Override
2852         public void accept(Visitor v) { v.visitTypeApply(this); }
2853 
2854         @DefinedBy(Api.COMPILER_TREE)
2855         public Kind getKind() { return Kind.PARAMETERIZED_TYPE; }
2856         @DefinedBy(Api.COMPILER_TREE)
2857         public JCTree getType() { return clazz; }
2858         @DefinedBy(Api.COMPILER_TREE)
2859         public List<JCExpression> getTypeArguments() {
2860             return arguments;
2861         }
2862         @Override @DefinedBy(Api.COMPILER_TREE)
2863         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
2864             return v.visitParameterizedType(this, d);
2865         }
2866         @Override
2867         public Tag getTag() {
2868             return TYPEAPPLY;
2869         }
2870     }
2871 
2872     /**
2873      * A union type, T1 | T2 | ... Tn (used in multicatch statements)
2874      */
2875     public static class JCTypeUnion extends JCExpression implements UnionTypeTree {
2876 
2877         public List<JCExpression> alternatives;
2878 
2879         protected JCTypeUnion(List<JCExpression> components) {
2880             this.alternatives = components;
2881         }
2882         @Override
2883         public void accept(Visitor v) { v.visitTypeUnion(this); }
2884 
2885         @DefinedBy(Api.COMPILER_TREE)
2886         public Kind getKind() { return Kind.UNION_TYPE; }
2887 
2888         @DefinedBy(Api.COMPILER_TREE)
2889         public List<JCExpression> getTypeAlternatives() {
2890             return alternatives;
2891         }
2892         @Override @DefinedBy(Api.COMPILER_TREE)
2893         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
2894             return v.visitUnionType(this, d);
2895         }
2896         @Override
2897         public Tag getTag() {
2898             return TYPEUNION;
2899         }
2900     }
2901 
2902     /**
2903      * An intersection type, {@code T1 & T2 & ... Tn} (used in cast expressions)
2904      */
2905     public static class JCTypeIntersection extends JCExpression implements IntersectionTypeTree {
2906 
2907         public List<JCExpression> bounds;
2908 
2909         protected JCTypeIntersection(List<JCExpression> bounds) {
2910             this.bounds = bounds;
2911         }
2912         @Override
2913         public void accept(Visitor v) { v.visitTypeIntersection(this); }
2914 
2915         @DefinedBy(Api.COMPILER_TREE)
2916         public Kind getKind() { return Kind.INTERSECTION_TYPE; }
2917 
2918         @DefinedBy(Api.COMPILER_TREE)
2919         public List<JCExpression> getBounds() {
2920             return bounds;
2921         }
2922         @Override @DefinedBy(Api.COMPILER_TREE)
2923         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
2924             return v.visitIntersectionType(this, d);
2925         }
2926         @Override
2927         public Tag getTag() {
2928             return TYPEINTERSECTION;
2929         }
2930     }
2931 
2932     /**
2933      * A formal class parameter.
2934      */
2935     public static class JCTypeParameter extends JCTree implements TypeParameterTree {
2936         /** name */
2937         public Name name;
2938         /** bounds */
2939         public List<JCExpression> bounds;
2940         /** type annotations on type parameter */
2941         public List<JCAnnotation> annotations;
2942         protected JCTypeParameter(Name name, List<JCExpression> bounds, List<JCAnnotation> annotations) {
2943             this.name = name;
2944             this.bounds = bounds;
2945             this.annotations = annotations;
2946         }
2947         @Override
2948         public void accept(Visitor v) { v.visitTypeParameter(this); }
2949 
2950         @DefinedBy(Api.COMPILER_TREE)
2951         public Kind getKind() { return Kind.TYPE_PARAMETER; }
2952         @DefinedBy(Api.COMPILER_TREE)
2953         public Name getName() { return name; }
2954         @DefinedBy(Api.COMPILER_TREE)
2955         public List<JCExpression> getBounds() {
2956             return bounds;
2957         }
2958         @DefinedBy(Api.COMPILER_TREE)
2959         public List<JCAnnotation> getAnnotations() {
2960             return annotations;
2961         }
2962         @Override @DefinedBy(Api.COMPILER_TREE)
2963         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
2964             return v.visitTypeParameter(this, d);
2965         }
2966         @Override
2967         public Tag getTag() {
2968             return TYPEPARAMETER;
2969         }
2970     }
2971 
2972     public static class JCWildcard extends JCExpression implements WildcardTree {
2973         public TypeBoundKind kind;
2974         public JCTree inner;
2975         protected JCWildcard(TypeBoundKind kind, JCTree inner) {
2976             this.kind = Assert.checkNonNull(kind);
2977             this.inner = inner;
2978         }
2979         @Override
2980         public void accept(Visitor v) { v.visitWildcard(this); }
2981 
2982         @DefinedBy(Api.COMPILER_TREE)
2983         public Kind getKind() {
2984             switch (kind.kind) {
2985             case UNBOUND:
2986                 return Kind.UNBOUNDED_WILDCARD;
2987             case EXTENDS:
2988                 return Kind.EXTENDS_WILDCARD;
2989             case SUPER:
2990                 return Kind.SUPER_WILDCARD;
2991             default:
2992                 throw new AssertionError("Unknown wildcard bound " + kind);
2993             }
2994         }
2995         @DefinedBy(Api.COMPILER_TREE)
2996         public JCTree getBound() { return inner; }
2997         @Override @DefinedBy(Api.COMPILER_TREE)
2998         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
2999             return v.visitWildcard(this, d);
3000         }
3001         @Override
3002         public Tag getTag() {
3003             return Tag.WILDCARD;
3004         }
3005     }
3006 
3007     public static class TypeBoundKind extends JCTree {
3008         public BoundKind kind;
3009         protected TypeBoundKind(BoundKind kind) {
3010             this.kind = kind;
3011         }
3012         @Override
3013         public void accept(Visitor v) { v.visitTypeBoundKind(this); }
3014 
3015         @DefinedBy(Api.COMPILER_TREE)
3016         public Kind getKind() {
3017             throw new AssertionError("TypeBoundKind is not part of a public API");
3018         }
3019         @Override @DefinedBy(Api.COMPILER_TREE)
3020         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
3021             throw new AssertionError("TypeBoundKind is not part of a public API");
3022         }
3023         @Override
3024         public Tag getTag() {
3025             return TYPEBOUNDKIND;
3026         }
3027     }
3028 
3029     public static class JCAnnotation extends JCExpression implements AnnotationTree {
3030         // Either Tag.ANNOTATION or Tag.TYPE_ANNOTATION
3031         private Tag tag;
3032 
3033         public JCTree annotationType;
3034         public List<JCExpression> args;
3035         public Attribute.Compound attribute;
3036 
3037         protected JCAnnotation(Tag tag, JCTree annotationType, List<JCExpression> args) {
3038             this.tag = tag;
3039             this.annotationType = annotationType;
3040             this.args = args;
3041         }
3042 
3043         @Override
3044         public void accept(Visitor v) { v.visitAnnotation(this); }
3045 
3046         @DefinedBy(Api.COMPILER_TREE)
3047         public Kind getKind() { return TreeInfo.tagToKind(getTag()); }
3048 
3049         @DefinedBy(Api.COMPILER_TREE)
3050         public JCTree getAnnotationType() { return annotationType; }
3051         @DefinedBy(Api.COMPILER_TREE)
3052         public List<JCExpression> getArguments() {
3053             return args;
3054         }
3055         @Override @DefinedBy(Api.COMPILER_TREE)
3056         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
3057             return v.visitAnnotation(this, d);
3058         }
3059         @Override
3060         public Tag getTag() {
3061             return tag;
3062         }
3063     }
3064 
3065     public static class JCModifiers extends JCTree implements com.sun.source.tree.ModifiersTree {
3066         public long flags;
3067         public List<JCAnnotation> annotations;
3068         protected JCModifiers(long flags, List<JCAnnotation> annotations) {
3069             this.flags = flags;
3070             this.annotations = annotations;
3071         }
3072         @Override
3073         public void accept(Visitor v) { v.visitModifiers(this); }
3074 
3075         @DefinedBy(Api.COMPILER_TREE)
3076         public Kind getKind() { return Kind.MODIFIERS; }
3077         @DefinedBy(Api.COMPILER_TREE)
3078         public Set<Modifier> getFlags() {
3079             return Flags.asModifierSet(flags);
3080         }
3081         @DefinedBy(Api.COMPILER_TREE)
3082         public List<JCAnnotation> getAnnotations() {
3083             return annotations;
3084         }
3085         @Override @DefinedBy(Api.COMPILER_TREE)
3086         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
3087             return v.visitModifiers(this, d);
3088         }
3089         @Override
3090         public Tag getTag() {
3091             return MODIFIERS;
3092         }
3093     }
3094 
3095     public static class JCAnnotatedType extends JCExpression implements com.sun.source.tree.AnnotatedTypeTree {
3096         // type annotations
3097         public List<JCAnnotation> annotations;
3098         public JCExpression underlyingType;
3099 
3100         protected JCAnnotatedType(List<JCAnnotation> annotations, JCExpression underlyingType) {
3101             Assert.check(annotations != null && annotations.nonEmpty());
3102             this.annotations = annotations;
3103             this.underlyingType = underlyingType;
3104         }
3105         @Override
3106         public void accept(Visitor v) { v.visitAnnotatedType(this); }
3107 
3108         @DefinedBy(Api.COMPILER_TREE)
3109         public Kind getKind() { return Kind.ANNOTATED_TYPE; }
3110         @DefinedBy(Api.COMPILER_TREE)
3111         public List<JCAnnotation> getAnnotations() {
3112             return annotations;
3113         }
3114         @DefinedBy(Api.COMPILER_TREE)
3115         public JCExpression getUnderlyingType() {
3116             return underlyingType;
3117         }
3118         @Override @DefinedBy(Api.COMPILER_TREE)
3119         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
3120             return v.visitAnnotatedType(this, d);
3121         }
3122         @Override
3123         public Tag getTag() {
3124             return ANNOTATED_TYPE;
3125         }
3126     }
3127 
3128     public abstract static class JCDirective extends JCTree
3129         implements DirectiveTree {
3130     }
3131 
3132     public static class JCModuleDecl extends JCTree implements ModuleTree {
3133         public JCModifiers mods;
3134         public ModuleType type;
3135         private final ModuleKind kind;
3136         public JCExpression qualId;
3137         public List<JCDirective> directives;
3138         public ModuleSymbol sym;
3139 
3140         protected JCModuleDecl(JCModifiers mods, ModuleKind kind,
3141                 JCExpression qualId, List<JCDirective> directives) {
3142             this.mods = mods;
3143             this.kind = kind;
3144             this.qualId = qualId;
3145             this.directives = directives;
3146         }
3147 
3148         @Override
3149         public void accept(Visitor v) { v.visitModuleDef(this); }
3150 
3151         @Override @DefinedBy(Api.COMPILER_TREE)
3152         public Kind getKind() {
3153             return Kind.MODULE;
3154         }
3155 
3156         @Override @DefinedBy(Api.COMPILER_TREE)
3157         public List<? extends AnnotationTree> getAnnotations() {
3158             return mods.annotations;
3159         }
3160 
3161         @Override @DefinedBy(Api.COMPILER_TREE)
3162         public ModuleKind getModuleType() {
3163             return kind;
3164         }
3165 
3166         @Override @DefinedBy(Api.COMPILER_TREE)
3167         public JCExpression getName() {
3168             return qualId;
3169         }
3170 
3171         @Override @DefinedBy(Api.COMPILER_TREE)
3172         public List<JCDirective> getDirectives() {
3173             return directives;
3174         }
3175 
3176         @Override @DefinedBy(Api.COMPILER_TREE)
3177         public <R, D> R accept(TreeVisitor<R, D> v, D d) {
3178             return v.visitModule(this, d);
3179         }
3180 
3181         @Override
3182         public Tag getTag() {
3183             return MODULEDEF;
3184         }
3185     }
3186 
3187     public static class JCExports extends JCDirective
3188             implements ExportsTree {
3189         public JCExpression qualid;
3190         public List<JCExpression> moduleNames;
3191         public ExportsDirective directive;
3192 
3193         protected JCExports(JCExpression qualId, List<JCExpression> moduleNames) {
3194             this.qualid = qualId;
3195             this.moduleNames = moduleNames;
3196         }
3197 
3198         @Override
3199         public void accept(Visitor v) { v.visitExports(this); }
3200 
3201         @Override @DefinedBy(Api.COMPILER_TREE)
3202         public Kind getKind() {
3203             return Kind.EXPORTS;
3204         }
3205 
3206         @Override @DefinedBy(Api.COMPILER_TREE)
3207         public JCExpression getPackageName() {
3208             return qualid;
3209         }
3210 
3211         @Override @DefinedBy(Api.COMPILER_TREE)
3212         public List<JCExpression> getModuleNames() {
3213             return moduleNames;
3214         }
3215 
3216         @Override @DefinedBy(Api.COMPILER_TREE)
3217         public <R, D> R accept(TreeVisitor<R, D> v, D d) {
3218             return v.visitExports(this, d);
3219         }
3220 
3221         @Override
3222         public Tag getTag() {
3223             return Tag.EXPORTS;
3224         }
3225     }
3226 
3227     public static class JCOpens extends JCDirective
3228             implements OpensTree {
3229         public JCExpression qualid;
3230         public List<JCExpression> moduleNames;
3231         public OpensDirective directive;
3232 
3233         protected JCOpens(JCExpression qualId, List<JCExpression> moduleNames) {
3234             this.qualid = qualId;
3235             this.moduleNames = moduleNames;
3236         }
3237 
3238         @Override
3239         public void accept(Visitor v) { v.visitOpens(this); }
3240 
3241         @Override @DefinedBy(Api.COMPILER_TREE)
3242         public Kind getKind() {
3243             return Kind.OPENS;
3244         }
3245 
3246         @Override @DefinedBy(Api.COMPILER_TREE)
3247         public JCExpression getPackageName() {
3248             return qualid;
3249         }
3250 
3251         @Override @DefinedBy(Api.COMPILER_TREE)
3252         public List<JCExpression> getModuleNames() {
3253             return moduleNames;
3254         }
3255 
3256         @Override @DefinedBy(Api.COMPILER_TREE)
3257         public <R, D> R accept(TreeVisitor<R, D> v, D d) {
3258             return v.visitOpens(this, d);
3259         }
3260 
3261         @Override
3262         public Tag getTag() {
3263             return Tag.OPENS;
3264         }
3265     }
3266 
3267     public static class JCProvides extends JCDirective
3268             implements ProvidesTree {
3269         public JCExpression serviceName;
3270         public List<JCExpression> implNames;
3271 
3272         protected JCProvides(JCExpression serviceName, List<JCExpression> implNames) {
3273             this.serviceName = serviceName;
3274             this.implNames = implNames;
3275         }
3276 
3277         @Override
3278         public void accept(Visitor v) { v.visitProvides(this); }
3279 
3280         @Override @DefinedBy(Api.COMPILER_TREE)
3281         public Kind getKind() {
3282             return Kind.PROVIDES;
3283         }
3284 
3285         @Override @DefinedBy(Api.COMPILER_TREE)
3286         public <R, D> R accept(TreeVisitor<R, D> v, D d) {
3287             return v.visitProvides(this, d);
3288         }
3289 
3290         @Override @DefinedBy(Api.COMPILER_TREE)
3291         public JCExpression getServiceName() {
3292             return serviceName;
3293         }
3294 
3295         @Override @DefinedBy(Api.COMPILER_TREE)
3296         public List<JCExpression> getImplementationNames() {
3297             return implNames;
3298         }
3299 
3300         @Override
3301         public Tag getTag() {
3302             return PROVIDES;
3303         }
3304     }
3305 
3306     public static class JCRequires extends JCDirective
3307             implements RequiresTree {
3308         public boolean isTransitive;
3309         public boolean isStaticPhase;
3310         public JCExpression moduleName;
3311         public RequiresDirective directive;
3312 
3313         protected JCRequires(boolean isTransitive, boolean isStaticPhase, JCExpression moduleName) {
3314             this.isTransitive = isTransitive;
3315             this.isStaticPhase = isStaticPhase;
3316             this.moduleName = moduleName;
3317         }
3318 
3319         @Override
3320         public void accept(Visitor v) { v.visitRequires(this); }
3321 
3322         @Override @DefinedBy(Api.COMPILER_TREE)
3323         public Kind getKind() {
3324             return Kind.REQUIRES;
3325         }
3326 
3327         @Override @DefinedBy(Api.COMPILER_TREE)
3328         public <R, D> R accept(TreeVisitor<R, D> v, D d) {
3329             return v.visitRequires(this, d);
3330         }
3331 
3332         @Override @DefinedBy(Api.COMPILER_TREE)
3333         public boolean isTransitive() {
3334             return isTransitive;
3335         }
3336 
3337         @Override @DefinedBy(Api.COMPILER_TREE)
3338         public boolean isStatic() {
3339             return isStaticPhase;
3340         }
3341 
3342         @Override @DefinedBy(Api.COMPILER_TREE)
3343         public JCExpression getModuleName() {
3344             return moduleName;
3345         }
3346 
3347         @Override
3348         public Tag getTag() {
3349             return REQUIRES;
3350         }
3351     }
3352 
3353     public static class JCUses extends JCDirective
3354             implements UsesTree {
3355         public JCExpression qualid;
3356 
3357         protected JCUses(JCExpression qualId) {
3358             this.qualid = qualId;
3359         }
3360 
3361         @Override
3362         public void accept(Visitor v) { v.visitUses(this); }
3363 
3364         @Override @DefinedBy(Api.COMPILER_TREE)
3365         public Kind getKind() {
3366             return Kind.USES;
3367         }
3368 
3369         @Override @DefinedBy(Api.COMPILER_TREE)
3370         public JCExpression getServiceName() {
3371             return qualid;
3372         }
3373 
3374         @Override @DefinedBy(Api.COMPILER_TREE)
3375         public <R, D> R accept(TreeVisitor<R, D> v, D d) {
3376             return v.visitUses(this, d);
3377         }
3378 
3379         @Override
3380         public Tag getTag() {
3381             return USES;
3382         }
3383     }
3384 
3385     public static class JCErroneous extends JCExpression
3386             implements ErroneousTree {
3387         public List<? extends JCTree> errs;
3388         protected JCErroneous(List<? extends JCTree> errs) {
3389             this.errs = errs;
3390         }
3391         @Override
3392         public void accept(Visitor v) { v.visitErroneous(this); }
3393 
3394         @DefinedBy(Api.COMPILER_TREE)
3395         public Kind getKind() { return Kind.ERRONEOUS; }
3396 
3397         @DefinedBy(Api.COMPILER_TREE)
3398         public List<? extends JCTree> getErrorTrees() {
3399             return errs;
3400         }
3401 
3402         @Override @DefinedBy(Api.COMPILER_TREE)
3403         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
3404             return v.visitErroneous(this, d);
3405         }
3406         @Override
3407         public Tag getTag() {
3408             return ERRONEOUS;
3409         }
3410     }
3411 
3412     /** (let int x = 3; in x+2) */
3413     public static class LetExpr extends JCExpression {
3414         public List<JCStatement> defs;
3415         public JCExpression expr;
3416         /**true if a expr should be run through Gen.genCond:*/
3417         public boolean needsCond;
3418         protected LetExpr(List<JCStatement> defs, JCExpression expr) {
3419             this.defs = defs;
3420             this.expr = expr;
3421         }
3422         @Override
3423         public void accept(Visitor v) { v.visitLetExpr(this); }
3424 
3425         @DefinedBy(Api.COMPILER_TREE)
3426         public Kind getKind() {
3427             throw new AssertionError("LetExpr is not part of a public API");
3428         }
3429         @Override @DefinedBy(Api.COMPILER_TREE)
3430         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
3431             throw new AssertionError("LetExpr is not part of a public API");
3432         }
3433         @Override
3434         public Tag getTag() {
3435             return LETEXPR;
3436         }
3437     }
3438 
3439     /** An interface for tree factories
3440      */
3441     public interface Factory {
3442         JCCompilationUnit TopLevel(List<JCTree> defs);
3443         JCPackageDecl PackageDecl(List<JCAnnotation> annotations,
3444                                   JCExpression pid);
3445         JCImport Import(JCFieldAccess qualid, boolean staticImport);
3446         JCClassDecl ClassDef(JCModifiers mods,
3447                           Name name,
3448                           List<JCTypeParameter> typarams,
3449                           JCExpression extending,
3450                           List<JCExpression> implementing,
3451                           List<JCTree> defs);
3452         JCMethodDecl MethodDef(JCModifiers mods,
3453                             Name name,
3454                             JCExpression restype,
3455                             List<JCTypeParameter> typarams,
3456                             JCVariableDecl recvparam,
3457                             List<JCVariableDecl> params,
3458                             List<JCExpression> thrown,
3459                             JCBlock body,
3460                             JCExpression defaultValue);
3461         JCVariableDecl VarDef(JCModifiers mods,
3462                       Name name,
3463                       JCExpression vartype,
3464                       JCExpression init);
3465         JCSkip Skip();
3466         JCBlock Block(long flags, List<JCStatement> stats);
3467         JCDoWhileLoop DoLoop(JCStatement body, JCExpression cond);
3468         JCWhileLoop WhileLoop(JCExpression cond, JCStatement body);
3469         JCForLoop ForLoop(List<JCStatement> init,
3470                         JCExpression cond,
3471                         List<JCExpressionStatement> step,
3472                         JCStatement body);
3473         JCEnhancedForLoop ForeachLoop(JCVariableDecl var, JCExpression expr, JCStatement body);
3474         JCLabeledStatement Labelled(Name label, JCStatement body);
3475         JCSwitch Switch(JCExpression selector, List<JCCase> cases);
3476         JCSwitchExpression SwitchExpression(JCExpression selector, List<JCCase> cases);
3477         JCCase Case(CaseTree.CaseKind caseKind, List<JCCaseLabel> labels, JCExpression guard,
3478                     List<JCStatement> stats, JCTree body);
3479         JCSynchronized Synchronized(JCExpression lock, JCBlock body);
3480         JCTry Try(JCBlock body, List<JCCatch> catchers, JCBlock finalizer);
3481         JCTry Try(List<JCTree> resources,
3482                   JCBlock body,
3483                   List<JCCatch> catchers,
3484                   JCBlock finalizer);
3485         JCCatch Catch(JCVariableDecl param, JCBlock body);
3486         JCConditional Conditional(JCExpression cond,
3487                                 JCExpression thenpart,
3488                                 JCExpression elsepart);
3489         JCIf If(JCExpression cond, JCStatement thenpart, JCStatement elsepart);
3490         JCExpressionStatement Exec(JCExpression expr);
3491         JCBreak Break(Name label);
3492         JCYield Yield(JCExpression value);
3493         JCContinue Continue(Name label);
3494         JCReturn Return(JCExpression expr);
3495         JCThrow Throw(JCExpression expr);
3496         JCAssert Assert(JCExpression cond, JCExpression detail);
3497         JCMethodInvocation Apply(List<JCExpression> typeargs,
3498                     JCExpression fn,
3499                     List<JCExpression> args);
3500         JCNewClass NewClass(JCExpression encl,
3501                           List<JCExpression> typeargs,
3502                           JCExpression clazz,
3503                           List<JCExpression> args,
3504                           JCClassDecl def);
3505         JCNewArray NewArray(JCExpression elemtype,
3506                           List<JCExpression> dims,
3507                           List<JCExpression> elems);
3508         JCParens Parens(JCExpression expr);
3509         JCAssign Assign(JCExpression lhs, JCExpression rhs);
3510         JCAssignOp Assignop(Tag opcode, JCTree lhs, JCTree rhs);
3511         JCUnary Unary(Tag opcode, JCExpression arg);
3512         JCBinary Binary(Tag opcode, JCExpression lhs, JCExpression rhs);
3513         JCTypeCast TypeCast(JCTree expr, JCExpression type);
3514         JCInstanceOf TypeTest(JCExpression expr, JCTree clazz);
3515         JCBindingPattern BindingPattern(JCVariableDecl var);
3516         JCArrayAccess Indexed(JCExpression indexed, JCExpression index);
3517         JCFieldAccess Select(JCExpression selected, Name selector);
3518         JCIdent Ident(Name idname);
3519         JCLiteral Literal(TypeTag tag, Object value);
3520         JCPrimitiveTypeTree TypeIdent(TypeTag typetag);
3521         JCArrayTypeTree TypeArray(JCExpression elemtype);
3522         JCTypeApply TypeApply(JCExpression clazz, List<JCExpression> arguments);
3523         JCTypeParameter TypeParameter(Name name, List<JCExpression> bounds);
3524         JCWildcard Wildcard(TypeBoundKind kind, JCTree type);
3525         TypeBoundKind TypeBoundKind(BoundKind kind);
3526         JCAnnotation Annotation(JCTree annotationType, List<JCExpression> args);
3527         JCModifiers Modifiers(long flags, List<JCAnnotation> annotations);
3528         JCErroneous Erroneous(List<? extends JCTree> errs);
3529         JCModuleDecl ModuleDef(JCModifiers mods, ModuleKind kind, JCExpression qualId, List<JCDirective> directives);
3530         JCExports Exports(JCExpression qualId, List<JCExpression> moduleNames);
3531         JCOpens Opens(JCExpression qualId, List<JCExpression> moduleNames);
3532         JCProvides Provides(JCExpression serviceName, List<JCExpression> implNames);
3533         JCRequires Requires(boolean isTransitive, boolean isStaticPhase, JCExpression qualId);
3534         JCUses Uses(JCExpression qualId);
3535         LetExpr LetExpr(List<JCStatement> defs, JCExpression expr);
3536     }
3537 
3538     /** A generic visitor class for trees.
3539      */
3540     public abstract static class Visitor {
3541         public void visitTopLevel(JCCompilationUnit that)    { visitTree(that); }
3542         public void visitPackageDef(JCPackageDecl that)      { visitTree(that); }
3543         public void visitImport(JCImport that)               { visitTree(that); }
3544         public void visitModuleImport(JCModuleImport that)   { visitTree(that); }
3545         public void visitClassDef(JCClassDecl that)          { visitTree(that); }
3546         public void visitMethodDef(JCMethodDecl that)        { visitTree(that); }
3547         public void visitVarDef(JCVariableDecl that)         { visitTree(that); }
3548         public void visitSkip(JCSkip that)                   { visitTree(that); }
3549         public void visitBlock(JCBlock that)                 { visitTree(that); }
3550         public void visitDoLoop(JCDoWhileLoop that)          { visitTree(that); }
3551         public void visitWhileLoop(JCWhileLoop that)         { visitTree(that); }
3552         public void visitForLoop(JCForLoop that)             { visitTree(that); }
3553         public void visitForeachLoop(JCEnhancedForLoop that) { visitTree(that); }
3554         public void visitLabelled(JCLabeledStatement that)   { visitTree(that); }
3555         public void visitSwitch(JCSwitch that)               { visitTree(that); }
3556         public void visitCase(JCCase that)                   { visitTree(that); }
3557         public void visitSwitchExpression(JCSwitchExpression that)               { visitTree(that); }
3558         public void visitSynchronized(JCSynchronized that)   { visitTree(that); }
3559         public void visitTry(JCTry that)                     { visitTree(that); }
3560         public void visitCatch(JCCatch that)                 { visitTree(that); }
3561         public void visitConditional(JCConditional that)     { visitTree(that); }
3562         public void visitIf(JCIf that)                       { visitTree(that); }
3563         public void visitExec(JCExpressionStatement that)    { visitTree(that); }
3564         public void visitBreak(JCBreak that)                 { visitTree(that); }
3565         public void visitYield(JCYield that)                 { visitTree(that); }
3566         public void visitContinue(JCContinue that)           { visitTree(that); }
3567         public void visitReturn(JCReturn that)               { visitTree(that); }
3568         public void visitThrow(JCThrow that)                 { visitTree(that); }
3569         public void visitAssert(JCAssert that)               { visitTree(that); }
3570         public void visitApply(JCMethodInvocation that)      { visitTree(that); }
3571         public void visitNewClass(JCNewClass that)           { visitTree(that); }
3572         public void visitNewArray(JCNewArray that)           { visitTree(that); }
3573         public void visitLambda(JCLambda that)               { visitTree(that); }
3574         public void visitParens(JCParens that)               { visitTree(that); }
3575         public void visitAssign(JCAssign that)               { visitTree(that); }
3576         public void visitAssignop(JCAssignOp that)           { visitTree(that); }
3577         public void visitUnary(JCUnary that)                 { visitTree(that); }
3578         public void visitBinary(JCBinary that)               { visitTree(that); }
3579         public void visitTypeCast(JCTypeCast that)           { visitTree(that); }
3580         public void visitTypeTest(JCInstanceOf that)         { visitTree(that); }
3581         public void visitAnyPattern(JCAnyPattern that)       { visitTree(that); }
3582         public void visitBindingPattern(JCBindingPattern that) { visitTree(that); }
3583         public void visitDefaultCaseLabel(JCDefaultCaseLabel that) { visitTree(that); }
3584         public void visitConstantCaseLabel(JCConstantCaseLabel that) { visitTree(that); }
3585         public void visitPatternCaseLabel(JCPatternCaseLabel that) { visitTree(that); }
3586         public void visitRecordPattern(JCRecordPattern that) { visitTree(that); }
3587         public void visitIndexed(JCArrayAccess that)         { visitTree(that); }
3588         public void visitSelect(JCFieldAccess that)          { visitTree(that); }
3589         public void visitReference(JCMemberReference that)   { visitTree(that); }
3590         public void visitIdent(JCIdent that)                 { visitTree(that); }
3591         public void visitLiteral(JCLiteral that)             { visitTree(that); }
3592         public void visitTypeIdent(JCPrimitiveTypeTree that) { visitTree(that); }
3593         public void visitTypeArray(JCArrayTypeTree that)     { visitTree(that); }
3594         public void visitTypeApply(JCTypeApply that)         { visitTree(that); }
3595         public void visitTypeUnion(JCTypeUnion that)         { visitTree(that); }
3596         public void visitTypeIntersection(JCTypeIntersection that)  { visitTree(that); }
3597         public void visitTypeParameter(JCTypeParameter that) { visitTree(that); }
3598         public void visitWildcard(JCWildcard that)           { visitTree(that); }
3599         public void visitTypeBoundKind(TypeBoundKind that)   { visitTree(that); }
3600         public void visitAnnotation(JCAnnotation that)       { visitTree(that); }
3601         public void visitModifiers(JCModifiers that)         { visitTree(that); }
3602         public void visitAnnotatedType(JCAnnotatedType that) { visitTree(that); }
3603         public void visitErroneous(JCErroneous that)         { visitTree(that); }
3604         public void visitModuleDef(JCModuleDecl that)        { visitTree(that); }
3605         public void visitExports(JCExports that)             { visitTree(that); }
3606         public void visitOpens(JCOpens that)                 { visitTree(that); }
3607         public void visitProvides(JCProvides that)           { visitTree(that); }
3608         public void visitRequires(JCRequires that)           { visitTree(that); }
3609         public void visitUses(JCUses that)                   { visitTree(that); }
3610         public void visitLetExpr(LetExpr that)               { visitTree(that); }
3611 
3612         public void visitTree(JCTree that)                   { Assert.error(); }
3613     }
3614 
3615 }