// Copyright (c) 2016, 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 memberrebinding;

import memberrebinding.subpackage.PublicClass;
import memberrebindinglib.AnIndependentInterface;

public class Memberrebinding {

  public static void main(String[] args) {
    ClassAtBottomOfChain bottomInstance = new ClassAtBottomOfChain();
    bottomInstance.superCallsProperlyPropagate();
    bottomInstance.methodThatCallsSuperCallsProperlyPropagateTwo();
    bottomInstance.methodThatShadowsPrivate();
    bottomInstance.ensureAllCalled();
    System.out.println(bottomInstance.superField);
    ClassExtendsLibraryClass classExtendsLibraryClass = new ClassExtendsLibraryClass();
    classExtendsLibraryClass.methodThatAddsHelloWorld();
    classExtendsLibraryClass.methodThatAddsHelloWorldUsingAddAll();
    System.out.println(classExtendsLibraryClass.get(0));
    System.out.println(classExtendsLibraryClass.get(1));
    System.out.println(classExtendsLibraryClass.get(2));
    PublicClass instance = new PublicClass();
    instance.aMethod();
    PublicClass.aStaticMethod();
    ClassExtendsOtherLibraryClass classExtendsOther = new ClassExtendsOtherLibraryClass();
    System.out.println(classExtendsOther.aMethodThatReturnsOne());
    System.out.println(classExtendsOther.aMethodThatReturnsTwo());
    System.out.println(classExtendsOther.aMethodThatReturnsThree());
    System.out.println(classExtendsOther.aMethodThatReturnsFour());
    AnIndependentInterface iface =
        System.currentTimeMillis() >= 0
            ? new ClassExtendsOtherLibraryClass()
            : new OtherClassExtendsOtherLibraryClass();
    System.out.println(iface.aMethodThatReturnsTwo());
    SuperClassOfClassExtendsOtherLibraryClass superClass =
        System.currentTimeMillis() >= 0
            ? new ClassExtendsOtherLibraryClass()
            : new OtherClassExtendsOtherLibraryClass();
    System.out.println(superClass.aMethodThatReturnsTrue());
    System.out.println(superClass.aMethodThatReturnsFalse());
  }
}
