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

Print this page

        

@@ -77,257 +77,279 @@
  * @see Pretty
  */
 public abstract class JCTree implements Tree, Cloneable, DiagnosticPosition {
 
     /* Tree tag values, identifying kinds of trees */
+    public enum Tag{
+        /** For methods that return an invalid tag if a given condition is not met
+         */
+        NO_TAG,
 
     /** Toplevel nodes, of type TopLevel, representing entire source files.
      */
-    public static final int  TOPLEVEL = 1;
+        TOPLEVEL,
 
     /** Import clauses, of type Import.
      */
-    public static final int IMPORT = TOPLEVEL + 1;
+        IMPORT,
 
     /** Class definitions, of type ClassDef.
      */
-    public static final int CLASSDEF = IMPORT + 1;
+        CLASSDEF,
 
     /** Method definitions, of type MethodDef.
      */
-    public static final int METHODDEF = CLASSDEF + 1;
+        METHODDEF,
 
     /** Variable definitions, of type VarDef.
      */
-    public static final int VARDEF = METHODDEF + 1;
+        VARDEF,
 
     /** The no-op statement ";", of type Skip
      */
-    public static final int SKIP = VARDEF + 1;
+        SKIP,
 
     /** Blocks, of type Block.
      */
-    public static final int BLOCK = SKIP + 1;
+        BLOCK,
 
     /** Do-while loops, of type DoLoop.
      */
-    public static final int DOLOOP = BLOCK + 1;
+        DOLOOP,
 
     /** While-loops, of type WhileLoop.
      */
-    public static final int WHILELOOP = DOLOOP + 1;
+        WHILELOOP,
 
     /** For-loops, of type ForLoop.
      */
-    public static final int FORLOOP = WHILELOOP + 1;
+        FORLOOP,
 
     /** Foreach-loops, of type ForeachLoop.
      */
-    public static final int FOREACHLOOP = FORLOOP + 1;
+        FOREACHLOOP,
 
     /** Labelled statements, of type Labelled.
      */
-    public static final int LABELLED = FOREACHLOOP + 1;
+        LABELLED,
 
     /** Switch statements, of type Switch.
      */
-    public static final int SWITCH = LABELLED + 1;
+        SWITCH,
 
     /** Case parts in switch statements, of type Case.
      */
-    public static final int CASE = SWITCH + 1;
+        CASE,
 
     /** Synchronized statements, of type Synchonized.
      */
-    public static final int SYNCHRONIZED = CASE + 1;
+        SYNCHRONIZED,
 
     /** Try statements, of type Try.
      */
-    public static final int TRY = SYNCHRONIZED + 1;
+        TRY,
 
     /** Catch clauses in try statements, of type Catch.
      */
-    public static final int CATCH = TRY + 1;
+        CATCH,
 
     /** Conditional expressions, of type Conditional.
      */
-    public static final int CONDEXPR = CATCH + 1;
+        CONDEXPR,
 
     /** Conditional statements, of type If.
      */
-    public static final int IF = CONDEXPR + 1;
+        IF,
 
     /** Expression statements, of type Exec.
      */
-    public static final int EXEC = IF + 1;
+        EXEC,
 
     /** Break statements, of type Break.
      */
-    public static final int BREAK = EXEC + 1;
+        BREAK,
 
     /** Continue statements, of type Continue.
      */
-    public static final int CONTINUE = BREAK + 1;
+        CONTINUE,
 
     /** Return statements, of type Return.
      */
-    public static final int RETURN = CONTINUE + 1;
+        RETURN,
 
     /** Throw statements, of type Throw.
      */
-    public static final int THROW = RETURN + 1;
+        THROW,
 
     /** Assert statements, of type Assert.
      */
-    public static final int ASSERT = THROW + 1;
+        ASSERT,
 
     /** Method invocation expressions, of type Apply.
      */
-    public static final int APPLY = ASSERT + 1;
+        APPLY,
 
     /** Class instance creation expressions, of type NewClass.
      */
-    public static final int NEWCLASS = APPLY + 1;
+        NEWCLASS,
 
     /** Array creation expressions, of type NewArray.
      */
-    public static final int NEWARRAY = NEWCLASS + 1;
+        NEWARRAY,
 
     /** Parenthesized subexpressions, of type Parens.
      */
-    public static final int PARENS = NEWARRAY + 1;
+        PARENS,
 
     /** Assignment expressions, of type Assign.
      */
-    public static final int ASSIGN = PARENS + 1;
+        ASSIGN,
 
     /** Type cast expressions, of type TypeCast.
      */
-    public static final int TYPECAST = ASSIGN + 1;
+        TYPECAST,
 
     /** Type test expressions, of type TypeTest.
      */
-    public static final int TYPETEST = TYPECAST + 1;
+        TYPETEST,
 
     /** Indexed array expressions, of type Indexed.
      */
-    public static final int INDEXED = TYPETEST + 1;
+        INDEXED,
 
     /** Selections, of type Select.
      */
-    public static final int SELECT = INDEXED + 1;
+        SELECT,
 
     /** Simple identifiers, of type Ident.
      */
-    public static final int IDENT = SELECT + 1;
+        IDENT,
 
     /** Literals, of type Literal.
      */
-    public static final int LITERAL = IDENT + 1;
+        LITERAL,
 
     /** Basic type identifiers, of type TypeIdent.
      */
-    public static final int TYPEIDENT = LITERAL + 1;
+        TYPEIDENT,
 
     /** Array types, of type TypeArray.
      */
-    public static final int TYPEARRAY = TYPEIDENT + 1;
+        TYPEARRAY,
 
     /** Parameterized types, of type TypeApply.
      */
-    public static final int TYPEAPPLY = TYPEARRAY + 1;
+        TYPEAPPLY,
 
     /** Union types, of type TypeUnion
      */
-    public static final int TYPEUNION = TYPEAPPLY + 1;
+        TYPEUNION,
 
     /** Formal type parameters, of type TypeParameter.
      */
-    public static final int TYPEPARAMETER = TYPEUNION + 1;
+        TYPEPARAMETER,
 
     /** Type argument.
      */
-    public static final int WILDCARD = TYPEPARAMETER + 1;
+        WILDCARD,
 
     /** Bound kind: extends, super, exact, or unbound
      */
-    public static final int TYPEBOUNDKIND = WILDCARD + 1;
+        TYPEBOUNDKIND,
 
     /** metadata: Annotation.
      */
-    public static final int ANNOTATION = TYPEBOUNDKIND + 1;
+        ANNOTATION,
 
     /** metadata: Modifiers
      */
-    public static final int MODIFIERS = ANNOTATION + 1;
+        MODIFIERS,
 
-    public static final int ANNOTATED_TYPE = MODIFIERS + 1;
+        ANNOTATED_TYPE,
 
     /** Error trees, of type Erroneous.
      */
-    public static final int ERRONEOUS = ANNOTATED_TYPE + 1;
+        ERRONEOUS,
 
     /** Unary operators, of type Unary.
      */
-    public static final int POS = ERRONEOUS + 1;             // +
-    public static final int NEG = POS + 1;                   // -
-    public static final int NOT = NEG + 1;                   // !
-    public static final int COMPL = NOT + 1;                 // ~
-    public static final int PREINC = COMPL + 1;              // ++ _
-    public static final int PREDEC = PREINC + 1;             // -- _
-    public static final int POSTINC = PREDEC + 1;            // _ ++
-    public static final int POSTDEC = POSTINC + 1;           // _ --
+        POS,                             // +
+        NEG,                             // -
+        NOT,                             // !
+        COMPL,                           // ~
+        PREINC,                          // ++ _
+        PREDEC,                          // -- _
+        POSTINC,                         // _ ++
+        POSTDEC,                         // _ --
 
     /** unary operator for null reference checks, only used internally.
      */
-    public static final int NULLCHK = POSTDEC + 1;
+        NULLCHK,
 
     /** Binary operators, of type Binary.
      */
-    public static final int OR = NULLCHK + 1;                // ||
-    public static final int AND = OR + 1;                    // &&
-    public static final int BITOR = AND + 1;                 // |
-    public static final int BITXOR = BITOR + 1;              // ^
-    public static final int BITAND = BITXOR + 1;             // &
-    public static final int EQ = BITAND + 1;                 // ==
-    public static final int NE = EQ + 1;                     // !=
-    public static final int LT = NE + 1;                     // <
-    public static final int GT = LT + 1;                     // >
-    public static final int LE = GT + 1;                     // <=
-    public static final int GE = LE + 1;                     // >=
-    public static final int SL = GE + 1;                     // <<
-    public static final int SR = SL + 1;                     // >>
-    public static final int USR = SR + 1;                    // >>>
-    public static final int PLUS = USR + 1;                  // +
-    public static final int MINUS = PLUS + 1;                // -
-    public static final int MUL = MINUS + 1;                 // *
-    public static final int DIV = MUL + 1;                   // /
-    public static final int MOD = DIV + 1;                   // %
+        OR,                              // ||
+        AND,                             // &&
+        BITOR,                           // |
+        BITXOR,                          // ^
+        BITAND,                          // &
+        EQ,                              // ==
+        NE,                              // !=
+        LT,                              // <
+        GT,                              // >
+        LE,                              // <=
+        GE,                              // >=
+        SL,                              // <<
+        SR,                              // >>
+        USR,                             // >>>
+        PLUS,                            // +
+        MINUS,                           // -
+        MUL,                             // *
+        DIV,                             // /
+        MOD,                             // %
 
     /** Assignment operators, of type Assignop.
      */
-    public static final int BITOR_ASG = MOD + 1;             // |=
-    public static final int BITXOR_ASG = BITOR_ASG + 1;      // ^=
-    public static final int BITAND_ASG = BITXOR_ASG + 1;     // &=
-
-    public static final int SL_ASG = SL + BITOR_ASG - BITOR; // <<=
-    public static final int SR_ASG = SL_ASG + 1;             // >>=
-    public static final int USR_ASG = SR_ASG + 1;            // >>>=
-    public static final int PLUS_ASG = USR_ASG + 1;          // +=
-    public static final int MINUS_ASG = PLUS_ASG + 1;        // -=
-    public static final int MUL_ASG = MINUS_ASG + 1;         // *=
-    public static final int DIV_ASG = MUL_ASG + 1;           // /=
-    public static final int MOD_ASG = DIV_ASG + 1;           // %=
+        BITOR_ASG(BITOR),                       // |=
+        BITXOR_ASG(BITXOR),                      // ^=
+        BITAND_ASG(BITAND),                      // &=
+
+        SL_ASG(SL),                         // <<=
+        SR_ASG(SR),                          // >>=
+        USR_ASG(USR),                         // >>>=
+        PLUS_ASG(PLUS),                        // +=
+        MINUS_ASG(MINUS),                       // -=
+        MUL_ASG(MUL),                         // *=
+        DIV_ASG(DIV),                         // /=
+        MOD_ASG(MOD),                         // %=
 
     /** A synthetic let expression, of type LetExpr.
      */
-    public static final int LETEXPR = MOD_ASG + 1;           // ala scheme
+        LETEXPR;                          // ala scheme
+        
+        private Tag noAssignTag;
+        
+        private Tag(Tag noAssignTag)
+        {
+            this.noAssignTag = noAssignTag;
+        }
 
+        private Tag()
+        {
+        }
+        
+        public Tag noAssignOp()
+        {
+            if (this.noAssignTag != null)
+                return noAssignTag;
+            throw new AssertionError("JCTree.Tag.noAssignOp() method is not available for non assignment tags");
+        }
+    }
 
     /** The offset between assignment operators and normal operators.
      */
-    public static final int ASGOffset = BITOR_ASG - BITOR;
+    //public static final int ASGOffset = BITOR_ASG - BITOR;
 
     /* The (encoded) position in the source file. @see util.Position.
      */
     public int pos;
 

@@ -335,11 +357,11 @@
      */
     public Type type;
 
     /* The tag of this node -- one of the constants declared above.
      */
-    public abstract int getTag();
+    public abstract JCTree.Tag getTag();
 
     /** Convert a tree to a pretty-printed string. */
     @Override
     public String toString() {
         StringWriter s = new StringWriter();

@@ -462,14 +484,14 @@
             return packageAnnotations;
         }
         public List<JCImport> getImports() {
             ListBuffer<JCImport> imports = new ListBuffer<JCImport>();
             for (JCTree tree : defs) {
-                int tag = tree.getTag();
-                if (tag == IMPORT)
+                JCTree.Tag tag = tree.getTag();
+                if (tag == JCTree.Tag.IMPORT)
                     imports.append((JCImport)tree);
-                else if (tag != SKIP)
+                else if (tag != JCTree.Tag.SKIP)
                     break;
             }
             return imports.toList();
         }
         public JCExpression getPackageName() { return pid; }

@@ -480,22 +502,22 @@
             return lineMap;
         }
         public List<JCTree> getTypeDecls() {
             List<JCTree> typeDefs;
             for (typeDefs = defs; !typeDefs.isEmpty(); typeDefs = typeDefs.tail)
-                if (typeDefs.head.getTag() != IMPORT)
+                if (typeDefs.head.getTag() != JCTree.Tag.IMPORT)
                     break;
             return typeDefs;
         }
         @Override
         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
             return v.visitCompilationUnit(this, d);
         }
 
         @Override
