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