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