open class A : Java2 {
  constructor() /* primary */ {
    super/*Java2*/()
    /* <init>() */

  }

}

class B : Java2 {
  constructor() /* primary */ {
    super/*Java2*/()
    /* <init>() */

  }

  override fun bar(): String {
    return "2"
  }

  override fun foo(s: String?) {
  }

}

class C : Java3 {
  constructor() /* primary */ {
    super/*Java3*/()
    /* <init>() */

  }

}

class D : Java3 {
  constructor() /* primary */ {
    super/*Java3*/()
    /* <init>() */

  }

  override fun bar(): String {
    return "3"
  }

  override fun foo(s: String?) {
  }

}

abstract class E : Java2, Java4 {
  constructor() /* primary */ {
    super/*Java2*/()
    /* <init>() */

  }

}

class F : Java2, Java4 {
  constructor() /* primary */ {
    super/*Java2*/()
    /* <init>() */

  }

  override fun foo(s: Any?) {
  }

}

abstract class G : Java2, KotlinInterface {
  constructor() /* primary */ {
    super/*Java2*/()
    /* <init>() */

  }

}

class H : Java2, KotlinInterface {
  override val nullableString: Any
    field = nullableString
    override get

  constructor(nullableString: Any) /* primary */ {
    super/*Java2*/()
    /* <init>() */

  }

  override fun foo(s: Any) {
  }

}

class I : Java5 {
  constructor() /* primary */ {
    super/*Java5*/()
    /* <init>() */

  }

}

interface KotlinInterface {
  abstract fun bar(): Any?

  abstract fun foo(s: Any)

  abstract val nullableString: Any
    abstract get

}

fun test(a: A, b: B, c: C, d: D, e: E, f: F, g: G, h: H, i: I) {
  a(super<A>).#nullableString /*~> Unit */
  a.foo(s = "")
  a.bar() /*~> Unit */
  b(super<B>).#nullableString /*~> Unit */
  b.foo(s = "")
  b.bar() /*~> Unit */
  c(super<C>).#nullableString /*~> Unit */
  c.foo(s = "")
  c.bar() /*~> Unit */
  d(super<D>).#nullableString /*~> Unit */
  d.foo(s = "")
  d.bar() /*~> Unit */
  e(super<E>).#nullableString /*~> Unit */
  e.foo(s = "")
  e.foo(s = 1)
  e.bar() /*~> Unit */
  f(super<F>).#nullableString /*~> Unit */
  f.foo(s = "")
  f.foo(s = 1)
  f.bar() /*~> Unit */
  g(super<G>).#nullableString /*~> Unit */
  g.foo(s = 1)
  g.bar() /*~> Unit */
  h(super<H>).#nullableString /*~> Unit */
  h.foo(s = 1)
  h.bar() /*~> Unit */
  i(super<I>).#nullableString /*~> Unit */
  i.foo(s = "")
  i.bar() /*~> Unit */
}
