// MODULE: lib // FILE: A.kt // VERSION: 1 open class X { fun foo(): String = "final method" val bar: String = "final property" } class Y: X() // FILE: B.kt // VERSION: 2 open class X { open fun foo(): String = "open method" open val bar: String = "open property" } class Y: X() { override fun foo(): String = "derived method" override val bar: String = "derived property" } // MODULE: mainLib(lib) // FILE: mainLib.kt class Z: X() fun lib(): String = when { X().foo() != "open method" -> "fail 1" X().bar != "open property" -> "fail 2" Y().foo() != "derived method" -> "fail 3" Y().bar != "derived property" -> "fail 4" Z().foo() != "open method" -> "fail 5" Z().bar != "open property" -> "fail 6" else -> "OK" } // MODULE: main(mainLib) // FILE: main.kt fun box(): String = lib()