6570730: com.sun.source.tree.ModifiersTree.getFlags() should return class type
authorjjg
Fri, 27 Aug 2010 17:21:17 -0700
changeset 6580 d3d578d22cc7
parent 6579 a344cff45d06
child 6581 f58f0ce45802
6570730: com.sun.source.tree.ModifiersTree.getFlags() should return class type Reviewed-by: mcimadamore
langtools/src/share/classes/com/sun/source/tree/Tree.java
langtools/src/share/classes/com/sun/tools/javac/tree/JCTree.java
langtools/test/tools/javac/T6341023.java
langtools/test/tools/javac/tree/ClassTreeTest.java
langtools/test/tools/javac/tree/TreeKindTest.java
--- a/langtools/src/share/classes/com/sun/source/tree/Tree.java	Fri Aug 27 17:14:51 2010 -0700
+++ b/langtools/src/share/classes/com/sun/source/tree/Tree.java	Fri Aug 27 17:21:17 2010 -0700
@@ -94,7 +94,7 @@
         CATCH(CatchTree.class),
 
         /**
-         * Used for instances of {@link ClassTree}.
+         * Used for instances of {@link ClassTree} representing classes.
          */
         CLASS(ClassTree.class),
 
@@ -558,6 +558,21 @@
         ERRONEOUS(ErroneousTree.class),
 
         /**
+         * Used for instances of {@link ClassTree} representing interfaces.
+         */
+        INTERFACE(ClassTree.class),
+
+        /**
+         * Used for instances of {@link ClassTree} representing enums.
+         */
+        ENUM(ClassTree.class),
+
+        /**
+         * Used for instances of {@link ClassTree} representing annotation types.
+         */
+        ANNOTATION_TYPE(ClassTree.class),
+
+        /**
          * An implementation-reserved node. This is the not the node
          * you are looking for.
          */
--- a/langtools/src/share/classes/com/sun/tools/javac/tree/JCTree.java	Fri Aug 27 17:14:51 2010 -0700
+++ b/langtools/src/share/classes/com/sun/tools/javac/tree/JCTree.java	Fri Aug 27 17:21:17 2010 -0700
@@ -340,6 +340,7 @@
     public abstract int getTag();
 
     /** Convert a tree to a pretty-printed string. */
