| // TARGET_BACKEND: JVM | |
| // WITH_STDLIB | |
| // See: | |
| // http://kotlinlang.org/docs/reference/java-interop.html#handling-signature-clashes-with-platformname | |
| // https://youtrack.jetbrains.com/issue/KT-5524 | |
| val strs = listOf("abc", "def") | |
| val ints = listOf(1, 2, 3) | |
| class C { | |
| // Instance methods | |
| @JvmName("instMethodStr") | |
| fun instMethod(list: List<String>): String = "instMethodStr" | |
| @JvmName("instMethodInt") | |
| fun instMethod(list: List<Int>): String = "instMethodInt" | |
| // Properties | |
| var rwProperty: Int | |
| @JvmName("get_rwProperty") | |
| get() = 123 | |
| @JvmName("set_rwProperty") | |
| set(v) {} | |
| var rwValue = 111 | |
| fun getRwProperty(): Int = rwValue | |
| fun setRwProperty(v: Int) { | |
| rwValue = v | |
| } | |
| // Extension methods | |
| class Inner | |
| @JvmName("extMethodWithGenericParamStr") | |
| fun Inner.extMethodWithGenericParam(list: List<String>): String = "extMethodWithGenericParamStr" | |
| @JvmName("extMethodWithGenericParamInt") | |
| fun Inner.extMethodWithGenericParam(list: List<Int>): String = "extMethodWithGenericParamInt" | |
| // This is already covered by extMethodWithGenericParam(), but might be relevant for a platform | |
| // with extension method code generation strategy different from Java 6. | |
| @JvmName("extMethodWithGenericReceiverStr") | |
| fun List<String>.extMethodWithGenericReceiver(): String = "extMethodWithGenericReceiverStr" | |
| @JvmName("extMethodWithGenericReceiverInt") | |
| fun List<Int>.extMethodWithGenericReceiver(): String = "extMethodWithGenericReceiverInt" | |
| // Extension method vs instance method | |
| @JvmName("ambigMethod1") | |
| fun ambigMethod(str: String): String = "ambigMethod1" | |
| @JvmName("ambigMethod2") | |
| fun String.ambigMethod(): String = "ambigMethod2" | |
| } | |
| fun box(): String { | |
| val c = C() | |
| // Instance methods: | |
| // method signatures with erased types SHOULD NOT clash | |
| val test1 = c.instMethod(strs) | |
| if (test1 != "instMethodStr") return "Fail: c.instMethod(strs)==$test1" | |
| val test2 = c.instMethod(ints) | |
| if (test2 != "instMethodInt") return "Fail: c.instMethod(ints)==$test2" | |
| // Properties: | |
| // property accessors SHOULD NOT clash with class methods | |
| val test3 = c.rwProperty | |
| if (test3 != 123) return "Fail: c.rwProperty==$test3" | |
| val test3a = c.getRwProperty() | |
| if (test3a != 111) return "Fail: c.getRwProperty()==$test3a" | |
| c.setRwProperty(444) | |
| val test3b = c.rwProperty | |
| if (test3b != 123) return "Fail: c.rwProperty==$test3b after c.setRwProperty(1234)" | |
| val test3c = c.getRwProperty() | |
| if (test3c != 444) return "Fail: c.getRwProperty()==$test3c after c.setRwProperty(1234)" | |
| // Extension methods: | |
| // method signatures with erased types SHOULD NOT clash | |
| val test4 = with(c) { C.Inner().extMethodWithGenericParam(strs) } | |
| if (test4 != "extMethodWithGenericParamStr") return "Fail: with(c) { C.Inner().extMethodWithGenericParam(strs) }==$test4" | |
| val test5 = with(c) { C.Inner().extMethodWithGenericParam(ints) } | |
| if (test5 != "extMethodWithGenericParamInt") return "Fail: with(c) { C.Inner().extMethodWithGenericParam(ints) }==$test5" | |
| val test6 = with(c) { strs.extMethodWithGenericReceiver() } | |
| if (test6 != "extMethodWithGenericReceiverStr") return "Fail: with(c) { strs.extMethodWithGenericReceiver() }==$test6" | |
| val test7 = with(c) { ints.extMethodWithGenericReceiver() } | |
| if (test7 != "extMethodWithGenericReceiverInt") return "Fail: with(c) { ints.extMethodWithGenericReceiver() }==$test7" | |
| // Extension method SHOULD NOT clash with instance method with the same Java signature. | |
| val str = "abc" | |
| val test8 = with(c) { ambigMethod(str) } | |
| if (test8 != "ambigMethod1") return "Fail: with(c) { ambigMethod(str) }==$test8" | |
| val test9 = with(c) { str.ambigMethod() } | |
| if (test9 != "ambigMethod2") return "Fail: with(c) { str.ambigMethod() }==$test9" | |
| // Everything is fine. | |
| return "OK" | |
| } |