test/tools/javac/annotations/typeAnnotations/newlocations/NestedTypes.java

changeset 0
959103a6100f
equal deleted inserted replaced
-1:000000000000 0:959103a6100f
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
24 import java.lang.annotation.*;
25 import 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 */
34 class 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
86 class 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
133 class 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
148 class 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
159 class 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
174 class 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

mercurial