/* * Copyright (c) 2013, 2017, 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 8005091 8009686 8025633 8026567 6469562 8071982 8071984 8162363 8175200 * @summary Make sure that type annotations are displayed correctly * @author Bhavesh Patel * @library ../lib * @modules jdk.javadoc/jdk.javadoc.internal.tool * @build JavadocTester * @run main TestTypeAnnotations */ public class TestTypeAnnotations extends JavadocTester { public static void main(String... args) throws Exception { TestTypeAnnotations tester = new TestTypeAnnotations(); tester.runTests(); } @Test void test() { javadoc("-d", "out", "-sourcepath", testSrc, "-private", "typeannos"); checkExit(Exit.OK); // Test for type annotations on Class Extends (ClassExtends.java). checkOutput("typeannos/MyClass.html", true, "extends @ClassExtA ParameterizedClass<" + "@ClassExtB java.lang.String>", "implements @ClassExtB java.lang.CharSequence, " + "@ClassExtA ParameterizedInterface<" + "@ClassExtB java.lang.String>"); checkOutput("typeannos/MyInterface.html", true, "extends @ClassExtA " + "ParameterizedInterface<@ClassExtA java.lang.String>, " + "@ClassExtB java.lang.CharSequence"); // Test for type annotations on Class Parameters (ClassParameters.java). checkOutput("typeannos/ExtendsBound.html", true, "class ExtendsBound<K extends @ClassParamA java.lang.String>"); checkOutput("typeannos/ExtendsGeneric.html", true, "
class ExtendsGeneric<K extends " + "@ClassParamA Unannotated<" + "@ClassParamB java.lang.String>>"); checkOutput("typeannos/TwoBounds.html", true, "class TwoBounds<K extends " + "@ClassParamA java.lang.String,V extends @ClassParamB" + " java.lang.String>"); checkOutput("typeannos/Complex1.html", true, "class Complex1<K extends " + "@ClassParamA java.lang.String & java.lang.Runnable>"); checkOutput("typeannos/Complex2.html", true, "class Complex2<K extends java.lang." + "String & @ClassParamB java.lang.Runnable>"); checkOutput("typeannos/ComplexBoth.html", true, "class ComplexBoth<K extends @ClassParamA java.lang.String & @ClassParamA" + " java.lang.Runnable>"); // Test for type annotations on fields (Fields.java). checkOutput("typeannos/DefaultScope.html", true, "Parameterized<@FldA java.lang.String," + "@FldB java.lang.String> bothTypeArgs", "@FldA java.lang.String @FldB [] " + "array1Deep", "java.lang.String @FldB [][] array2SecondOld", // When JDK-8068737, we should change the order "" + "@FldD java.lang.String " + "@FldC " + "@FldB [] " + "@FldC " + "@FldA [] " + "array2Deep"); checkOutput("typeannos/ModifiedScoped.html", true, "public final Parameterized<@FldA " + "Parameterized<@FldA java.lang.String," + "@FldB java.lang.String>,@FldB java.lang.String> " + "nestedParameterized", "public final @FldA java.lang.String[][] " + "array2"); // Test for type annotations on method return types (MethodReturnType.java). checkOutput("typeannos/MtdDefaultScope.html", true, "public <T> @MRtnA java.lang.String" + " method()", // When JDK-8068737 is fixed, we should change the order "" + "@MRtnA java.lang.String " + "@MRtnB [] " + "@MRtnA []" + " array2Deep()", "@MRtnA java.lang.String[][] array2()"); checkOutput("typeannos/MtdModifiedScoped.html", true, "public final MtdParameterized<@MRtnA " + "MtdParameterized<@MRtnA java.lang." + "String,@MRtnB java.lang.String>,@MRtnB java." + "lang.String> nestedMtdParameterized()"); // Test for type annotations on method type parameters (MethodTypeParameters.java). checkOutput("typeannos/UnscopedUnmodified.html", true, "<K extends @MTyParamA java.lang.String>" + " void methodExtends()", "<K extends @MTyParamA " + "MtdTyParameterized<@MTyParamB java.lang.String" + ">> void nestedExtends()"); checkOutput("typeannos/PublicModifiedMethods.html", true, "public final <K extends @MTyParamA " + "java.lang.String> void methodExtends()", "public final <K extends @MTyParamA " + "java.lang.String,V extends @MTyParamA " + "MtdTyParameterized<@MTyParamB java.lang.String" + ">> void dual()"); // Test for type annotations on parameters (Parameters.java). checkOutput("typeannos/Parameters.html", true, "void unannotated(" + "ParaParameterized<java.lang.String,java.lang.String>" + " a)", "void nestedParaParameterized(" + "ParaParameterized<@ParamA " + "ParaParameterized<@ParamA java.lang.String," + "@ParamB java.lang.String>,@ParamB" + " java.lang.String> a)", // When JDK-8068737 is fixed, we should change the order "void array2Deep(@ParamA java.lang.String " + "" + "@ParamB [] " + "" + "@ParamA []" + " a)"); // Test for type annotations on throws (Throws.java). checkOutput("typeannos/ThrDefaultUnmodified.html", true, "void oneException()\n" + " throws @ThrA java.lang.Exception", "void twoExceptions()\n" + " throws @ThrA java.lang.RuntimeException,\n" + " @ThrA java.lang.Exception"); checkOutput("typeannos/ThrPublicModified.html", true, "public final void oneException(java.lang.String a)\n" + " throws @ThrA java.lang.Exception", "public final void twoExceptions(java.lang.String a)\n" + " throws @ThrA java.lang.RuntimeException,\n" + " @ThrA java.lang.Exception"); checkOutput("typeannos/ThrWithValue.html", true, "void oneException()\n" + " throws @ThrB(" + "\"m\") java.lang.Exception", "void twoExceptions()\n" + " throws @ThrB(" + "\"m\") java.lang.RuntimeException,\n" + " @ThrA java.lang.Exception"); // Test for type annotations on type parameters (TypeParameters.java). checkOutput("typeannos/TestMethods.html", true, "<K," + "@TyParaA V extends @TyParaA " + "java.lang.String> void secondAnnotated()" ); // Test for type annotations on wildcard type (Wildcards.java). checkOutput("typeannos/BoundTest.html", true, "void wcExtends(MyList<? extends @WldA" + " java.lang.String> l)", "MyList<? super @WldA java.lang.String>" + " returnWcSuper()"); checkOutput("typeannos/BoundWithValue.html", true, "void wcSuper(MyList<? super @WldB(" + "\"m\") java.lang." + "String> l)", "MyList<? extends @WldB(" + "\"m\") java.lang.String" + "> returnWcExtends()"); // Test for receiver annotations (Receivers.java). checkOutput("typeannos/DefaultUnmodified.html", true, "void withException(@RcvrA " + "DefaultUnmodified this)\n" + " throws java." + "lang.Exception", "java.lang.String nonVoid(@RcvrA @RcvrB" + "(\"m\")" + " DefaultUnmodified this)", "<T extends java.lang.Runnable> void accept(" + "@RcvrA DefaultUnmodified this,\n" + " T r)\n" + " throws java.lang.Exception"); checkOutput("typeannos/PublicModified.html", true, "public final java.lang.String nonVoid(" + "@RcvrA PublicModified this)", "public final <T extends java.lang.Runnable> " + "void accept(@RcvrA PublicModified this,\n" + " T r)\n" + " throws java.lang.Exception"); checkOutput("typeannos/WithValue.html", true, "<T extends java.lang.Runnable> void accept(" + "@RcvrB(" + "\"m\") WithValue this,\n" + " T r)\n" + " throws java.lang.Exception"); checkOutput("typeannos/WithFinal.html", true, "java.lang.String nonVoid(@RcvrB(\"m\") " + "" + "WithFinal afield)"); checkOutput("typeannos/WithBody.html", true, "void field(@RcvrA WithBody this)"); checkOutput("typeannos/Generic2.html", true, "void test2(@RcvrA Generic2<X> this)"); // Test for repeated type annotations (RepeatedAnnotations.java). checkOutput("typeannos/RepeatingAtClassLevel.html", true, "@RepTypeA @RepTypeA\n" + "@RepTypeB @RepTypeB\nclass RepeatingAtClassLevel\nextends " + "java.lang.Object
"); // @ignore 8146008 // checkOutput("typeannos/RepeatingAtClassLevel2.html", true, // "@RepTypeUseA @RepTypeUseA\n@RepTypeUseB @RepTypeUseB\nclass RepeatingAtClassLevel2\nextends " // + "java.lang.Object
"); // // checkOutput("typeannos/RepeatingAtClassLevel2.html", true, // "@RepAllContextsA @RepAllContextsA\n@RepAllContextsB @RepAllContextsB\n" // + "class RepeatingAtClassLevel3\n" // + "extends java.lang.Object
"); checkOutput("typeannos/RepeatingOnConstructor.html", true, "@RepConstructorA @RepConstructorA\n@RepConstructorB @RepConstructorB\n" + "RepeatingOnConstructor()", "@RepConstructorA @RepConstructorA\n@RepConstructorB @RepConstructorB\n" + "RepeatingOnConstructor(int i,\n int j)", "@RepAllContextsA @RepAllContextsA\n" + "@RepAllContextsB @RepAllContextsB\n" + "RepeatingOnConstructor(int i,\n int j,\n" + " int k)", "RepeatingOnConstructor(@RepParameterA @RepParameterA @RepParameterB " + "@RepParameterB\n java.lang.String parameter,\n" + " @RepParameterA " + "@RepParameterA @RepParameterB " + "@RepParameterB\n java.lang.String " + "" + "@RepTypeUseA @RepTypeUseA @RepTypeUseB " + "" + "@RepTypeUseB ... vararg)" ); checkOutput("typeannos/RepeatingOnConstructor.Inner.html", true, "Inner" + "(java.lang.String parameter,\n java.lang.String " + "@RepTypeUseA @RepTypeUseA @RepTypeUseB " + "@RepTypeUseB ... vararg)
", "Inner(" + "@RepTypeUseA @RepTypeUseA @RepTypeUseB " + "@RepTypeUseB RepeatingOnConstructor this,\n " + "@RepParameterA @RepParameterA @RepParameterB " + "@RepParameterB\n java.lang.String parameter,\n" + " " + "@RepParameterA @RepParameterA @RepParameterB " + "@RepParameterB\n java.lang.String @RepTypeUseA " + "@RepTypeUseA @RepTypeUseB @RepTypeUseB ... vararg)"); checkOutput("typeannos/RepeatingOnField.html", true, "(package private) java.lang.Integer
\n" + " i1
", "(package private) @RepTypeUseA " + "@RepTypeUseA @RepTypeUseB @RepTypeUseB java.lang.Integer
\n" + "i2
", "(package private) @RepTypeUseA @RepTypeUseA " + "@RepTypeUseB @RepTypeUseB java.lang.Integer
" + "\n" + "i3
", "(package private) @RepAllContextsA @RepAllContextsA " + "@RepAllContextsB @RepAllContextsB java.lang.Integer
" + "\n" + "i4
", "(package private) java.lang.String @RepTypeUseA " + "@RepTypeUseA @RepTypeUseB @RepTypeUseB [] " + "@RepTypeUseA @RepTypeUseA @RepTypeUseB " + "@RepTypeUseB []
\nsa
", "" + "@RepFieldA @RepFieldA\n@RepFieldB " + "@RepFieldB\njava.lang.Integer i1", "@RepTypeUseA @RepTypeUseA " + "" + "@RepTypeUseB @RepTypeUseB java.lang.Integer i2", "" + "@RepFieldA @RepFieldA\n@RepFieldB " + "@RepFieldB\n@RepTypeUseA @RepTypeUseA " + "@RepTypeUseB @RepTypeUseB java.lang.Integer i3", "" + "@RepAllContextsA @RepAllContextsA\n" + "@RepAllContextsB @RepAllContextsB\n" + "" + "@RepAllContextsA @RepAllContextsA " + "@RepAllContextsB @RepAllContextsB java.lang.Integer i4", "java.lang.String @RepTypeUseA @RepTypeUseA " + "@RepTypeUseB @RepTypeUseB [] " + "@RepTypeUseA @RepTypeUseA @RepTypeUseB " + "@RepTypeUseB [] sa"); checkOutput("typeannos/RepeatingOnMethod.html", true, "(package private) java.lang.String
\n" + " test1()
", "(package private) @RepTypeUseA " + "@RepTypeUseA @RepTypeUseB @RepTypeUseB java.lang.String
" + "\n" + "test2" + "()
", "(package private) @RepTypeUseA " + "@RepTypeUseA @RepTypeUseB @RepTypeUseB java.lang.String
" + "\n" + "test3" + "()
", "(package private) @RepAllContextsA " + "@RepAllContextsA @RepAllContextsB " + "@RepAllContextsB java.lang.String
\n" + " test4()
", "test5" + "(java.lang.String parameter,\n java.lang.String " + "@RepTypeUseA @RepTypeUseA @RepTypeUseB " + "@RepTypeUseB ... vararg)
", "" + "@RepMethodA @RepMethodA\n@RepMethodB " + "@RepMethodB\njava.lang.String test1()", "" + "@RepTypeUseA @RepTypeUseA @RepTypeUseB @RepTypeUseB java.lang.String test2()", "" + "@RepMethodA @RepMethodA\n@RepMethodB " + "@RepMethodB\n@RepTypeUseA @RepTypeUseA " + "@RepTypeUseB @RepTypeUseB java.lang.String test3()", "" + "@RepAllContextsA @RepAllContextsA\n" + "@RepAllContextsB @RepAllContextsB\n" + "@RepAllContextsA @RepAllContextsA " + "@RepAllContextsB @RepAllContextsB java.lang.String test4()", "java.lang.String test5(@RepTypeUseA " + "@RepTypeUseA @RepTypeUseB @RepTypeUseB RepeatingOnMethod " + "this,\n @RepParameterA " + "@RepParameterA @RepParameterB " + "@RepParameterB\n java.lang.String parameter,\n" + " @RepParameterA @RepParameterA " + "@RepParameterB @RepParameterB\n " + "java.lang.String @RepTypeUseA @RepTypeUseA " + "@RepTypeUseB @RepTypeUseB ... vararg)"); checkOutput("typeannos/RepeatingOnTypeParametersBoundsTypeArgumentsOnMethod.html", true, "(package private) <T> java.lang.String
\n" + "genericMethod(T t)
", "(package private) <T> java.lang.String
\n" + "genericMethod2(@RepTypeUseA @RepTypeUseA @RepTypeUseB @RepTypeUseB T t)
", "(package private) java.lang.String
\n" + "test()
", "java.lang.String test(@RepTypeUseA " + "@RepTypeUseA @RepTypeUseB @RepTypeUseB " + "RepeatingOnTypeParametersBoundsTypeArgumentsOnMethod<" + "@RepTypeUseA @RepTypeUseA @RepTypeUseB @RepTypeUseB T> this)"); checkOutput("typeannos/RepeatingOnVoidMethodDeclaration.html", true, "" + "@RepMethodA @RepMethodA\n@RepMethodB " + "@RepMethodB\nvoid test()"); } }