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