Files
kotlin-fork/js/js.translator/testData/box/nameClashes/overloadClassGenericExtensionInGenericScope.kt
T
Alexander Korepanov 0982872959 [JS IR] Fix clash between generic extension overloads
Type parameter constraints are used for calculating JS signature hash.

^KT-51151 Fixed
2022-07-22 16:14:51 +00:00

97 lines
2.9 KiB
Kotlin
Vendored

class Receiver()
open class A1
open class A2: A1()
open class A3: A2()
class GenericScope<E : A1>() {
class GenericSubScope<E : A2> {
fun <T : E> Receiver.testOverload(e: T) = "SubScope"
}
fun <T : E> Receiver.testOverload(e: T) = "Scope"
}
class GenericScopeWithOverloads<E : A1>() {
class GenericSubScopeWithOverloads<E : A2> {
fun <T : E> Receiver.testOverload(e: T) = "SubScope"
fun <T : A3> Receiver.testOverload(e: T) = "SubScope A3"
}
fun <T : E> Receiver.testOverload(e: T) = "Scope"
fun <T : A2> Receiver.testOverload(e: T) = "Scope A2"
fun <T : A3> Receiver.testOverload(e: T) = "Scope A3"
}
val r = Receiver()
fun testGenericScope() {
GenericScope<A1>().apply {
assertEquals("Scope", r.testOverload(A1()))
assertEquals("Scope", r.testOverload(A2()))
assertEquals("Scope", r.testOverload(A3()))
GenericScope.GenericSubScope<A2>().apply {
assertEquals("Scope", r.testOverload(A1()))
assertEquals("SubScope", r.testOverload(A2()))
assertEquals("SubScope", r.testOverload(A3()))
}
GenericScope.GenericSubScope<A3>().apply {
assertEquals("Scope", r.testOverload(A1()))
assertEquals("Scope", r.testOverload(A2()))
assertEquals("SubScope", r.testOverload(A3()))
}
}
GenericScope<A2>().apply {
assertEquals("Scope", r.testOverload(A2()))
assertEquals("Scope", r.testOverload(A3()))
GenericScope.GenericSubScope<A2>().apply {
assertEquals("SubScope", r.testOverload(A2()))
assertEquals("SubScope", r.testOverload(A3()))
}
GenericScope.GenericSubScope<A3>().apply {
assertEquals("Scope", r.testOverload(A2()))
assertEquals("SubScope", r.testOverload(A3()))
}
}
}
fun testGenericScopeWithOverloads() {
GenericScopeWithOverloads<A1>().apply {
assertEquals("Scope", r.testOverload(A1()))
assertEquals("Scope A2", r.testOverload(A2()))
assertEquals("Scope A3", r.testOverload(A3()))
GenericScopeWithOverloads.GenericSubScopeWithOverloads<A2>().apply {
assertEquals("Scope", r.testOverload(A1()))
assertEquals("SubScope", r.testOverload(A2()))
assertEquals("SubScope A3", r.testOverload(A3()))
}
GenericScopeWithOverloads.GenericSubScopeWithOverloads<A3>().apply {
assertEquals("Scope", r.testOverload(A1()))
assertEquals("Scope A2", r.testOverload(A2()))
}
}
GenericScopeWithOverloads<A2>().apply {
assertEquals("Scope A3", r.testOverload(A3()))
GenericScopeWithOverloads.GenericSubScopeWithOverloads<A2>().apply {
assertEquals("SubScope", r.testOverload(A2()))
assertEquals("SubScope A3", r.testOverload(A3()))
}
}
}
fun box(): String {
testGenericScope()
testGenericScopeWithOverloads()
return "OK"
}