// Copyright (c) 2018, 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 classmerging;


public class ConflictInGeneratedNameTest {
  public static void main(String[] args) {
    B obj = new B();
    obj.run();
  }

  public static class A {
    @NeverPropagateValue @NoRedundantFieldLoadElimination private String name = "A";

    public A() {
      print("In A.<init>()");
      $r8$constructor$classmerging$ConflictInGeneratedNameTest$A();
    }

    private void $r8$constructor$classmerging$ConflictInGeneratedNameTest$A() {
      print("In A.$r8$constructor$classmerging$ConflictInGeneratedNameTest$A()");
    }

    public void printState() {
      print("In A.printState()");
      print("A=" + name + "=" + getName());
    }

    // This method is not overridden.
    public void foo() {
      print("In A.foo()");
    }

    // This method is overridden.
    public void bar() {
      print("In A.bar()");
    }

    // This method is overridden and there is a PUBLIC method in B with the same name
    // as the direct version of this method in B.
    public void baz() {
      print("In A.baz()");
    }

    // This method is overridden and there is a PRIVATE method in B with the same name
    // as the direct version of this method in B.
    public void boo() {
      print("In A.boo()");
    }

    // There is a private method in B with the same name as this one.
    @NoAccessModification
    private String getName() {
      return name;
    }
  }

  public static class B extends A {
    @NeverPropagateValue @NoRedundantFieldLoadElimination private String name = "B";

    @NeverPropagateValue @NoRedundantFieldLoadElimination
    private String name$classmerging$ConflictInGeneratedNameTest$A = "C";

    public B() {
      print("In B.<init>()");
      print("A=" + super.name + "=" + super.getName());
      print("B=" + name + "=" + getName());
      print("C=" + name$classmerging$ConflictInGeneratedNameTest$A);
    }

    public void run() {
      printState();
      foo();
      bar();
      baz();
      baz$classmerging$ConflictInGeneratedNameTest$A();
      boo();
      boo$classmerging$ConflictInGeneratedNameTest$A();
    }

    @Override
    public void bar() {
      print("In B.bar()");
      super.bar();
    }

    @Override
    public void baz() {
      print("In B.baz()");
      super.baz();
    }

    public void baz$classmerging$ConflictInGeneratedNameTest$A() {
      print("In B.baz$classmerging$ConflictInGeneratedNameTest$A()");
    }

    @Override
    public void boo() {
      print("In B.boo()");
      super.boo();
    }

    @NoAccessModification
    private void boo$classmerging$ConflictInGeneratedNameTest$A() {
      print("In B.boo$classmerging$ConflictInGeneratedNameTest$A()");
    }

    @NoAccessModification
    private String getName() {
      return name;
    }
  }

  public static void print(String message) {
    System.out.println(message);
  }
}
