// 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.

class KotlinInline {

  fun processObject(obj: Any, func: (Any) -> Unit) {
    func(obj)
  }

  fun printObject(obj: Any) {
    println(obj)
  }

  fun invokeInlinedFunctions() {
    inlinedA {
      val inA = 1
      inlinedB {
        val inB = 2
        foo(inA, inB)
      }
    }
  }

  inline fun inlinedA(f: () -> Unit) {
    f()
  }

  inline fun inlinedB(f: () -> Unit) {
    f()
  }

  fun foo(a: Int, b: Int) {
    println("a=$a, b=$b")
  }

  fun emptyMethod(unused: Int) {}

  fun singleInline() {
    emptyMethod(0)
    inlined()
    emptyMethod(1)
  }

  inline fun inlined() {
    emptyMethod(-1)
  }

  // Double inlining
  fun testNestedInlining() {
    val l1 = Int.MAX_VALUE
    val l2 = Int.MIN_VALUE
    inlinee1(l1, l2)
  }

  inline fun inlinee1(a: Int, b: Int) {
    val c = a - 2
    inlinee2(1) {
      val left = a + b
      val right = a - b
      foo(left, right)
    }
    inlinee2(c) { foo(b, a) }
  }

  inline fun inlinee2(p: Int, block: () -> Unit) {
    if (p > 0) {
      block()
    }
  }

  companion object {
    @JvmStatic
    fun main(args: Array<String>) {
      println("Hello world!")
      val instance = KotlinInline()
      instance.processObject(instance, instance::printObject)
      instance.invokeInlinedFunctions()
      instance.singleInline()
      instance.testNestedInlining()
    }
  }
}
