// Copyright (c) 2019, 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 nesthostexample;

public class BasicNestHostWithInnerClassConstructors {

  public String field;

  private BasicNestHostWithInnerClassConstructors(String field) {
    this.field = field;
  }

  private BasicNestHostWithInnerClassConstructors(int intVal) {
    this.field = String.valueOf(intVal);
  }

  public static BasicNestedClass createNestedInstance(String field) {
    return new BasicNestedClass(field);
  }

  public static class BasicNestedClass {

    public String field;

    private BasicNestedClass(String field) {
      this.field = field;
    }

    private BasicNestedClass(String unused, String field, String alsoUnused) {
      this.field = field + "UnusedConstructor";
    }

    public static BasicNestHostWithInnerClassConstructors createOuterInstance(String field) {
      return new BasicNestHostWithInnerClassConstructors(field);
    }
  }

  public static void main(String[] args) {
    BasicNestHostWithInnerClassConstructors outer = BasicNestedClass.createOuterInstance("field");
    BasicNestedClass inner =
        BasicNestHostWithInnerClassConstructors.createNestedInstance("nest1SField");
    BasicNestHostWithInnerClassConstructors noBridge =
        new BasicNestHostWithInnerClassConstructors(1);
    BasicNestedClass unusedParamConstructor =
        new BasicNestedClass("unused", "innerField", "alsoUnused");

    System.out.println(outer.field);
    System.out.println(inner.field);
    System.out.println(noBridge.field);
    System.out.println(unusedParamConstructor.field);
  }
}
