blob: 780bcf70a244a84526a7bbd5e83a1e1cd39fa21d [file] [log] [blame]
/*
* 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");
}
}
}