7812306bc0
Reviewed-by: vromero
320 lines
14 KiB
Java
320 lines
14 KiB
Java
/*
|
|
* Copyright (c) 2014, 2016, 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 8042261
|
|
* @summary Checking what attribute is generated by annotation Deprecated
|
|
* or javadoc deprecated for field, method, class(inner/local), interface.
|
|
* @library /tools/lib /tools/javac/lib ../lib
|
|
* @modules jdk.compiler/com.sun.tools.javac.api
|
|
* jdk.compiler/com.sun.tools.javac.main
|
|
* jdk.compiler/com.sun.tools.javac.util
|
|
* jdk.jdeps/com.sun.tools.classfile
|
|
* @build toolbox.ToolBox InMemoryFileManager TestResult TestBase
|
|
* @run main DeprecatedTest
|
|
*/
|
|
|
|
import com.sun.tools.classfile.Attribute;
|
|
import com.sun.tools.classfile.ClassFile;
|
|
import com.sun.tools.classfile.ConstantPoolException;
|
|
import com.sun.tools.classfile.Deprecated_attribute;
|
|
import com.sun.tools.classfile.Field;
|
|
import com.sun.tools.classfile.InnerClasses_attribute;
|
|
import com.sun.tools.classfile.InnerClasses_attribute.Info;
|
|
import com.sun.tools.classfile.Method;
|
|
|
|
import javax.tools.JavaFileObject;
|
|
import java.io.IOException;
|
|
import java.util.Map;
|
|
|
|
public class DeprecatedTest extends TestResult {
|
|
|
|
private static final String[] sources = new String[]{
|
|
"@Deprecated public class deprecated {\n"
|
|
+ "@Deprecated class deprecatedInner01 {}\n"
|
|
+ "@Deprecated interface deprecatedInner02 {}\n"
|
|
+ "@Deprecated enum deprecatedInner03 {}\n"
|
|
+ "@Deprecated @interface deprecatedInner04 {}\n"
|
|
+ "class notDeprecatedInner01 {}\n"
|
|
+ "interface notDeprecatedInner02 {}\n"
|
|
+ "enum notDeprecatedInner03 {}\n"
|
|
+ "@interface notDeprecatedInner04 {}\n"
|
|
+ "@Deprecated public void deprecated() {}\n"
|
|
+ "@Deprecated public int deprecated;\n"
|
|
+ "public void notDeprecated() {}\n"
|
|
+ "public int notDeprecated;\n"
|
|
+ "public void f() {\n"
|
|
+ " @Deprecated class deprecatedLocal {\n"
|
|
+ " @Deprecated int deprecated;\n"
|
|
+ " @Deprecated void deprecated() {}\n"
|
|
+ " int notDeprecated;\n"
|
|
+ " void notDeprecated(){}\n"
|
|
+ " }\n"
|
|
+ " class notDeprecatedLocal {\n"
|
|
+ " @Deprecated int deprecated;\n"
|
|
+ " @Deprecated void deprecated() {}\n"
|
|
+ " int notDeprecated;\n"
|
|
+ " void notDeprecated(){}\n"
|
|
+ " }}\n"
|
|
+ "}",
|
|
"@Deprecated public interface deprecated {\n"
|
|
+ "@Deprecated class deprecatedInner01 {}\n"
|
|
+ "@Deprecated interface deprecatedInner02 {}\n"
|
|
+ "@Deprecated enum deprecatedInner03 {}\n"
|
|
+ "@Deprecated @interface deprecatedInner04 {}\n"
|
|
+ "class notDeprecatedInner01 {}\n"
|
|
+ "interface notDeprecatedInner02 {}\n"
|
|
+ "enum notDeprecatedInner03 {}\n"
|
|
+ "@interface notDeprecatedInner04 {}\n"
|
|
+ "@Deprecated void deprecated01();\n"
|
|
+ "void notDeprecated01();\n"
|
|
+ "@Deprecated default void deprecated02() {}\n"
|
|
+ "default void notDeprecated02() {}\n"
|
|
+ "@Deprecated int deprecated = 0;\n"
|
|
+ "int notDeprecated = 0;\n"
|
|
+ "}",
|
|
"@Deprecated public enum deprecated {\n"
|
|
+ "@Deprecated deprecated, notDeprecated;\n"
|
|
+ "@Deprecated class deprecatedInner01 {}\n"
|
|
+ "@Deprecated interface deprecatedInner02 {}\n"
|
|
+ "@Deprecated enum deprecatedInner03 {}\n"
|
|
+ "@Deprecated @interface deprecatedInner04 {}\n"
|
|
+ "class notDeprecatedInner01 {}\n"
|
|
+ "interface notDeprecatedInner02 {}\n"
|
|
+ "enum notDeprecatedInner03 {}\n"
|
|
+ "@interface notDeprecatedInner04 {}\n"
|
|
+ "@Deprecated public void deprecated() {}\n"
|
|
+ "public void notDeprecated() {}\n"
|
|
+ "public void f() {\n"
|
|
+ " @Deprecated class deprecatedLocal {\n"
|
|
+ " @Deprecated int deprecated;\n"
|
|
+ " @Deprecated void deprecated() {}\n"
|
|
+ " int notDeprecated;\n"
|
|
+ " void notDeprecated(){}\n"
|
|
+ " }\n"
|
|
+ " class notDeprecatedLocal {\n"
|
|
+ " @Deprecated int deprecated;\n"
|
|
+ " @Deprecated void deprecated() {}\n"
|
|
+ " int notDeprecated;\n"
|
|
+ " void notDeprecated(){}\n"
|
|
+ " }}\n"
|
|
+ "}",
|
|
"@Deprecated public @interface deprecated {\n"
|
|
+ "@Deprecated class deprecatedInner01 {}\n"
|
|
+ "@Deprecated interface deprecatedInner02 {}\n"
|
|
+ "@Deprecated enum deprecatedInner03 {}\n"
|
|
+ "@Deprecated @interface deprecatedInner04 {}\n"
|
|
+ "class notDeprecatedInner01 {}\n"
|
|
+ "interface notDeprecatedInner02 {}\n"
|
|
+ "enum notDeprecatedInner03 {}\n"
|
|
+ "@interface notDeprecatedInner04 {}\n"
|
|
+ "@Deprecated int deprecated() default 0;\n"
|
|
+ "int notDeprecated() default 0;\n"
|
|
+ "@Deprecated int deprecated = 0;\n"
|
|
+ "int notDeprecated = 0;\n"
|
|
+ "}",
|
|
"public class notDeprecated {\n"
|
|
+ "@Deprecated class deprecatedInner01 {}\n"
|
|
+ "@Deprecated interface deprecatedInner02 {}\n"
|
|
+ "@Deprecated enum deprecatedInner03 {}\n"
|
|
+ "@Deprecated @interface deprecatedInner04 {}\n"
|
|
+ "class notDeprecatedInner01 {}\n"
|
|
+ "interface notDeprecatedInner02 {}\n"
|
|
+ "enum notDeprecatedInner03 {}\n"
|
|
+ "@interface notDeprecatedInner04 {}\n"
|
|
+ "@Deprecated public void deprecated() {}\n"
|
|
+ "@Deprecated public int deprecated;\n"
|
|
+ "public void notDeprecated() {}\n"
|
|
+ "public int notDeprecated;\n"
|
|
+ "public void f() {\n"
|
|
+ " @Deprecated class deprecatedLocal {\n"
|
|
+ " @Deprecated int deprecated;\n"
|
|
+ " @Deprecated void deprecated() {}\n"
|
|
+ " int notDeprecated;\n"
|
|
+ " void notDeprecated(){}\n"
|
|
+ " }\n"
|
|
+ " class notDeprecatedLocal {\n"
|
|
+ " @Deprecated int deprecated;\n"
|
|
+ " @Deprecated void deprecated() {}\n"
|
|
+ " int notDeprecated;\n"
|
|
+ " void notDeprecated(){}\n"
|
|
+ " }}\n"
|
|
+ "}",
|
|
"public interface notDeprecated {\n"
|
|
+ "@Deprecated class deprecatedInner01 {}\n"
|
|
+ "@Deprecated interface deprecatedInner02 {}\n"
|
|
+ "@Deprecated enum deprecatedInner03 {}\n"
|
|
+ "@Deprecated @interface deprecatedInner04 {}\n"
|
|
+ "class notDeprecatedInner01 {}\n"
|
|
+ "interface notDeprecatedInner02 {}\n"
|
|
+ "enum notDeprecatedInner03 {}\n"
|
|
+ "@interface notDeprecatedInner04 {}\n"
|
|
+ "@Deprecated void deprecated01();\n"
|
|
+ "void notDeprecated01();\n"
|
|
+ "@Deprecated default void deprecated02() {}\n"
|
|
+ "default void notDeprecated02() {}\n"
|
|
+ "@Deprecated int deprecated = 0;\n"
|
|
+ "int notDeprecated = 0;\n"
|
|
+ "}",
|
|
"public enum notDeprecated {\n"
|
|
+ "@Deprecated deprecated, notDeprecated;\n"
|
|
+ "@Deprecated class deprecatedInner01 {}\n"
|
|
+ "@Deprecated interface deprecatedInner02 {}\n"
|
|
+ "@Deprecated enum deprecatedInner03 {}\n"
|
|
+ "@Deprecated @interface deprecatedInner04 {}\n"
|
|
+ "class notDeprecatedInner01 {}\n"
|
|
+ "interface notDeprecatedInner02 {}\n"
|
|
+ "enum notDeprecatedInner03 {}\n"
|
|
+ "@interface notDeprecatedInner04 {}\n"
|
|
+ "@Deprecated public void deprecated() {}\n"
|
|
+ "public void notDeprecated() {}\n"
|
|
+ "public void f() {\n"
|
|
+ " @Deprecated class deprecatedLocal {\n"
|
|
+ " @Deprecated int deprecated;\n"
|
|
+ " @Deprecated void deprecated() {}\n"
|
|
+ " int notDeprecated;\n"
|
|
+ " void notDeprecated(){}\n"
|
|
+ " }\n"
|
|
+ " class notDeprecatedLocal {\n"
|
|
+ " @Deprecated int deprecated;\n"
|
|
+ " @Deprecated void deprecated() {}\n"
|
|
+ " int notDeprecated;\n"
|
|
+ " void notDeprecated(){}\n"
|
|
+ " }}\n"
|
|
+ "}",
|
|
"public @interface notDeprecated {\n"
|
|
+ "@Deprecated class deprecatedInner01 {}\n"
|
|
+ "@Deprecated interface deprecatedInner02 {}\n"
|
|
+ "@Deprecated enum deprecatedInner03 {}\n"
|
|
+ "@Deprecated @interface deprecatedInner04 {}\n"
|
|
+ "class notDeprecatedInner01 {}\n"
|
|
+ "interface notDeprecatedInner02 {}\n"
|
|
+ "enum notDeprecatedInner03 {}\n"
|
|
+ "@interface notDeprecatedInner04 {}\n"
|
|
+ "@Deprecated int deprecated() default 0;\n"
|
|
+ "int notDeprecated() default 0;\n"
|
|
+ "@Deprecated int deprecated = 0;\n"
|
|
+ "int notDeprecated = 0;\n"
|
|
+ "}"};
|
|
|
|
public static void main(String[] args) throws TestFailedException {
|
|
new DeprecatedTest().test();
|
|
}
|
|
|
|
public void test() throws TestFailedException {
|
|
try {
|
|
for (String src : sources) {
|
|
test(src);
|
|
test(src.replaceAll("@Deprecated", "/** @deprecated */"));
|
|
}
|
|
} catch (Exception e) {
|
|
addFailure(e);
|
|
} finally {
|
|
checkStatus();
|
|
}
|
|
}
|
|
|
|
private void test(String src) {
|
|
addTestCase(src);
|
|
printf("Testing test case :\n%s\n", src);
|
|
try {
|
|
Map<String, ? extends JavaFileObject> classes = compile(src).getClasses();
|
|
String outerClassName = classes.containsKey("deprecated")
|
|
? "deprecated"
|
|
: "notDeprecated";
|
|
echo("Testing outer class : " + outerClassName);
|
|
ClassFile cf = readClassFile(classes.get(outerClassName));
|
|
Deprecated_attribute attr = (Deprecated_attribute)
|
|
cf.getAttribute(Attribute.Deprecated);
|
|
testAttribute(outerClassName, attr, cf);
|
|
testInnerClasses(cf, classes);
|
|
testMethods(cf);
|
|
testFields(cf);
|
|
} catch (Exception e) {
|
|
addFailure(e);
|
|
}
|
|
}
|
|
|
|
private void testInnerClasses(ClassFile cf, Map<String, ? extends JavaFileObject> classes)
|
|
throws ConstantPoolException, IOException {
|
|
InnerClasses_attribute innerAttr = (InnerClasses_attribute)
|
|
cf.getAttribute(Attribute.InnerClasses);
|
|
for (Info innerClass : innerAttr.classes) {
|
|
String innerClassName = cf.constant_pool.
|
|
getClassInfo(innerClass.inner_class_info_index).getName();
|
|
echo("Testing inner class : " + innerClassName);
|
|
ClassFile innerCf = readClassFile(classes.get(innerClassName));
|
|
Deprecated_attribute attr = (Deprecated_attribute)
|
|
innerCf.getAttribute(Attribute.Deprecated);
|
|
String innerClassSimpleName = innerClass.getInnerName(cf.constant_pool);
|
|
testAttribute(innerClassSimpleName, attr, innerCf);
|
|
if (innerClassName.contains("Local")) {
|
|
testMethods(innerCf);
|
|
testFields(innerCf);
|
|
}
|
|
}
|
|
}
|
|
|
|
private void testMethods(ClassFile cf)
|
|
throws ConstantPoolException {
|
|
for (Method m : cf.methods) {
|
|
String methodName = cf.constant_pool.getUTF8Value(m.name_index);
|
|
echo("Testing method : " + methodName);
|
|
Deprecated_attribute attr = (Deprecated_attribute)
|
|
m.attributes.get(Attribute.Deprecated);
|
|
testAttribute(methodName, attr, cf);
|
|
}
|
|
}
|
|
|
|
private void testFields(ClassFile cf) throws ConstantPoolException {
|
|
for (Field f : cf.fields) {
|
|
String fieldName = cf.constant_pool.getUTF8Value(f.name_index);
|
|
echo("Testing field : " + fieldName);
|
|
Deprecated_attribute attr = (Deprecated_attribute)
|
|
f.attributes.get(Attribute.Deprecated);
|
|
testAttribute(fieldName, attr, cf);
|
|
}
|
|
}
|
|
|
|
private void testAttribute(String name, Deprecated_attribute attr, ClassFile cf)
|
|
throws ConstantPoolException {
|
|
if (name.contains("deprecated")) {
|
|
testDeprecatedAttribute(name, attr, cf);
|
|
} else {
|
|
checkNull(attr, name + " should not have deprecated attribute");
|
|
}
|
|
}
|
|
|
|
private void testDeprecatedAttribute(String name, Deprecated_attribute attr, ClassFile cf)
|
|
throws ConstantPoolException {
|
|
if (checkNotNull(attr, name + " must have deprecated attribute")) {
|
|
checkEquals(0, attr.attribute_length,
|
|
"attribute_length should equal to 0");
|
|
checkEquals("Deprecated",
|
|
cf.constant_pool.getUTF8Value(attr.attribute_name_index),
|
|
name + " attribute_name_index");
|
|
}
|
|
}
|
|
}
|