aoqi@0: /* aoqi@0: * Copyright (c) 2008, 2013, Oracle and/or its affiliates. All rights reserved. aoqi@0: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. aoqi@0: * aoqi@0: * This code is free software; you can redistribute it and/or modify it aoqi@0: * under the terms of the GNU General Public License version 2 only, as aoqi@0: * published by the Free Software Foundation. aoqi@0: * aoqi@0: * This code is distributed in the hope that it will be useful, but WITHOUT aoqi@0: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or aoqi@0: * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License aoqi@0: * version 2 for more details (a copy is included in the LICENSE file that aoqi@0: * accompanied this code). aoqi@0: * aoqi@0: * You should have received a copy of the GNU General Public License version aoqi@0: * 2 along with this work; if not, write to the Free Software Foundation, aoqi@0: * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. aoqi@0: * aoqi@0: * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA aoqi@0: * or visit www.oracle.com if you need additional information or have any aoqi@0: * questions. aoqi@0: */ aoqi@0: aoqi@0: import java.lang.annotation.*; aoqi@0: import java.util.Map; aoqi@0: aoqi@0: /* aoqi@0: * @test aoqi@0: * @bug 8006775 aoqi@0: * @summary new type annotation location: nested types aoqi@0: * @author Werner Dietl aoqi@0: * @compile NestedTypes.java aoqi@0: */ aoqi@0: class Outer { aoqi@0: class Inner { aoqi@0: class Inner2 { aoqi@0: // m1a-c all have the same parameter type. aoqi@0: void m1a(@A Inner2 p1a) {} aoqi@0: void m1b(Inner.@A Inner2 p1b) {} aoqi@0: void m1c(Outer.Inner.@A Inner2 p1c) {} aoqi@0: // notice the difference to m1d aoqi@0: void m1d(@A Outer.Inner.Inner2 p1d) {} aoqi@0: aoqi@0: // m2a-b both have the same parameter type. aoqi@0: void m2a(@A Inner.Inner2 p2a) {} aoqi@0: void m2b(Outer.@A Inner.Inner2 p2b) {} aoqi@0: aoqi@0: // The location for @A is the same in m3a-c aoqi@0: void m3a(@A Outer p3a) {} aoqi@0: void m3b(@A Outer.Inner p3b) {} aoqi@0: void m3c(@A Outer.Inner.Inner2 p3c) {} aoqi@0: aoqi@0: // Test combinations aoqi@0: void m4a(@A Outer p3a) {} aoqi@0: void m4b(@A Outer. @B Inner p3b) {} aoqi@0: void m4c(@A Outer. @B Inner. @C Inner2 p3c) {} aoqi@0: } aoqi@0: } aoqi@0: aoqi@0: void m4a(@A Map p4a) {} aoqi@0: void m4b(Map.@B Entry p4c) {} aoqi@0: // Illegal: aoqi@0: // void m4b(@A Map.Entry p4b) {} aoqi@0: // void m4c(@A Map.@B Entry p4c) {} aoqi@0: aoqi@0: void m4c(Map.@B Entry p4d) {} aoqi@0: // Illegal: aoqi@0: // void m4d(@A Map.@B Entry p4d) {} aoqi@0: aoqi@0: void m4e(MyList p4e) {} aoqi@0: void m4f(MyList p4f) {} aoqi@0: // Illegal: aoqi@0: // void m4g(MyList<@A Map.Entry> p4e) {} aoqi@0: // void m4h(MyList<@A Map.@B Entry> p4f) {} aoqi@0: aoqi@0: class GInner { aoqi@0: class GInner2 {} aoqi@0: } aoqi@0: aoqi@0: static class Static {} aoqi@0: static class GStatic { aoqi@0: static class GStatic2 {} aoqi@0: } aoqi@0: } aoqi@0: aoqi@0: class Test1 { aoqi@0: // Outer.GStatic.GStatic2 gs; aoqi@0: Outer.GStatic.@A GStatic2 gsgood; aoqi@0: // TODO: add failing test aoqi@0: // Outer.@A GStatic.GStatic2 gsbad; aoqi@0: aoqi@0: MyList<@A Outer . @B Inner. @C Inner2> f; aoqi@0: @A Outer .GInner.GInner2 g; aoqi@0: aoqi@0: // TODO: Make sure that something like this fails gracefully: aoqi@0: // MyList pkg; aoqi@0: aoqi@0: @A Outer f1; aoqi@0: @A Outer . @B Inner f2 = f1.new @B Inner(); aoqi@0: // TODO: ensure type annos on new are stored. aoqi@0: @A Outer . @B GInner<@C Object> f3 = f1.new @B GInner<@C Object>(); aoqi@0: aoqi@0: MyList<@A Outer . @B GInner<@C MyList<@D Object>>. @E GInner2<@F Integer, @G Object>> f4; aoqi@0: // MyList.GInner2> f4clean; aoqi@0: aoqi@0: @A Outer . @B GInner<@C MyList<@D Object>>. @E GInner2<@F Integer, @G Object> f4top; aoqi@0: aoqi@0: MyList<@A Outer . @B GInner<@C MyList<@D Object @E[] @F[]>>. @G GInner2<@H Integer, @I Object> @J[] @K[]> f4arr; aoqi@0: aoqi@0: @A Outer . @B GInner<@C MyList<@D Object @E[] @F[]>>. @G GInner2<@H Integer, @I Object> @J[] @K[] f4arrtop; aoqi@0: aoqi@0: MyList f5; aoqi@0: // Illegal: aoqi@0: // MyList<@A Outer . @B Static> f5; aoqi@0: aoqi@0: Outer . @B Static f6; aoqi@0: // Illegal: aoqi@0: // @A Outer . @B Static f6; aoqi@0: aoqi@0: Outer . @Bv("B") GStatic<@Cv("C") String, @Dv("D") Object> f7; aoqi@0: // Illegal: aoqi@0: // @Av("A") Outer . @Bv("B") GStatic<@Cv("C") String, @Dv("D") Object> f7; aoqi@0: aoqi@0: Outer . @Cv("Data") Static f8; aoqi@0: // Illegal: aoqi@0: // @A Outer . @Cv("Data") Static f8; aoqi@0: aoqi@0: MyList f9; aoqi@0: // Illegal: aoqi@0: // MyList<@A Outer . @Cv("Data") Static> f9; aoqi@0: } aoqi@0: aoqi@0: class Test2 { aoqi@0: void m() { aoqi@0: @A Outer f1 = null; aoqi@0: @A Outer.@B Inner f2 = null; aoqi@0: Outer.@B Static f3 = null; aoqi@0: // Illegal: aoqi@0: // @A Outer.@B Static f3 = null; aoqi@0: @A Outer.@C Inner f4 = null; aoqi@0: aoqi@0: Outer . @B Static f5 = null; aoqi@0: Outer . @Cv("Data") Static f6 = null; aoqi@0: MyList f7 = null; aoqi@0: } aoqi@0: } aoqi@0: aoqi@0: class Test3 { aoqi@0: void monster(@A Outer p1, aoqi@0: @A Outer.@B Inner p2, aoqi@0: Outer.@B Static p3, aoqi@0: @A Outer.@Cv("Test") Inner p4, aoqi@0: Outer . @B Static p5, aoqi@0: Outer . @Cv("Data") Static p6, aoqi@0: MyList p7) { aoqi@0: } aoqi@0: } aoqi@0: aoqi@0: class Test4 { aoqi@0: void m() { aoqi@0: @A Outer p1 = new @A Outer(); aoqi@0: @A Outer.@B Inner p2 = p1.new @B Inner(); aoqi@0: // Illegal: aoqi@0: // @A Outer.@B Static p3 = new @A Outer.@B Static(); aoqi@0: // Object o3 = new @A Outer.@B Static(); aoqi@0: aoqi@0: @A Outer.@Cv("Test") Inner p4 = p1.new @Cv("Test") Inner(); aoqi@0: Outer . @B Static p5 = new Outer . @B Static(); aoqi@0: Outer . @Cv("Data") Static p6 = new Outer . @Cv("Data") Static(); aoqi@0: MyList p7 = new MyList(); aoqi@0: } aoqi@0: } aoqi@0: aoqi@0: class MyList { } aoqi@0: aoqi@0: aoqi@0: @Target({ElementType.TYPE_USE, ElementType.TYPE_PARAMETER}) aoqi@0: @interface A { } aoqi@0: @Target({ElementType.TYPE_USE, ElementType.TYPE_PARAMETER}) aoqi@0: @interface B { } aoqi@0: @Target({ElementType.TYPE_USE, ElementType.TYPE_PARAMETER}) aoqi@0: @interface C { } aoqi@0: @Target({ElementType.TYPE_USE, ElementType.TYPE_PARAMETER}) aoqi@0: @interface D { } aoqi@0: @Target({ElementType.TYPE_USE, ElementType.TYPE_PARAMETER}) aoqi@0: @interface E { } aoqi@0: @Target({ElementType.TYPE_USE, ElementType.TYPE_PARAMETER}) aoqi@0: @interface F { } aoqi@0: @Target({ElementType.TYPE_USE, ElementType.TYPE_PARAMETER}) aoqi@0: @interface G { } aoqi@0: @Target({ElementType.TYPE_USE, ElementType.TYPE_PARAMETER}) aoqi@0: @interface H { } aoqi@0: @Target({ElementType.TYPE_USE, ElementType.TYPE_PARAMETER}) aoqi@0: @interface I { } aoqi@0: @Target({ElementType.TYPE_USE, ElementType.TYPE_PARAMETER}) aoqi@0: @interface J { } aoqi@0: @Target({ElementType.TYPE_USE, ElementType.TYPE_PARAMETER}) aoqi@0: @interface K { } aoqi@0: aoqi@0: @Target({ElementType.TYPE_USE, ElementType.TYPE_PARAMETER}) aoqi@0: @interface Av { String value(); } aoqi@0: @Target({ElementType.TYPE_USE, ElementType.TYPE_PARAMETER}) aoqi@0: @interface Bv { String value(); } aoqi@0: @Target({ElementType.TYPE_USE, ElementType.TYPE_PARAMETER}) aoqi@0: @interface Cv { String value(); } aoqi@0: @Target({ElementType.TYPE_USE, ElementType.TYPE_PARAMETER}) aoqi@0: @interface Dv { String value(); } aoqi@0: @Target({ElementType.TYPE_USE, ElementType.TYPE_PARAMETER}) aoqi@0: @interface Ev { String value(); } aoqi@0: @Target({ElementType.TYPE_USE, ElementType.TYPE_PARAMETER}) aoqi@0: @interface Fv { String value(); } aoqi@0: