NestedTypes.java revision 1520:71f35e4b93a5
1/*
2 * Copyright (c) 2008, 2013, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 */
23
24import java.lang.annotation.*;
25import java.util.Map;
26
27/*
28 * @test
29 * @bug 8006775
30 * @summary new type annotation location: nested types
31 * @author Werner Dietl
32 * @compile NestedTypes.java
33 */
34class Outer {
35    class Inner {
36        class Inner2 {
37            // m1a-c all have the same parameter type.
38            void m1a(@A Inner2 p1a) {}
39            void m1b(Inner.@A Inner2 p1b) {}
40            void m1c(Outer.Inner.@A Inner2 p1c) {}
41            // notice the difference to m1d
42            void m1d(@A Outer.Inner.Inner2 p1d) {}
43
44            // m2a-b both have the same parameter type.
45            void m2a(@A Inner.Inner2 p2a) {}
46            void m2b(Outer.@A Inner.Inner2 p2b) {}
47
48            // The location for @A is the same in m3a-c
49            void m3a(@A Outer p3a) {}
50            void m3b(@A Outer.Inner p3b) {}
51            void m3c(@A Outer.Inner.Inner2 p3c) {}
52
53            // Test combinations
54            void m4a(@A Outer p3a) {}
55            void m4b(@A Outer. @B Inner p3b) {}
56            void m4c(@A Outer. @B Inner. @C Inner2 p3c) {}
57        }
58    }
59
60    void m4a(@A Map p4a) {}
61    void m4b(Map.@B Entry p4c) {}
62    // Illegal:
63    // void m4b(@A Map.Entry p4b) {}
64    // void m4c(@A Map.@B Entry p4c) {}
65
66    void m4c(Map<String,String>.@B Entry<String,String> p4d) {}
67    // Illegal:
68    // void m4d(@A Map<String,String>.@B Entry<String,String> p4d) {}
69
70    void m4e(MyList<Map.Entry> p4e) {}
71    void m4f(MyList<Map.@B Entry> p4f) {}
72    // Illegal:
73    // void m4g(MyList<@A Map.Entry> p4e) {}
74    // void m4h(MyList<@A Map.@B Entry> p4f) {}
75
76    class GInner<X> {
77        class GInner2<Y, Z> {}
78    }
79
80    static class Static {}
81    static class GStatic<X, Y> {
82        static class GStatic2<Z> {}
83    }
84}
85
86class Test1 {
87    // Outer.GStatic<Object,Object>.GStatic2<Object> gs;
88    Outer.GStatic.@A GStatic2<Object> gsgood;
89    // TODO: add failing test
90    // Outer.@A GStatic.GStatic2<Object> gsbad;
91
92    MyList<@A Outer . @B Inner. @C Inner2> f;
93    @A Outer .GInner<Object>.GInner2<String, Integer> g;
94
95    // TODO: Make sure that something like this fails gracefully:
96    // MyList<java.@B lang.Object> pkg;
97
98    @A Outer f1;
99    @A Outer . @B Inner f2 = f1.new @B Inner();
100    // TODO: ensure type annos on new are stored.
101    @A Outer . @B GInner<@C Object> f3 = f1.new @B GInner<@C Object>();
102
103    MyList<@A Outer . @B GInner<@C MyList<@D Object>>. @E GInner2<@F Integer, @G Object>> f4;
104    // MyList<Outer.GInner<Object>.GInner2<Integer>> f4clean;
105
106    @A Outer . @B GInner<@C MyList<@D Object>>. @E GInner2<@F Integer, @G Object> f4top;
107
108    MyList<@A Outer . @B GInner<@C MyList<@D Object @E[] @F[]>>. @G GInner2<@H Integer, @I Object> @J[] @K[]> f4arr;
109
110    @A Outer . @B GInner<@C MyList<@D Object @E[] @F[]>>. @G GInner2<@H Integer, @I Object> @J[] @K[] f4arrtop;
111
112    MyList<Outer . @B Static> f5;
113    // Illegal:
114    // MyList<@A Outer . @B Static> f5;
115
116    Outer . @B Static f6;
117    // Illegal:
118    // @A Outer . @B Static f6;
119
120    Outer . @Bv("B") GStatic<@Cv("C") String, @Dv("D") Object> f7;
121    // Illegal:
122    // @Av("A") Outer . @Bv("B") GStatic<@Cv("C") String, @Dv("D") Object> f7;
123
124    Outer . @Cv("Data") Static f8;
125    // Illegal:
126    // @A Outer . @Cv("Data") Static f8;
127
128    MyList<Outer . @Cv("Data") Static> f9;
129    // Illegal:
130    // MyList<@A Outer . @Cv("Data") Static> f9;
131}
132
133class Test2 {
134    void m() {
135        @A Outer f1 = null;
136        @A Outer.@B Inner f2 = null;
137        Outer.@B Static f3 = null;
138        // Illegal:
139        // @A Outer.@B Static f3 = null;
140        @A Outer.@C Inner f4 = null;
141
142        Outer . @B Static f5 = null;
143        Outer . @Cv("Data") Static f6 = null;
144        MyList<Outer . @Cv("Data") Static> f7 = null;
145    }
146}
147
148class Test3 {
149    void monster(@A Outer p1,
150        @A Outer.@B Inner p2,
151        Outer.@B Static p3,
152        @A Outer.@Cv("Test") Inner p4,
153        Outer . @B Static p5,
154        Outer . @Cv("Data") Static p6,
155        MyList<Outer . @Cv("Data") Static> p7) {
156    }
157}
158
159class Test4 {
160    void m() {
161        @A Outer p1 = new @A Outer();
162        @A Outer.@B Inner p2 = p1.new @B Inner();
163        // Illegal:
164        // @A Outer.@B Static p3 = new @A Outer.@B Static();
165        // Object o3 = new @A Outer.@B Static();
166
167        @A Outer.@Cv("Test") Inner p4 = p1.new @Cv("Test") Inner();
168        Outer . @B Static p5 = new Outer . @B Static();
169        Outer . @Cv("Data") Static p6 = new Outer . @Cv("Data") Static();
170        MyList<Outer . @Cv("Data") Static> p7 = new MyList<Outer . @Cv("Data") Static>();
171    }
172}
173
174class MyList<K> { }
175
176
177@Target({ElementType.TYPE_USE, ElementType.TYPE_PARAMETER})
178@interface A { }
179@Target({ElementType.TYPE_USE, ElementType.TYPE_PARAMETER})
180@interface B { }
181@Target({ElementType.TYPE_USE, ElementType.TYPE_PARAMETER})
182@interface C { }
183@Target({ElementType.TYPE_USE, ElementType.TYPE_PARAMETER})
184@interface D { }
185@Target({ElementType.TYPE_USE, ElementType.TYPE_PARAMETER})
186@interface E { }
187@Target({ElementType.TYPE_USE, ElementType.TYPE_PARAMETER})
188@interface F { }
189@Target({ElementType.TYPE_USE, ElementType.TYPE_PARAMETER})
190@interface G { }
191@Target({ElementType.TYPE_USE, ElementType.TYPE_PARAMETER})
192@interface H { }
193@Target({ElementType.TYPE_USE, ElementType.TYPE_PARAMETER})
194@interface I { }
195@Target({ElementType.TYPE_USE, ElementType.TYPE_PARAMETER})
196@interface J { }
197@Target({ElementType.TYPE_USE, ElementType.TYPE_PARAMETER})
198@interface K { }
199
200@Target({ElementType.TYPE_USE, ElementType.TYPE_PARAMETER})
201@interface Av { String value(); }
202@Target({ElementType.TYPE_USE, ElementType.TYPE_PARAMETER})
203@interface Bv { String value(); }
204@Target({ElementType.TYPE_USE, ElementType.TYPE_PARAMETER})
205@interface Cv { String value(); }
206@Target({ElementType.TYPE_USE, ElementType.TYPE_PARAMETER})
207@interface Dv { String value(); }
208@Target({ElementType.TYPE_USE, ElementType.TYPE_PARAMETER})
209@interface Ev { String value(); }
210@Target({ElementType.TYPE_USE, ElementType.TYPE_PARAMETER})
211@interface Fv { String value(); }
212
213