// MODULE: lib // FILE: A.kt // VERSION: 1 interface A { fun foo(): String val bar: String } class X(val a: String, var b: String) { fun foo(): String = "original class' method" val bar: String = "original class' property" } // FILE: B.kt // VERSION: 2 interface A { fun foo(): String val bar: String } data class X(val a: String, var b: String) { fun foo(): String = a + b val bar: String = b + a } // MODULE: mainLib(lib) // FILE: mainLib.kt fun lib(): String { val x = X("first", "second") return when { x.a != "first" -> "fail 1" x.b != "second" -> "fail 2" x.foo() != "firstsecond" -> "fail 3" x.bar != "secondfirst" -> "fail 4" x.toString() != "X(a=first, b=second)" -> "fail 5" else -> "OK" } } // MODULE: main(mainLib) // FILE: main.kt fun box(): String = lib()