src/share/classes/com/sun/tools/javac/tree/JCTree.java

Thu, 31 Aug 2017 15:17:03 +0800

author
aoqi
date
Thu, 31 Aug 2017 15:17:03 +0800
changeset 2525
2eb010b6cb22
parent 2395
9c577131ffa6
parent 0
959103a6100f
permissions
-rw-r--r--

merge

aoqi@0 1 /*
aoqi@0 2 * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved.
aoqi@0 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
aoqi@0 4 *
aoqi@0 5 * This code is free software; you can redistribute it and/or modify it
aoqi@0 6 * under the terms of the GNU General Public License version 2 only, as
aoqi@0 7 * published by the Free Software Foundation. Oracle designates this
aoqi@0 8 * particular file as subject to the "Classpath" exception as provided
aoqi@0 9 * by Oracle in the LICENSE file that accompanied this code.
aoqi@0 10 *
aoqi@0 11 * This code is distributed in the hope that it will be useful, but WITHOUT
aoqi@0 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
aoqi@0 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
aoqi@0 14 * version 2 for more details (a copy is included in the LICENSE file that
aoqi@0 15 * accompanied this code).
aoqi@0 16 *
aoqi@0 17 * You should have received a copy of the GNU General Public License version
aoqi@0 18 * 2 along with this work; if not, write to the Free Software Foundation,
aoqi@0 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
aoqi@0 20 *
aoqi@0 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
aoqi@0 22 * or visit www.oracle.com if you need additional information or have any
aoqi@0 23 * questions.
aoqi@0 24 */
aoqi@0 25
aoqi@0 26 package com.sun.tools.javac.tree;
aoqi@0 27
aoqi@0 28 import java.io.IOException;
aoqi@0 29 import java.io.StringWriter;
aoqi@0 30 import java.util.*;
aoqi@0 31
aoqi@0 32 import javax.lang.model.element.Modifier;
aoqi@0 33 import javax.lang.model.type.TypeKind;
aoqi@0 34 import javax.tools.JavaFileObject;
aoqi@0 35
aoqi@0 36 import com.sun.source.tree.*;
aoqi@0 37 import com.sun.source.tree.LambdaExpressionTree.BodyKind;
aoqi@0 38 import com.sun.source.tree.MemberReferenceTree.ReferenceMode;
aoqi@0 39 import com.sun.tools.javac.code.*;
aoqi@0 40 import com.sun.tools.javac.code.Scope.*;
aoqi@0 41 import com.sun.tools.javac.code.Symbol.*;
aoqi@0 42 import com.sun.tools.javac.util.*;
aoqi@0 43 import com.sun.tools.javac.util.JCDiagnostic.DiagnosticPosition;
aoqi@0 44 import com.sun.tools.javac.util.List;
aoqi@0 45 import static com.sun.tools.javac.tree.JCTree.Tag.*;
aoqi@0 46
aoqi@0 47 /**
aoqi@0 48 * Root class for abstract syntax tree nodes. It provides definitions
aoqi@0 49 * for specific tree nodes as subclasses nested inside.
aoqi@0 50 *
aoqi@0 51 * <p>Each subclass is highly standardized. It generally contains
aoqi@0 52 * only tree fields for the syntactic subcomponents of the node. Some
aoqi@0 53 * classes that represent identifier uses or definitions also define a
aoqi@0 54 * Symbol field that denotes the represented identifier. Classes for
aoqi@0 55 * non-local jumps also carry the jump target as a field. The root
aoqi@0 56 * class Tree itself defines fields for the tree's type and position.
aoqi@0 57 * No other fields are kept in a tree node; instead parameters are
aoqi@0 58 * passed to methods accessing the node.
aoqi@0 59 *
aoqi@0 60 * <p>Except for the methods defined by com.sun.source, the only
aoqi@0 61 * method defined in subclasses is `visit' which applies a given
aoqi@0 62 * visitor to the tree. The actual tree processing is done by visitor
aoqi@0 63 * classes in other packages. The abstract class Visitor, as well as
aoqi@0 64 * an Factory interface for trees, are defined as inner classes in
aoqi@0 65 * Tree.
aoqi@0 66 *
aoqi@0 67 * <p>To avoid ambiguities with the Tree API in com.sun.source all sub
aoqi@0 68 * classes should, by convention, start with JC (javac).
aoqi@0 69 *
aoqi@0 70 * <p><b>This is NOT part of any supported API.
aoqi@0 71 * If you write code that depends on this, you do so at your own risk.
aoqi@0 72 * This code and its internal interfaces are subject to change or
aoqi@0 73 * deletion without notice.</b>
aoqi@0 74 *
aoqi@0 75 * @see TreeMaker
aoqi@0 76 * @see TreeInfo
aoqi@0 77 * @see TreeTranslator
aoqi@0 78 * @see Pretty
aoqi@0 79 */
aoqi@0 80 public abstract class JCTree implements Tree, Cloneable, DiagnosticPosition {
aoqi@0 81
aoqi@0 82 /* Tree tag values, identifying kinds of trees */
aoqi@0 83 public enum Tag {
aoqi@0 84 /** For methods that return an invalid tag if a given condition is not met
aoqi@0 85 */
aoqi@0 86 NO_TAG,
aoqi@0 87
aoqi@0 88 /** Toplevel nodes, of type TopLevel, representing entire source files.
aoqi@0 89 */
aoqi@0 90 TOPLEVEL,
aoqi@0 91
aoqi@0 92 /** Import clauses, of type Import.
aoqi@0 93 */
aoqi@0 94 IMPORT,
aoqi@0 95
aoqi@0 96 /** Class definitions, of type ClassDef.
aoqi@0 97 */
aoqi@0 98 CLASSDEF,
aoqi@0 99
aoqi@0 100 /** Method definitions, of type MethodDef.
aoqi@0 101 */
aoqi@0 102 METHODDEF,
aoqi@0 103
aoqi@0 104 /** Variable definitions, of type VarDef.
aoqi@0 105 */
aoqi@0 106 VARDEF,
aoqi@0 107
aoqi@0 108 /** The no-op statement ";", of type Skip
aoqi@0 109 */
aoqi@0 110 SKIP,
aoqi@0 111
aoqi@0 112 /** Blocks, of type Block.
aoqi@0 113 */
aoqi@0 114 BLOCK,
aoqi@0 115
aoqi@0 116 /** Do-while loops, of type DoLoop.
aoqi@0 117 */
aoqi@0 118 DOLOOP,
aoqi@0 119
aoqi@0 120 /** While-loops, of type WhileLoop.
aoqi@0 121 */
aoqi@0 122 WHILELOOP,
aoqi@0 123
aoqi@0 124 /** For-loops, of type ForLoop.
aoqi@0 125 */
aoqi@0 126 FORLOOP,
aoqi@0 127
aoqi@0 128 /** Foreach-loops, of type ForeachLoop.
aoqi@0 129 */
aoqi@0 130 FOREACHLOOP,
aoqi@0 131
aoqi@0 132 /** Labelled statements, of type Labelled.
aoqi@0 133 */
aoqi@0 134 LABELLED,
aoqi@0 135
aoqi@0 136 /** Switch statements, of type Switch.
aoqi@0 137 */
aoqi@0 138 SWITCH,
aoqi@0 139
aoqi@0 140 /** Case parts in switch statements, of type Case.
aoqi@0 141 */
aoqi@0 142 CASE,
aoqi@0 143
aoqi@0 144 /** Synchronized statements, of type Synchonized.
aoqi@0 145 */
aoqi@0 146 SYNCHRONIZED,
aoqi@0 147
aoqi@0 148 /** Try statements, of type Try.
aoqi@0 149 */
aoqi@0 150 TRY,
aoqi@0 151
aoqi@0 152 /** Catch clauses in try statements, of type Catch.
aoqi@0 153 */
aoqi@0 154 CATCH,
aoqi@0 155
aoqi@0 156 /** Conditional expressions, of type Conditional.
aoqi@0 157 */
aoqi@0 158 CONDEXPR,
aoqi@0 159
aoqi@0 160 /** Conditional statements, of type If.
aoqi@0 161 */
aoqi@0 162 IF,
aoqi@0 163
aoqi@0 164 /** Expression statements, of type Exec.
aoqi@0 165 */
aoqi@0 166 EXEC,
aoqi@0 167
aoqi@0 168 /** Break statements, of type Break.
aoqi@0 169 */
aoqi@0 170 BREAK,
aoqi@0 171
aoqi@0 172 /** Continue statements, of type Continue.
aoqi@0 173 */
aoqi@0 174 CONTINUE,
aoqi@0 175
aoqi@0 176 /** Return statements, of type Return.
aoqi@0 177 */
aoqi@0 178 RETURN,
aoqi@0 179
aoqi@0 180 /** Throw statements, of type Throw.
aoqi@0 181 */
aoqi@0 182 THROW,
aoqi@0 183
aoqi@0 184 /** Assert statements, of type Assert.
aoqi@0 185 */
aoqi@0 186 ASSERT,
aoqi@0 187
aoqi@0 188 /** Method invocation expressions, of type Apply.
aoqi@0 189 */
aoqi@0 190 APPLY,
aoqi@0 191
aoqi@0 192 /** Class instance creation expressions, of type NewClass.
aoqi@0 193 */
aoqi@0 194 NEWCLASS,
aoqi@0 195
aoqi@0 196 /** Array creation expressions, of type NewArray.
aoqi@0 197 */
aoqi@0 198 NEWARRAY,
aoqi@0 199
aoqi@0 200 /** Lambda expression, of type Lambda.
aoqi@0 201 */
aoqi@0 202 LAMBDA,
aoqi@0 203
aoqi@0 204 /** Parenthesized subexpressions, of type Parens.
aoqi@0 205 */
aoqi@0 206 PARENS,
aoqi@0 207
aoqi@0 208 /** Assignment expressions, of type Assign.
aoqi@0 209 */
aoqi@0 210 ASSIGN,
aoqi@0 211
aoqi@0 212 /** Type cast expressions, of type TypeCast.
aoqi@0 213 */
aoqi@0 214 TYPECAST,
aoqi@0 215
aoqi@0 216 /** Type test expressions, of type TypeTest.
aoqi@0 217 */
aoqi@0 218 TYPETEST,
aoqi@0 219
aoqi@0 220 /** Indexed array expressions, of type Indexed.
aoqi@0 221 */
aoqi@0 222 INDEXED,
aoqi@0 223
aoqi@0 224 /** Selections, of type Select.
aoqi@0 225 */
aoqi@0 226 SELECT,
aoqi@0 227
aoqi@0 228 /** Member references, of type Reference.
aoqi@0 229 */
aoqi@0 230 REFERENCE,
aoqi@0 231
aoqi@0 232 /** Simple identifiers, of type Ident.
aoqi@0 233 */
aoqi@0 234 IDENT,
aoqi@0 235
aoqi@0 236 /** Literals, of type Literal.
aoqi@0 237 */
aoqi@0 238 LITERAL,
aoqi@0 239
aoqi@0 240 /** Basic type identifiers, of type TypeIdent.
aoqi@0 241 */
aoqi@0 242 TYPEIDENT,
aoqi@0 243
aoqi@0 244 /** Array types, of type TypeArray.
aoqi@0 245 */
aoqi@0 246 TYPEARRAY,
aoqi@0 247
aoqi@0 248 /** Parameterized types, of type TypeApply.
aoqi@0 249 */
aoqi@0 250 TYPEAPPLY,
aoqi@0 251
aoqi@0 252 /** Union types, of type TypeUnion.
aoqi@0 253 */
aoqi@0 254 TYPEUNION,
aoqi@0 255
aoqi@0 256 /** Intersection types, of type TypeIntersection.
aoqi@0 257 */
aoqi@0 258 TYPEINTERSECTION,
aoqi@0 259
aoqi@0 260 /** Formal type parameters, of type TypeParameter.
aoqi@0 261 */
aoqi@0 262 TYPEPARAMETER,
aoqi@0 263
aoqi@0 264 /** Type argument.
aoqi@0 265 */
aoqi@0 266 WILDCARD,
aoqi@0 267
aoqi@0 268 /** Bound kind: extends, super, exact, or unbound
aoqi@0 269 */
aoqi@0 270 TYPEBOUNDKIND,
aoqi@0 271
aoqi@0 272 /** metadata: Annotation.
aoqi@0 273 */
aoqi@0 274 ANNOTATION,
aoqi@0 275
aoqi@0 276 /** metadata: Type annotation.
aoqi@0 277 */
aoqi@0 278 TYPE_ANNOTATION,
aoqi@0 279
aoqi@0 280 /** metadata: Modifiers
aoqi@0 281 */
aoqi@0 282 MODIFIERS,
aoqi@0 283
aoqi@0 284 /** An annotated type tree.
aoqi@0 285 */
aoqi@0 286 ANNOTATED_TYPE,
aoqi@0 287
aoqi@0 288 /** Error trees, of type Erroneous.
aoqi@0 289 */
aoqi@0 290 ERRONEOUS,
aoqi@0 291
aoqi@0 292 /** Unary operators, of type Unary.
aoqi@0 293 */
aoqi@0 294 POS, // +
aoqi@0 295 NEG, // -
aoqi@0 296 NOT, // !
aoqi@0 297 COMPL, // ~
aoqi@0 298 PREINC, // ++ _
aoqi@0 299 PREDEC, // -- _
aoqi@0 300 POSTINC, // _ ++
aoqi@0 301 POSTDEC, // _ --
aoqi@0 302
aoqi@0 303 /** unary operator for null reference checks, only used internally.
aoqi@0 304 */
aoqi@0 305 NULLCHK,
aoqi@0 306
aoqi@0 307 /** Binary operators, of type Binary.
aoqi@0 308 */
aoqi@0 309 OR, // ||
aoqi@0 310 AND, // &&
aoqi@0 311 BITOR, // |
aoqi@0 312 BITXOR, // ^
aoqi@0 313 BITAND, // &
aoqi@0 314 EQ, // ==
aoqi@0 315 NE, // !=
aoqi@0 316 LT, // <
aoqi@0 317 GT, // >
aoqi@0 318 LE, // <=
aoqi@0 319 GE, // >=
aoqi@0 320 SL, // <<
aoqi@0 321 SR, // >>
aoqi@0 322 USR, // >>>
aoqi@0 323 PLUS, // +
aoqi@0 324 MINUS, // -
aoqi@0 325 MUL, // *
aoqi@0 326 DIV, // /
aoqi@0 327 MOD, // %
aoqi@0 328
aoqi@0 329 /** Assignment operators, of type Assignop.
aoqi@0 330 */
aoqi@0 331 BITOR_ASG(BITOR), // |=
aoqi@0 332 BITXOR_ASG(BITXOR), // ^=
aoqi@0 333 BITAND_ASG(BITAND), // &=
aoqi@0 334
aoqi@0 335 SL_ASG(SL), // <<=
aoqi@0 336 SR_ASG(SR), // >>=
aoqi@0 337 USR_ASG(USR), // >>>=
aoqi@0 338 PLUS_ASG(PLUS), // +=
aoqi@0 339 MINUS_ASG(MINUS), // -=
aoqi@0 340 MUL_ASG(MUL), // *=
aoqi@0 341 DIV_ASG(DIV), // /=
aoqi@0 342 MOD_ASG(MOD), // %=
aoqi@0 343
aoqi@0 344 /** A synthetic let expression, of type LetExpr.
aoqi@0 345 */
aoqi@0 346 LETEXPR; // ala scheme
aoqi@0 347
aoqi@0 348 private final Tag noAssignTag;
aoqi@0 349
aoqi@0 350 private static final int numberOfOperators = MOD.ordinal() - POS.ordinal() + 1;
aoqi@0 351
aoqi@0 352 private Tag(Tag noAssignTag) {
aoqi@0 353 this.noAssignTag = noAssignTag;
aoqi@0 354 }
aoqi@0 355
aoqi@0 356 private Tag() {
aoqi@0 357 this(null);
aoqi@0 358 }
aoqi@0 359
aoqi@0 360 public static int getNumberOfOperators() {
aoqi@0 361 return numberOfOperators;
aoqi@0 362 }
aoqi@0 363
aoqi@0 364 public Tag noAssignOp() {
aoqi@0 365 if (noAssignTag != null)
aoqi@0 366 return noAssignTag;
aoqi@0 367 throw new AssertionError("noAssignOp() method is not available for non assignment tags");
aoqi@0 368 }
aoqi@0 369
aoqi@0 370 public boolean isPostUnaryOp() {
aoqi@0 371 return (this == POSTINC || this == POSTDEC);
aoqi@0 372 }
aoqi@0 373
aoqi@0 374 public boolean isIncOrDecUnaryOp() {
aoqi@0 375 return (this == PREINC || this == PREDEC || this == POSTINC || this == POSTDEC);
aoqi@0 376 }
aoqi@0 377
aoqi@0 378 public boolean isAssignop() {
aoqi@0 379 return noAssignTag != null;
aoqi@0 380 }
aoqi@0 381
aoqi@0 382 public int operatorIndex() {
aoqi@0 383 return (this.ordinal() - POS.ordinal());
aoqi@0 384 }
aoqi@0 385 }
aoqi@0 386
aoqi@0 387 /* The (encoded) position in the source file. @see util.Position.
aoqi@0 388 */
aoqi@0 389 public int pos;
aoqi@0 390
aoqi@0 391 /* The type of this node.
aoqi@0 392 */
aoqi@0 393 public Type type;
aoqi@0 394
aoqi@0 395 /* The tag of this node -- one of the constants declared above.
aoqi@0 396 */
aoqi@0 397 public abstract Tag getTag();
aoqi@0 398
aoqi@0 399 /* Returns true if the tag of this node is equals to tag.
aoqi@0 400 */
aoqi@0 401 public boolean hasTag(Tag tag) {
aoqi@0 402 return tag == getTag();
aoqi@0 403 }
aoqi@0 404
aoqi@0 405 /** Convert a tree to a pretty-printed string. */
aoqi@0 406 @Override
aoqi@0 407 public String toString() {
aoqi@0 408 StringWriter s = new StringWriter();
aoqi@0 409 try {
aoqi@0 410 new Pretty(s, false).printExpr(this);
aoqi@0 411 }
aoqi@0 412 catch (IOException e) {
aoqi@0 413 // should never happen, because StringWriter is defined
aoqi@0 414 // never to throw any IOExceptions
aoqi@0 415 throw new AssertionError(e);
aoqi@0 416 }
aoqi@0 417 return s.toString();
aoqi@0 418 }
aoqi@0 419
aoqi@0 420 /** Set position field and return this tree.
aoqi@0 421 */
aoqi@0 422 public JCTree setPos(int pos) {
aoqi@0 423 this.pos = pos;
aoqi@0 424 return this;
aoqi@0 425 }
aoqi@0 426
aoqi@0 427 /** Set type field and return this tree.
aoqi@0 428 */
aoqi@0 429 public JCTree setType(Type type) {
aoqi@0 430 this.type = type;
aoqi@0 431 return this;
aoqi@0 432 }
aoqi@0 433
aoqi@0 434 /** Visit this tree with a given visitor.
aoqi@0 435 */
aoqi@0 436 public abstract void accept(Visitor v);
aoqi@0 437
aoqi@0 438 public abstract <R,D> R accept(TreeVisitor<R,D> v, D d);
aoqi@0 439
aoqi@0 440 /** Return a shallow copy of this tree.
aoqi@0 441 */
aoqi@0 442 @Override
aoqi@0 443 public Object clone() {
aoqi@0 444 try {
aoqi@0 445 return super.clone();
aoqi@0 446 } catch(CloneNotSupportedException e) {
aoqi@0 447 throw new RuntimeException(e);
aoqi@0 448 }
aoqi@0 449 }
aoqi@0 450
aoqi@0 451 /** Get a default position for this tree node.
aoqi@0 452 */
aoqi@0 453 public DiagnosticPosition pos() {
aoqi@0 454 return this;
aoqi@0 455 }
aoqi@0 456
aoqi@0 457 // for default DiagnosticPosition
aoqi@0 458 public JCTree getTree() {
aoqi@0 459 return this;
aoqi@0 460 }
aoqi@0 461
aoqi@0 462 // for default DiagnosticPosition
aoqi@0 463 public int getStartPosition() {
aoqi@0 464 return TreeInfo.getStartPos(this);
aoqi@0 465 }
aoqi@0 466
aoqi@0 467 // for default DiagnosticPosition
aoqi@0 468 public int getPreferredPosition() {
aoqi@0 469 return pos;
aoqi@0 470 }
aoqi@0 471
aoqi@0 472 // for default DiagnosticPosition
aoqi@0 473 public int getEndPosition(EndPosTable endPosTable) {
aoqi@0 474 return TreeInfo.getEndPos(this, endPosTable);
aoqi@0 475 }
aoqi@0 476
aoqi@0 477 /**
aoqi@0 478 * Everything in one source file is kept in a {@linkplain JCCompilationUnit} structure.
aoqi@0 479 */
aoqi@0 480 public static class JCCompilationUnit extends JCTree implements CompilationUnitTree {
aoqi@0 481 public List<JCAnnotation> packageAnnotations;
aoqi@0 482 /** The tree representing the package clause. */
aoqi@0 483 public JCExpression pid;
aoqi@0 484 /** All definitions in this file (ClassDef, Import, and Skip) */
aoqi@0 485 public List<JCTree> defs;
aoqi@0 486 /* The source file name. */
aoqi@0 487 public JavaFileObject sourcefile;
aoqi@0 488 /** The package to which this compilation unit belongs. */
aoqi@0 489 public PackageSymbol packge;
aoqi@0 490 /** A scope for all named imports. */
aoqi@0 491 public ImportScope namedImportScope;
aoqi@0 492 /** A scope for all import-on-demands. */
aoqi@0 493 public StarImportScope starImportScope;
aoqi@0 494 /** Line starting positions, defined only if option -g is set. */
aoqi@0 495 public Position.LineMap lineMap = null;
aoqi@0 496 /** A table that stores all documentation comments indexed by the tree
aoqi@0 497 * nodes they refer to. defined only if option -s is set. */
aoqi@0 498 public DocCommentTable docComments = null;
aoqi@0 499 /* An object encapsulating ending positions of source ranges indexed by
aoqi@0 500 * the tree nodes they belong to. Defined only if option -Xjcov is set. */
aoqi@0 501 public EndPosTable endPositions = null;
aoqi@0 502 protected JCCompilationUnit(List<JCAnnotation> packageAnnotations,
aoqi@0 503 JCExpression pid,
aoqi@0 504 List<JCTree> defs,
aoqi@0 505 JavaFileObject sourcefile,
aoqi@0 506 PackageSymbol packge,
aoqi@0 507 ImportScope namedImportScope,
aoqi@0 508 StarImportScope starImportScope) {
aoqi@0 509 this.packageAnnotations = packageAnnotations;
aoqi@0 510 this.pid = pid;
aoqi@0 511 this.defs = defs;
aoqi@0 512 this.sourcefile = sourcefile;
aoqi@0 513 this.packge = packge;
aoqi@0 514 this.namedImportScope = namedImportScope;
aoqi@0 515 this.starImportScope = starImportScope;
aoqi@0 516 }
aoqi@0 517 @Override
aoqi@0 518 public void accept(Visitor v) { v.visitTopLevel(this); }
aoqi@0 519
aoqi@0 520 public Kind getKind() { return Kind.COMPILATION_UNIT; }
aoqi@0 521 public List<JCAnnotation> getPackageAnnotations() {
aoqi@0 522 return packageAnnotations;
aoqi@0 523 }
aoqi@0 524 public List<JCImport> getImports() {
aoqi@0 525 ListBuffer<JCImport> imports = new ListBuffer<JCImport>();
aoqi@0 526 for (JCTree tree : defs) {
aoqi@0 527 if (tree.hasTag(IMPORT))
aoqi@0 528 imports.append((JCImport)tree);
aoqi@0 529 else if (!tree.hasTag(SKIP))
aoqi@0 530 break;
aoqi@0 531 }
aoqi@0 532 return imports.toList();
aoqi@0 533 }
aoqi@0 534 public JCExpression getPackageName() { return pid; }
aoqi@0 535 public JavaFileObject getSourceFile() {
aoqi@0 536 return sourcefile;
aoqi@0 537 }
aoqi@0 538 public Position.LineMap getLineMap() {
aoqi@0 539 return lineMap;
aoqi@0 540 }
aoqi@0 541 public List<JCTree> getTypeDecls() {
aoqi@0 542 List<JCTree> typeDefs;
aoqi@0 543 for (typeDefs = defs; !typeDefs.isEmpty(); typeDefs = typeDefs.tail)
aoqi@0 544 if (!typeDefs.head.hasTag(IMPORT))
aoqi@0 545 break;
aoqi@0 546 return typeDefs;
aoqi@0 547 }
aoqi@0 548 @Override
aoqi@0 549 public <R,D> R accept(TreeVisitor<R,D> v, D d) {
aoqi@0 550 return v.visitCompilationUnit(this, d);
aoqi@0 551 }
aoqi@0 552
aoqi@0 553 @Override
aoqi@0 554 public Tag getTag() {
aoqi@0 555 return TOPLEVEL;
aoqi@0 556 }
aoqi@0 557 }
aoqi@0 558
aoqi@0 559 /**
aoqi@0 560 * An import clause.
aoqi@0 561 */
aoqi@0 562 public static class JCImport extends JCTree implements ImportTree {
aoqi@0 563 public boolean staticImport;
aoqi@0 564 /** The imported class(es). */
aoqi@0 565 public JCTree qualid;
aoqi@0 566 protected JCImport(JCTree qualid, boolean importStatic) {
aoqi@0 567 this.qualid = qualid;
aoqi@0 568 this.staticImport = importStatic;
aoqi@0 569 }
aoqi@0 570 @Override
aoqi@0 571 public void accept(Visitor v) { v.visitImport(this); }
aoqi@0 572
aoqi@0 573 public boolean isStatic() { return staticImport; }
aoqi@0 574 public JCTree getQualifiedIdentifier() { return qualid; }
aoqi@0 575
aoqi@0 576 public Kind getKind() { return Kind.IMPORT; }
aoqi@0 577 @Override
aoqi@0 578 public <R,D> R accept(TreeVisitor<R,D> v, D d) {
aoqi@0 579 return v.visitImport(this, d);
aoqi@0 580 }
aoqi@0 581
aoqi@0 582 @Override
aoqi@0 583 public Tag getTag() {
aoqi@0 584 return IMPORT;
aoqi@0 585 }
aoqi@0 586 }
aoqi@0 587
aoqi@0 588 public static abstract class JCStatement extends JCTree implements StatementTree {
aoqi@0 589 @Override
aoqi@0 590 public JCStatement setType(Type type) {
aoqi@0 591 super.setType(type);
aoqi@0 592 return this;
aoqi@0 593 }
aoqi@0 594 @Override
aoqi@0 595 public JCStatement setPos(int pos) {
aoqi@0 596 super.setPos(pos);
aoqi@0 597 return this;
aoqi@0 598 }
aoqi@0 599 }
aoqi@0 600
aoqi@0 601 public static abstract class JCExpression extends JCTree implements ExpressionTree {
aoqi@0 602 @Override
aoqi@0 603 public JCExpression setType(Type type) {
aoqi@0 604 super.setType(type);
aoqi@0 605 return this;
aoqi@0 606 }
aoqi@0 607 @Override
aoqi@0 608 public JCExpression setPos(int pos) {
aoqi@0 609 super.setPos(pos);
aoqi@0 610 return this;
aoqi@0 611 }
aoqi@0 612
aoqi@0 613 public boolean isPoly() { return false; }
aoqi@0 614 public boolean isStandalone() { return true; }
aoqi@0 615 }
aoqi@0 616
aoqi@0 617 /**
aoqi@0 618 * Common supertype for all poly expression trees (lambda, method references,
aoqi@0 619 * conditionals, method and constructor calls)
aoqi@0 620 */
aoqi@0 621 public static abstract class JCPolyExpression extends JCExpression {
aoqi@0 622
aoqi@0 623 /**
aoqi@0 624 * A poly expression can only be truly 'poly' in certain contexts
aoqi@0 625 */
aoqi@0 626 public enum PolyKind {
aoqi@0 627 /** poly expression to be treated as a standalone expression */
aoqi@0 628 STANDALONE,
aoqi@0 629 /** true poly expression */
aoqi@0 630 POLY;
aoqi@0 631 }
aoqi@0 632
aoqi@0 633 /** is this poly expression a 'true' poly expression? */
aoqi@0 634 public PolyKind polyKind;
aoqi@0 635
aoqi@0 636 @Override public boolean isPoly() { return polyKind == PolyKind.POLY; }
aoqi@0 637 @Override public boolean isStandalone() { return polyKind == PolyKind.STANDALONE; }
aoqi@0 638 }
aoqi@0 639
aoqi@0 640 /**
aoqi@0 641 * Common supertype for all functional expression trees (lambda and method references)
aoqi@0 642 */
aoqi@0 643 public static abstract class JCFunctionalExpression extends JCPolyExpression {
aoqi@0 644
aoqi@0 645 public JCFunctionalExpression() {
aoqi@0 646 //a functional expression is always a 'true' poly
aoqi@0 647 polyKind = PolyKind.POLY;
aoqi@0 648 }
aoqi@0 649
aoqi@0 650 /** list of target types inferred for this functional expression. */
aoqi@0 651 public List<Type> targets;
aoqi@0 652
aoqi@0 653 public Type getDescriptorType(Types types) {
aoqi@0 654 return targets.nonEmpty() ? types.findDescriptorType(targets.head) : types.createErrorType(null);
aoqi@0 655 }
aoqi@0 656 }
aoqi@0 657
aoqi@0 658 /**
aoqi@0 659 * A class definition.
aoqi@0 660 */
aoqi@0 661 public static class JCClassDecl extends JCStatement implements ClassTree {
aoqi@0 662 /** the modifiers */
aoqi@0 663 public JCModifiers mods;
aoqi@0 664 /** the name of the class */
aoqi@0 665 public Name name;
aoqi@0 666 /** formal class parameters */
aoqi@0 667 public List<JCTypeParameter> typarams;
aoqi@0 668 /** the classes this class extends */
aoqi@0 669 public JCExpression extending;
aoqi@0 670 /** the interfaces implemented by this class */
aoqi@0 671 public List<JCExpression> implementing;
aoqi@0 672 /** all variables and methods defined in this class */
aoqi@0 673 public List<JCTree> defs;
aoqi@0 674 /** the symbol */
aoqi@0 675 public ClassSymbol sym;
aoqi@0 676 protected JCClassDecl(JCModifiers mods,
aoqi@0 677 Name name,
aoqi@0 678 List<JCTypeParameter> typarams,
aoqi@0 679 JCExpression extending,
aoqi@0 680 List<JCExpression> implementing,
aoqi@0 681 List<JCTree> defs,
aoqi@0 682 ClassSymbol sym)
aoqi@0 683 {
aoqi@0 684 this.mods = mods;
aoqi@0 685 this.name = name;
aoqi@0 686 this.typarams = typarams;
aoqi@0 687 this.extending = extending;
aoqi@0 688 this.implementing = implementing;
aoqi@0 689 this.defs = defs;
aoqi@0 690 this.sym = sym;
aoqi@0 691 }
aoqi@0 692 @Override
aoqi@0 693 public void accept(Visitor v) { v.visitClassDef(this); }
aoqi@0 694
aoqi@0 695 public Kind getKind() {
aoqi@0 696 if ((mods.flags & Flags.ANNOTATION) != 0)
aoqi@0 697 return Kind.ANNOTATION_TYPE;
aoqi@0 698 else if ((mods.flags & Flags.INTERFACE) != 0)
aoqi@0 699 return Kind.INTERFACE;
aoqi@0 700 else if ((mods.flags & Flags.ENUM) != 0)
aoqi@0 701 return Kind.ENUM;
aoqi@0 702 else
aoqi@0 703 return Kind.CLASS;
aoqi@0 704 }
aoqi@0 705
aoqi@0 706 public JCModifiers getModifiers() { return mods; }
aoqi@0 707 public Name getSimpleName() { return name; }
aoqi@0 708 public List<JCTypeParameter> getTypeParameters() {
aoqi@0 709 return typarams;
aoqi@0 710 }
aoqi@0 711 public JCExpression getExtendsClause() { return extending; }
aoqi@0 712 public List<JCExpression> getImplementsClause() {
aoqi@0 713 return implementing;
aoqi@0 714 }
aoqi@0 715 public List<JCTree> getMembers() {
aoqi@0 716 return defs;
aoqi@0 717 }
aoqi@0 718 @Override
aoqi@0 719 public <R,D> R accept(TreeVisitor<R,D> v, D d) {
aoqi@0 720 return v.visitClass(this, d);
aoqi@0 721 }
aoqi@0 722
aoqi@0 723 @Override
aoqi@0 724 public Tag getTag() {
aoqi@0 725 return CLASSDEF;
aoqi@0 726 }
aoqi@0 727 }
aoqi@0 728
aoqi@0 729 /**
aoqi@0 730 * A method definition.
aoqi@0 731 */
aoqi@0 732 public static class JCMethodDecl extends JCTree implements MethodTree {
aoqi@0 733 /** method modifiers */
aoqi@0 734 public JCModifiers mods;
aoqi@0 735 /** method name */
aoqi@0 736 public Name name;
aoqi@0 737 /** type of method return value */
aoqi@0 738 public JCExpression restype;
aoqi@0 739 /** type parameters */
aoqi@0 740 public List<JCTypeParameter> typarams;
aoqi@0 741 /** receiver parameter */
aoqi@0 742 public JCVariableDecl recvparam;
aoqi@0 743 /** value parameters */
aoqi@0 744 public List<JCVariableDecl> params;
aoqi@0 745 /** exceptions thrown by this method */
aoqi@0 746 public List<JCExpression> thrown;
aoqi@0 747 /** statements in the method */
aoqi@0 748 public JCBlock body;
aoqi@0 749 /** default value, for annotation types */
aoqi@0 750 public JCExpression defaultValue;
aoqi@0 751 /** method symbol */
aoqi@0 752 public MethodSymbol sym;
aoqi@0 753 protected JCMethodDecl(JCModifiers mods,
aoqi@0 754 Name name,
aoqi@0 755 JCExpression restype,
aoqi@0 756 List<JCTypeParameter> typarams,
aoqi@0 757 JCVariableDecl recvparam,
aoqi@0 758 List<JCVariableDecl> params,
aoqi@0 759 List<JCExpression> thrown,
aoqi@0 760 JCBlock body,
aoqi@0 761 JCExpression defaultValue,
aoqi@0 762 MethodSymbol sym)
aoqi@0 763 {
aoqi@0 764 this.mods = mods;
aoqi@0 765 this.name = name;
aoqi@0 766 this.restype = restype;
aoqi@0 767 this.typarams = typarams;
aoqi@0 768 this.params = params;
aoqi@0 769 this.recvparam = recvparam;
aoqi@0 770 // TODO: do something special if the given type is null?
aoqi@0 771 // receiver != null ? receiver : List.<JCTypeAnnotation>nil());
aoqi@0 772 this.thrown = thrown;
aoqi@0 773 this.body = body;
aoqi@0 774 this.defaultValue = defaultValue;
aoqi@0 775 this.sym = sym;
aoqi@0 776 }
aoqi@0 777 @Override
aoqi@0 778 public void accept(Visitor v) { v.visitMethodDef(this); }
aoqi@0 779
aoqi@0 780 public Kind getKind() { return Kind.METHOD; }
aoqi@0 781 public JCModifiers getModifiers() { return mods; }
aoqi@0 782 public Name getName() { return name; }
aoqi@0 783 public JCTree getReturnType() { return restype; }
aoqi@0 784 public List<JCTypeParameter> getTypeParameters() {
aoqi@0 785 return typarams;
aoqi@0 786 }
aoqi@0 787 public List<JCVariableDecl> getParameters() {
aoqi@0 788 return params;
aoqi@0 789 }
aoqi@0 790 public JCVariableDecl getReceiverParameter() { return recvparam; }
aoqi@0 791 public List<JCExpression> getThrows() {
aoqi@0 792 return thrown;
aoqi@0 793 }
aoqi@0 794 public JCBlock getBody() { return body; }
aoqi@0 795 public JCTree getDefaultValue() { // for annotation types
aoqi@0 796 return defaultValue;
aoqi@0 797 }
aoqi@0 798 @Override
aoqi@0 799 public <R,D> R accept(TreeVisitor<R,D> v, D d) {
aoqi@0 800 return v.visitMethod(this, d);
aoqi@0 801 }
aoqi@0 802
aoqi@0 803 @Override
aoqi@0 804 public Tag getTag() {
aoqi@0 805 return METHODDEF;
aoqi@0 806 }
aoqi@0 807 }
aoqi@0 808
aoqi@0 809 /**
aoqi@0 810 * A variable definition.
aoqi@0 811 */
aoqi@0 812 public static class JCVariableDecl extends JCStatement implements VariableTree {
aoqi@0 813 /** variable modifiers */
aoqi@0 814 public JCModifiers mods;
aoqi@0 815 /** variable name */
aoqi@0 816 public Name name;
aoqi@0 817 /** variable name expression */
aoqi@0 818 public JCExpression nameexpr;
aoqi@0 819 /** type of the variable */
aoqi@0 820 public JCExpression vartype;
aoqi@0 821 /** variable's initial value */
aoqi@0 822 public JCExpression init;
aoqi@0 823 /** symbol */
aoqi@0 824 public VarSymbol sym;
aoqi@0 825
aoqi@0 826 protected JCVariableDecl(JCModifiers mods,
aoqi@0 827 Name name,
aoqi@0 828 JCExpression vartype,
aoqi@0 829 JCExpression init,
aoqi@0 830 VarSymbol sym) {
aoqi@0 831 this.mods = mods;
aoqi@0 832 this.name = name;
aoqi@0 833 this.vartype = vartype;
aoqi@0 834 this.init = init;
aoqi@0 835 this.sym = sym;
aoqi@0 836 }
aoqi@0 837
aoqi@0 838 protected JCVariableDecl(JCModifiers mods,
aoqi@0 839 JCExpression nameexpr,
aoqi@0 840 JCExpression vartype) {
aoqi@0 841 this(mods, null, vartype, null, null);
aoqi@0 842 this.nameexpr = nameexpr;
aoqi@0 843 if (nameexpr.hasTag(Tag.IDENT)) {
aoqi@0 844 this.name = ((JCIdent)nameexpr).name;
aoqi@0 845 } else {
aoqi@0 846 // Only other option is qualified name x.y.this;
aoqi@0 847 this.name = ((JCFieldAccess)nameexpr).name;
aoqi@0 848 }
aoqi@0 849 }
aoqi@0 850
aoqi@0 851 @Override
aoqi@0 852 public void accept(Visitor v) { v.visitVarDef(this); }
aoqi@0 853
aoqi@0 854 public Kind getKind() { return Kind.VARIABLE; }
aoqi@0 855 public JCModifiers getModifiers() { return mods; }
aoqi@0 856 public Name getName() { return name; }
aoqi@0 857 public JCExpression getNameExpression() { return nameexpr; }
aoqi@0 858 public JCTree getType() { return vartype; }
aoqi@0 859 public JCExpression getInitializer() {
aoqi@0 860 return init;
aoqi@0 861 }
aoqi@0 862 @Override
aoqi@0 863 public <R,D> R accept(TreeVisitor<R,D> v, D d) {
aoqi@0 864 return v.visitVariable(this, d);
aoqi@0 865 }
aoqi@0 866
aoqi@0 867 @Override
aoqi@0 868 public Tag getTag() {
aoqi@0 869 return VARDEF;
aoqi@0 870 }
aoqi@0 871 }
aoqi@0 872
aoqi@0 873 /**
aoqi@0 874 * A no-op statement ";".
aoqi@0 875 */
aoqi@0 876 public static class JCSkip extends JCStatement implements EmptyStatementTree {
aoqi@0 877 protected JCSkip() {
aoqi@0 878 }
aoqi@0 879 @Override
aoqi@0 880 public void accept(Visitor v) { v.visitSkip(this); }
aoqi@0 881
aoqi@0 882 public Kind getKind() { return Kind.EMPTY_STATEMENT; }
aoqi@0 883 @Override
aoqi@0 884 public <R,D> R accept(TreeVisitor<R,D> v, D d) {
aoqi@0 885 return v.visitEmptyStatement(this, d);
aoqi@0 886 }
aoqi@0 887
aoqi@0 888 @Override
aoqi@0 889 public Tag getTag() {
aoqi@0 890 return SKIP;
aoqi@0 891 }
aoqi@0 892 }
aoqi@0 893
aoqi@0 894 /**
aoqi@0 895 * A statement block.
aoqi@0 896 */
aoqi@0 897 public static class JCBlock extends JCStatement implements BlockTree {
aoqi@0 898 /** flags */
aoqi@0 899 public long flags;
aoqi@0 900 /** statements */
aoqi@0 901 public List<JCStatement> stats;
aoqi@0 902 /** Position of closing brace, optional. */
aoqi@0 903 public int endpos = Position.NOPOS;
aoqi@0 904 protected JCBlock(long flags, List<JCStatement> stats) {
aoqi@0 905 this.stats = stats;
aoqi@0 906 this.flags = flags;
aoqi@0 907 }
aoqi@0 908 @Override
aoqi@0 909 public void accept(Visitor v) { v.visitBlock(this); }
aoqi@0 910
aoqi@0 911 public Kind getKind() { return Kind.BLOCK; }
aoqi@0 912 public List<JCStatement> getStatements() {
aoqi@0 913 return stats;
aoqi@0 914 }
aoqi@0 915 public boolean isStatic() { return (flags & Flags.STATIC) != 0; }
aoqi@0 916 @Override
aoqi@0 917 public <R,D> R accept(TreeVisitor<R,D> v, D d) {
aoqi@0 918 return v.visitBlock(this, d);
aoqi@0 919 }
aoqi@0 920
aoqi@0 921 @Override
aoqi@0 922 public Tag getTag() {
aoqi@0 923 return BLOCK;
aoqi@0 924 }
aoqi@0 925 }
aoqi@0 926
aoqi@0 927 /**
aoqi@0 928 * A do loop
aoqi@0 929 */
aoqi@0 930 public static class JCDoWhileLoop extends JCStatement implements DoWhileLoopTree {
aoqi@0 931 public JCStatement body;
aoqi@0 932 public JCExpression cond;
aoqi@0 933 protected JCDoWhileLoop(JCStatement body, JCExpression cond) {
aoqi@0 934 this.body = body;
aoqi@0 935 this.cond = cond;
aoqi@0 936 }
aoqi@0 937 @Override
aoqi@0 938 public void accept(Visitor v) { v.visitDoLoop(this); }
aoqi@0 939
aoqi@0 940 public Kind getKind() { return Kind.DO_WHILE_LOOP; }
aoqi@0 941 public JCExpression getCondition() { return cond; }
aoqi@0 942 public JCStatement getStatement() { return body; }
aoqi@0 943 @Override
aoqi@0 944 public <R,D> R accept(TreeVisitor<R,D> v, D d) {
aoqi@0 945 return v.visitDoWhileLoop(this, d);
aoqi@0 946 }
aoqi@0 947
aoqi@0 948 @Override
aoqi@0 949 public Tag getTag() {
aoqi@0 950 return DOLOOP;
aoqi@0 951 }
aoqi@0 952 }
aoqi@0 953
aoqi@0 954 /**
aoqi@0 955 * A while loop
aoqi@0 956 */
aoqi@0 957 public static class JCWhileLoop extends JCStatement implements WhileLoopTree {
aoqi@0 958 public JCExpression cond;
aoqi@0 959 public JCStatement body;
aoqi@0 960 protected JCWhileLoop(JCExpression cond, JCStatement body) {
aoqi@0 961 this.cond = cond;
aoqi@0 962 this.body = body;
aoqi@0 963 }
aoqi@0 964 @Override
aoqi@0 965 public void accept(Visitor v) { v.visitWhileLoop(this); }
aoqi@0 966
aoqi@0 967 public Kind getKind() { return Kind.WHILE_LOOP; }
aoqi@0 968 public JCExpression getCondition() { return cond; }
aoqi@0 969 public JCStatement getStatement() { return body; }
aoqi@0 970 @Override
aoqi@0 971 public <R,D> R accept(TreeVisitor<R,D> v, D d) {
aoqi@0 972 return v.visitWhileLoop(this, d);
aoqi@0 973 }
aoqi@0 974
aoqi@0 975 @Override
aoqi@0 976 public Tag getTag() {
aoqi@0 977 return WHILELOOP;
aoqi@0 978 }
aoqi@0 979 }
aoqi@0 980
aoqi@0 981 /**
aoqi@0 982 * A for loop.
aoqi@0 983 */
aoqi@0 984 public static class JCForLoop extends JCStatement implements ForLoopTree {
aoqi@0 985 public List<JCStatement> init;
aoqi@0 986 public JCExpression cond;
aoqi@0 987 public List<JCExpressionStatement> step;
aoqi@0 988 public JCStatement body;
aoqi@0 989 protected JCForLoop(List<JCStatement> init,
aoqi@0 990 JCExpression cond,
aoqi@0 991 List<JCExpressionStatement> update,
aoqi@0 992 JCStatement body)
aoqi@0 993 {
aoqi@0 994 this.init = init;
aoqi@0 995 this.cond = cond;
aoqi@0 996 this.step = update;
aoqi@0 997 this.body = body;
aoqi@0 998 }
aoqi@0 999 @Override
aoqi@0 1000 public void accept(Visitor v) { v.visitForLoop(this); }
aoqi@0 1001
aoqi@0 1002 public Kind getKind() { return Kind.FOR_LOOP; }
aoqi@0 1003 public JCExpression getCondition() { return cond; }
aoqi@0 1004 public JCStatement getStatement() { return body; }
aoqi@0 1005 public List<JCStatement> getInitializer() {
aoqi@0 1006 return init;
aoqi@0 1007 }
aoqi@0 1008 public List<JCExpressionStatement> getUpdate() {
aoqi@0 1009 return step;
aoqi@0 1010 }
aoqi@0 1011 @Override
aoqi@0 1012 public <R,D> R accept(TreeVisitor<R,D> v, D d) {
aoqi@0 1013 return v.visitForLoop(this, d);
aoqi@0 1014 }
aoqi@0 1015
aoqi@0 1016 @Override
aoqi@0 1017 public Tag getTag() {
aoqi@0 1018 return FORLOOP;
aoqi@0 1019 }
aoqi@0 1020 }
aoqi@0 1021
aoqi@0 1022 /**
aoqi@0 1023 * The enhanced for loop.
aoqi@0 1024 */
aoqi@0 1025 public static class JCEnhancedForLoop extends JCStatement implements EnhancedForLoopTree {
aoqi@0 1026 public JCVariableDecl var;
aoqi@0 1027 public JCExpression expr;
aoqi@0 1028 public JCStatement body;
aoqi@0 1029 protected JCEnhancedForLoop(JCVariableDecl var, JCExpression expr, JCStatement body) {
aoqi@0 1030 this.var = var;
aoqi@0 1031 this.expr = expr;
aoqi@0 1032 this.body = body;
aoqi@0 1033 }
aoqi@0 1034 @Override
aoqi@0 1035 public void accept(Visitor v) { v.visitForeachLoop(this); }
aoqi@0 1036
aoqi@0 1037 public Kind getKind() { return Kind.ENHANCED_FOR_LOOP; }
aoqi@0 1038 public JCVariableDecl getVariable() { return var; }
aoqi@0 1039 public JCExpression getExpression() { return expr; }
aoqi@0 1040 public JCStatement getStatement() { return body; }
aoqi@0 1041 @Override
aoqi@0 1042 public <R,D> R accept(TreeVisitor<R,D> v, D d) {
aoqi@0 1043 return v.visitEnhancedForLoop(this, d);
aoqi@0 1044 }
aoqi@0 1045 @Override
aoqi@0 1046 public Tag getTag() {
aoqi@0 1047 return FOREACHLOOP;
aoqi@0 1048 }
aoqi@0 1049 }
aoqi@0 1050
aoqi@0 1051 /**
aoqi@0 1052 * A labelled expression or statement.
aoqi@0 1053 */
aoqi@0 1054 public static class JCLabeledStatement extends JCStatement implements LabeledStatementTree {
aoqi@0 1055 public Name label;
aoqi@0 1056 public JCStatement body;
aoqi@0 1057 protected JCLabeledStatement(Name label, JCStatement body) {
aoqi@0 1058 this.label = label;
aoqi@0 1059 this.body = body;
aoqi@0 1060 }
aoqi@0 1061 @Override
aoqi@0 1062 public void accept(Visitor v) { v.visitLabelled(this); }
aoqi@0 1063 public Kind getKind() { return Kind.LABELED_STATEMENT; }
aoqi@0 1064 public Name getLabel() { return label; }
aoqi@0 1065 public JCStatement getStatement() { return body; }
aoqi@0 1066 @Override
aoqi@0 1067 public <R,D> R accept(TreeVisitor<R,D> v, D d) {
aoqi@0 1068 return v.visitLabeledStatement(this, d);
aoqi@0 1069 }
aoqi@0 1070 @Override
aoqi@0 1071 public Tag getTag() {
aoqi@0 1072 return LABELLED;
aoqi@0 1073 }
aoqi@0 1074 }
aoqi@0 1075
aoqi@0 1076 /**
aoqi@0 1077 * A "switch ( ) { }" construction.
aoqi@0 1078 */
aoqi@0 1079 public static class JCSwitch extends JCStatement implements SwitchTree {
aoqi@0 1080 public JCExpression selector;
aoqi@0 1081 public List<JCCase> cases;
aoqi@0 1082 protected JCSwitch(JCExpression selector, List<JCCase> cases) {
aoqi@0 1083 this.selector = selector;
aoqi@0 1084 this.cases = cases;
aoqi@0 1085 }
aoqi@0 1086 @Override
aoqi@0 1087 public void accept(Visitor v) { v.visitSwitch(this); }
aoqi@0 1088
aoqi@0 1089 public Kind getKind() { return Kind.SWITCH; }
aoqi@0 1090 public JCExpression getExpression() { return selector; }
aoqi@0 1091 public List<JCCase> getCases() { return cases; }
aoqi@0 1092 @Override
aoqi@0 1093 public <R,D> R accept(TreeVisitor<R,D> v, D d) {
aoqi@0 1094 return v.visitSwitch(this, d);
aoqi@0 1095 }
aoqi@0 1096 @Override
aoqi@0 1097 public Tag getTag() {
aoqi@0 1098 return SWITCH;
aoqi@0 1099 }
aoqi@0 1100 }
aoqi@0 1101
aoqi@0 1102 /**
aoqi@0 1103 * A "case :" of a switch.
aoqi@0 1104 */
aoqi@0 1105 public static class JCCase extends JCStatement implements CaseTree {
aoqi@0 1106 public JCExpression pat;
aoqi@0 1107 public List<JCStatement> stats;
aoqi@0 1108 protected JCCase(JCExpression pat, List<JCStatement> stats) {
aoqi@0 1109 this.pat = pat;
aoqi@0 1110 this.stats = stats;
aoqi@0 1111 }
aoqi@0 1112 @Override
aoqi@0 1113 public void accept(Visitor v) { v.visitCase(this); }
aoqi@0 1114
aoqi@0 1115 public Kind getKind() { return Kind.CASE; }
aoqi@0 1116 public JCExpression getExpression() { return pat; }
aoqi@0 1117 public List<JCStatement> getStatements() { return stats; }
aoqi@0 1118 @Override
aoqi@0 1119 public <R,D> R accept(TreeVisitor<R,D> v, D d) {
aoqi@0 1120 return v.visitCase(this, d);
aoqi@0 1121 }
aoqi@0 1122 @Override
aoqi@0 1123 public Tag getTag() {
aoqi@0 1124 return CASE;
aoqi@0 1125 }
aoqi@0 1126 }
aoqi@0 1127
aoqi@0 1128 /**
aoqi@0 1129 * A synchronized block.
aoqi@0 1130 */
aoqi@0 1131 public static class JCSynchronized extends JCStatement implements SynchronizedTree {
aoqi@0 1132 public JCExpression lock;
aoqi@0 1133 public JCBlock body;
aoqi@0 1134 protected JCSynchronized(JCExpression lock, JCBlock body) {
aoqi@0 1135 this.lock = lock;
aoqi@0 1136 this.body = body;
aoqi@0 1137 }
aoqi@0 1138 @Override
aoqi@0 1139 public void accept(Visitor v) { v.visitSynchronized(this); }
aoqi@0 1140
aoqi@0 1141 public Kind getKind() { return Kind.SYNCHRONIZED; }
aoqi@0 1142 public JCExpression getExpression() { return lock; }
aoqi@0 1143 public JCBlock getBlock() { return body; }
aoqi@0 1144 @Override
aoqi@0 1145 public <R,D> R accept(TreeVisitor<R,D> v, D d) {
aoqi@0 1146 return v.visitSynchronized(this, d);
aoqi@0 1147 }
aoqi@0 1148 @Override
aoqi@0 1149 public Tag getTag() {
aoqi@0 1150 return SYNCHRONIZED;
aoqi@0 1151 }
aoqi@0 1152 }
aoqi@0 1153
aoqi@0 1154 /**
aoqi@0 1155 * A "try { } catch ( ) { } finally { }" block.
aoqi@0 1156 */
aoqi@0 1157 public static class JCTry extends JCStatement implements TryTree {
aoqi@0 1158 public JCBlock body;
aoqi@0 1159 public List<JCCatch> catchers;
aoqi@0 1160 public JCBlock finalizer;
aoqi@0 1161 public List<JCTree> resources;
aoqi@0 1162 public boolean finallyCanCompleteNormally;
aoqi@0 1163 protected JCTry(List<JCTree> resources,
aoqi@0 1164 JCBlock body,
aoqi@0 1165 List<JCCatch> catchers,
aoqi@0 1166 JCBlock finalizer) {
aoqi@0 1167 this.body = body;
aoqi@0 1168 this.catchers = catchers;
aoqi@0 1169 this.finalizer = finalizer;
aoqi@0 1170 this.resources = resources;
aoqi@0 1171 }
aoqi@0 1172 @Override
aoqi@0 1173 public void accept(Visitor v) { v.visitTry(this); }
aoqi@0 1174
aoqi@0 1175 public Kind getKind() { return Kind.TRY; }
aoqi@0 1176 public JCBlock getBlock() { return body; }
aoqi@0 1177 public List<JCCatch> getCatches() {
aoqi@0 1178 return catchers;
aoqi@0 1179 }
aoqi@0 1180 public JCBlock getFinallyBlock() { return finalizer; }
aoqi@0 1181 @Override
aoqi@0 1182 public <R,D> R accept(TreeVisitor<R,D> v, D d) {
aoqi@0 1183 return v.visitTry(this, d);
aoqi@0 1184 }
aoqi@0 1185 @Override
aoqi@0 1186 public List<JCTree> getResources() {
aoqi@0 1187 return resources;
aoqi@0 1188 }
aoqi@0 1189 @Override
aoqi@0 1190 public Tag getTag() {
aoqi@0 1191 return TRY;
aoqi@0 1192 }
aoqi@0 1193 }
aoqi@0 1194
aoqi@0 1195 /**
aoqi@0 1196 * A catch block.
aoqi@0 1197 */
aoqi@0 1198 public static class JCCatch extends JCTree implements CatchTree {
aoqi@0 1199 public JCVariableDecl param;
aoqi@0 1200 public JCBlock body;
aoqi@0 1201 protected JCCatch(JCVariableDecl param, JCBlock body) {
aoqi@0 1202 this.param = param;
aoqi@0 1203 this.body = body;
aoqi@0 1204 }
aoqi@0 1205 @Override
aoqi@0 1206 public void accept(Visitor v) { v.visitCatch(this); }
aoqi@0 1207
aoqi@0 1208 public Kind getKind() { return Kind.CATCH; }
aoqi@0 1209 public JCVariableDecl getParameter() { return param; }
aoqi@0 1210 public JCBlock getBlock() { return body; }
aoqi@0 1211 @Override
aoqi@0 1212 public <R,D> R accept(TreeVisitor<R,D> v, D d) {
aoqi@0 1213 return v.visitCatch(this, d);
aoqi@0 1214 }
aoqi@0 1215 @Override
aoqi@0 1216 public Tag getTag() {
aoqi@0 1217 return CATCH;
aoqi@0 1218 }
aoqi@0 1219 }
aoqi@0 1220
aoqi@0 1221 /**
aoqi@0 1222 * A ( ) ? ( ) : ( ) conditional expression
aoqi@0 1223 */
aoqi@0 1224 public static class JCConditional extends JCPolyExpression implements ConditionalExpressionTree {
aoqi@0 1225 public JCExpression cond;
aoqi@0 1226 public JCExpression truepart;
aoqi@0 1227 public JCExpression falsepart;
aoqi@0 1228 protected JCConditional(JCExpression cond,
aoqi@0 1229 JCExpression truepart,
aoqi@0 1230 JCExpression falsepart)
aoqi@0 1231 {
aoqi@0 1232 this.cond = cond;
aoqi@0 1233 this.truepart = truepart;
aoqi@0 1234 this.falsepart = falsepart;
aoqi@0 1235 }
aoqi@0 1236 @Override
aoqi@0 1237 public void accept(Visitor v) { v.visitConditional(this); }
aoqi@0 1238
aoqi@0 1239 public Kind getKind() { return Kind.CONDITIONAL_EXPRESSION; }
aoqi@0 1240 public JCExpression getCondition() { return cond; }
aoqi@0 1241 public JCExpression getTrueExpression() { return truepart; }
aoqi@0 1242 public JCExpression getFalseExpression() { return falsepart; }
aoqi@0 1243 @Override
aoqi@0 1244 public <R,D> R accept(TreeVisitor<R,D> v, D d) {
aoqi@0 1245 return v.visitConditionalExpression(this, d);
aoqi@0 1246 }
aoqi@0 1247 @Override
aoqi@0 1248 public Tag getTag() {
aoqi@0 1249 return CONDEXPR;
aoqi@0 1250 }
aoqi@0 1251 }
aoqi@0 1252
aoqi@0 1253 /**
aoqi@0 1254 * An "if ( ) { } else { }" block
aoqi@0 1255 */
aoqi@0 1256 public static class JCIf extends JCStatement implements IfTree {
aoqi@0 1257 public JCExpression cond;
aoqi@0 1258 public JCStatement thenpart;
aoqi@0 1259 public JCStatement elsepart;
aoqi@0 1260 protected JCIf(JCExpression cond,
aoqi@0 1261 JCStatement thenpart,
aoqi@0 1262 JCStatement elsepart)
aoqi@0 1263 {
aoqi@0 1264 this.cond = cond;
aoqi@0 1265 this.thenpart = thenpart;
aoqi@0 1266 this.elsepart = elsepart;
aoqi@0 1267 }
aoqi@0 1268 @Override
aoqi@0 1269 public void accept(Visitor v) { v.visitIf(this); }
aoqi@0 1270
aoqi@0 1271 public Kind getKind() { return Kind.IF; }
aoqi@0 1272 public JCExpression getCondition() { return cond; }
aoqi@0 1273 public JCStatement getThenStatement() { return thenpart; }
aoqi@0 1274 public JCStatement getElseStatement() { return elsepart; }
aoqi@0 1275 @Override
aoqi@0 1276 public <R,D> R accept(TreeVisitor<R,D> v, D d) {
aoqi@0 1277 return v.visitIf(this, d);
aoqi@0 1278 }
aoqi@0 1279 @Override
aoqi@0 1280 public Tag getTag() {
aoqi@0 1281 return IF;
aoqi@0 1282 }
aoqi@0 1283 }
aoqi@0 1284
aoqi@0 1285 /**
aoqi@0 1286 * an expression statement
aoqi@0 1287 */
aoqi@0 1288 public static class JCExpressionStatement extends JCStatement implements ExpressionStatementTree {
aoqi@0 1289 /** expression structure */
aoqi@0 1290 public JCExpression expr;
aoqi@0 1291 protected JCExpressionStatement(JCExpression expr)
aoqi@0 1292 {
aoqi@0 1293 this.expr = expr;
aoqi@0 1294 }
aoqi@0 1295 @Override
aoqi@0 1296 public void accept(Visitor v) { v.visitExec(this); }
aoqi@0 1297
aoqi@0 1298 public Kind getKind() { return Kind.EXPRESSION_STATEMENT; }
aoqi@0 1299 public JCExpression getExpression() { return expr; }
aoqi@0 1300 @Override
aoqi@0 1301 public <R,D> R accept(TreeVisitor<R,D> v, D d) {
aoqi@0 1302 return v.visitExpressionStatement(this, d);
aoqi@0 1303 }
aoqi@0 1304 @Override
aoqi@0 1305 public Tag getTag() {
aoqi@0 1306 return EXEC;
aoqi@0 1307 }
aoqi@0 1308
aoqi@0 1309 /** Convert a expression-statement tree to a pretty-printed string. */
aoqi@0 1310 @Override
aoqi@0 1311 public String toString() {
aoqi@0 1312 StringWriter s = new StringWriter();
aoqi@0 1313 try {
aoqi@0 1314 new Pretty(s, false).printStat(this);
aoqi@0 1315 }
aoqi@0 1316 catch (IOException e) {
aoqi@0 1317 // should never happen, because StringWriter is defined
aoqi@0 1318 // never to throw any IOExceptions
aoqi@0 1319 throw new AssertionError(e);
aoqi@0 1320 }
aoqi@0 1321 return s.toString();
aoqi@0 1322 }
aoqi@0 1323 }
aoqi@0 1324
aoqi@0 1325 /**
aoqi@0 1326 * A break from a loop or switch.
aoqi@0 1327 */
aoqi@0 1328 public static class JCBreak extends JCStatement implements BreakTree {
aoqi@0 1329 public Name label;
aoqi@0 1330 public JCTree target;
aoqi@0 1331 protected JCBreak(Name label, JCTree target) {
aoqi@0 1332 this.label = label;
aoqi@0 1333 this.target = target;
aoqi@0 1334 }
aoqi@0 1335 @Override
aoqi@0 1336 public void accept(Visitor v) { v.visitBreak(this); }
aoqi@0 1337
aoqi@0 1338 public Kind getKind() { return Kind.BREAK; }
aoqi@0 1339 public Name getLabel() { return label; }
aoqi@0 1340 @Override
aoqi@0 1341 public <R,D> R accept(TreeVisitor<R,D> v, D d) {
aoqi@0 1342 return v.visitBreak(this, d);
aoqi@0 1343 }
aoqi@0 1344 @Override
aoqi@0 1345 public Tag getTag() {
aoqi@0 1346 return BREAK;
aoqi@0 1347 }
aoqi@0 1348 }
aoqi@0 1349
aoqi@0 1350 /**
aoqi@0 1351 * A continue of a loop.
aoqi@0 1352 */
aoqi@0 1353 public static class JCContinue extends JCStatement implements ContinueTree {
aoqi@0 1354 public Name label;
aoqi@0 1355 public JCTree target;
aoqi@0 1356 protected JCContinue(Name label, JCTree target) {
aoqi@0 1357 this.label = label;
aoqi@0 1358 this.target = target;
aoqi@0 1359 }
aoqi@0 1360 @Override
aoqi@0 1361 public void accept(Visitor v) { v.visitContinue(this); }
aoqi@0 1362
aoqi@0 1363 public Kind getKind() { return Kind.CONTINUE; }
aoqi@0 1364 public Name getLabel() { return label; }
aoqi@0 1365 @Override
aoqi@0 1366 public <R,D> R accept(TreeVisitor<R,D> v, D d) {
aoqi@0 1367 return v.visitContinue(this, d);
aoqi@0 1368 }
aoqi@0 1369 @Override
aoqi@0 1370 public Tag getTag() {
aoqi@0 1371 return CONTINUE;
aoqi@0 1372 }
aoqi@0 1373 }
aoqi@0 1374
aoqi@0 1375 /**
aoqi@0 1376 * A return statement.
aoqi@0 1377 */
aoqi@0 1378 public static class JCReturn extends JCStatement implements ReturnTree {
aoqi@0 1379 public JCExpression expr;
aoqi@0 1380 protected JCReturn(JCExpression expr) {
aoqi@0 1381 this.expr = expr;
aoqi@0 1382 }
aoqi@0 1383 @Override
aoqi@0 1384 public void accept(Visitor v) { v.visitReturn(this); }
aoqi@0 1385
aoqi@0 1386 public Kind getKind() { return Kind.RETURN; }
aoqi@0 1387 public JCExpression getExpression() { return expr; }
aoqi@0 1388 @Override
aoqi@0 1389 public <R,D> R accept(TreeVisitor<R,D> v, D d) {
aoqi@0 1390 return v.visitReturn(this, d);
aoqi@0 1391 }
aoqi@0 1392 @Override
aoqi@0 1393 public Tag getTag() {
aoqi@0 1394 return RETURN;
aoqi@0 1395 }
aoqi@0 1396 }
aoqi@0 1397
aoqi@0 1398 /**
aoqi@0 1399 * A throw statement.
aoqi@0 1400 */
aoqi@0 1401 public static class JCThrow extends JCStatement implements ThrowTree {
aoqi@0 1402 public JCExpression expr;
aoqi@0 1403 protected JCThrow(JCExpression expr) {
aoqi@0 1404 this.expr = expr;
aoqi@0 1405 }
aoqi@0 1406 @Override
aoqi@0 1407 public void accept(Visitor v) { v.visitThrow(this); }
aoqi@0 1408
aoqi@0 1409 public Kind getKind() { return Kind.THROW; }
aoqi@0 1410 public JCExpression getExpression() { return expr; }
aoqi@0 1411 @Override
aoqi@0 1412 public <R,D> R accept(TreeVisitor<R,D> v, D d) {
aoqi@0 1413 return v.visitThrow(this, d);
aoqi@0 1414 }
aoqi@0 1415 @Override
aoqi@0 1416 public Tag getTag() {
aoqi@0 1417 return THROW;
aoqi@0 1418 }
aoqi@0 1419 }
aoqi@0 1420
aoqi@0 1421 /**
aoqi@0 1422 * An assert statement.
aoqi@0 1423 */
aoqi@0 1424 public static class JCAssert extends JCStatement implements AssertTree {
aoqi@0 1425 public JCExpression cond;
aoqi@0 1426 public JCExpression detail;
aoqi@0 1427 protected JCAssert(JCExpression cond, JCExpression detail) {
aoqi@0 1428 this.cond = cond;
aoqi@0 1429 this.detail = detail;
aoqi@0 1430 }
aoqi@0 1431 @Override
aoqi@0 1432 public void accept(Visitor v) { v.visitAssert(this); }
aoqi@0 1433
aoqi@0 1434 public Kind getKind() { return Kind.ASSERT; }
aoqi@0 1435 public JCExpression getCondition() { return cond; }
aoqi@0 1436 public JCExpression getDetail() { return detail; }
aoqi@0 1437 @Override
aoqi@0 1438 public <R,D> R accept(TreeVisitor<R,D> v, D d) {
aoqi@0 1439 return v.visitAssert(this, d);
aoqi@0 1440 }
aoqi@0 1441 @Override
aoqi@0 1442 public Tag getTag() {
aoqi@0 1443 return ASSERT;
aoqi@0 1444 }
aoqi@0 1445 }
aoqi@0 1446
aoqi@0 1447 /**
aoqi@0 1448 * A method invocation
aoqi@0 1449 */
aoqi@0 1450 public static class JCMethodInvocation extends JCPolyExpression implements MethodInvocationTree {
aoqi@0 1451 public List<JCExpression> typeargs;
aoqi@0 1452 public JCExpression meth;
aoqi@0 1453 public List<JCExpression> args;
aoqi@0 1454 public Type varargsElement;
aoqi@0 1455 protected JCMethodInvocation(List<JCExpression> typeargs,
aoqi@0 1456 JCExpression meth,
aoqi@0 1457 List<JCExpression> args)
aoqi@0 1458 {
aoqi@0 1459 this.typeargs = (typeargs == null) ? List.<JCExpression>nil()
aoqi@0 1460 : typeargs;
aoqi@0 1461 this.meth = meth;
aoqi@0 1462 this.args = args;
aoqi@0 1463 }
aoqi@0 1464 @Override
aoqi@0 1465 public void accept(Visitor v) { v.visitApply(this); }
aoqi@0 1466
aoqi@0 1467 public Kind getKind() { return Kind.METHOD_INVOCATION; }
aoqi@0 1468 public List<JCExpression> getTypeArguments() {
aoqi@0 1469 return typeargs;
aoqi@0 1470 }
aoqi@0 1471 public JCExpression getMethodSelect() { return meth; }
aoqi@0 1472 public List<JCExpression> getArguments() {
aoqi@0 1473 return args;
aoqi@0 1474 }
aoqi@0 1475 @Override
aoqi@0 1476 public <R,D> R accept(TreeVisitor<R,D> v, D d) {
aoqi@0 1477 return v.visitMethodInvocation(this, d);
aoqi@0 1478 }
aoqi@0 1479 @Override
aoqi@0 1480 public JCMethodInvocation setType(Type type) {
aoqi@0 1481 super.setType(type);
aoqi@0 1482 return this;
aoqi@0 1483 }
aoqi@0 1484 @Override
aoqi@0 1485 public Tag getTag() {
aoqi@0 1486 return(APPLY);
aoqi@0 1487 }
aoqi@0 1488 }
aoqi@0 1489
aoqi@0 1490 /**
aoqi@0 1491 * A new(...) operation.
aoqi@0 1492 */
aoqi@0 1493 public static class JCNewClass extends JCPolyExpression implements NewClassTree {
aoqi@0 1494 public JCExpression encl;
aoqi@0 1495 public List<JCExpression> typeargs;
aoqi@0 1496 public JCExpression clazz;
aoqi@0 1497 public List<JCExpression> args;
aoqi@0 1498 public JCClassDecl def;
aoqi@0 1499 public Symbol constructor;
aoqi@0 1500 public Type varargsElement;
aoqi@0 1501 public Type constructorType;
aoqi@0 1502 protected JCNewClass(JCExpression encl,
aoqi@0 1503 List<JCExpression> typeargs,
aoqi@0 1504 JCExpression clazz,
aoqi@0 1505 List<JCExpression> args,
aoqi@0 1506 JCClassDecl def)
aoqi@0 1507 {
aoqi@0 1508 this.encl = encl;
aoqi@0 1509 this.typeargs = (typeargs == null) ? List.<JCExpression>nil()
aoqi@0 1510 : typeargs;
aoqi@0 1511 this.clazz = clazz;
aoqi@0 1512 this.args = args;
aoqi@0 1513 this.def = def;
aoqi@0 1514 }
aoqi@0 1515 @Override
aoqi@0 1516 public void accept(Visitor v) { v.visitNewClass(this); }
aoqi@0 1517
aoqi@0 1518 public Kind getKind() { return Kind.NEW_CLASS; }
aoqi@0 1519 public JCExpression getEnclosingExpression() { // expr.new C< ... > ( ... )
aoqi@0 1520 return encl;
aoqi@0 1521 }
aoqi@0 1522 public List<JCExpression> getTypeArguments() {
aoqi@0 1523 return typeargs;
aoqi@0 1524 }
aoqi@0 1525 public JCExpression getIdentifier() { return clazz; }
aoqi@0 1526 public List<JCExpression> getArguments() {
aoqi@0 1527 return args;
aoqi@0 1528 }
aoqi@0 1529 public JCClassDecl getClassBody() { return def; }
aoqi@0 1530 @Override
aoqi@0 1531 public <R,D> R accept(TreeVisitor<R,D> v, D d) {
aoqi@0 1532 return v.visitNewClass(this, d);
aoqi@0 1533 }
aoqi@0 1534 @Override
aoqi@0 1535 public Tag getTag() {
aoqi@0 1536 return NEWCLASS;
aoqi@0 1537 }
aoqi@0 1538 }
aoqi@0 1539
aoqi@0 1540 /**
aoqi@0 1541 * A new[...] operation.
aoqi@0 1542 */
aoqi@0 1543 public static class JCNewArray extends JCExpression implements NewArrayTree {
aoqi@0 1544 public JCExpression elemtype;
aoqi@0 1545 public List<JCExpression> dims;
aoqi@0 1546 // type annotations on inner-most component
aoqi@0 1547 public List<JCAnnotation> annotations;
aoqi@0 1548 // type annotations on dimensions
aoqi@0 1549 public List<List<JCAnnotation>> dimAnnotations;
aoqi@0 1550 public List<JCExpression> elems;
aoqi@0 1551 protected JCNewArray(JCExpression elemtype,
aoqi@0 1552 List<JCExpression> dims,
aoqi@0 1553 List<JCExpression> elems)
aoqi@0 1554 {
aoqi@0 1555 this.elemtype = elemtype;
aoqi@0 1556 this.dims = dims;
aoqi@0 1557 this.annotations = List.nil();
aoqi@0 1558 this.dimAnnotations = List.nil();
aoqi@0 1559 this.elems = elems;
aoqi@0 1560 }
aoqi@0 1561 @Override
aoqi@0 1562 public void accept(Visitor v) { v.visitNewArray(this); }
aoqi@0 1563
aoqi@0 1564 public Kind getKind() { return Kind.NEW_ARRAY; }
aoqi@0 1565 public JCExpression getType() { return elemtype; }
aoqi@0 1566 public List<JCExpression> getDimensions() {
aoqi@0 1567 return dims;
aoqi@0 1568 }
aoqi@0 1569 public List<JCExpression> getInitializers() {
aoqi@0 1570 return elems;
aoqi@0 1571 }
aoqi@0 1572 @Override
aoqi@0 1573 public <R,D> R accept(TreeVisitor<R,D> v, D d) {
aoqi@0 1574 return v.visitNewArray(this, d);
aoqi@0 1575 }
aoqi@0 1576 @Override
aoqi@0 1577 public Tag getTag() {
aoqi@0 1578 return NEWARRAY;
aoqi@0 1579 }
aoqi@0 1580
aoqi@0 1581 @Override
aoqi@0 1582 public List<JCAnnotation> getAnnotations() {
aoqi@0 1583 return annotations;
aoqi@0 1584 }
aoqi@0 1585
aoqi@0 1586 @Override
aoqi@0 1587 public List<List<JCAnnotation>> getDimAnnotations() {
aoqi@0 1588 return dimAnnotations;
aoqi@0 1589 }
aoqi@0 1590 }
aoqi@0 1591
aoqi@0 1592 /**
aoqi@0 1593 * A lambda expression.
aoqi@0 1594 */
aoqi@0 1595 public static class JCLambda extends JCFunctionalExpression implements LambdaExpressionTree {
aoqi@0 1596
aoqi@0 1597 public enum ParameterKind {
aoqi@0 1598 IMPLICIT,
aoqi@0 1599 EXPLICIT;
aoqi@0 1600 }
aoqi@0 1601
aoqi@0 1602 public List<JCVariableDecl> params;
aoqi@0 1603 public JCTree body;
aoqi@0 1604 public boolean canCompleteNormally = true;
aoqi@0 1605 public ParameterKind paramKind;
aoqi@0 1606
aoqi@0 1607 public JCLambda(List<JCVariableDecl> params,
aoqi@0 1608 JCTree body) {
aoqi@0 1609 this.params = params;
aoqi@0 1610 this.body = body;
aoqi@0 1611 if (params.isEmpty() ||
aoqi@0 1612 params.head.vartype != null) {
aoqi@0 1613 paramKind = ParameterKind.EXPLICIT;
aoqi@0 1614 } else {
aoqi@0 1615 paramKind = ParameterKind.IMPLICIT;
aoqi@0 1616 }
aoqi@0 1617 }
aoqi@0 1618 @Override
aoqi@0 1619 public Tag getTag() {
aoqi@0 1620 return LAMBDA;
aoqi@0 1621 }
aoqi@0 1622 @Override
aoqi@0 1623 public void accept(Visitor v) {
aoqi@0 1624 v.visitLambda(this);
aoqi@0 1625 }
aoqi@0 1626 @Override
aoqi@0 1627 public <R, D> R accept(TreeVisitor<R, D> v, D d) {
aoqi@0 1628 return v.visitLambdaExpression(this, d);
aoqi@0 1629 }
aoqi@0 1630 public Kind getKind() {
aoqi@0 1631 return Kind.LAMBDA_EXPRESSION;
aoqi@0 1632 }
aoqi@0 1633 public JCTree getBody() {
aoqi@0 1634 return body;
aoqi@0 1635 }
aoqi@0 1636 public java.util.List<? extends VariableTree> getParameters() {
aoqi@0 1637 return params;
aoqi@0 1638 }
aoqi@0 1639 @Override
aoqi@0 1640 public JCLambda setType(Type type) {
aoqi@0 1641 super.setType(type);
aoqi@0 1642 return this;
aoqi@0 1643 }
aoqi@0 1644 @Override
aoqi@0 1645 public BodyKind getBodyKind() {
aoqi@0 1646 return body.hasTag(BLOCK) ?
aoqi@0 1647 BodyKind.STATEMENT :
aoqi@0 1648 BodyKind.EXPRESSION;
aoqi@0 1649 }
aoqi@0 1650 }
aoqi@0 1651
aoqi@0 1652 /**
aoqi@0 1653 * A parenthesized subexpression ( ... )
aoqi@0 1654 */
aoqi@0 1655 public static class JCParens extends JCExpression implements ParenthesizedTree {
aoqi@0 1656 public JCExpression expr;
aoqi@0 1657 protected JCParens(JCExpression expr) {
aoqi@0 1658 this.expr = expr;
aoqi@0 1659 }
aoqi@0 1660 @Override
aoqi@0 1661 public void accept(Visitor v) { v.visitParens(this); }
aoqi@0 1662
aoqi@0 1663 public Kind getKind() { return Kind.PARENTHESIZED; }
aoqi@0 1664 public JCExpression getExpression() { return expr; }
aoqi@0 1665 @Override
aoqi@0 1666 public <R,D> R accept(TreeVisitor<R,D> v, D d) {
aoqi@0 1667 return v.visitParenthesized(this, d);
aoqi@0 1668 }
aoqi@0 1669 @Override
aoqi@0 1670 public Tag getTag() {
aoqi@0 1671 return PARENS;
aoqi@0 1672 }
aoqi@0 1673 }
aoqi@0 1674
aoqi@0 1675 /**
aoqi@0 1676 * A assignment with "=".
aoqi@0 1677 */
aoqi@0 1678 public static class JCAssign extends JCExpression implements AssignmentTree {
aoqi@0 1679 public JCExpression lhs;
aoqi@0 1680 public JCExpression rhs;
aoqi@0 1681 protected JCAssign(JCExpression lhs, JCExpression rhs) {
aoqi@0 1682 this.lhs = lhs;
aoqi@0 1683 this.rhs = rhs;
aoqi@0 1684 }
aoqi@0 1685 @Override
aoqi@0 1686 public void accept(Visitor v) { v.visitAssign(this); }
aoqi@0 1687
aoqi@0 1688 public Kind getKind() { return Kind.ASSIGNMENT; }
aoqi@0 1689 public JCExpression getVariable() { return lhs; }
aoqi@0 1690 public JCExpression getExpression() { return rhs; }
aoqi@0 1691 @Override
aoqi@0 1692 public <R,D> R accept(TreeVisitor<R,D> v, D d) {
aoqi@0 1693 return v.visitAssignment(this, d);
aoqi@0 1694 }
aoqi@0 1695 @Override
aoqi@0 1696 public Tag getTag() {
aoqi@0 1697 return ASSIGN;
aoqi@0 1698 }
aoqi@0 1699 }
aoqi@0 1700
aoqi@0 1701 /**
aoqi@0 1702 * An assignment with "+=", "|=" ...
aoqi@0 1703 */
aoqi@0 1704 public static class JCAssignOp extends JCExpression implements CompoundAssignmentTree {
aoqi@0 1705 private Tag opcode;
aoqi@0 1706 public JCExpression lhs;
aoqi@0 1707 public JCExpression rhs;
aoqi@0 1708 public Symbol operator;
aoqi@0 1709 protected JCAssignOp(Tag opcode, JCTree lhs, JCTree rhs, Symbol operator) {
aoqi@0 1710 this.opcode = opcode;
aoqi@0 1711 this.lhs = (JCExpression)lhs;
aoqi@0 1712 this.rhs = (JCExpression)rhs;
aoqi@0 1713 this.operator = operator;
aoqi@0 1714 }
aoqi@0 1715 @Override
aoqi@0 1716 public void accept(Visitor v) { v.visitAssignop(this); }
aoqi@0 1717
aoqi@0 1718 public Kind getKind() { return TreeInfo.tagToKind(getTag()); }
aoqi@0 1719 public JCExpression getVariable() { return lhs; }
aoqi@0 1720 public JCExpression getExpression() { return rhs; }
aoqi@0 1721 public Symbol getOperator() {
aoqi@0 1722 return operator;
aoqi@0 1723 }
aoqi@0 1724 @Override
aoqi@0 1725 public <R,D> R accept(TreeVisitor<R,D> v, D d) {
aoqi@0 1726 return v.visitCompoundAssignment(this, d);
aoqi@0 1727 }
aoqi@0 1728 @Override
aoqi@0 1729 public Tag getTag() {
aoqi@0 1730 return opcode;
aoqi@0 1731 }
aoqi@0 1732 }
aoqi@0 1733
aoqi@0 1734 /**
aoqi@0 1735 * A unary operation.
aoqi@0 1736 */
aoqi@0 1737 public static class JCUnary extends JCExpression implements UnaryTree {
aoqi@0 1738 private Tag opcode;
aoqi@0 1739 public JCExpression arg;
aoqi@0 1740 public Symbol operator;
aoqi@0 1741 protected JCUnary(Tag opcode, JCExpression arg) {
aoqi@0 1742 this.opcode = opcode;
aoqi@0 1743 this.arg = arg;
aoqi@0 1744 }
aoqi@0 1745 @Override
aoqi@0 1746 public void accept(Visitor v) { v.visitUnary(this); }
aoqi@0 1747
aoqi@0 1748 public Kind getKind() { return TreeInfo.tagToKind(getTag()); }
aoqi@0 1749 public JCExpression getExpression() { return arg; }
aoqi@0 1750 public Symbol getOperator() {
aoqi@0 1751 return operator;
aoqi@0 1752 }
aoqi@0 1753 @Override
aoqi@0 1754 public <R,D> R accept(TreeVisitor<R,D> v, D d) {
aoqi@0 1755 return v.visitUnary(this, d);
aoqi@0 1756 }
aoqi@0 1757 @Override
aoqi@0 1758 public Tag getTag() {
aoqi@0 1759 return opcode;
aoqi@0 1760 }
aoqi@0 1761
aoqi@0 1762 public void setTag(Tag tag) {
aoqi@0 1763 opcode = tag;
aoqi@0 1764 }
aoqi@0 1765 }
aoqi@0 1766
aoqi@0 1767 /**
aoqi@0 1768 * A binary operation.
aoqi@0 1769 */
aoqi@0 1770 public static class JCBinary extends JCExpression implements BinaryTree {
aoqi@0 1771 private Tag opcode;
aoqi@0 1772 public JCExpression lhs;
aoqi@0 1773 public JCExpression rhs;
aoqi@0 1774 public Symbol operator;
aoqi@0 1775 protected JCBinary(Tag opcode,
aoqi@0 1776 JCExpression lhs,
aoqi@0 1777 JCExpression rhs,
aoqi@0 1778 Symbol operator) {
aoqi@0 1779 this.opcode = opcode;
aoqi@0 1780 this.lhs = lhs;
aoqi@0 1781 this.rhs = rhs;
aoqi@0 1782 this.operator = operator;
aoqi@0 1783 }
aoqi@0 1784 @Override
aoqi@0 1785 public void accept(Visitor v) { v.visitBinary(this); }
aoqi@0 1786
aoqi@0 1787 public Kind getKind() { return TreeInfo.tagToKind(getTag()); }
aoqi@0 1788 public JCExpression getLeftOperand() { return lhs; }
aoqi@0 1789 public JCExpression getRightOperand() { return rhs; }
aoqi@0 1790 public Symbol getOperator() {
aoqi@0 1791 return operator;
aoqi@0 1792 }
aoqi@0 1793 @Override
aoqi@0 1794 public <R,D> R accept(TreeVisitor<R,D> v, D d) {
aoqi@0 1795 return v.visitBinary(this, d);
aoqi@0 1796 }
aoqi@0 1797 @Override
aoqi@0 1798 public Tag getTag() {
aoqi@0 1799 return opcode;
aoqi@0 1800 }
aoqi@0 1801 }
aoqi@0 1802
aoqi@0 1803 /**
aoqi@0 1804 * A type cast.
aoqi@0 1805 */
aoqi@0 1806 public static class JCTypeCast extends JCExpression implements TypeCastTree {
aoqi@0 1807 public JCTree clazz;
aoqi@0 1808 public JCExpression expr;
aoqi@0 1809 protected JCTypeCast(JCTree clazz, JCExpression expr) {
aoqi@0 1810 this.clazz = clazz;
aoqi@0 1811 this.expr = expr;
aoqi@0 1812 }
aoqi@0 1813 @Override
aoqi@0 1814 public void accept(Visitor v) { v.visitTypeCast(this); }
aoqi@0 1815
aoqi@0 1816 public Kind getKind() { return Kind.TYPE_CAST; }
aoqi@0 1817 public JCTree getType() { return clazz; }
aoqi@0 1818 public JCExpression getExpression() { return expr; }
aoqi@0 1819 @Override
aoqi@0 1820 public <R,D> R accept(TreeVisitor<R,D> v, D d) {
aoqi@0 1821 return v.visitTypeCast(this, d);
aoqi@0 1822 }
aoqi@0 1823 @Override
aoqi@0 1824 public Tag getTag() {
aoqi@0 1825 return TYPECAST;
aoqi@0 1826 }
aoqi@0 1827 }
aoqi@0 1828
aoqi@0 1829 /**
aoqi@0 1830 * A type test.
aoqi@0 1831 */
aoqi@0 1832 public static class JCInstanceOf extends JCExpression implements InstanceOfTree {
aoqi@0 1833 public JCExpression expr;
aoqi@0 1834 public JCTree clazz;
aoqi@0 1835 protected JCInstanceOf(JCExpression expr, JCTree clazz) {
aoqi@0 1836 this.expr = expr;
aoqi@0 1837 this.clazz = clazz;
aoqi@0 1838 }
aoqi@0 1839 @Override
aoqi@0 1840 public void accept(Visitor v) { v.visitTypeTest(this); }
aoqi@0 1841
aoqi@0 1842 public Kind getKind() { return Kind.INSTANCE_OF; }
aoqi@0 1843 public JCTree getType() { return clazz; }
aoqi@0 1844 public JCExpression getExpression() { return expr; }
aoqi@0 1845 @Override
aoqi@0 1846 public <R,D> R accept(TreeVisitor<R,D> v, D d) {
aoqi@0 1847 return v.visitInstanceOf(this, d);
aoqi@0 1848 }
aoqi@0 1849 @Override
aoqi@0 1850 public Tag getTag() {
aoqi@0 1851 return TYPETEST;
aoqi@0 1852 }
aoqi@0 1853 }
aoqi@0 1854
aoqi@0 1855 /**
aoqi@0 1856 * An array selection
aoqi@0 1857 */
aoqi@0 1858 public static class JCArrayAccess extends JCExpression implements ArrayAccessTree {
aoqi@0 1859 public JCExpression indexed;
aoqi@0 1860 public JCExpression index;
aoqi@0 1861 protected JCArrayAccess(JCExpression indexed, JCExpression index) {
aoqi@0 1862 this.indexed = indexed;
aoqi@0 1863 this.index = index;
aoqi@0 1864 }
aoqi@0 1865 @Override
aoqi@0 1866 public void accept(Visitor v) { v.visitIndexed(this); }
aoqi@0 1867
aoqi@0 1868 public Kind getKind() { return Kind.ARRAY_ACCESS; }
aoqi@0 1869 public JCExpression getExpression() { return indexed; }
aoqi@0 1870 public JCExpression getIndex() { return index; }
aoqi@0 1871 @Override
aoqi@0 1872 public <R,D> R accept(TreeVisitor<R,D> v, D d) {
aoqi@0 1873 return v.visitArrayAccess(this, d);
aoqi@0 1874 }
aoqi@0 1875 @Override
aoqi@0 1876 public Tag getTag() {
aoqi@0 1877 return INDEXED;
aoqi@0 1878 }
aoqi@0 1879 }
aoqi@0 1880
aoqi@0 1881 /**
aoqi@0 1882 * Selects through packages and classes
aoqi@0 1883 */
aoqi@0 1884 public static class JCFieldAccess extends JCExpression implements MemberSelectTree {
aoqi@0 1885 /** selected Tree hierarchy */
aoqi@0 1886 public JCExpression selected;
aoqi@0 1887 /** name of field to select thru */
aoqi@0 1888 public Name name;
aoqi@0 1889 /** symbol of the selected class */
aoqi@0 1890 public Symbol sym;
aoqi@0 1891 protected JCFieldAccess(JCExpression selected, Name name, Symbol sym) {
aoqi@0 1892 this.selected = selected;
aoqi@0 1893 this.name = name;
aoqi@0 1894 this.sym = sym;
aoqi@0 1895 }
aoqi@0 1896 @Override
aoqi@0 1897 public void accept(Visitor v) { v.visitSelect(this); }
aoqi@0 1898
aoqi@0 1899 public Kind getKind() { return Kind.MEMBER_SELECT; }
aoqi@0 1900 public JCExpression getExpression() { return selected; }
aoqi@0 1901 @Override
aoqi@0 1902 public <R,D> R accept(TreeVisitor<R,D> v, D d) {
aoqi@0 1903 return v.visitMemberSelect(this, d);
aoqi@0 1904 }
aoqi@0 1905 public Name getIdentifier() { return name; }
aoqi@0 1906 @Override
aoqi@0 1907 public Tag getTag() {
aoqi@0 1908 return SELECT;
aoqi@0 1909 }
aoqi@0 1910 }
aoqi@0 1911
aoqi@0 1912 /**
aoqi@0 1913 * Selects a member expression.
aoqi@0 1914 */
aoqi@0 1915 public static class JCMemberReference extends JCFunctionalExpression implements MemberReferenceTree {
aoqi@0 1916
aoqi@0 1917 public ReferenceMode mode;
aoqi@0 1918 public ReferenceKind kind;
aoqi@0 1919 public Name name;
aoqi@0 1920 public JCExpression expr;
aoqi@0 1921 public List<JCExpression> typeargs;
aoqi@0 1922 public Symbol sym;
aoqi@0 1923 public Type varargsElement;
aoqi@0 1924 public PolyKind refPolyKind;
aoqi@0 1925 public boolean ownerAccessible;
aoqi@0 1926 public OverloadKind overloadKind;
aoqi@0 1927
aoqi@0 1928 public enum OverloadKind {
aoqi@0 1929 OVERLOADED,
aoqi@0 1930 UNOVERLOADED;
aoqi@0 1931 }
aoqi@0 1932
aoqi@0 1933 /**
aoqi@0 1934 * Javac-dependent classification for member references, based
aoqi@0 1935 * on relevant properties w.r.t. code-generation
aoqi@0 1936 */
aoqi@0 1937 public enum ReferenceKind {
aoqi@0 1938 /** super # instMethod */
aoqi@0 1939 SUPER(ReferenceMode.INVOKE, false),
aoqi@0 1940 /** Type # instMethod */
aoqi@0 1941 UNBOUND(ReferenceMode.INVOKE, true),
aoqi@0 1942 /** Type # staticMethod */
aoqi@0 1943 STATIC(ReferenceMode.INVOKE, false),
aoqi@0 1944 /** Expr # instMethod */
aoqi@0 1945 BOUND(ReferenceMode.INVOKE, false),
aoqi@0 1946 /** Inner # new */
aoqi@0 1947 IMPLICIT_INNER(ReferenceMode.NEW, false),
aoqi@0 1948 /** Toplevel # new */
aoqi@0 1949 TOPLEVEL(ReferenceMode.NEW, false),
aoqi@0 1950 /** ArrayType # new */
aoqi@0 1951 ARRAY_CTOR(ReferenceMode.NEW, false);
aoqi@0 1952
aoqi@0 1953 final ReferenceMode mode;
aoqi@0 1954 final boolean unbound;
aoqi@0 1955
aoqi@0 1956 private ReferenceKind(ReferenceMode mode, boolean unbound) {
aoqi@0 1957 this.mode = mode;
aoqi@0 1958 this.unbound = unbound;
aoqi@0 1959 }
aoqi@0 1960
aoqi@0 1961 public boolean isUnbound() {
aoqi@0 1962 return unbound;
aoqi@0 1963 }
aoqi@0 1964 }
aoqi@0 1965
aoqi@0 1966 protected JCMemberReference(ReferenceMode mode, Name name, JCExpression expr, List<JCExpression> typeargs) {
aoqi@0 1967 this.mode = mode;
aoqi@0 1968 this.name = name;
aoqi@0 1969 this.expr = expr;
aoqi@0 1970 this.typeargs = typeargs;
aoqi@0 1971 }
aoqi@0 1972 @Override
aoqi@0 1973 public void accept(Visitor v) { v.visitReference(this); }
aoqi@0 1974
aoqi@0 1975 public Kind getKind() { return Kind.MEMBER_REFERENCE; }
aoqi@0 1976 @Override
aoqi@0 1977 public ReferenceMode getMode() { return mode; }
aoqi@0 1978 @Override
aoqi@0 1979 public JCExpression getQualifierExpression() { return expr; }
aoqi@0 1980 @Override
aoqi@0 1981 public Name getName() { return name; }
aoqi@0 1982 @Override
aoqi@0 1983 public List<JCExpression> getTypeArguments() { return typeargs; }
aoqi@0 1984
aoqi@0 1985 @Override
aoqi@0 1986 public <R,D> R accept(TreeVisitor<R,D> v, D d) {
aoqi@0 1987 return v.visitMemberReference(this, d);
aoqi@0 1988 }
aoqi@0 1989 @Override
aoqi@0 1990 public Tag getTag() {
aoqi@0 1991 return REFERENCE;
aoqi@0 1992 }
aoqi@0 1993 public boolean hasKind(ReferenceKind kind) {
aoqi@0 1994 return this.kind == kind;
aoqi@0 1995 }
aoqi@0 1996 }
aoqi@0 1997
aoqi@0 1998 /**
aoqi@0 1999 * An identifier
aoqi@0 2000 */
aoqi@0 2001 public static class JCIdent extends JCExpression implements IdentifierTree {
aoqi@0 2002 /** the name */
aoqi@0 2003 public Name name;
aoqi@0 2004 /** the symbol */
aoqi@0 2005 public Symbol sym;
aoqi@0 2006 protected JCIdent(Name name, Symbol sym) {
aoqi@0 2007 this.name = name;
aoqi@0 2008 this.sym = sym;
aoqi@0 2009 }
aoqi@0 2010 @Override
aoqi@0 2011 public void accept(Visitor v) { v.visitIdent(this); }
aoqi@0 2012
aoqi@0 2013 public Kind getKind() { return Kind.IDENTIFIER; }
aoqi@0 2014 public Name getName() { return name; }
aoqi@0 2015 @Override
aoqi@0 2016 public <R,D> R accept(TreeVisitor<R,D> v, D d) {
aoqi@0 2017 return v.visitIdentifier(this, d);
aoqi@0 2018 }
aoqi@0 2019 @Override
aoqi@0 2020 public Tag getTag() {
aoqi@0 2021 return IDENT;
aoqi@0 2022 }
aoqi@0 2023 }
aoqi@0 2024
aoqi@0 2025 /**
aoqi@0 2026 * A constant value given literally.
aoqi@0 2027 */
aoqi@0 2028 public static class JCLiteral extends JCExpression implements LiteralTree {
aoqi@0 2029 public TypeTag typetag;
aoqi@0 2030 /** value representation */
aoqi@0 2031 public Object value;
aoqi@0 2032 protected JCLiteral(TypeTag typetag, Object value) {
aoqi@0 2033 this.typetag = typetag;
aoqi@0 2034 this.value = value;
aoqi@0 2035 }
aoqi@0 2036 @Override
aoqi@0 2037 public void accept(Visitor v) { v.visitLiteral(this); }
aoqi@0 2038
aoqi@0 2039 public Kind getKind() {
aoqi@0 2040 return typetag.getKindLiteral();
aoqi@0 2041 }
aoqi@0 2042
aoqi@0 2043 public Object getValue() {
aoqi@0 2044 switch (typetag) {
aoqi@0 2045 case BOOLEAN:
aoqi@0 2046 int bi = (Integer) value;
aoqi@0 2047 return (bi != 0);
aoqi@0 2048 case CHAR:
aoqi@0 2049 int ci = (Integer) value;
aoqi@0 2050 char c = (char) ci;
aoqi@0 2051 if (c != ci)
aoqi@0 2052 throw new AssertionError("bad value for char literal");
aoqi@0 2053 return c;
aoqi@0 2054 default:
aoqi@0 2055 return value;
aoqi@0 2056 }
aoqi@0 2057 }
aoqi@0 2058 @Override
aoqi@0 2059 public <R,D> R accept(TreeVisitor<R,D> v, D d) {
aoqi@0 2060 return v.visitLiteral(this, d);
aoqi@0 2061 }
aoqi@0 2062 @Override
aoqi@0 2063 public JCLiteral setType(Type type) {
aoqi@0 2064 super.setType(type);
aoqi@0 2065 return this;
aoqi@0 2066 }
aoqi@0 2067 @Override
aoqi@0 2068 public Tag getTag() {
aoqi@0 2069 return LITERAL;
aoqi@0 2070 }
aoqi@0 2071 }
aoqi@0 2072
aoqi@0 2073 /**
aoqi@0 2074 * Identifies a basic type.
aoqi@0 2075 * @see TypeTag
aoqi@0 2076 */
aoqi@0 2077 public static class JCPrimitiveTypeTree extends JCExpression implements PrimitiveTypeTree {
aoqi@0 2078 /** the basic type id */
aoqi@0 2079 public TypeTag typetag;
aoqi@0 2080 protected JCPrimitiveTypeTree(TypeTag typetag) {
aoqi@0 2081 this.typetag = typetag;
aoqi@0 2082 }
aoqi@0 2083 @Override
aoqi@0 2084 public void accept(Visitor v) { v.visitTypeIdent(this); }
aoqi@0 2085
aoqi@0 2086 public Kind getKind() { return Kind.PRIMITIVE_TYPE; }
aoqi@0 2087 public TypeKind getPrimitiveTypeKind() {
aoqi@0 2088 return typetag.getPrimitiveTypeKind();
aoqi@0 2089 }
aoqi@0 2090
aoqi@0 2091 @Override
aoqi@0 2092 public <R,D> R accept(TreeVisitor<R,D> v, D d) {
aoqi@0 2093 return v.visitPrimitiveType(this, d);
aoqi@0 2094 }
aoqi@0 2095 @Override
aoqi@0 2096 public Tag getTag() {
aoqi@0 2097 return TYPEIDENT;
aoqi@0 2098 }
aoqi@0 2099 }
aoqi@0 2100
aoqi@0 2101 /**
aoqi@0 2102 * An array type, A[]
aoqi@0 2103 */
aoqi@0 2104 public static class JCArrayTypeTree extends JCExpression implements ArrayTypeTree {
aoqi@0 2105 public JCExpression elemtype;
aoqi@0 2106 protected JCArrayTypeTree(JCExpression elemtype) {
aoqi@0 2107 this.elemtype = elemtype;
aoqi@0 2108 }
aoqi@0 2109 @Override
aoqi@0 2110 public void accept(Visitor v) { v.visitTypeArray(this); }
aoqi@0 2111
aoqi@0 2112 public Kind getKind() { return Kind.ARRAY_TYPE; }
aoqi@0 2113 public JCTree getType() { return elemtype; }
aoqi@0 2114 @Override
aoqi@0 2115 public <R,D> R accept(TreeVisitor<R,D> v, D d) {
aoqi@0 2116 return v.visitArrayType(this, d);
aoqi@0 2117 }
aoqi@0 2118 @Override
aoqi@0 2119 public Tag getTag() {
aoqi@0 2120 return TYPEARRAY;
aoqi@0 2121 }
aoqi@0 2122 }
aoqi@0 2123
aoqi@0 2124 /**
aoqi@0 2125 * A parameterized type, {@literal T<...>}
aoqi@0 2126 */
aoqi@0 2127 public static class JCTypeApply extends JCExpression implements ParameterizedTypeTree {
aoqi@0 2128 public JCExpression clazz;
aoqi@0 2129 public List<JCExpression> arguments;
aoqi@0 2130 protected JCTypeApply(JCExpression clazz, List<JCExpression> arguments) {
aoqi@0 2131 this.clazz = clazz;
aoqi@0 2132 this.arguments = arguments;
aoqi@0 2133 }
aoqi@0 2134 @Override
aoqi@0 2135 public void accept(Visitor v) { v.visitTypeApply(this); }
aoqi@0 2136
aoqi@0 2137 public Kind getKind() { return Kind.PARAMETERIZED_TYPE; }
aoqi@0 2138 public JCTree getType() { return clazz; }
aoqi@0 2139 public List<JCExpression> getTypeArguments() {
aoqi@0 2140 return arguments;
aoqi@0 2141 }
aoqi@0 2142 @Override
aoqi@0 2143 public <R,D> R accept(TreeVisitor<R,D> v, D d) {
aoqi@0 2144 return v.visitParameterizedType(this, d);
aoqi@0 2145 }
aoqi@0 2146 @Override
aoqi@0 2147 public Tag getTag() {
aoqi@0 2148 return TYPEAPPLY;
aoqi@0 2149 }
aoqi@0 2150 }
aoqi@0 2151
aoqi@0 2152 /**
aoqi@0 2153 * A union type, T1 | T2 | ... Tn (used in multicatch statements)
aoqi@0 2154 */
aoqi@0 2155 public static class JCTypeUnion extends JCExpression implements UnionTypeTree {
aoqi@0 2156
aoqi@0 2157 public List<JCExpression> alternatives;
aoqi@0 2158
aoqi@0 2159 protected JCTypeUnion(List<JCExpression> components) {
aoqi@0 2160 this.alternatives = components;
aoqi@0 2161 }
aoqi@0 2162 @Override
aoqi@0 2163 public void accept(Visitor v) { v.visitTypeUnion(this); }
aoqi@0 2164
aoqi@0 2165 public Kind getKind() { return Kind.UNION_TYPE; }
aoqi@0 2166
aoqi@0 2167 public List<JCExpression> getTypeAlternatives() {
aoqi@0 2168 return alternatives;
aoqi@0 2169 }
aoqi@0 2170 @Override
aoqi@0 2171 public <R,D> R accept(TreeVisitor<R,D> v, D d) {
aoqi@0 2172 return v.visitUnionType(this, d);
aoqi@0 2173 }
aoqi@0 2174 @Override
aoqi@0 2175 public Tag getTag() {
aoqi@0 2176 return TYPEUNION;
aoqi@0 2177 }
aoqi@0 2178 }
aoqi@0 2179
aoqi@0 2180 /**
aoqi@0 2181 * An intersection type, T1 & T2 & ... Tn (used in cast expressions)
aoqi@0 2182 */
aoqi@0 2183 public static class JCTypeIntersection extends JCExpression implements IntersectionTypeTree {
aoqi@0 2184
aoqi@0 2185 public List<JCExpression> bounds;
aoqi@0 2186
aoqi@0 2187 protected JCTypeIntersection(List<JCExpression> bounds) {
aoqi@0 2188 this.bounds = bounds;
aoqi@0 2189 }
aoqi@0 2190 @Override
aoqi@0 2191 public void accept(Visitor v) { v.visitTypeIntersection(this); }
aoqi@0 2192
aoqi@0 2193 public Kind getKind() { return Kind.INTERSECTION_TYPE; }
aoqi@0 2194
aoqi@0 2195 public List<JCExpression> getBounds() {
aoqi@0 2196 return bounds;
aoqi@0 2197 }
aoqi@0 2198 @Override
aoqi@0 2199 public <R,D> R accept(TreeVisitor<R,D> v, D d) {
aoqi@0 2200 return v.visitIntersectionType(this, d);
aoqi@0 2201 }
aoqi@0 2202 @Override
aoqi@0 2203 public Tag getTag() {
aoqi@0 2204 return TYPEINTERSECTION;
aoqi@0 2205 }
aoqi@0 2206 }
aoqi@0 2207
aoqi@0 2208 /**
aoqi@0 2209 * A formal class parameter.
aoqi@0 2210 */
aoqi@0 2211 public static class JCTypeParameter extends JCTree implements TypeParameterTree {
aoqi@0 2212 /** name */
aoqi@0 2213 public Name name;
aoqi@0 2214 /** bounds */
aoqi@0 2215 public List<JCExpression> bounds;
aoqi@0 2216 /** type annotations on type parameter */
aoqi@0 2217 public List<JCAnnotation> annotations;
aoqi@0 2218 protected JCTypeParameter(Name name, List<JCExpression> bounds, List<JCAnnotation> annotations) {
aoqi@0 2219 this.name = name;
aoqi@0 2220 this.bounds = bounds;
aoqi@0 2221 this.annotations = annotations;
aoqi@0 2222 }
aoqi@0 2223 @Override
aoqi@0 2224 public void accept(Visitor v) { v.visitTypeParameter(this); }
aoqi@0 2225
aoqi@0 2226 public Kind getKind() { return Kind.TYPE_PARAMETER; }
aoqi@0 2227 public Name getName() { return name; }
aoqi@0 2228 public List<JCExpression> getBounds() {
aoqi@0 2229 return bounds;
aoqi@0 2230 }
aoqi@0 2231 public List<JCAnnotation> getAnnotations() {
aoqi@0 2232 return annotations;
aoqi@0 2233 }
aoqi@0 2234 @Override
aoqi@0 2235 public <R,D> R accept(TreeVisitor<R,D> v, D d) {
aoqi@0 2236 return v.visitTypeParameter(this, d);
aoqi@0 2237 }
aoqi@0 2238 @Override
aoqi@0 2239 public Tag getTag() {
aoqi@0 2240 return TYPEPARAMETER;
aoqi@0 2241 }
aoqi@0 2242 }
aoqi@0 2243
aoqi@0 2244 public static class JCWildcard extends JCExpression implements WildcardTree {
aoqi@0 2245 public TypeBoundKind kind;
aoqi@0 2246 public JCTree inner;
aoqi@0 2247 protected JCWildcard(TypeBoundKind kind, JCTree inner) {
aoqi@0 2248 kind.getClass(); // null-check
aoqi@0 2249 this.kind = kind;
aoqi@0 2250 this.inner = inner;
aoqi@0 2251 }
aoqi@0 2252 @Override
aoqi@0 2253 public void accept(Visitor v) { v.visitWildcard(this); }
aoqi@0 2254
aoqi@0 2255 public Kind getKind() {
aoqi@0 2256 switch (kind.kind) {
aoqi@0 2257 case UNBOUND:
aoqi@0 2258 return Kind.UNBOUNDED_WILDCARD;
aoqi@0 2259 case EXTENDS:
aoqi@0 2260 return Kind.EXTENDS_WILDCARD;
aoqi@0 2261 case SUPER:
aoqi@0 2262 return Kind.SUPER_WILDCARD;
aoqi@0 2263 default:
aoqi@0 2264 throw new AssertionError("Unknown wildcard bound " + kind);
aoqi@0 2265 }
aoqi@0 2266 }
aoqi@0 2267 public JCTree getBound() { return inner; }
aoqi@0 2268 @Override
aoqi@0 2269 public <R,D> R accept(TreeVisitor<R,D> v, D d) {
aoqi@0 2270 return v.visitWildcard(this, d);
aoqi@0 2271 }
aoqi@0 2272 @Override
aoqi@0 2273 public Tag getTag() {
aoqi@0 2274 return Tag.WILDCARD;
aoqi@0 2275 }
aoqi@0 2276 }
aoqi@0 2277
aoqi@0 2278 public static class TypeBoundKind extends JCTree {
aoqi@0 2279 public BoundKind kind;
aoqi@0 2280 protected TypeBoundKind(BoundKind kind) {
aoqi@0 2281 this.kind = kind;
aoqi@0 2282 }
aoqi@0 2283 @Override
aoqi@0 2284 public void accept(Visitor v) { v.visitTypeBoundKind(this); }
aoqi@0 2285
aoqi@0 2286 public Kind getKind() {
aoqi@0 2287 throw new AssertionError("TypeBoundKind is not part of a public API");
aoqi@0 2288 }
aoqi@0 2289 @Override
aoqi@0 2290 public <R,D> R accept(TreeVisitor<R,D> v, D d) {
aoqi@0 2291 throw new AssertionError("TypeBoundKind is not part of a public API");
aoqi@0 2292 }
aoqi@0 2293 @Override
aoqi@0 2294 public Tag getTag() {
aoqi@0 2295 return TYPEBOUNDKIND;
aoqi@0 2296 }
aoqi@0 2297 }
aoqi@0 2298
aoqi@0 2299 public static class JCAnnotation extends JCExpression implements AnnotationTree {
aoqi@0 2300 // Either Tag.ANNOTATION or Tag.TYPE_ANNOTATION
aoqi@0 2301 private Tag tag;
aoqi@0 2302
aoqi@0 2303 public JCTree annotationType;
aoqi@0 2304 public List<JCExpression> args;
aoqi@0 2305
aoqi@0 2306 // Attribute.Compound if tag is ANNOTATION
aoqi@0 2307 // Attribute.TypeCompound if tag is TYPE_ANNOTATION
aoqi@0 2308 public Attribute.Compound attribute;
aoqi@0 2309
aoqi@0 2310 protected JCAnnotation(Tag tag, JCTree annotationType, List<JCExpression> args) {
aoqi@0 2311 this.tag = tag;
aoqi@0 2312 this.annotationType = annotationType;
aoqi@0 2313 this.args = args;
aoqi@0 2314 }
aoqi@0 2315
aoqi@0 2316 @Override
aoqi@0 2317 public void accept(Visitor v) { v.visitAnnotation(this); }
aoqi@0 2318
aoqi@0 2319 public Kind getKind() { return TreeInfo.tagToKind(getTag()); }
aoqi@0 2320
aoqi@0 2321 public JCTree getAnnotationType() { return annotationType; }
aoqi@0 2322 public List<JCExpression> getArguments() {
aoqi@0 2323 return args;
aoqi@0 2324 }
aoqi@0 2325 @Override
aoqi@0 2326 public <R,D> R accept(TreeVisitor<R,D> v, D d) {
aoqi@0 2327 return v.visitAnnotation(this, d);
aoqi@0 2328 }
aoqi@0 2329 @Override
aoqi@0 2330 public Tag getTag() {
aoqi@0 2331 return tag;
aoqi@0 2332 }
aoqi@0 2333 }
aoqi@0 2334
aoqi@0 2335 public static class JCModifiers extends JCTree implements com.sun.source.tree.ModifiersTree {
aoqi@0 2336 public long flags;
aoqi@0 2337 public List<JCAnnotation> annotations;
aoqi@0 2338 protected JCModifiers(long flags, List<JCAnnotation> annotations) {
aoqi@0 2339 this.flags = flags;
aoqi@0 2340 this.annotations = annotations;
aoqi@0 2341 }
aoqi@0 2342 @Override
aoqi@0 2343 public void accept(Visitor v) { v.visitModifiers(this); }
aoqi@0 2344
aoqi@0 2345 public Kind getKind() { return Kind.MODIFIERS; }
aoqi@0 2346 public Set<Modifier> getFlags() {
aoqi@0 2347 return Flags.asModifierSet(flags);
aoqi@0 2348 }
aoqi@0 2349 public List<JCAnnotation> getAnnotations() {
aoqi@0 2350 return annotations;
aoqi@0 2351 }
aoqi@0 2352 @Override
aoqi@0 2353 public <R,D> R accept(TreeVisitor<R,D> v, D d) {
aoqi@0 2354 return v.visitModifiers(this, d);
aoqi@0 2355 }
aoqi@0 2356 @Override
aoqi@0 2357 public Tag getTag() {
aoqi@0 2358 return MODIFIERS;
aoqi@0 2359 }
aoqi@0 2360 }
aoqi@0 2361
aoqi@0 2362 public static class JCAnnotatedType extends JCExpression implements com.sun.source.tree.AnnotatedTypeTree {
aoqi@0 2363 // type annotations
aoqi@0 2364 public List<JCAnnotation> annotations;
aoqi@0 2365 public JCExpression underlyingType;
aoqi@0 2366
aoqi@0 2367 protected JCAnnotatedType(List<JCAnnotation> annotations, JCExpression underlyingType) {
aoqi@0 2368 Assert.check(annotations != null && annotations.nonEmpty());
aoqi@0 2369 this.annotations = annotations;
aoqi@0 2370 this.underlyingType = underlyingType;
aoqi@0 2371 }
aoqi@0 2372 @Override
aoqi@0 2373 public void accept(Visitor v) { v.visitAnnotatedType(this); }
aoqi@0 2374
aoqi@0 2375 public Kind getKind() { return Kind.ANNOTATED_TYPE; }
aoqi@0 2376 public List<JCAnnotation> getAnnotations() {
aoqi@0 2377 return annotations;
aoqi@0 2378 }
aoqi@0 2379 public JCExpression getUnderlyingType() {
aoqi@0 2380 return underlyingType;
aoqi@0 2381 }
aoqi@0 2382 @Override
aoqi@0 2383 public <R,D> R accept(TreeVisitor<R,D> v, D d) {
aoqi@0 2384 return v.visitAnnotatedType(this, d);
aoqi@0 2385 }
aoqi@0 2386 @Override
aoqi@0 2387 public Tag getTag() {
aoqi@0 2388 return ANNOTATED_TYPE;
aoqi@0 2389 }
aoqi@0 2390 }
aoqi@0 2391
aoqi@0 2392 public static class JCErroneous extends JCExpression
aoqi@0 2393 implements com.sun.source.tree.ErroneousTree {
aoqi@0 2394 public List<? extends JCTree> errs;
aoqi@0 2395 protected JCErroneous(List<? extends JCTree> errs) {
aoqi@0 2396 this.errs = errs;
aoqi@0 2397 }
aoqi@0 2398 @Override
aoqi@0 2399 public void accept(Visitor v) { v.visitErroneous(this); }
aoqi@0 2400
aoqi@0 2401 public Kind getKind() { return Kind.ERRONEOUS; }
aoqi@0 2402
aoqi@0 2403 public List<? extends JCTree> getErrorTrees() {
aoqi@0 2404 return errs;
aoqi@0 2405 }
aoqi@0 2406
aoqi@0 2407 @Override
aoqi@0 2408 public <R,D> R accept(TreeVisitor<R,D> v, D d) {
aoqi@0 2409 return v.visitErroneous(this, d);
aoqi@0 2410 }
aoqi@0 2411 @Override
aoqi@0 2412 public Tag getTag() {
aoqi@0 2413 return ERRONEOUS;
aoqi@0 2414 }
aoqi@0 2415 }
aoqi@0 2416
aoqi@0 2417 /** (let int x = 3; in x+2) */
aoqi@0 2418 public static class LetExpr extends JCExpression {
aoqi@0 2419 public List<JCVariableDecl> defs;
aoqi@0 2420 public JCTree expr;
aoqi@0 2421 protected LetExpr(List<JCVariableDecl> defs, JCTree expr) {
aoqi@0 2422 this.defs = defs;
aoqi@0 2423 this.expr = expr;
aoqi@0 2424 }
aoqi@0 2425 @Override
aoqi@0 2426 public void accept(Visitor v) { v.visitLetExpr(this); }
aoqi@0 2427
aoqi@0 2428 public Kind getKind() {
aoqi@0 2429 throw new AssertionError("LetExpr is not part of a public API");
aoqi@0 2430 }
aoqi@0 2431 @Override
aoqi@0 2432 public <R,D> R accept(TreeVisitor<R,D> v, D d) {
aoqi@0 2433 throw new AssertionError("LetExpr is not part of a public API");
aoqi@0 2434 }
aoqi@0 2435 @Override
aoqi@0 2436 public Tag getTag() {
aoqi@0 2437 return LETEXPR;
aoqi@0 2438 }
aoqi@0 2439 }
aoqi@0 2440
aoqi@0 2441 /** An interface for tree factories
aoqi@0 2442 */
aoqi@0 2443 public interface Factory {
aoqi@0 2444 JCCompilationUnit TopLevel(List<JCAnnotation> packageAnnotations,
aoqi@0 2445 JCExpression pid,
aoqi@0 2446 List<JCTree> defs);
aoqi@0 2447 JCImport Import(JCTree qualid, boolean staticImport);
aoqi@0 2448 JCClassDecl ClassDef(JCModifiers mods,
aoqi@0 2449 Name name,
aoqi@0 2450 List<JCTypeParameter> typarams,
aoqi@0 2451 JCExpression extending,
aoqi@0 2452 List<JCExpression> implementing,
aoqi@0 2453 List<JCTree> defs);
aoqi@0 2454 JCMethodDecl MethodDef(JCModifiers mods,
aoqi@0 2455 Name name,
aoqi@0 2456 JCExpression restype,
aoqi@0 2457 List<JCTypeParameter> typarams,
aoqi@0 2458 JCVariableDecl recvparam,
aoqi@0 2459 List<JCVariableDecl> params,
aoqi@0 2460 List<JCExpression> thrown,
aoqi@0 2461 JCBlock body,
aoqi@0 2462 JCExpression defaultValue);
aoqi@0 2463 JCVariableDecl VarDef(JCModifiers mods,
aoqi@0 2464 Name name,
aoqi@0 2465 JCExpression vartype,
aoqi@0 2466 JCExpression init);
aoqi@0 2467 JCSkip Skip();
aoqi@0 2468 JCBlock Block(long flags, List<JCStatement> stats);
aoqi@0 2469 JCDoWhileLoop DoLoop(JCStatement body, JCExpression cond);
aoqi@0 2470 JCWhileLoop WhileLoop(JCExpression cond, JCStatement body);
aoqi@0 2471 JCForLoop ForLoop(List<JCStatement> init,
aoqi@0 2472 JCExpression cond,
aoqi@0 2473 List<JCExpressionStatement> step,
aoqi@0 2474 JCStatement body);
aoqi@0 2475 JCEnhancedForLoop ForeachLoop(JCVariableDecl var, JCExpression expr, JCStatement body);
aoqi@0 2476 JCLabeledStatement Labelled(Name label, JCStatement body);
aoqi@0 2477 JCSwitch Switch(JCExpression selector, List<JCCase> cases);
aoqi@0 2478 JCCase Case(JCExpression pat, List<JCStatement> stats);
aoqi@0 2479 JCSynchronized Synchronized(JCExpression lock, JCBlock body);
aoqi@0 2480 JCTry Try(JCBlock body, List<JCCatch> catchers, JCBlock finalizer);
aoqi@0 2481 JCTry Try(List<JCTree> resources,
aoqi@0 2482 JCBlock body,
aoqi@0 2483 List<JCCatch> catchers,
aoqi@0 2484 JCBlock finalizer);
aoqi@0 2485 JCCatch Catch(JCVariableDecl param, JCBlock body);
aoqi@0 2486 JCConditional Conditional(JCExpression cond,
aoqi@0 2487 JCExpression thenpart,
aoqi@0 2488 JCExpression elsepart);
aoqi@0 2489 JCIf If(JCExpression cond, JCStatement thenpart, JCStatement elsepart);
aoqi@0 2490 JCExpressionStatement Exec(JCExpression expr);
aoqi@0 2491 JCBreak Break(Name label);
aoqi@0 2492 JCContinue Continue(Name label);
aoqi@0 2493 JCReturn Return(JCExpression expr);
aoqi@0 2494 JCThrow Throw(JCExpression expr);
aoqi@0 2495 JCAssert Assert(JCExpression cond, JCExpression detail);
aoqi@0 2496 JCMethodInvocation Apply(List<JCExpression> typeargs,
aoqi@0 2497 JCExpression fn,
aoqi@0 2498 List<JCExpression> args);
aoqi@0 2499 JCNewClass NewClass(JCExpression encl,
aoqi@0 2500 List<JCExpression> typeargs,
aoqi@0 2501 JCExpression clazz,
aoqi@0 2502 List<JCExpression> args,
aoqi@0 2503 JCClassDecl def);
aoqi@0 2504 JCNewArray NewArray(JCExpression elemtype,
aoqi@0 2505 List<JCExpression> dims,
aoqi@0 2506 List<JCExpression> elems);
aoqi@0 2507 JCParens Parens(JCExpression expr);
aoqi@0 2508 JCAssign Assign(JCExpression lhs, JCExpression rhs);
aoqi@0 2509 JCAssignOp Assignop(Tag opcode, JCTree lhs, JCTree rhs);
aoqi@0 2510 JCUnary Unary(Tag opcode, JCExpression arg);
aoqi@0 2511 JCBinary Binary(Tag opcode, JCExpression lhs, JCExpression rhs);
aoqi@0 2512 JCTypeCast TypeCast(JCTree expr, JCExpression type);
aoqi@0 2513 JCInstanceOf TypeTest(JCExpression expr, JCTree clazz);
aoqi@0 2514 JCArrayAccess Indexed(JCExpression indexed, JCExpression index);
aoqi@0 2515 JCFieldAccess Select(JCExpression selected, Name selector);
aoqi@0 2516 JCIdent Ident(Name idname);
aoqi@0 2517 JCLiteral Literal(TypeTag tag, Object value);
aoqi@0 2518 JCPrimitiveTypeTree TypeIdent(TypeTag typetag);
aoqi@0 2519 JCArrayTypeTree TypeArray(JCExpression elemtype);
aoqi@0 2520 JCTypeApply TypeApply(JCExpression clazz, List<JCExpression> arguments);
aoqi@0 2521 JCTypeParameter TypeParameter(Name name, List<JCExpression> bounds);
aoqi@0 2522 JCWildcard Wildcard(TypeBoundKind kind, JCTree type);
aoqi@0 2523 TypeBoundKind TypeBoundKind(BoundKind kind);
aoqi@0 2524 JCAnnotation Annotation(JCTree annotationType, List<JCExpression> args);
aoqi@0 2525 JCModifiers Modifiers(long flags, List<JCAnnotation> annotations);
aoqi@0 2526 JCErroneous Erroneous(List<? extends JCTree> errs);
aoqi@0 2527 LetExpr LetExpr(List<JCVariableDecl> defs, JCTree expr);
aoqi@0 2528 }
aoqi@0 2529
aoqi@0 2530 /** A generic visitor class for trees.
aoqi@0 2531 */
aoqi@0 2532 public static abstract class Visitor {
aoqi@0 2533 public void visitTopLevel(JCCompilationUnit that) { visitTree(that); }
aoqi@0 2534 public void visitImport(JCImport that) { visitTree(that); }
aoqi@0 2535 public void visitClassDef(JCClassDecl that) { visitTree(that); }
aoqi@0 2536 public void visitMethodDef(JCMethodDecl that) { visitTree(that); }
aoqi@0 2537 public void visitVarDef(JCVariableDecl that) { visitTree(that); }
aoqi@0 2538 public void visitSkip(JCSkip that) { visitTree(that); }
aoqi@0 2539 public void visitBlock(JCBlock that) { visitTree(that); }
aoqi@0 2540 public void visitDoLoop(JCDoWhileLoop that) { visitTree(that); }
aoqi@0 2541 public void visitWhileLoop(JCWhileLoop that) { visitTree(that); }
aoqi@0 2542 public void visitForLoop(JCForLoop that) { visitTree(that); }
aoqi@0 2543 public void visitForeachLoop(JCEnhancedForLoop that) { visitTree(that); }
aoqi@0 2544 public void visitLabelled(JCLabeledStatement that) { visitTree(that); }
aoqi@0 2545 public void visitSwitch(JCSwitch that) { visitTree(that); }
aoqi@0 2546 public void visitCase(JCCase that) { visitTree(that); }
aoqi@0 2547 public void visitSynchronized(JCSynchronized that) { visitTree(that); }
aoqi@0 2548 public void visitTry(JCTry that) { visitTree(that); }
aoqi@0 2549 public void visitCatch(JCCatch that) { visitTree(that); }
aoqi@0 2550 public void visitConditional(JCConditional that) { visitTree(that); }
aoqi@0 2551 public void visitIf(JCIf that) { visitTree(that); }
aoqi@0 2552 public void visitExec(JCExpressionStatement that) { visitTree(that); }
aoqi@0 2553 public void visitBreak(JCBreak that) { visitTree(that); }
aoqi@0 2554 public void visitContinue(JCContinue that) { visitTree(that); }
aoqi@0 2555 public void visitReturn(JCReturn that) { visitTree(that); }
aoqi@0 2556 public void visitThrow(JCThrow that) { visitTree(that); }
aoqi@0 2557 public void visitAssert(JCAssert that) { visitTree(that); }
aoqi@0 2558 public void visitApply(JCMethodInvocation that) { visitTree(that); }
aoqi@0 2559 public void visitNewClass(JCNewClass that) { visitTree(that); }
aoqi@0 2560 public void visitNewArray(JCNewArray that) { visitTree(that); }
aoqi@0 2561 public void visitLambda(JCLambda that) { visitTree(that); }
aoqi@0 2562 public void visitParens(JCParens that) { visitTree(that); }
aoqi@0 2563 public void visitAssign(JCAssign that) { visitTree(that); }
aoqi@0 2564 public void visitAssignop(JCAssignOp that) { visitTree(that); }
aoqi@0 2565 public void visitUnary(JCUnary that) { visitTree(that); }
aoqi@0 2566 public void visitBinary(JCBinary that) { visitTree(that); }
aoqi@0 2567 public void visitTypeCast(JCTypeCast that) { visitTree(that); }
aoqi@0 2568 public void visitTypeTest(JCInstanceOf that) { visitTree(that); }
aoqi@0 2569 public void visitIndexed(JCArrayAccess that) { visitTree(that); }
aoqi@0 2570 public void visitSelect(JCFieldAccess that) { visitTree(that); }
aoqi@0 2571 public void visitReference(JCMemberReference that) { visitTree(that); }
aoqi@0 2572 public void visitIdent(JCIdent that) { visitTree(that); }
aoqi@0 2573 public void visitLiteral(JCLiteral that) { visitTree(that); }
aoqi@0 2574 public void visitTypeIdent(JCPrimitiveTypeTree that) { visitTree(that); }
aoqi@0 2575 public void visitTypeArray(JCArrayTypeTree that) { visitTree(that); }
aoqi@0 2576 public void visitTypeApply(JCTypeApply that) { visitTree(that); }
aoqi@0 2577 public void visitTypeUnion(JCTypeUnion that) { visitTree(that); }
aoqi@0 2578 public void visitTypeIntersection(JCTypeIntersection that) { visitTree(that); }
aoqi@0 2579 public void visitTypeParameter(JCTypeParameter that) { visitTree(that); }
aoqi@0 2580 public void visitWildcard(JCWildcard that) { visitTree(that); }
aoqi@0 2581 public void visitTypeBoundKind(TypeBoundKind that) { visitTree(that); }
aoqi@0 2582 public void visitAnnotation(JCAnnotation that) { visitTree(that); }
aoqi@0 2583 public void visitModifiers(JCModifiers that) { visitTree(that); }
aoqi@0 2584 public void visitAnnotatedType(JCAnnotatedType that) { visitTree(that); }
aoqi@0 2585 public void visitErroneous(JCErroneous that) { visitTree(that); }
aoqi@0 2586 public void visitLetExpr(LetExpr that) { visitTree(that); }
aoqi@0 2587
aoqi@0 2588 public void visitTree(JCTree that) { Assert.error(); }
aoqi@0 2589 }
aoqi@0 2590
aoqi@0 2591 }

mercurial