KT-2752: remove diagnostic that reports about overridden method having several names from different sources. Generate proxies instead. Fix reporting name clash when two distinct fake overrides require same name.
This commit is contained in:
+59
@@ -0,0 +1,59 @@
|
||||
// TARGET_BACKEND: JS
|
||||
package foo
|
||||
|
||||
interface A {
|
||||
@JsName("foo") fun foo(value: Int): String
|
||||
}
|
||||
|
||||
interface B {
|
||||
@JsName("bar") fun foo(value: Int): String
|
||||
}
|
||||
|
||||
open class C : A, B {
|
||||
override fun foo(value: Int) = "C.foo($value)"
|
||||
}
|
||||
|
||||
class CDerived : C() {
|
||||
override fun foo(value: Int) = "CDerived.foo($value)"
|
||||
}
|
||||
|
||||
open class D {
|
||||
open fun foo(value: Int) = "D.foo($value)"
|
||||
}
|
||||
|
||||
class E : D(), A, B
|
||||
|
||||
fun box(): String {
|
||||
val a: A = C()
|
||||
assertEquals("C.foo(55)", a.foo(55))
|
||||
|
||||
val b: B = C()
|
||||
assertEquals("C.foo(23)", b.foo(23))
|
||||
|
||||
val a2: A = CDerived()
|
||||
assertEquals("CDerived.foo(55)", a2.foo(55))
|
||||
|
||||
val b2: B = CDerived()
|
||||
assertEquals("CDerived.foo(23)", b2.foo(23))
|
||||
|
||||
val d: dynamic = C()
|
||||
assertEquals("C.foo(42)", d.foo(42))
|
||||
assertEquals("C.foo(99)", d.bar(99))
|
||||
|
||||
val d2: dynamic = CDerived()
|
||||
assertEquals("CDerived.foo(42)", d2.foo(42))
|
||||
assertEquals("CDerived.foo(99)", d2.bar(99))
|
||||
|
||||
val da: A = E()
|
||||
assertEquals("D.foo(55)", da.foo(55))
|
||||
|
||||
val db: B = E()
|
||||
assertEquals("D.foo(23)", db.foo(23))
|
||||
|
||||
val dd: dynamic = E()
|
||||
assertEquals("D.foo(42)", dd.foo(42))
|
||||
assertEquals("D.foo(99)", dd.bar(99))
|
||||
assertEquals("D.foo(88)", dd.`foo_za3lpa$`(88))
|
||||
|
||||
return "OK"
|
||||
}
|
||||
@@ -13,6 +13,12 @@ class C : A, B {
|
||||
override fun foo(value: Int) = "C.foo($value)"
|
||||
}
|
||||
|
||||
open class D {
|
||||
open fun foo(value: Int) = "D.foo($value)"
|
||||
}
|
||||
|
||||
class E : D(), A, B
|
||||
|
||||
fun box(): String {
|
||||
val a: A = C()
|
||||
assertEquals("C.foo(55)", a.foo(55))
|
||||
@@ -24,5 +30,15 @@ fun box(): String {
|
||||
assertEquals("C.foo(42)", d.foo(42))
|
||||
assertEquals("C.foo(99)", d.`foo_za3lpa$`(99))
|
||||
|
||||
val da: A = E()
|
||||
assertEquals("D.foo(55)", da.foo(55))
|
||||
|
||||
val db: B = E()
|
||||
assertEquals("D.foo(23)", db.foo(23))
|
||||
|
||||
val dd: dynamic = E()
|
||||
assertEquals("D.foo(42)", dd.foo(42))
|
||||
assertEquals("D.foo(99)", dd.`foo_za3lpa$`(99))
|
||||
|
||||
return "OK"
|
||||
}
|
||||
+1
-1
@@ -20,4 +20,4 @@ open class E {
|
||||
open fun g() {}
|
||||
}
|
||||
|
||||
<!JS_NAME_OVERRIDE_CLASH!>class F : E(), A, B<!>
|
||||
<!JS_NAME_CLASH_SYNTHETIC!>class F : E(), A, B<!>
|
||||
|
||||
-23
@@ -1,23 +0,0 @@
|
||||
interface A {
|
||||
@JsName("f") fun foo(value: Int)
|
||||
}
|
||||
|
||||
interface B {
|
||||
@JsName("g") fun foo(value: Int)
|
||||
}
|
||||
|
||||
class C : A, B {
|
||||
<!JS_NAME_OVERRIDE_CLASH!>override fun foo(value: Int) { }<!>
|
||||
}
|
||||
|
||||
@native interface NA {
|
||||
@JsName("f") fun foo(value: Int)
|
||||
}
|
||||
|
||||
@native interface NB {
|
||||
@JsName("g") fun foo(value: Int)
|
||||
}
|
||||
|
||||
class NC : NA, NB {
|
||||
<!JS_NAME_OVERRIDE_CLASH!>override fun foo(value: Int) { }<!>
|
||||
}
|
||||
-45
@@ -1,45 +0,0 @@
|
||||
package
|
||||
|
||||
public interface A {
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
@kotlin.js.JsName(name = "f") public abstract fun foo(/*0*/ value: kotlin.Int): kotlin.Unit
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
public interface B {
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
@kotlin.js.JsName(name = "g") public abstract fun foo(/*0*/ value: kotlin.Int): kotlin.Unit
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
public final class C : A, B {
|
||||
public constructor C()
|
||||
public open override /*2*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*2*/ fun foo(/*0*/ value: kotlin.Int): kotlin.Unit
|
||||
public open override /*2*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*2*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
@kotlin.js.native() public interface NA {
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
@kotlin.js.JsName(name = "f") public abstract fun foo(/*0*/ value: kotlin.Int): kotlin.Unit
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
@kotlin.js.native() public interface NB {
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
@kotlin.js.JsName(name = "g") public abstract fun foo(/*0*/ value: kotlin.Int): kotlin.Unit
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
public final class NC : NA, NB {
|
||||
public constructor NC()
|
||||
public open override /*2*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*2*/ fun foo(/*0*/ value: kotlin.Int): kotlin.Unit
|
||||
public open override /*2*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*2*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
Reference in New Issue
Block a user