/* * 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"); } } }