+    @Override
     public String toString() {
         StringWriter s = new StringWriter();
         try {
@@ -375,6 +376,7 @@
 
     /** Return a shallow copy of this tree.
      */
+    @Override
     public Object clone() {
         try {
             return super.clone();
@@ -587,7 +589,17 @@
         @Override
         public void accept(Visitor v) { v.visitClassDef(this); }
 
-        public Kind getKind() { return Kind.CLASS; }
+        public Kind getKind() {
+            if ((mods.flags & Flags.ANNOTATION) != 0)
+                return Kind.ANNOTATION_TYPE;
+            else if ((mods.flags & Flags.INTERFACE) != 0)
+                return Kind.INTERFACE;
+            else if ((mods.flags & Flags.ENUM) != 0)
+                return Kind.ENUM;
+            else
+                return Kind.CLASS;
+        }
+
         public JCModifiers getModifiers() { return mods; }
         public Name getSimpleName() { return name; }
         public List<JCTypeParameter> getTypeParameters() {
--- a/langtools/test/tools/javac/T6341023.java	Fri Aug 27 17:14:51 2010 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,125 +0,0 @@
-/*
- * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-/*
- * @test
- * @bug 6341023
- * @summary Tree API: Tree.Kind should have mapping to interface
- */
-
-import com.sun.source.tree.*;
-
-public class T6341023 {
-    public static void main(String... args) {
-        boolean ok = true;
-
-        for (Tree.Kind k: Tree.Kind.values()) {
-            //System.err.println(k + " " + k.asInterface());
-            Class<? extends Tree> i = k.asInterface();
-            switch (k) {
-            case POSTFIX_INCREMENT:
-            case POSTFIX_DECREMENT:
-            case PREFIX_INCREMENT:
-            case PREFIX_DECREMENT:
-            case UNARY_PLUS:
-            case UNARY_MINUS:
-            case BITWISE_COMPLEMENT:
-            case LOGICAL_COMPLEMENT:
-                ok = ok & verify(k, i, i == UnaryTree.class);
-                break;
-
-            case MULTIPLY:
-            case DIVIDE:
-            case REMAINDER:
-            case PLUS:
-            case MINUS:
-            case LEFT_SHIFT:
-            case RIGHT_SHIFT:
-            case UNSIGNED_RIGHT_SHIFT:
-            case LESS_THAN:
-            case GREATER_THAN:
-            case LESS_THAN_EQUAL:
-            case GREATER_THAN_EQUAL:
-            case EQUAL_TO:
-            case NOT_EQUAL_TO:
-            case AND:
-            case XOR:
-            case OR:
-            case CONDITIONAL_AND:
-            case CONDITIONAL_OR:
-                ok = ok & verify(k, i, i == BinaryTree.class);
-                break;
-
-            case MULTIPLY_ASSIGNMENT:
-            case DIVIDE_ASSIGNMENT:
-            case REMAINDER_ASSIGNMENT:
-            case PLUS_ASSIGNMENT:
-            case MINUS_ASSIGNMENT:
-            case LEFT_SHIFT_ASSIGNMENT:
-            case RIGHT_SHIFT_ASSIGNMENT:
-            case UNSIGNED_RIGHT_SHIFT_ASSIGNMENT:
-            case AND_ASSIGNMENT:
-            case XOR_ASSIGNMENT:
-            case OR_ASSIGNMENT:
-                ok = ok & verify(k, i, i == CompoundAssignmentTree.class);
-                break;
-
-            case INT_LITERAL:
-            case LONG_LITERAL:
-            case FLOAT_LITERAL:
-            case DOUBLE_LITERAL:
-            case BOOLEAN_LITERAL:
-            case CHAR_LITERAL:
-            case STRING_LITERAL:
-            case NULL_LITERAL:
-                ok = ok & verify(k, i, i == LiteralTree.class);
-                break;
-
-            case UNBOUNDED_WILDCARD:
-            case EXTENDS_WILDCARD:
-            case SUPER_WILDCARD:
-                ok = ok & verify(k, i, i == WildcardTree.class);
-                break;
-
-            case OTHER:
-                ok = ok & verify(k, i, i == null);
-                break;
-
-            default:
-                String ks = k.toString().replace("_", "") + "tree";
-                String iName = i.getName();
-                String is = iName.substring(iName.lastIndexOf(".") + 1);
-                ok = ok & verify(k, i, ks.equalsIgnoreCase(is));
-            }
-        }
-
-        if (!ok)
-            throw new AssertionError("test failed");
-    }
-
-    static boolean verify(Tree.Kind k, Class<?> c, boolean b) {
-        if (!b)
-            System.err.println("error: " + k + " " + c);
-        return b;
-    }
-}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/tree/ClassTreeTest.java	Fri Aug 27 17:21:17 2010 -0700
@@ -0,0 +1,102 @@
+/*
+ * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 6570730
+ * @summary com.sun.source.tree.ModifiersTree.getFlags() should return class type
+ */
+
+import java.io.*;
+import java.util.*;
+import javax.tools.*;
+import com.sun.source.tree.*;
+import com.sun.source.util.*;
+import com.sun.tools.javac.api.*;
+
+public class ClassTreeTest {
+    public static void main(String... args) throws Exception {
+        new ClassTreeTest().run();
+    }
+
+    void run() throws Exception {
+        JavacTool tool = JavacTool.create();
+        StandardJavaFileManager fm = tool.getStandardFileManager(null, null, null);
+        List<String> opts = Collections.<String>emptyList();
+        File testSrc = new File(System.getProperty("test.src"));
+        File thisFile = new File(testSrc, ClassTreeTest.class.getSimpleName() + ".java");
+        Iterable<? extends JavaFileObject> fos = fm.getJavaFileObjects(thisFile);
+        JavacTask task = tool.getTask(null, fm, null, opts, null, fos);
+        for (CompilationUnitTree cu: task.parse()) {
+            check(cu, "CLASS", Tree.Kind.CLASS);
+            check(cu, "INTERFACE", Tree.Kind.INTERFACE);
+            check(cu, "ENUM", Tree.Kind.ENUM);
+            check(cu, "ANNOTATION_TYPE", Tree.Kind.ANNOTATION_TYPE);
+        }
+
+        int expected = 4;
+        if (checks != expected)
+            error("Unexpected number of checks performed; expected: " + expected + ", found: " + checks);
+
+        if (errors > 0)
+            throw new Exception(errors + " errors found");
+    }
+
+    void check(CompilationUnitTree cu, String name, Tree.Kind k) {
+        checks++;
+
+        TreeScanner<ClassTree,String> s = new TreeScanner<ClassTree,String>() {
+            @Override
+            public ClassTree visitClass(ClassTree c, String name) {
+                if (c.getSimpleName().toString().equals(name))
+                    return c;
+                else
+                    return super.visitClass(c, name);
+            }
+
+            @Override
+            public ClassTree reduce(ClassTree t1, ClassTree t2) {
+                return (t1 != null ? t1 : t2);
+            }
+        };
+
+        ClassTree c = s.scan(cu, name);
+        if (c == null)
+            error("Can't find node named " + name);
+        else if (c.getKind() != k)
+            error("Unexpected kind for node named " + name + ": expected: " + k + ", found: " + c.getKind());
+    }
+
+    void error(String msg) {
+        System.err.println("Error: " + msg);
+        errors++;
+    }
+
+    int checks;
+    int errors;
+
+    class CLASS { }
+    interface INTERFACE { }
+    enum ENUM { }
+    @interface ANNOTATION_TYPE { }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/tree/TreeKindTest.java	Fri Aug 27 17:21:17 2010 -0700
@@ -0,0 +1,132 @@
+/*
+ * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 6341023
+ * @summary Tree API: Tree.Kind should have mapping to interface
+ */
+
+import com.sun.source.tree.*;
+
+public class TreeKindTest{
+    public static void main(String... args) {
+        boolean ok = true;
+
+        for (Tree.Kind k: Tree.Kind.values()) {
+            //System.err.println(k + " " + k.asInterface());
+            Class<? extends Tree> i = k.asInterface();
+            switch (k) {
+            case POSTFIX_INCREMENT:
+            case POSTFIX_DECREMENT:
+            case PREFIX_INCREMENT:
+            case PREFIX_DECREMENT:
+            case UNARY_PLUS:
+            case UNARY_MINUS:
+            case BITWISE_COMPLEMENT:
+            case LOGICAL_COMPLEMENT:
+                ok = ok & verify(k, i, i == UnaryTree.class);
+                break;
+
+            case MULTIPLY:
+            case DIVIDE:
+            case REMAINDER:
+            case PLUS:
+            case MINUS:
+            case LEFT_SHIFT:
+            case RIGHT_SHIFT:
+            case UNSIGNED_RIGHT_SHIFT:
+            case LESS_THAN:
+            case GREATER_THAN:
+            case LESS_THAN_EQUAL:
+            case GREATER_THAN_EQUAL:
+            case EQUAL_TO:
+            case NOT_EQUAL_TO:
+            case AND:
+            case XOR:
+            case OR:
+            case CONDITIONAL_AND:
+            case CONDITIONAL_OR:
+                ok = ok & verify(k, i, i == BinaryTree.class);
+                break;
+
+            case MULTIPLY_ASSIGNMENT:
+            case DIVIDE_ASSIGNMENT:
+            case REMAINDER_ASSIGNMENT:
+            case PLUS_ASSIGNMENT:
+            case MINUS_ASSIGNMENT:
+            case LEFT_SHIFT_ASSIGNMENT:
+            case RIGHT_SHIFT_ASSIGNMENT:
+            case UNSIGNED_RIGHT_SHIFT_ASSIGNMENT:
+            case AND_ASSIGNMENT:
+            case XOR_ASSIGNMENT:
+            case OR_ASSIGNMENT:
+                ok = ok & verify(k, i, i == CompoundAssignmentTree.class);
+                break;
+
+            case INT_LITERAL:
+            case LONG_LITERAL:
+            case FLOAT_LITERAL:
+            case DOUBLE_LITERAL:
+            case BOOLEAN_LITERAL:
+            case CHAR_LITERAL:
+            case STRING_LITERAL:
+            case NULL_LITERAL:
+                ok = ok & verify(k, i, i == LiteralTree.class);
+                break;
+
+            case UNBOUNDED_WILDCARD:
+            case EXTENDS_WILDCARD:
+            case SUPER_WILDCARD:
+                ok = ok & verify(k, i, i == WildcardTree.class);
+                break;
+
+            case INTERFACE:
+            case ANNOTATION_TYPE:
+            case ENUM:
+            case CLASS:
+                ok = ok & verify(k, i, i == ClassTree.class);
+                break;
+
+            case OTHER:
+                ok = ok & verify(k, i, i == null);
+                break;
+
+            default:
+                String ks = k.toString().replace("_", "") + "tree";
+                String iName = i.getName();
+                String is = iName.substring(iName.lastIndexOf(".") + 1);
+                ok = ok & verify(k, i, ks.equalsIgnoreCase(is));
+            }
+        }
+
+        if (!ok)
+            throw new AssertionError("test failed");
+    }
+
+    static boolean verify(Tree.Kind k, Class<?> c, boolean b) {
+        if (!b)
+            System.err.println("error: " + k + " " + c);
+        return b;
+    }
+}