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

public class OuterClass {
  public class InnerClass {
    private int value;

    public InnerClass(int x) {
      this.value = x;
    }

    int computeAResult(int y) {
      int result = 1;
      for (int i = value; i < y; i++) {
        result++;
        if (result == 1) {
          return result;
        }
      }
      return value * y;
    }
  }

  public abstract class MagicClass {
    public abstract int returnAnInt();
  }

  public int getValueFromInner(int x) {
    class LocalMagic extends MagicClass {

      @Override
      public int returnAnInt() {
        return 123;
      }
    }

    InnerClass inner = new InnerClass(x);
    MagicClass magic =
        new MagicClass() {

          @Override
          public int returnAnInt() {
            return 124;
          }
        };
    MagicClass localMagic = new LocalMagic();
    return inner.computeAResult(42) + magic.returnAnInt() + localMagic.returnAnInt();
  }
}
