1/*
2 * Copyright (c) 2015, 2016, 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/*
25 * @test
26 * @bug 8049238
27 * @summary Checks Signature attribute for inner classes.
28 * @library /tools/lib /tools/javac/lib ../lib
29 * @modules jdk.compiler/com.sun.tools.javac.api
30 *          jdk.compiler/com.sun.tools.javac.main
31 *          jdk.jdeps/com.sun.tools.classfile
32 * @build toolbox.ToolBox InMemoryFileManager TestResult TestBase
33 * @build InnerClassTest Driver ExpectedSignature ExpectedSignatureContainer
34 * @run main Driver InnerClassTest
35 */
36
37import java.util.ArrayList;
38import java.util.List;
39import java.util.Map;
40import java.util.Set;
41import java.util.concurrent.Callable;
42
43@ExpectedSignature(descriptor = "InnerClassTest",
44        signature = "<T:Ljava/util/ArrayList<TT;>;:Ljava/lang/Runnable;>Ljava/lang/Object;")
45@ExpectedSignature(descriptor = "InnerClassTest$1",
46        signature = "LInnerClassTest$1Local1;", isAnonymous = true)
47@ExpectedSignature(descriptor = "InnerClassTest$2",
48        signature = "LInnerClassTest$1Local2<Ljava/util/ArrayList<TT;>;" +
49                "Ljava/util/Map<Ljava/util/ArrayList<TT;>;Ljava/util/ArrayList<TT;>;>;>;", isAnonymous = true)
50public class InnerClassTest<T extends ArrayList<T> & Runnable> {
51
52    {
53        class Local1 {
54            // no Signature attribute
55            Local1() {
56            }
57
58            @ExpectedSignature(descriptor = "genericType", signature = "TT;")
59            T genericType;
60
61            @ExpectedSignature(descriptor = "genericTypeArray", signature = "[TT;")
62            T[] genericTypeArray;
63        }
64
65        @ExpectedSignature(descriptor = "InnerClassTest$1Local2",
66                signature = "<T:Ljava/lang/Object;U::Ljava/util/Map<+TT;-TT;>;>Ljava/lang/Object;")
67        class Local2<T, U extends Map<? extends T, ? super T>> {
68            // no Signature attribute
69            Local2() {
70            }
71
72            @ExpectedSignature(descriptor = "<init>(InnerClassTest, java.lang.Object, java.util.Map)",
73                    signature = "(TT;TU;)V")
74            Local2(T a, U b) {
75            }
76
77            @ExpectedSignature(descriptor = "genericMethod(java.lang.Object[])",
78                    signature = "([TT;)[TU;")
79            U[] genericMethod(T...a) {
80                return null;
81            }
82        }
83
84        @ExpectedSignature(descriptor = "InnerClassTest$1Local3",
85                signature = "LInnerClassTest$1Local2<Ljava/util/ArrayList<TT;>;" +
86                        "Ljava/util/Map<Ljava/util/ArrayList<TT;>;Ljava/util/ArrayList<TT;>;>;>;")
87        class Local3 extends Local2<ArrayList<T>, Map<ArrayList<T>, ArrayList<T>>> {
88        }
89
90        new Local1() {
91            @ExpectedSignature(descriptor = "genericType", signature = "TT;")
92            T genericType;
93
94            @ExpectedSignature(descriptor = "genericTypeArray", signature = "[TT;")
95            T[] genericTypeArray;
96        };
97
98        new Local2<ArrayList<T>, Map<ArrayList<T>, ArrayList<T>>>() {
99        };
100    }
101
102    @ExpectedSignature(descriptor = "InnerClassTest$InnerClass1",
103            signature = "<E:TT;U::Ljava/util/Set<-TE;>;>Ljava/lang/Object;")
104    class InnerClass1<E extends T, U extends Set<? super E>> {
105        @ExpectedSignature(descriptor = "genericTypeArray", signature = "[TT;")
106        T[] genericTypeArray;
107
108        @ExpectedSignature(descriptor = "genericListExtendsBound", signature = "Ljava/util/List<+TT;>;")
109        List<? extends T> genericListExtendsBound;
110
111        @ExpectedSignature(descriptor = "genericListSuperBound", signature = "Ljava/util/List<-TU;>;")
112        List<? super U> genericListSuperBound;
113
114        @ExpectedSignature(descriptor = "genericListWildCard", signature = "Ljava/util/List<*>;")
115        List<?> genericListWildCard;
116
117        @ExpectedSignature(descriptor = "genericListExactType", signature = "Ljava/util/List<Ljava/lang/Integer;>;")
118        List<Integer> genericListExactType;
119
120        @ExpectedSignature(descriptor = "listWithGenericType", signature = "Ljava/util/List<TE;>;")
121        List<E> listWithGenericType;
122
123        List listNoSignatureAttribute;
124
125        // no Signature attribute
126        InnerClass1(List a) {
127        }
128
129        @ExpectedSignature(descriptor = "<init>(InnerClassTest, java.util.ArrayList)",
130                signature = "(TT;)V")
131        InnerClass1(T a) {
132        }
133
134        @ExpectedSignature(descriptor = "<init>(InnerClassTest, java.util.ArrayList, java.util.ArrayList)",
135                signature = "(TT;TE;)V")
136        InnerClass1(T a, E b) {
137        }
138
139        @ExpectedSignature(descriptor = "genericMethod(java.util.ArrayList)",
140                signature = "(TT;)TE;")
141        E genericMethod(T a) {
142            return null;
143        }
144    }
145
146    @ExpectedSignature(descriptor = "InnerClassTest$InnerInterface",
147            signature = "<T:Ljava/lang/Object;>Ljava/lang/Object;")
148    interface InnerInterface<T> {
149        @ExpectedSignature(descriptor = "genericMethod(java.lang.Object)", signature = "(TT;)TT;")
150        T genericMethod(T a);
151
152        @ExpectedSignature(descriptor = "genericListExtendsBound", signature = "Ljava/util/List<+Ljava/lang/Number;>;")
153        List<? extends Number> genericListExtendsBound = null;
154
155        @ExpectedSignature(descriptor = "genericListSuperBound", signature = "Ljava/util/List<-Ljava/lang/Number;>;")
156        List<? super Number> genericListSuperBound = null;
157
158        @ExpectedSignature(descriptor = "genericListWildCard", signature = "Ljava/util/List<*>;")
159        List<?> genericListWildCard = null;
160
161        @ExpectedSignature(descriptor = "genericListExactType", signature = "Ljava/util/List<Ljava/lang/Integer;>;")
162        List<Integer> genericListExactType = null;
163
164        List listNoSignatureAttribute = null;
165
166        @ExpectedSignature(descriptor = "genericBoundsMethod1(java.util.List)",
167                signature = "(Ljava/util/List<-TT;>;)Ljava/util/List<+TT;>;")
168        List<? extends T> genericBoundsMethod1(List<? super T> a);
169
170        @ExpectedSignature(descriptor = "genericBoundsMethod2(java.util.List)",
171                signature = "(Ljava/util/List<+TT;>;)Ljava/util/List<-TT;>;")
172        List<? super T> genericBoundsMethod2(List<? extends T> a);
173
174        @ExpectedSignature(descriptor = "genericWildCardMethod(java.util.Map)",
175                signature = "(Ljava/util/Map<**>;)Ljava/util/Map<**>;")
176        Map<?, ?> genericWildCardMethod(Map<?, ?> a);
177
178        @ExpectedSignature(descriptor = "defaultGenericMethod(java.util.List, java.util.List, java.util.Map)",
179                signature = "(Ljava/util/List<+TT;>;Ljava/util/List<-TT;>;Ljava/util/Map<**>;)Ljava/util/List<*>;")
180        default List<?> defaultGenericMethod(List<? extends T> list1, List<? super T> list2, Map<?, ?> map) { return null; }
181
182
183        default List defaultNoSignatureAttributeMethod(List list1, List list2, Map list3) { return null; }
184
185        @ExpectedSignature(descriptor = "staticGenericMethod(java.util.List, java.util.List, java.util.Map)",
186                signature = "<T::Ljava/lang/Runnable;>(Ljava/util/List<+TT;>;Ljava/util/List<-TT;>;Ljava/util/Map<**>;)Ljava/util/List<*>;")
187        static <T extends Runnable> List<?> staticGenericMethod(List<? extends T> list1, List<? super T> list2, Map<?, ?> map) { return null; }
188
189
190        static List staticNoSignatureAttributeMethod(List list1, List list2, Map list3) { return null; }
191    }
192
193    @ExpectedSignature(descriptor = "InnerClassTest$InnerClass2",
194            signature = "LInnerClassTest<TT;>.InnerClass1<TT;Ljava/util/Set<TT;>;>;LInnerClassTest$InnerInterface<TT;>;")
195    class InnerClass2 extends InnerClass1<T, Set<T>> implements InnerInterface<T> {
196
197        // no Signature attribute
198        InnerClass2() {
199            super(null);
200        }
201
202        @ExpectedSignature(descriptor = "<init>(InnerClassTest, java.util.ArrayList)",
203                signature = "(TT;)V")
204        InnerClass2(T a) {
205            super(a);
206        }
207
208        @ExpectedSignature(descriptor = "<init>(InnerClassTest, java.util.ArrayList, java.util.ArrayList)",
209                signature = "(TT;TT;)V")
210        InnerClass2(T a, T b) {
211            super(a, b);
212        }
213
214        @ExpectedSignature(descriptor = "genericMethod(java.util.ArrayList)", signature = "(TT;)TT;")
215        @Override
216        public T genericMethod(T a) {
217            return null;
218        }
219
220        @ExpectedSignature(descriptor = "genericBoundsMethod1(java.util.List)",
221                signature = "(Ljava/util/List<-TT;>;)Ljava/util/List<+TT;>;")
222        @Override
223        public List<? extends T> genericBoundsMethod1(List<? super T> a) {
224            return null;
225        }
226
227        @ExpectedSignature(descriptor = "genericBoundsMethod2(java.util.List)",
228                signature = "(Ljava/util/List<+TT;>;)Ljava/util/List<-TT;>;")
229        @Override
230        public List<? super T> genericBoundsMethod2(List<? extends T> a) {
231            return null;
232        }
233
234        @ExpectedSignature(descriptor = "genericWildCardMethod(java.util.Map)",
235                signature = "(Ljava/util/Map<**>;)Ljava/util/Map<**>;")
236        @Override
237        public Map<?, ?> genericWildCardMethod(Map<?, ?> a) {
238            return null;
239        }
240    }
241
242    @ExpectedSignature(descriptor = "InnerClassTest$StaticInnerClass",
243            signature = "<T:Ljava/lang/String;E::Ljava/util/Set<TT;>;>" +
244                    "Ljava/lang/Object;LInnerClassTest$InnerInterface<TE;>;")
245    static class StaticInnerClass<T extends String, E extends Set<T>> implements InnerInterface<E> {
246        // no Signature attribute
247        StaticInnerClass(List a) {
248        }
249
250        @ExpectedSignature(descriptor = "<init>(java.lang.Runnable)",
251                signature = "<E::Ljava/lang/Runnable;>(TE;)V")
252        <E extends Runnable> StaticInnerClass(E a) {
253        }
254
255        @ExpectedSignature(descriptor = "<init>(java.lang.String)",
256                signature = "(TT;)V")
257        StaticInnerClass(T a) {
258        }
259
260        @ExpectedSignature(descriptor = "<init>(java.lang.String, java.util.Set)",
261                signature = "(TT;TE;)V")
262        StaticInnerClass(T a, E b) {
263        }
264
265        @ExpectedSignature(descriptor = "genericListExtendsBound", signature = "Ljava/util/List<+Ljava/lang/Number;>;")
266        static List<? extends Number> genericListExtendsBound;
267
268        @ExpectedSignature(descriptor = "genericListSuperBound", signature = "Ljava/util/List<-Ljava/lang/Number;>;")
269        static List<? super Number> genericListSuperBound;
270
271        @ExpectedSignature(descriptor = "genericListWildCard", signature = "Ljava/util/List<*>;")
272        static List<?> genericListWildCard;
273
274        @ExpectedSignature(descriptor = "genericListExactType", signature = "Ljava/util/List<Ljava/lang/Integer;>;")
275        static List<Integer> genericListExactType;
276
277        static List listNoSignatureAttribute;
278
279        @ExpectedSignature(descriptor = "genericMethod(java.util.Set)",
280                signature = "(TE;)TE;")
281        @Override
282        public E genericMethod(E a) {
283            return null;
284        }
285
286        @ExpectedSignature(descriptor = "genericBoundsMethod1(java.util.List)",
287                signature = "(Ljava/util/List<-TE;>;)Ljava/util/List<+TE;>;")
288        @Override
289        public List<? extends E> genericBoundsMethod1(List<? super E> a) {
290            return null;
291        }
292
293        @ExpectedSignature(descriptor = "genericBoundsMethod2(java.util.List)",
294                signature = "(Ljava/util/List<+TE;>;)Ljava/util/List<-TE;>;")
295        @Override
296        public List<? super E> genericBoundsMethod2(List<? extends E> a) {
297            return null;
298        }
299
300        @ExpectedSignature(descriptor = "genericWildCardMethod(java.util.Map)",
301                signature = "(Ljava/util/Map<**>;)Ljava/util/Map<**>;")
302        @Override
303        public Map<?, ?> genericWildCardMethod(Map<?, ?> a) {
304            return null;
305        }
306
307        @ExpectedSignature(descriptor = "staticGenericMethod(java.lang.Object)",
308                signature = "<E:Ljava/lang/Object;>(TE;)TE;")
309        public static <E> E staticGenericMethod(E a) {
310            return null;
311        }
312
313        @ExpectedSignature(descriptor = "staticGenericBoundsMethod1(java.util.List)",
314                signature = "<E:Ljava/lang/Object;>(Ljava/util/List<-TE;>;)Ljava/util/List<+TE;>;")
315        public static <E> List<? extends E> staticGenericBoundsMethod1(List<? super E> a) {
316            return null;
317        }
318
319        @ExpectedSignature(descriptor = "staticGenericBoundsMethod2(java.util.List)",
320                signature = "<E:Ljava/lang/Object;>(Ljava/util/List<+TE;>;)Ljava/util/List<-TE;>;")
321        public static <E> List<? super E> staticGenericBoundsMethod2(List<? extends E> a) {
322            return null;
323        }
324
325        @ExpectedSignature(descriptor = "staticGenericWildCardMethod(java.util.Map)",
326                signature = "<E:Ljava/lang/Object;>(Ljava/util/Map<**>;)Ljava/util/Map<**>;")
327        public static <E> Map<?, ?> staticGenericWildCardMethod(Map<?, ?> a) {
328            return null;
329        }
330    }
331
332    @ExpectedSignature(descriptor = "InnerClassTest$InnerClass3",
333            signature = "Ljava/lang/Object;LInnerClassTest$ExceptionHolder" +
334                    "<Ljava/lang/RuntimeException;>;Ljava/util/concurrent/Callable<Ljava/util/Map<**>;>;")
335    public static class InnerClass3 implements  ExceptionHolder<RuntimeException>, Callable<Map<?, ?>> {
336        @ExpectedSignature(descriptor = "call()", signature = "()Ljava/util/Map<**>;")
337        @Override
338        public Map<?, ?> call() throws Exception {
339            return null;
340        }
341
342        @Override
343        public void Throw() throws RuntimeException {
344        }
345
346        @Override
347        public RuntimeException Return() {
348            return null;
349        }
350    }
351
352    /**
353     * Class is for checking that the Signature attribute is not generated
354     * for overridden methods despite of the appropriate methods in the parent class
355     * have the Signature attribute.
356     */
357    @ExpectedSignature(descriptor = "InnerClassTest$ExceptionHolder",
358            signature = "<E:Ljava/lang/Exception;>Ljava/lang/Object;")
359    interface ExceptionHolder<E extends Exception> {
360        @ExpectedSignature(descriptor = "Throw()", signature = "()V^TE;")
361        void Throw() throws E;
362        @ExpectedSignature(descriptor = "Return()", signature = "()TE;")
363        E Return();
364    }
365}
366