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