1 // Copyright (c) 2017, the R8 project authors. Please see the AUTHORS file 2 // for details. All rights reserved. Use of this source code is governed by a 3 // BSD-style license that can be found in the LICENSE file. 4 package lambdadesugaringnplus; 5 6 import java.io.Serializable; 7 import java.lang.annotation.Annotation; 8 import java.lang.annotation.Retention; 9 import java.lang.annotation.RetentionPolicy; 10 import lambdadesugaringnplus.other.ClassWithDefaultPackagePrivate; 11 import lambdadesugaringnplus.other.InterfaceWithDefaultPackagePrivate; 12 13 public class LambdasWithStaticAndDefaultMethods { 14 interface I { iRegular()15 String iRegular(); 16 iStatic()17 static String iStatic() { 18 return "I::iStatic()"; 19 } 20 iDefault()21 default String iDefault() { 22 return "I::iDefault()"; 23 } 24 iDefaultOverridden()25 default String iDefaultOverridden() { 26 return "I::iDefaultOverridden()"; 27 } 28 stateless()29 default II stateless() { 30 return () -> "I::stateless()"; 31 } 32 stateful()33 default II stateful() { 34 return () -> "I::captureThis(" + stateless().iRegular() + ")"; 35 } 36 } 37 38 static class C implements I { 39 @Override iRegular()40 public String iRegular() { 41 return "C::iRegular()"; 42 } 43 44 @Override iDefaultOverridden()45 public String iDefaultOverridden() { 46 return "C::iDefaultOverridden()"; 47 } 48 } 49 50 interface II extends I { iStatic()51 static String iStatic() { 52 II ii = I::iStatic; 53 return "II::iStatic(" + ((I) I::iStatic).iRegular() + 54 "|" + ((II) ii::iDefaultOverridden).iRegular() + 55 "|" + ((II) String::new).iRegular() + 56 "|" + ((II) ii::iRegular).iRegular() + ")"; 57 } 58 iDefaultOverridden()59 default String iDefaultOverridden() { 60 return "II::iDefault(" + ((I) this::iDefault).iRegular() + 61 "|" + ((II) "One-Two-Three"::intern).iRegular() + 62 "|" + ((II) this::iDefault).iRegular() + ")"; 63 } 64 } 65 66 interface P { get()67 String get(); 68 } 69 p(P p)70 static void p(P p) { 71 System.out.println(p.get()); 72 } 73 74 interface X<T> { foo(T t)75 String foo(T t); 76 } 77 78 interface Y<T extends I> extends X<T> { foo(T t)79 String foo(T t); 80 } 81 82 interface Z extends Y<II> { foo(II t)83 String foo(II t); 84 } 85 86 interface G<T> { foo(T t)87 T foo(T t); 88 } 89 90 interface B38257361_I1<T extends Number> { copy(T t)91 default T copy(T t) { 92 return t; 93 } 94 } 95 96 interface B38257361_I2 extends B38257361_I1<Integer> { 97 @Override copy(Integer t)98 default Integer copy(Integer t) { 99 return B38257361_I1.super.copy(t); 100 } 101 } 102 103 static class B38257361_C implements B38257361_I2 { 104 } 105 106 static class B38257361 { 107 private B38257361_C c = new B38257361_C(); 108 test(Integer i)109 public Integer test(Integer i) { 110 return c.copy(i); 111 } 112 113 @SuppressWarnings({"rawtypes", "unchecked"}) test(Number n)114 public Number test(Number n) { 115 return ((B38257361_I1) c).copy(n); 116 } 117 test()118 public static void test() { 119 B38257361 l = new B38257361(); 120 Integer i = new Integer(1); 121 if (i.equals(l.test(i))) { 122 System.out.println("Check 1: OK"); 123 } else { 124 System.out.println("Check 1: NOT OK"); 125 } 126 if (i.equals(l.test((Number) i))) { 127 System.out.println("Check 2: OK"); 128 } else { 129 System.out.println("Check 2: NOT OK"); 130 } 131 try { 132 Double d = new Double(1); 133 if (d.equals(l.test((Number) d))) { 134 System.out.println("Check 3: NOT OK, classCastException expected"); 135 } else { 136 System.out.println("Check 3: NOT OK, classCastException expected"); 137 } 138 System.out.println("Error, ClassCastException is expected"); 139 } catch (ClassCastException e) { 140 // Class cast into the bridge method is expected 141 System.out.println("OK, ClassCastException is expected"); 142 } 143 } 144 } 145 146 interface B38257037_I1 { getNumber()147 default Number getNumber() { 148 return new Integer(1); 149 } 150 } 151 152 interface B38257037_I2 extends B38257037_I1 { 153 @Override getNumber()154 default Double getNumber() { 155 return new Double(2.3); 156 } 157 } 158 159 static class B38257037_C implements B38257037_I2 { 160 } 161 162 /** 163 * Check that bridges are generated. 164 */ 165 static class B38257037 { 166 private B38257037_C c = new B38257037_C(); 167 test1()168 public Double test1() { 169 return c.getNumber(); 170 } 171 test2()172 public Number test2() { 173 return ((B38257037_I1) c).getNumber(); 174 } 175 test()176 public static void test() { 177 B38257037 l = new B38257037(); 178 if (l.test1() == 2.3) { 179 System.out.println("Check 1: OK"); 180 } else { 181 System.out.println("Check 1: NOT OK"); 182 } 183 if (l.test2().equals(new Double(2.3))) { 184 System.out.println("Check 2: OK"); 185 } else { 186 System.out.println("Check 2: NOT OK"); 187 } 188 } 189 } 190 191 interface B38306708_I { 192 class $CC{ print()193 static void print() { 194 System.out.println("$CC"); 195 } 196 } 197 m()198 default String m() { 199 return "ITop.m()"; 200 } 201 } 202 203 static class B38306708 { test()204 public static void test() { 205 B38306708_I.$CC.print(); 206 } 207 } 208 209 interface B38308515_I { m()210 default String m() { 211 return "m instance"; 212 } 213 m(B38308515_I i)214 static String m(B38308515_I i) { 215 return "m static"; 216 } 217 } 218 219 static class B38308515_C implements B38308515_I { 220 } 221 222 static class B38308515 { test()223 static void test() { 224 B38308515_C c = new B38308515_C(); 225 System.out.println(c.m()); 226 System.out.println(B38308515_I.m(c)); 227 } 228 } 229 230 static class B38302860 { 231 232 @SomeAnnotation(1) 233 private interface AnnotatedInterface { 234 235 @SomeAnnotation(2) annotatedAbstractMethod()236 void annotatedAbstractMethod(); 237 238 @SomeAnnotation(3) annotatedDefaultMethod()239 default void annotatedDefaultMethod() { 240 } 241 242 @SomeAnnotation(4) annotatedStaticMethod()243 static void annotatedStaticMethod() { 244 } 245 } 246 247 @Retention(value = RetentionPolicy.RUNTIME) 248 private @interface SomeAnnotation { value()249 int value(); 250 } 251 checkAnnotationValue(Annotation[] annotations, int value)252 private static boolean checkAnnotationValue(Annotation[] annotations, int value) { 253 if (annotations.length != 1) { 254 return false; 255 } 256 return annotations[0] instanceof SomeAnnotation 257 && ((SomeAnnotation) annotations[0]).value() == value; 258 } 259 260 @SuppressWarnings("unchecked") test()261 static void test() throws Exception { 262 if (checkAnnotationValue(AnnotatedInterface.class.getAnnotations(), 1)) { 263 System.out.println("Check 1: OK"); 264 } else { 265 System.out.println("Check 1: NOT OK"); 266 } 267 268 if (checkAnnotationValue( 269 AnnotatedInterface.class.getMethod("annotatedAbstractMethod").getAnnotations(), 2)) { 270 System.out.println("Check 2: OK"); 271 } else { 272 System.out.println("Check 2: NOT OK"); 273 } 274 275 if (checkAnnotationValue( 276 AnnotatedInterface.class.getMethod("annotatedDefaultMethod").getAnnotations(), 3)) { 277 System.out.println("Check 3: OK"); 278 } else { 279 System.out.println("Check 3: NOT OK"); 280 } 281 282 if (checkAnnotationValue( 283 getCompanionClassOrInterface().getMethod("annotatedStaticMethod").getAnnotations(), 4)) { 284 System.out.println("Check 4: OK"); 285 } else { 286 System.out.println("Check 4: NOT OK"); 287 } 288 } 289 getCompanionClassOrInterface()290 private static Class getCompanionClassOrInterface() { 291 try { 292 return Class.forName("lambdadesugaringnplus." 293 + "LambdasWithStaticAndDefaultMethods$B38302860$AnnotatedInterface-CC"); 294 } catch (Exception e) { 295 return AnnotatedInterface.class; 296 } 297 } 298 } 299 300 static class B62168701 { 301 interface I extends Serializable { getValue()302 String getValue(); 303 } 304 305 interface J { dump()306 static void dump() { 307 I i = () -> "B62168701 -- OK"; 308 System.out.println(i.getValue()); 309 } 310 } 311 test()312 static void test() { 313 J.dump(); 314 } 315 } 316 z(Z p)317 static void z(Z p) { 318 System.out.println(p.foo(null)); 319 } 320 g(G<String[]> g)321 static void g(G<String[]> g) { 322 StringBuilder builder = new StringBuilder("{"); 323 String sep = ""; 324 for (String s : g.foo(new String[] { "Arg0", "Arg1", "Arg2" })) { 325 builder.append(sep).append(s); 326 sep = ", "; 327 } 328 builder.append("}"); 329 System.out.println(builder.toString()); 330 } 331 332 interface SuperChain { iMain()333 default String iMain() { 334 return "SuperChain::iMain()"; 335 } 336 } 337 338 interface SuperChainDerived extends SuperChain { iMain()339 default String iMain() { 340 return "SuperChainDerived::iMain(" + SuperChain.super.iMain() + ")"; 341 } 342 } 343 344 interface OtherSuperChain { iMain()345 default String iMain() { 346 return "OtherSuperChain::iMain()"; 347 } 348 } 349 350 static class ClassWithSuperChain implements SuperChainDerived, OtherSuperChain { iMain()351 public String iMain() { 352 return "ClassWithSuperChain::iMain(" + SuperChainDerived.super.iMain() + ")" + iMainImpl(); 353 } 354 iMainImpl()355 public String iMainImpl() { 356 return "ClassWithSuperChain::iMain(" + SuperChainDerived.super.iMain() + 357 " + " + OtherSuperChain.super.iMain() + ")"; 358 } 359 } 360 main(String[] args)361 public static void main(String[] args) throws Exception { 362 C c = new C(); 363 I i = c; 364 365 c.iRegular(); 366 c.iDefault(); 367 c.iDefaultOverridden(); 368 I.iStatic(); 369 i.iRegular(); 370 i.iDefault(); 371 i.iDefaultOverridden(); 372 373 p(i.stateless()::iRegular); 374 p(i.stateful()::iRegular); 375 376 g(a -> a); 377 g(a -> { 378 int size = a.length; 379 for (int x = 0; x < size / 2; x++) { 380 String t = a[x]; 381 a[x] = a[size - 1 - x]; 382 a[size - 1 - x] = t; 383 } 384 return a; 385 }); 386 387 p(c::iRegular); 388 p(c::iDefault); 389 p(c::iDefaultOverridden); 390 p(I::iStatic); 391 p(i::iRegular); 392 p(i::iDefault); 393 p(i::iDefaultOverridden); 394 395 II ii = i::iRegular; 396 p(II::iStatic); 397 p(ii::iRegular); 398 p(ii::iDefault); 399 p(ii::iDefaultOverridden); 400 401 z(s -> "From Interface With Bridges"); 402 403 System.out.println(new ClassWithSuperChain().iMain()); 404 405 ClassWithDefaultPackagePrivate c2 = new ClassWithDefaultPackagePrivate(); 406 InterfaceWithDefaultPackagePrivate i2 = c2; 407 408 c2.defaultFoo(); 409 i2.defaultFoo(); 410 InterfaceWithDefaultPackagePrivate.staticFoo(); 411 412 p(c2::defaultFoo); 413 p(i2::defaultFoo); 414 p(InterfaceWithDefaultPackagePrivate::staticFoo); 415 p(c2.lambda()::foo); 416 417 B38257361.test(); 418 B38257037.test(); 419 B38306708.test(); 420 B38308515.test(); 421 B38302860.test(); 422 B62168701.test(); 423 } 424 } 425