// 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 enclosingmethod_proguarded;

public class OuterClass {
  public class AClass {

  }

  public void aMethod() {
    class AnotherClass extends AbstractClass {

      @Override
      public int anInt() {
        return 48;
      }
    }

    print(new AbstractClass() {
      @Override
      public int anInt() {
        return 42;
      }
    });
    print(new AnotherClass());
  }

  private static void print(AbstractClass anInstance) {
    System.out.println(anInstance.anInt());
    System.out.println(anInstance.getClass().getEnclosingClass());
    System.out.println(anInstance.getClass().getEnclosingMethod());
    System.out.println(anInstance.getClass().isAnonymousClass());
    System.out.println(anInstance.getClass().isLocalClass());
    System.out.println(anInstance.getClass().isMemberClass());
  }
}
