/*
 * 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() {}
}