| // 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()); |
| } |
| } |