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