open class A : Java2 { constructor() /* primary */ { super/*Java2*/() /* () */ } } class B : Java2 { constructor() /* primary */ { super/*Java2*/() /* () */ } override fun bar(): String { return "2" } override fun foo(s: String?) { } } class C : Java3 { constructor() /* primary */ { super/*Java3*/() /* () */ } } class D : Java3 { constructor() /* primary */ { super/*Java3*/() /* () */ } override fun bar(): String { return "3" } override fun foo(s: String?) { } } abstract class E : Java2, Java4 { constructor() /* primary */ { super/*Java2*/() /* () */ } } class F : Java2, Java4 { constructor() /* primary */ { super/*Java2*/() /* () */ } override fun foo(s: Any?) { } } abstract class G : Java2, KotlinInterface { constructor() /* primary */ { super/*Java2*/() /* () */ } } class H : Java2, KotlinInterface { override val nullableString: Any field = nullableString override get constructor(nullableString: Any) /* primary */ { super/*Java2*/() /* () */ } override fun foo(s: Any) { } } class I : Java5 { constructor() /* primary */ { super/*Java5*/() /* () */ } } 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.#nullableString /*~> Unit */ a.foo(s = "") a.bar() /*~> Unit */ b.#nullableString /*~> Unit */ b.foo(s = "") b.bar() /*~> Unit */ c.#nullableString /*~> Unit */ c.foo(s = "") c.bar() /*~> Unit */ d.#nullableString /*~> Unit */ d.foo(s = "") d.bar() /*~> Unit */ e.#nullableString /*~> Unit */ e.foo(s = "") e.foo(s = 1) e.bar() /*~> Unit */ f.#nullableString /*~> Unit */ f.foo(s = "") f.foo(s = 1) f.bar() /*~> Unit */ g.#nullableString /*~> Unit */ g.foo(s = 1) g.bar() /*~> Unit */ h.() /*~> Unit */ h.foo(s = 1) h.bar() /*~> Unit */ i.#nullableString /*~> Unit */ i.foo(s = "") i.bar() /*~> Unit */ }