6570730: com.sun.source.tree.ModifiersTree.getFlags() should return class type
Reviewed-by: mcimadamore
--- 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;
+ }
+}