/*
 * Copyright (C) 2016 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

class Main {
  public String getA() {
    return "A";
  }
  public String getB() {
    return "B";
  }
  public String getC() {
    return "C";
  }
}

class TestInline {
  public int inlineMonomorphic(Super s) {
    return s.getValue();
  }

  public int inlinePolymorphic(Super s) {
    return s.getValue();
  }

  public int inlineMegamorphic(Super s) {
    return s.getValue();
  }

  public int inlineMissingTypes(Super s) {
    return s.getValue();
  }

  public int noInlineCache(Super s) {
    return s.getValue();
  }

  public int inlineMultiMonomorphic(Super s, Secret sec) {
    return s.getValue() + sec.getIdentity();
  }

  public int inlineMultiPolymorphic(Super s, Secret sec) {
    return s.getValue() + sec.getIdentity();
  }

  public int inlineTriplePolymorphic(Super s, Secret sec, Secret thr) {
    return s.getValue() + sec.getIdentity() + thr.getIdentity();
  }

  public int inlineMultiMegamorphic(Super s, Secret sec) {
    return s.getValue() + sec.getIdentity();
  }

  public int inlineMultiMissingTypes(Super s, Secret sec) {
    return s.getValue() + sec.getIdentity();
  }

  public int noInlineCacheMulti(Super s, Secret sec) {
    return s.getValue() + sec.getIdentity();
  }
}

class TestInlineSubtype extends TestInline {
  public void foobar() {
    this.inlineMonomorphic(new SubA());
  }
}

abstract class Secret {
  abstract int getIdentity();
}

abstract class Super extends Secret {
  abstract int getValue();
}

class SubA extends Super {
  int getValue() { return 42; }
  int getIdentity() { return 24; }
}

class SubB extends Super {
  int getValue() { return 38; };
  int getIdentity() { return 83; }
}

class SubD extends Super {
  int getValue() { return 20; };
  int getIdentity() { return 2; };
}

class SubE extends Super {
  int getValue() { return 16; };
  int getIdentity() { return 61; };
}

// Add a class with lots of methods so we can test profile guided compilation triggers.
class ZLotsOfMethods {
  public void m1() {}
  public void m2() {}
  public void m3() {}
  public void m4() {}
  public void m5() {}
  public void m6() {}
  public void m7() {}
  public void m8() {}
  public void m9() {}
  public void m10() {}
  public void m11() {}
  public void m12() {}
  public void m13() {}
  public void m14() {}
  public void m15() {}
  public void m16() {}
  public void m17() {}
  public void m18() {}
  public void m19() {}
  public void m20() {}
  public void m21() {}
  public void m22() {}
  public void m23() {}
  public void m24() {}
  public void m25() {}
  public void m26() {}
  public void m27() {}
  public void m28() {}
  public void m29() {}
  public void m30() {}
  public void m31() {}
  public void m32() {}
  public void m33() {}
  public void m34() {}
  public void m35() {}
  public void m36() {}
  public void m37() {}
  public void m38() {}
  public void m39() {}
  public void m40() {}
  public void m41() {}
  public void m42() {}
  public void m43() {}
  public void m44() {}
  public void m45() {}
  public void m46() {}
  public void m47() {}
  public void m48() {}
  public void m49() {}
  public void m50() {}
  public void m51() {}
  public void m52() {}
  public void m53() {}
  public void m54() {}
  public void m55() {}
  public void m56() {}
  public void m57() {}
  public void m58() {}
  public void m59() {}
  public void m60() {}
  public void m61() {}
  public void m62() {}
  public void m63() {}
  public void m64() {}
  public void m65() {}
  public void m66() {}
  public void m67() {}
  public void m68() {}
  public void m69() {}
  public void m70() {}
  public void m71() {}
  public void m72() {}
  public void m73() {}
  public void m74() {}
  public void m75() {}
  public void m76() {}
  public void m77() {}
  public void m78() {}
  public void m79() {}
  public void m80() {}
  public void m81() {}
  public void m82() {}
  public void m83() {}
  public void m84() {}
  public void m85() {}
  public void m86() {}
  public void m87() {}
  public void m88() {}
  public void m89() {}
  public void m90() {}
  public void m91() {}
  public void m92() {}
  public void m93() {}
  public void m94() {}
  public void m95() {}
  public void m96() {}
  public void m97() {}
  public void m98() {}
  public void m99() {}
  public void m100() {}
  public void m101() {}
  public void m102() {}
  public void m103() {}
  public void m104() {}
  public void m105() {}
  public void m106() {}
  public void m107() {}
  public void m108() {}
  public void m109() {}
  public void m110() {}
  public void m111() {}
  public void m112() {}
  public void m113() {}
  public void m114() {}
  public void m115() {}
  public void m116() {}
  public void m117() {}
  public void m118() {}
  public void m119() {}
  public void m120() {}
  public void m121() {}
  public void m122() {}
  public void m123() {}
  public void m124() {}
  public void m125() {}
  public void m126() {}
  public void m127() {}
  public void m128() {}
  public void m129() {}
  public void m130() {}
  public void m131() {}
  public void m132() {}
  public void m133() {}
  public void m134() {}
  public void m135() {}
  public void m136() {}
  public void m137() {}
  public void m138() {}
  public void m139() {}
  public void m140() {}
  public void m141() {}
  public void m142() {}
  public void m143() {}
  public void m144() {}
  public void m145() {}
  public void m146() {}
  public void m147() {}
  public void m148() {}
  public void m149() {}
  public void m150() {}
}
