// Generated from "instancejsmethods/Main.java"
@file:Suppress(
 "ALWAYS_NULL",
 "PARAMETER_NAME_CHANGED_ON_OVERRIDE",
 "SENSELESS_COMPARISON",
 "UNCHECKED_CAST",
 "UNNECESSARY_LATEINIT",
 "UNNECESSARY_NOT_NULL_ASSERTION",
 "UNREACHABLE_CODE",
 "UNUSED_ANONYMOUS_PARAMETER",
 "UNUSED_PARAMETER",
 "UNUSED_VARIABLE",
 "USELESS_CAST",
 "VARIABLE_IN_SINGLETON_WITHOUT_THREAD_LOCAL",
 "VARIABLE_WITH_REDUNDANT_INITIALIZER",
 "REDUNDANT_ELSE_IN_WHEN")

package instancejsmethods

import javaemul.lang.*
import jsinterop.annotations.JsMethod
import kotlin.Int
import kotlin.Suppress
import kotlin.jvm.JvmStatic

fun interface MyInterface {
 fun intfFoo(): Int
}

open class SuperParent internal constructor() {
 open fun `fun`(a: Int, b: Int): Int {
  return a + b + 111
 }

 open fun bar(a: Int, b: Int): Int {
  return a * b + 222
 }
}

open class Parent internal constructor(): SuperParent() {
 @JsMethod(name = "sum")
 override fun `fun`(a: Int, b: Int): Int {
  return a + b
 }

 @JsMethod
 override fun bar(a: Int, b: Int): Int {
  return a * b
 }

 @JsMethod(name = "myFoo")
 open fun foo(a: Int): Int {
  return a
 }
}

open class Child internal constructor(): Parent(), MyInterface {
 override fun `fun`(a: Int, b: Int): Int {
  return a + b + 1
 }

 override fun bar(a: Int, b: Int): Int {
  return a * b + 1
 }

 @JsMethod(name = "myFoo")
 override fun foo(a: Int): Int {
  return a
 }

 @JsMethod
 override fun intfFoo(): Int {
  return 1
 }
}

open class Main {
 open fun testCallBySuperParent() {
  val sp: SuperParent = SuperParent()
  val p: SuperParent = Parent()
  val c: SuperParent = Child()
  val pp: Parent = Parent()
  val cc: Parent = Child()
  val intf: MyInterface = Child()
  sp.`fun`(12, 35)
  sp.bar(6, 7)
  p.`fun`(12, 35)
  p.bar(6, 7)
  c.`fun`(12, 35)
  c.bar(6, 7)
  pp.foo(1)
  cc.foo(1)
  intf.intfFoo()
 }

 companion object {
  @JvmStatic
  fun testCallByConcreteType() {
   val sp: SuperParent = SuperParent()
   val p: Parent = Parent()
   val c: Child = Child()
   sp.`fun`(12, 35)
   sp.bar(6, 7)
   p.`fun`(12, 35)
   p.bar(6, 7)
   p.foo(1)
   c.`fun`(12, 35)
   c.bar(6, 7)
   c.foo(1)
   c.intfFoo()
  }
 }
}