-        public int getTag() {
-            return TOPLEVEL;
+        public JCTree.Tag getTag() {
+            return JCTree.Tag.TOPLEVEL;
         }
     }
 
     /**
      * An import clause.

@@ -519,12 +541,12 @@
         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
             return v.visitImport(this, d);
         }
 
         @Override
-        public int getTag() {
-            return IMPORT;
+        public JCTree.Tag getTag() {
+            return JCTree.Tag.IMPORT;
         }
     }
 
     public static abstract class JCStatement extends JCTree implements StatementTree {
         @Override

@@ -616,12 +638,12 @@
         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
             return v.visitClass(this, d);
         }
 
         @Override
-        public int getTag() {
-            return CLASSDEF;
+        public JCTree.Tag getTag() {
+            return JCTree.Tag.CLASSDEF;
         }
     }
 
     /**
      * A method definition.

@@ -688,12 +710,12 @@
         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
             return v.visitMethod(this, d);
         }
 
         @Override
-        public int getTag() {
-            return METHODDEF;
+        public JCTree.Tag getTag() {
+            return JCTree.Tag.METHODDEF;
         }
   }
 
     /**
      * A variable definition.

@@ -734,12 +756,12 @@
         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
             return v.visitVariable(this, d);
         }
 
         @Override
-        public int getTag() {
-            return VARDEF;
+        public JCTree.Tag getTag() {
+            return JCTree.Tag.VARDEF;
         }
     }
 
       /**
      * A no-op statement ";".

@@ -755,12 +777,12 @@
         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
             return v.visitEmptyStatement(this, d);
         }
 
         @Override
-        public int getTag() {
-            return SKIP;
+        public JCTree.Tag getTag() {
+            return JCTree.Tag.SKIP;
         }
     }
 
     /**
      * A statement block.

@@ -788,12 +810,12 @@
         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
             return v.visitBlock(this, d);
         }
 
         @Override
-        public int getTag() {
-            return BLOCK;
+        public JCTree.Tag getTag() {
+            return JCTree.Tag.BLOCK;
         }
     }
 
     /**
      * A do loop

@@ -815,12 +837,12 @@
         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
             return v.visitDoWhileLoop(this, d);
         }
 
         @Override
-        public int getTag() {
-            return DOLOOP;
+        public JCTree.Tag getTag() {
+            return JCTree.Tag.DOLOOP;
         }
     }
 
     /**
      * A while loop

@@ -842,12 +864,12 @@
         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
             return v.visitWhileLoop(this, d);
         }
 
         @Override
-        public int getTag() {
-            return WHILELOOP;
+        public JCTree.Tag getTag() {
+            return JCTree.Tag.WHILELOOP;
         }
     }
 
     /**
      * A for loop.

@@ -883,12 +905,12 @@
         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
             return v.visitForLoop(this, d);
         }
 
         @Override
-        public int getTag() {
-            return FORLOOP;
+        public JCTree.Tag getTag() {
+            return JCTree.Tag.FORLOOP;
         }
     }
 
     /**
      * The enhanced for loop.

@@ -912,12 +934,12 @@
         @Override
         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
             return v.visitEnhancedForLoop(this, d);
         }
         @Override
-        public int getTag() {
-            return FOREACHLOOP;
+        public JCTree.Tag getTag() {
+            return JCTree.Tag.FOREACHLOOP;
         }
     }
 
     /**
      * A labelled expression or statement.

@@ -937,12 +959,12 @@
         @Override
         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
             return v.visitLabeledStatement(this, d);
         }
         @Override
-        public int getTag() {
-            return LABELLED;
+        public JCTree.Tag getTag() {
+            return JCTree.Tag.LABELLED;
         }
     }
 
     /**
      * A "switch ( ) { }" construction.

@@ -963,12 +985,12 @@
         @Override
         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
             return v.visitSwitch(this, d);
         }
         @Override
-        public int getTag() {
-            return SWITCH;
+        public JCTree.Tag getTag() {
+            return JCTree.Tag.SWITCH;
         }
     }
 
     /**
      * A "case  :" of a switch.

@@ -989,12 +1011,12 @@
         @Override
         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
             return v.visitCase(this, d);
         }
         @Override
-        public int getTag() {
-            return CASE;
+        public JCTree.Tag getTag() {
+            return JCTree.Tag.CASE;
         }
     }
 
     /**
      * A synchronized block.

@@ -1015,12 +1037,12 @@
         @Override
         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
             return v.visitSynchronized(this, d);
         }
         @Override
-        public int getTag() {
-            return SYNCHRONIZED;
+        public JCTree.Tag getTag() {
+            return JCTree.Tag.SYNCHRONIZED;
         }
     }
 
     /**
      * A "try { } catch ( ) { } finally { }" block.

@@ -1055,12 +1077,12 @@
         @Override
         public List<? extends JCTree> getResources() {
             return resources;
         }
         @Override
-        public int getTag() {
-            return TRY;
+        public JCTree.Tag getTag() {
+            return JCTree.Tag.TRY;
         }
     }
 
     /**
      * A catch block.

@@ -1081,12 +1103,12 @@
         @Override
         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
             return v.visitCatch(this, d);
         }
         @Override
-        public int getTag() {
-            return CATCH;
+        public JCTree.Tag getTag() {
+            return JCTree.Tag.CATCH;
         }
     }
 
     /**
      * A ( ) ? ( ) : ( ) conditional expression

@@ -1113,12 +1135,12 @@
         @Override
         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
             return v.visitConditionalExpression(this, d);
         }
         @Override
-        public int getTag() {
-            return CONDEXPR;
+        public JCTree.Tag getTag() {
+            return JCTree.Tag.CONDEXPR;
         }
     }
 
     /**
      * An "if ( ) { } else { }" block

@@ -1145,12 +1167,12 @@
         @Override
         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
             return v.visitIf(this, d);
         }
         @Override
-        public int getTag() {
-            return IF;
+        public JCTree.Tag getTag() {
+            return JCTree.Tag.IF;
         }
     }
 
     /**
      * an expression statement

@@ -1170,12 +1192,12 @@
         @Override
         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
             return v.visitExpressionStatement(this, d);
         }
         @Override
-        public int getTag() {
-            return EXEC;
+        public JCTree.Tag getTag() {
+            return JCTree.Tag.EXEC;
         }
 
         /** Convert a expression-statement tree to a pretty-printed string. */
         @Override
         public String toString() {

@@ -1210,12 +1232,12 @@
         @Override
         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
             return v.visitBreak(this, d);
         }
         @Override
