[JS IR] Generate references from fake override to body in case of generic superclass
This commit is contained in:
+13
-8
@@ -258,17 +258,14 @@ class JsClassGenerator(private val irClass: IrClass, val context: JsGenerationCo
|
|||||||
// interface II : I
|
// interface II : I
|
||||||
// II.prototype.foo = I.prototype.foo
|
// II.prototype.foo = I.prototype.foo
|
||||||
if (!irClass.isInterface) {
|
if (!irClass.isInterface) {
|
||||||
|
val isFakeOverride = declaration.isFakeOverride
|
||||||
|
val missedOverrides = mutableListOf<IrSimpleFunction>()
|
||||||
declaration.collectRealOverrides()
|
declaration.collectRealOverrides()
|
||||||
.find { it.modality != Modality.ABSTRACT }
|
.onEach {
|
||||||
?.let {
|
if (isFakeOverride && it.modality == Modality.ABSTRACT) {
|
||||||
val implClassDeclaration = it.parent as IrClass
|
missedOverrides.add(it)
|
||||||
|
|
||||||
if (implClassDeclaration.shouldCopyFrom() && it.body != null) {
|
|
||||||
val reference = context.getNameForStaticDeclaration(it).makeRef()
|
|
||||||
classModel.postDeclarationBlock.statements += jsAssignment(memberRef, reference).makeStmt()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
declaration.collectRealOverrides()
|
|
||||||
.find { it.modality != Modality.ABSTRACT }
|
.find { it.modality != Modality.ABSTRACT }
|
||||||
?.let {
|
?.let {
|
||||||
val implClassDeclaration = it.parent as IrClass
|
val implClassDeclaration = it.parent as IrClass
|
||||||
@@ -276,6 +273,14 @@ class JsClassGenerator(private val irClass: IrClass, val context: JsGenerationCo
|
|||||||
if (implClassDeclaration.shouldCopyFrom() && it.body != null) {
|
if (implClassDeclaration.shouldCopyFrom() && it.body != null) {
|
||||||
val reference = context.getNameForStaticDeclaration(it).makeRef()
|
val reference = context.getNameForStaticDeclaration(it).makeRef()
|
||||||
classModel.postDeclarationBlock.statements += jsAssignment(memberRef, reference).makeStmt()
|
classModel.postDeclarationBlock.statements += jsAssignment(memberRef, reference).makeStmt()
|
||||||
|
if (isFakeOverride) {
|
||||||
|
classModel.postDeclarationBlock.statements += missedOverrides
|
||||||
|
.map { missedOverride ->
|
||||||
|
val name = context.getNameForMemberFunction(missedOverride)
|
||||||
|
val ref = jsElementAccess(name.ident, classPrototypeRef)
|
||||||
|
jsAssignment(ref, reference).makeStmt()
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +1,6 @@
|
|||||||
// !LANGUAGE: -AbstractClassMemberNotImplementedWithIntermediateAbstractClass
|
// !LANGUAGE: -AbstractClassMemberNotImplementedWithIntermediateAbstractClass
|
||||||
// IGNORE_BACKEND: WASM
|
// IGNORE_BACKEND: WASM
|
||||||
// WASM_MUTE_REASON: IGNORED_IN_JS
|
// WASM_MUTE_REASON: IGNORED_IN_JS
|
||||||
// IGNORE_BACKEND: JS_IR
|
|
||||||
// IGNORE_BACKEND: JS_IR_ES6
|
|
||||||
|
|
||||||
var result = "Fail"
|
var result = "Fail"
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user