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

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

mercurial