-        public int getTag() {
-            return BREAK;
+        public JCTree.Tag getTag() {
+            return JCTree.Tag.BREAK;
         }
     }
 
     /**
      * A continue of a loop.

@@ -1235,12 +1257,12 @@
         @Override
         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
             return v.visitContinue(this, d);
         }
         @Override
-        public int getTag() {
-            return CONTINUE;
+        public JCTree.Tag getTag() {
+            return JCTree.Tag.CONTINUE;
         }
     }
 
     /**
      * A return statement.

@@ -1258,12 +1280,12 @@
         @Override
         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
             return v.visitReturn(this, d);
         }
         @Override
-        public int getTag() {
-            return RETURN;
+        public JCTree.Tag getTag() {
+            return JCTree.Tag.RETURN;
         }
     }
 
     /**
      * A throw statement.

@@ -1281,12 +1303,12 @@
         @Override
         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
             return v.visitThrow(this, d);
         }
         @Override
-        public int getTag() {
-            return THROW;
+        public JCTree.Tag getTag() {
+            return JCTree.Tag.THROW;
         }
     }
 
     /**
      * An assert statement.

@@ -1307,12 +1329,12 @@
         @Override
         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
             return v.visitAssert(this, d);
         }
         @Override
-        public int getTag() {
-            return ASSERT;
+        public JCTree.Tag getTag() {
+            return JCTree.Tag.ASSERT;
         }
     }
 
     /**
      * A method invocation

@@ -1350,12 +1372,12 @@
         public JCMethodInvocation setType(Type type) {
             super.setType(type);
             return this;
         }
         @Override
-        public int getTag() {
-            return(APPLY);
+        public JCTree.Tag getTag() {
+            return(JCTree.Tag.APPLY);
         }
     }
 
     /**
      * A new(...) operation.

@@ -1400,12 +1422,12 @@
         @Override
         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
             return v.visitNewClass(this, d);
         }
         @Override
-        public int getTag() {
-            return NEWCLASS;
+        public JCTree.Tag getTag() {
+            return JCTree.Tag.NEWCLASS;
         }
     }
 
     /**
      * A new[...] operation.

@@ -1436,12 +1458,12 @@
         @Override
         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
             return v.visitNewArray(this, d);
         }
         @Override
-        public int getTag() {
-            return NEWARRAY;
+        public JCTree.Tag getTag() {
+            return JCTree.Tag.NEWARRAY;
         }
     }
 
     /**
      * A parenthesized subexpression ( ... )

@@ -1459,12 +1481,12 @@
         @Override
         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
             return v.visitParenthesized(this, d);
         }
         @Override
-        public int getTag() {
-            return PARENS;
+        public JCTree.Tag getTag() {
+            return JCTree.Tag.PARENS;
         }
     }
 
     /**
      * A assignment with "=".

@@ -1485,24 +1507,24 @@
         @Override
         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
             return v.visitAssignment(this, d);
         }
         @Override
-        public int getTag() {
-            return ASSIGN;
+        public JCTree.Tag getTag() {
+            return JCTree.Tag.ASSIGN;
         }
     }
 
     /**
      * An assignment with "+=", "|=" ...
      */
     public static class JCAssignOp extends JCExpression implements CompoundAssignmentTree {
-        private int opcode;
+        private JCTree.Tag opcode;
         public JCExpression lhs;
         public JCExpression rhs;
         public Symbol operator;
-        protected JCAssignOp(int opcode, JCTree lhs, JCTree rhs, Symbol operator) {
+        protected JCAssignOp(JCTree.Tag opcode, JCTree lhs, JCTree rhs, Symbol operator) {
             this.opcode = opcode;
             this.lhs = (JCExpression)lhs;
             this.rhs = (JCExpression)rhs;
             this.operator = operator;
         }

@@ -1518,23 +1540,23 @@
         @Override
         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
             return v.visitCompoundAssignment(this, d);
         }
         @Override
-        public int getTag() {
+        public JCTree.Tag getTag() {
             return opcode;
         }
     }
 
     /**
      * A unary operation.
      */
     public static class JCUnary extends JCExpression implements UnaryTree {
-        private int opcode;
+        private JCTree.Tag opcode;
         public JCExpression arg;
         public Symbol operator;
-        protected JCUnary(int opcode, JCExpression arg) {
+        protected JCUnary(JCTree.Tag opcode, JCExpression arg) {
             this.opcode = opcode;
             this.arg = arg;
         }
         @Override
         public void accept(Visitor v) { v.visitUnary(this); }

@@ -1547,28 +1569,28 @@
         @Override
         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
             return v.visitUnary(this, d);
         }
         @Override
-        public int getTag() {
+        public JCTree.Tag getTag() {
             return opcode;
         }
 
-        public void setTag(int tag) {
+        public void setTag(JCTree.Tag tag) {
             opcode = tag;
         }
     }
 
     /**
      * A binary operation.
      */
     public static class JCBinary extends JCExpression implements BinaryTree {
-        private int opcode;
+        private JCTree.Tag opcode;
         public JCExpression lhs;
         public JCExpression rhs;
         public Symbol operator;
-        protected JCBinary(int opcode,
+        protected JCBinary(JCTree.Tag opcode,
                          JCExpression lhs,
                          JCExpression rhs,
                          Symbol operator) {
             this.opcode = opcode;
             this.lhs = lhs;

@@ -1587,11 +1609,11 @@
         @Override
         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
             return v.visitBinary(this, d);
         }
         @Override
-        public int getTag() {
+        public JCTree.Tag getTag() {
             return opcode;
         }
     }
 
     /**

@@ -1613,12 +1635,12 @@
         @Override
         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
             return v.visitTypeCast(this, d);
         }
         @Override
-        public int getTag() {
-            return TYPECAST;
+        public JCTree.Tag getTag() {
+            return JCTree.Tag.TYPECAST;
         }
     }
 
     /**
      * A type test.

@@ -1639,12 +1661,12 @@
         @Override
         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
             return v.visitInstanceOf(this, d);
         }
         @Override
-        public int getTag() {
-            return TYPETEST;
+        public JCTree.Tag getTag() {
+            return JCTree.Tag.TYPETEST;
         }
     }
 
     /**
      * An array selection

@@ -1665,12 +1687,12 @@
         @Override
         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
             return v.visitArrayAccess(this, d);
         }
         @Override
-        public int getTag() {
-            return INDEXED;
+        public JCTree.Tag getTag() {
+            return JCTree.Tag.INDEXED;
         }
     }
 
     /**
      * Selects through packages and classes

@@ -1696,12 +1718,12 @@
         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
             return v.visitMemberSelect(this, d);
         }
         public Name getIdentifier() { return name; }
         @Override
-        public int getTag() {
-            return SELECT;
+        public JCTree.Tag getTag() {
+            return JCTree.Tag.SELECT;
         }
     }
 
     /**
      * An identifier

@@ -1722,12 +1744,12 @@
         public Name getName() { return name; }
         @Override
         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
             return v.visitIdentifier(this, d);
         }
-        public int getTag() {
-            return IDENT;
+        public JCTree.Tag getTag() {
+            return JCTree.Tag.IDENT;
         }
     }
 
     /**
      * A constant value given literally.

@@ -1788,12 +1810,12 @@
         public JCLiteral setType(Type type) {
             super.setType(type);
             return this;
         }
         @Override
-        public int getTag() {
-            return LITERAL;
+        public JCTree.Tag getTag() {
+            return JCTree.Tag.LITERAL;
         }
     }
 
     /**
      * Identifies a basic type.

@@ -1836,12 +1858,12 @@
         @Override
         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
             return v.visitPrimitiveType(this, d);
         }
         @Override
-        public int getTag() {
-            return TYPEIDENT;
+        public JCTree.Tag getTag() {
+            return JCTree.Tag.TYPEIDENT;
         }
     }
 
     /**
      * An array type, A[]

@@ -1859,12 +1881,12 @@
         @Override
         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
             return v.visitArrayType(this, d);
         }
         @Override
-        public int getTag() {
-            return TYPEARRAY;
+        public JCTree.Tag getTag() {
+            return JCTree.Tag.TYPEARRAY;
         }
     }
 
     /**
      * A parameterized type, T<...>

@@ -1887,12 +1909,12 @@
         @Override
         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
             return v.visitParameterizedType(this, d);
         }
         @Override
-        public int getTag() {
-            return TYPEAPPLY;
+        public JCTree.Tag getTag() {
+            return JCTree.Tag.TYPEAPPLY;
         }
     }
 
     /**
      * A union type, T1 | T2 | ... Tn (used in multicatch statements)

@@ -1915,12 +1937,12 @@
         @Override
         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
             return v.visitUnionType(this, d);
         }
         @Override
-        public int getTag() {
-            return TYPEUNION;
+        public JCTree.Tag getTag() {
+            return JCTree.Tag.TYPEUNION;
         }
     }
 
     /**
      * A formal class parameter.

@@ -1945,12 +1967,12 @@
         @Override
         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
             return v.visitTypeParameter(this, d);
         }
         @Override
-        public int getTag() {
-            return TYPEPARAMETER;
+        public JCTree.Tag getTag() {
+            return JCTree.Tag.TYPEPARAMETER;
         }
     }
 
     public static class JCWildcard extends JCExpression implements WildcardTree {
         public TypeBoundKind kind;

@@ -1979,12 +2001,12 @@
         @Override
         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
             return v.visitWildcard(this, d);
         }
         @Override
-        public int getTag() {
-            return WILDCARD;
+        public JCTree.Tag getTag() {
+            return JCTree.Tag.WILDCARD;
         }
     }
 
     public static class TypeBoundKind extends JCTree {
         public BoundKind kind;

@@ -2000,12 +2022,12 @@
         @Override
         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
             throw new AssertionError("TypeBoundKind is not part of a public API");
         }
         @Override
-        public int getTag() {
-            return TYPEBOUNDKIND;
+        public JCTree.Tag getTag() {
+            return JCTree.Tag.TYPEBOUNDKIND;
         }
     }
 
     public static class JCAnnotation extends JCExpression implements AnnotationTree {
         public JCTree annotationType;

@@ -2025,12 +2047,12 @@
         @Override
         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
             return v.visitAnnotation(this, d);
         }
         @Override
-        public int getTag() {
-            return ANNOTATION;
+        public JCTree.Tag getTag() {
+            return JCTree.Tag.ANNOTATION;
         }
     }
 
     public static class JCModifiers extends JCTree implements com.sun.source.tree.ModifiersTree {
         public long flags;

@@ -2052,12 +2074,12 @@
         @Override
         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
             return v.visitModifiers(this, d);
         }
         @Override
-        public int getTag() {
-            return MODIFIERS;
+        public JCTree.Tag getTag() {
+            return JCTree.Tag.MODIFIERS;
         }
     }
 
     public static class JCErroneous extends JCExpression
             implements com.sun.source.tree.ErroneousTree {

@@ -2077,12 +2099,12 @@
         @Override
         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
             return v.visitErroneous(this, d);
         }
         @Override
-        public int getTag() {
-            return ERRONEOUS;
+        public JCTree.Tag getTag() {
+            return JCTree.Tag.ERRONEOUS;
         }
     }
 
     /** (let int x = 3; in x+2) */
     public static class LetExpr extends JCExpression {

@@ -2101,12 +2123,12 @@
         @Override
         public <R,D> R accept(TreeVisitor<R,D> v, D d) {
             throw new AssertionError("LetExpr is not part of a public API");
         }
         @Override
-        public int getTag() {
-            return LETEXPR;
+        public JCTree.Tag getTag() {
+            return JCTree.Tag.LETEXPR;
         }
     }
 
     /** An interface for tree factories
      */

@@ -2173,13 +2195,13 @@
         JCNewArray NewArray(JCExpression elemtype,
                           List<JCExpression> dims,
                           List<JCExpression> elems);
         JCParens Parens(JCExpression expr);
         JCAssign Assign(JCExpression lhs, JCExpression rhs);
-        JCAssignOp Assignop(int opcode, JCTree lhs, JCTree rhs);
-        JCUnary Unary(int opcode, JCExpression arg);
-        JCBinary Binary(int opcode, JCExpression lhs, JCExpression rhs);
+        JCAssignOp Assignop(JCTree.Tag opcode, JCTree lhs, JCTree rhs);
+        JCUnary Unary(JCTree.Tag opcode, JCExpression arg);
+        JCBinary Binary(JCTree.Tag opcode, JCExpression lhs, JCExpression rhs);
         JCTypeCast TypeCast(JCTree expr, JCExpression type);
         JCInstanceOf TypeTest(JCExpression expr, JCTree clazz);
         JCArrayAccess Indexed(JCExpression indexed, JCExpression index);
         JCFieldAccess Select(JCExpression selected, Name selector);
         JCIdent Ident(Name idname);