| // Copyright (c) 2017, the R8 project authors. Please see the AUTHORS file | |
| // for details. All rights reserved. Use of this source code is governed by a | |
| // BSD-style license that can be found in the LICENSE file. | |
| package lambdadesugaring; | |
| import java.io.Serializable; | |
| public class ValueAdjustments { | |
| interface B2i { | |
| int foo(Byte i); | |
| } | |
| interface BnUnB { | |
| Object foo( | |
| boolean z, | |
| Boolean Z, | |
| byte b, | |
| Byte B, | |
| char c, | |
| Character C, | |
| short s, | |
| Short S, | |
| int i, | |
| Integer I, | |
| long l, | |
| Long L, | |
| float f, | |
| Float F, | |
| double d, | |
| Double D); | |
| } | |
| interface it<T> { | |
| T t(); | |
| } | |
| interface iz { | |
| boolean f(); | |
| } | |
| interface iBoolean { | |
| Boolean f(); | |
| } | |
| interface ib { | |
| byte f(); | |
| } | |
| interface iObject { | |
| Object f(); | |
| } | |
| interface iNumber { | |
| Number f(); | |
| } | |
| interface iSerializableOut { | |
| Serializable f(); | |
| } | |
| interface iSerializableInt { | |
| Object f(Serializable s); | |
| } | |
| interface iComparableOut<T> { | |
| Comparable<T> f(); | |
| } | |
| interface iComparableInt<T> { | |
| Object f(Comparable<T> c); | |
| } | |
| interface iByte { | |
| Byte f(); | |
| } | |
| interface ic { | |
| char f(); | |
| } | |
| interface iCharacter { | |
| Character f(); | |
| } | |
| interface is { | |
| short f(); | |
| } | |
| interface iShort { | |
| Short f(); | |
| } | |
| interface ii { | |
| int f(); | |
| } | |
| interface iInteger { | |
| Integer f(); | |
| } | |
| interface ij { | |
| long f(); | |
| } | |
| interface iLong { | |
| Long f(); | |
| } | |
| interface if_ { | |
| float f(); | |
| } | |
| interface iFloat { | |
| Float f(); | |
| } | |
| interface id { | |
| double f(); | |
| } | |
| interface iDouble { | |
| Double f(); | |
| } | |
| static class B70348575_A { | |
| String greet() { | |
| return "Hello from A"; | |
| } | |
| } | |
| static class B70348575_A1 extends B70348575_A { | |
| @Override | |
| String greet() { | |
| return "Hello from A1"; | |
| } | |
| } | |
| interface B70348575_B { | |
| B70348575_A1 get(); | |
| } | |
| static class B70348575_C<B70348575_AA extends B70348575_A> { | |
| private B70348575_AA a; | |
| B70348575_C(B70348575_AA a) { | |
| this.a = a; | |
| } | |
| B70348575_AA getA() { | |
| return a; | |
| } | |
| } | |
| static class B70348575_C1 extends B70348575_C<B70348575_A1> { | |
| B70348575_C1() { | |
| super(new B70348575_A1()); | |
| } | |
| B70348575_B getB() { | |
| return this::getA; | |
| } | |
| } | |
| private static void checkObject(StringBuffer builder) { | |
| builder | |
| .append(((iObject) ValueAdjustments::z).f()) | |
| .append(' ') | |
| .append(((iObject) ValueAdjustments::Z).f()) | |
| .append(' ') | |
| .append(((iObject) ValueAdjustments::b).f()) | |
| .append(' ') | |
| .append(((iObject) ValueAdjustments::B).f()) | |
| .append(' ') | |
| .append(((iObject) ValueAdjustments::c).f()) | |
| .append(' ') | |
| .append(((iObject) ValueAdjustments::C).f()) | |
| .append(' ') | |
| .append(((iObject) ValueAdjustments::s).f()) | |
| .append(' ') | |
| .append(((iObject) ValueAdjustments::S).f()) | |
| .append(' ') | |
| .append(((iObject) ValueAdjustments::i).f()) | |
| .append(' ') | |
| .append(((iObject) ValueAdjustments::I).f()) | |
| .append(' ') | |
| .append(((iObject) ValueAdjustments::j).f()) | |
| .append(' ') | |
| .append(((iObject) ValueAdjustments::J).f()) | |
| .append(' ') | |
| .append(((iObject) ValueAdjustments::f).f()) | |
| .append(' ') | |
| .append(((iObject) ValueAdjustments::F).f()) | |
| .append(' ') | |
| .append(((iObject) ValueAdjustments::d).f()) | |
| .append(' ') | |
| .append(((iObject) ValueAdjustments::D).f()) | |
| .append('\n'); | |
| } | |
| private static void checkNumber(StringBuffer builder) { | |
| builder | |
| .append(((iNumber) ValueAdjustments::b).f()) | |
| .append(' ') | |
| .append(((iNumber) ValueAdjustments::B).f()) | |
| .append(' ') | |
| .append(((iNumber) ValueAdjustments::s).f()) | |
| .append(' ') | |
| .append(((iNumber) ValueAdjustments::S).f()) | |
| .append(' ') | |
| .append(((iNumber) ValueAdjustments::i).f()) | |
| .append(' ') | |
| .append(((iNumber) ValueAdjustments::I).f()) | |
| .append(' ') | |
| .append(((iNumber) ValueAdjustments::j).f()) | |
| .append(' ') | |
| .append(((iNumber) ValueAdjustments::J).f()) | |
| .append(' ') | |
| .append(((iNumber) ValueAdjustments::f).f()) | |
| .append(' ') | |
| .append(((iNumber) ValueAdjustments::F).f()) | |
| .append(' ') | |
| .append(((iNumber) ValueAdjustments::d).f()) | |
| .append(' ') | |
| .append(((iNumber) ValueAdjustments::D).f()) | |
| .append('\n'); | |
| } | |
| private static void checkSerializableOut(StringBuffer builder) { | |
| builder | |
| .append(((iSerializableOut) ValueAdjustments::z).f()) | |
| .append(' ') | |
| .append(((iSerializableOut) ValueAdjustments::c).f()) | |
| .append(' ') | |
| .append(((iSerializableOut) ValueAdjustments::b).f()) | |
| .append(' ') | |
| .append(((iSerializableOut) ValueAdjustments::s).f()) | |
| .append(' ') | |
| .append(((iSerializableOut) ValueAdjustments::i).f()) | |
| .append(' ') | |
| .append(((iSerializableOut) ValueAdjustments::j).f()) | |
| .append(' ') | |
| .append(((iSerializableOut) ValueAdjustments::f).f()) | |
| .append(' ') | |
| .append(((iSerializableOut) ValueAdjustments::d).f()) | |
| .append(' '); | |
| } | |
| private static void checkComparableOut(StringBuffer builder) { | |
| builder | |
| .append(((iComparableOut) ValueAdjustments::z).f()) | |
| .append(' ') | |
| .append(((iComparableOut) ValueAdjustments::c).f()) | |
| .append(' ') | |
| .append(((iComparableOut) ValueAdjustments::b).f()) | |
| .append(' ') | |
| .append(((iComparableOut) ValueAdjustments::s).f()) | |
| .append(' ') | |
| .append(((iComparableOut) ValueAdjustments::i).f()) | |
| .append(' ') | |
| .append(((iComparableOut) ValueAdjustments::j).f()) | |
| .append(' ') | |
| .append(((iComparableOut) ValueAdjustments::f).f()) | |
| .append(' ') | |
| .append(((iComparableOut) ValueAdjustments::d).f()) | |
| .append(' '); | |
| } | |
| private static void checkBoxes(StringBuffer builder) { | |
| builder | |
| .append(((iBoolean) ValueAdjustments::z).f()) | |
| .append(' ') | |
| .append(((iByte) ValueAdjustments::b).f()) | |
| .append(' ') | |
| .append(((iCharacter) ValueAdjustments::c).f()) | |
| .append(' ') | |
| .append(((iShort) ValueAdjustments::s).f()) | |
| .append(' ') | |
| .append(((iInteger) ValueAdjustments::i).f()) | |
| .append(' ') | |
| .append(((iLong) ValueAdjustments::j).f()) | |
| .append(' ') | |
| .append(((iFloat) ValueAdjustments::f).f()) | |
| .append(' ') | |
| .append(((iDouble) ValueAdjustments::d).f()) | |
| .append('\n'); | |
| } | |
| private static void checkDouble(StringBuffer builder) { | |
| builder | |
| .append( | |
| ((id) | |
| new it<Double>() { | |
| @Override | |
| public Double t() { | |
| return (double) (Integer.MAX_VALUE) + 1; | |
| } | |
| } | |
| ::t) | |
| .f()) | |
| .append(' ') | |
| .append(((id) ValueAdjustments::b).f()) | |
| .append(' ') | |
| .append(((id) ValueAdjustments::B).f()) | |
| .append(' ') | |
| .append(((id) ValueAdjustments::s).f()) | |
| .append(' ') | |
| .append(((id) ValueAdjustments::S).f()) | |
| .append(' ') | |
| .append(((id) ValueAdjustments::c).f()) | |
| .append(' ') | |
| .append(((id) ValueAdjustments::C).f()) | |
| .append(' ') | |
| .append(((id) ValueAdjustments::i).f()) | |
| .append(' ') | |
| .append(((id) ValueAdjustments::I).f()) | |
| .append(' ') | |
| .append(((id) ValueAdjustments::j).f()) | |
| .append(' ') | |
| .append(((id) ValueAdjustments::J).f()) | |
| .append(' ') | |
| .append(((id) ValueAdjustments::f).f()) | |
| .append(' ') | |
| .append(((id) ValueAdjustments::F).f()) | |
| .append(' ') | |
| .append(((id) ValueAdjustments::d).f()) | |
| .append(' ') | |
| .append(((id) ValueAdjustments::D).f()) | |
| .append('\n'); | |
| } | |
| private static void checkFloat(StringBuffer builder) { | |
| builder | |
| .append( | |
| ((if_) | |
| new it<Float>() { | |
| @Override | |
| public Float t() { | |
| return (float) (Short.MAX_VALUE) + 1; | |
| } | |
| } | |
| ::t) | |
| .f()) | |
| .append(' ') | |
| .append(((if_) ValueAdjustments::b).f()) | |
| .append(' ') | |
| .append(((if_) ValueAdjustments::B).f()) | |
| .append(' ') | |
| .append(((if_) ValueAdjustments::s).f()) | |
| .append(' ') | |
| .append(((if_) ValueAdjustments::S).f()) | |
| .append(' ') | |
| .append(((if_) ValueAdjustments::c).f()) | |
| .append(' ') | |
| .append(((if_) ValueAdjustments::C).f()) | |
| .append(' ') | |
| .append(((if_) ValueAdjustments::i).f()) | |
| .append(' ') | |
| .append(((if_) ValueAdjustments::I).f()) | |
| .append(' ') | |
| .append(((if_) ValueAdjustments::j).f()) | |
| .append(' ') | |
| .append(((if_) ValueAdjustments::J).f()) | |
| .append(' ') | |
| .append(((if_) ValueAdjustments::f).f()) | |
| .append(' ') | |
| .append(((if_) ValueAdjustments::F).f()) | |
| .append('\n'); | |
| } | |
| private static void checkLong(StringBuffer builder) { | |
| builder | |
| .append( | |
| ((ij) | |
| new it<Long>() { | |
| @Override | |
| public Long t() { | |
| return (long) (Integer.MAX_VALUE) + 1; | |
| } | |
| } | |
| ::t) | |
| .f()) | |
| .append(' ') | |
| .append(((ij) ValueAdjustments::b).f()) | |
| .append(' ') | |
| .append(((ij) ValueAdjustments::B).f()) | |
| .append(' ') | |
| .append(((ij) ValueAdjustments::s).f()) | |
| .append(' ') | |
| .append(((ij) ValueAdjustments::S).f()) | |
| .append(' ') | |
| .append(((ij) ValueAdjustments::c).f()) | |
| .append(' ') | |
| .append(((ij) ValueAdjustments::C).f()) | |
| .append(' ') | |
| .append(((ij) ValueAdjustments::i).f()) | |
| .append(' ') | |
| .append(((ij) ValueAdjustments::I).f()) | |
| .append(' ') | |
| .append(((ij) ValueAdjustments::j).f()) | |
| .append(' ') | |
| .append(((ij) ValueAdjustments::J).f()) | |
| .append('\n'); | |
| } | |
| private static void checkInt(StringBuffer builder) { | |
| builder | |
| .append( | |
| ((ii) | |
| new it<Integer>() { | |
| @Override | |
| public Integer t() { | |
| return Short.MAX_VALUE + 1; | |
| } | |
| } | |
| ::t) | |
| .f()) | |
| .append(' ') | |
| .append(((ii) ValueAdjustments::b).f()) | |
| .append(' ') | |
| .append(((ii) ValueAdjustments::B).f()) | |
| .append(' ') | |
| .append(((ii) ValueAdjustments::s).f()) | |
| .append(' ') | |
| .append(((ii) ValueAdjustments::S).f()) | |
| .append(' ') | |
| .append(((ii) ValueAdjustments::c).f()) | |
| .append(' ') | |
| .append(((ii) ValueAdjustments::C).f()) | |
| .append(' ') | |
| .append(((ii) ValueAdjustments::i).f()) | |
| .append(' ') | |
| .append(((ii) ValueAdjustments::I).f()) | |
| .append('\n'); | |
| } | |
| private static void checkShort(StringBuffer builder) { | |
| builder | |
| .append( | |
| ((is) | |
| new it<Short>() { | |
| @Override | |
| public Short t() { | |
| return 256; | |
| } | |
| } | |
| ::t) | |
| .f()) | |
| .append(' ') | |
| .append(((is) ValueAdjustments::b).f()) | |
| .append(' ') | |
| .append(((is) ValueAdjustments::B).f()) | |
| .append(' ') | |
| .append(((is) ValueAdjustments::s).f()) | |
| .append(' ') | |
| .append(((is) ValueAdjustments::S).f()) | |
| .append('\n'); | |
| } | |
| private static void checkChar(StringBuffer builder) { | |
| builder | |
| .append( | |
| ((ic) | |
| new it<Character>() { | |
| @Override | |
| public Character t() { | |
| return 'C'; | |
| } | |
| } | |
| ::t) | |
| .f()) | |
| .append(' ') | |
| .append(((ic) ValueAdjustments::c).f()) | |
| .append(' ') | |
| .append(((ic) ValueAdjustments::C).f()) | |
| .append('\n'); | |
| } | |
| private static void checkByte(StringBuffer builder) { | |
| builder | |
| .append( | |
| ((ib) | |
| new it<Byte>() { | |
| @Override | |
| public Byte t() { | |
| return 11; | |
| } | |
| } | |
| ::t) | |
| .f()) | |
| .append(' ') | |
| .append(((ib) ValueAdjustments::b).f()) | |
| .append(' ') | |
| .append(((ib) ValueAdjustments::B).f()) | |
| .append('\n'); | |
| } | |
| private static void checkBoolean(StringBuffer builder) { | |
| builder | |
| .append( | |
| ((iz) | |
| new it<Boolean>() { | |
| @Override | |
| public Boolean t() { | |
| return true; | |
| } | |
| } | |
| ::t) | |
| .f()) | |
| .append(' ') | |
| .append(((iz) ValueAdjustments::z).f()) | |
| .append(' ') | |
| .append(((iz) ValueAdjustments::Z).f()) | |
| .append('\n'); | |
| } | |
| private static void checkMisc(StringBuffer builder) { | |
| builder | |
| .append( | |
| ((BnUnB) ValueAdjustments::boxingAndUnboxing) | |
| .foo( | |
| true, false, (byte) 1, (byte) 2, (char) 33, (char) 44, (short) 5, (short) 6, 7, | |
| 8, 9, 10L, 11, 12f, 13, 14d)) | |
| .append('\n') | |
| .append( | |
| ((BnUnB) ValueAdjustments::boxingAndUnboxingW) | |
| .foo( | |
| true, false, (byte) 1, (byte) 2, (char) 33, (char) 44, (short) 5, (short) 6, 7, | |
| 8, 9, 10L, 11, 12f, 13, 14d)) | |
| .append('\n') | |
| .append( | |
| ((BnUnB) ValueAdjustments::allSerializable) | |
| .foo( | |
| true, false, (byte) 1, (byte) 2, (char) 33, (char) 44, (short) 5, (short) 6, 7, | |
| 8, 9, 10L, 11, 12f, 13, 14d)) | |
| .append('\n') | |
| .append( | |
| ((BnUnB) ValueAdjustments::allComparable) | |
| .foo( | |
| true, false, (byte) 1, (byte) 2, (char) 33, (char) 44, (short) 5, (short) 6, 7, | |
| 8, 9, 10L, 11, 12f, 13, 14d)) | |
| .append('\n') | |
| .append(((B2i) (Integer::new)).foo(Byte.valueOf((byte) 44))) | |
| .append('\n'); | |
| } | |
| static String boxingAndUnboxing( | |
| Boolean Z, | |
| boolean z, | |
| Byte B, | |
| byte b, | |
| Character C, | |
| char c, | |
| Short S, | |
| short s, | |
| Integer I, | |
| int i, | |
| Long L, | |
| long l, | |
| Float F, | |
| float f, | |
| Double D, | |
| double d) { | |
| return "boxingAndUnboxing: " | |
| + Z | |
| + ":" | |
| + z | |
| + ":" | |
| + B | |
| + ":" | |
| + b | |
| + ":" | |
| + C | |
| + ":" | |
| + c | |
| + ":" | |
| + S | |
| + ":" | |
| + s | |
| + ":" | |
| + I | |
| + ":" | |
| + i | |
| + ":" | |
| + L | |
| + ":" | |
| + l | |
| + ":" | |
| + F | |
| + ":" | |
| + f | |
| + ":" | |
| + D | |
| + ":" | |
| + d; | |
| } | |
| static String boxingAndUnboxingW( | |
| boolean Z, | |
| boolean z, | |
| double B, | |
| double b, | |
| double C, | |
| double c, | |
| double S, | |
| double s, | |
| double I, | |
| double i, | |
| double L, | |
| double l, | |
| double F, | |
| double f, | |
| double D, | |
| double d) { | |
| return "boxingAndUnboxingW: " | |
| + Z | |
| + ":" | |
| + z | |
| + ":" | |
| + B | |
| + ":" | |
| + b | |
| + ":" | |
| + C | |
| + ":" | |
| + c | |
| + ":" | |
| + S | |
| + ":" | |
| + s | |
| + ":" | |
| + I | |
| + ":" | |
| + i | |
| + ":" | |
| + L | |
| + ":" | |
| + l | |
| + ":" | |
| + F | |
| + ":" | |
| + f | |
| + ":" | |
| + D | |
| + ":" | |
| + d; | |
| } | |
| static String allSerializable( | |
| Serializable Z, | |
| Serializable z, | |
| Serializable B, | |
| Serializable b, | |
| Serializable C, | |
| Serializable c, | |
| Serializable S, | |
| Serializable s, | |
| Serializable I, | |
| Serializable i, | |
| Serializable L, | |
| Serializable l, | |
| Serializable F, | |
| Serializable f, | |
| Serializable D, | |
| Serializable d) { | |
| return "allSerializable: " | |
| + Z | |
| + ":" | |
| + z | |
| + ":" | |
| + B | |
| + ":" | |
| + b | |
| + ":" | |
| + C | |
| + ":" | |
| + c | |
| + ":" | |
| + S | |
| + ":" | |
| + s | |
| + ":" | |
| + I | |
| + ":" | |
| + i | |
| + ":" | |
| + L | |
| + ":" | |
| + l | |
| + ":" | |
| + F | |
| + ":" | |
| + f | |
| + ":" | |
| + D | |
| + ":" | |
| + d; | |
| } | |
| static String allComparable( | |
| Comparable Z, | |
| Comparable z, | |
| Comparable B, | |
| Comparable b, | |
| Comparable C, | |
| Comparable c, | |
| Comparable S, | |
| Comparable s, | |
| Comparable I, | |
| Comparable i, | |
| Comparable L, | |
| Comparable l, | |
| Comparable F, | |
| Comparable f, | |
| Comparable D, | |
| Comparable d) { | |
| return "allComparable: " | |
| + Z | |
| + ":" | |
| + z | |
| + ":" | |
| + B | |
| + ":" | |
| + b | |
| + ":" | |
| + C | |
| + ":" | |
| + c | |
| + ":" | |
| + S | |
| + ":" | |
| + s | |
| + ":" | |
| + I | |
| + ":" | |
| + i | |
| + ":" | |
| + L | |
| + ":" | |
| + l | |
| + ":" | |
| + F | |
| + ":" | |
| + f | |
| + ":" | |
| + D | |
| + ":" | |
| + d; | |
| } | |
| static boolean z() { | |
| return true; | |
| } | |
| static byte b() { | |
| return 8; | |
| } | |
| static char c() { | |
| return 'c'; | |
| } | |
| static short s() { | |
| return 16; | |
| } | |
| static int i() { | |
| return 32; | |
| } | |
| static long j() { | |
| return 64; | |
| } | |
| static float f() { | |
| return 0.32f; | |
| } | |
| static double d() { | |
| return 0.64; | |
| } | |
| static Boolean Z() { | |
| return false; | |
| } | |
| static Byte B() { | |
| return -8; | |
| } | |
| static Character C() { | |
| return 'C'; | |
| } | |
| static Short S() { | |
| return -16; | |
| } | |
| static Integer I() { | |
| return -32; | |
| } | |
| static Long J() { | |
| return -64L; | |
| } | |
| static Float F() { | |
| return -0.32f; | |
| } | |
| static Double D() { | |
| return -0.64; | |
| } | |
| private static void bB70348575(StringBuffer builder) { | |
| B70348575_C1 c1 = new B70348575_C1(); | |
| B70348575_A1 a = c1.getB().get(); | |
| builder.append(a.greet()).append('\n'); | |
| } | |
| // Make the test independent of libraries by not using java.util.function.Function. | |
| interface MyFunction<T, R> { | |
| R apply(T var1); | |
| } | |
| static class Observable<T> {} | |
| static class Handler<T> { | |
| T elements; | |
| Handler(T e) { | |
| elements = e; | |
| } | |
| public T handleErrors(T result) { | |
| System.out.println(result.getClass().getName()); | |
| return null; | |
| } | |
| public final Observable<T> map(MyFunction<? super T, ? extends T> mapper) { | |
| System.out.println("Handler.map"); | |
| mapper.apply(elements); | |
| return null; | |
| } | |
| } | |
| static class B116542124 { | |
| private Handler<String[]> approvalManagersHandler = new Handler<>(new String[] {"asdf"}); | |
| public void test() { | |
| approvalManagersHandler.map(approvalManagersHandler::handleErrors); | |
| } | |
| } | |
| public static void main(String[] args) { | |
| StringBuffer builder = new StringBuffer(); | |
| checkBoolean(builder); | |
| checkByte(builder); | |
| checkChar(builder); | |
| checkShort(builder); | |
| checkInt(builder); | |
| checkLong(builder); | |
| checkFloat(builder); | |
| checkDouble(builder); | |
| checkBoxes(builder); | |
| checkNumber(builder); | |
| checkSerializableOut(builder); | |
| checkComparableOut(builder); | |
| checkObject(builder); | |
| checkMisc(builder); | |
| bB70348575(builder); | |
| new B116542124().test(); | |
| System.out.println(builder.toString()); | |
| } | |
| } |