From d6112224b4f556a322ec4b1e460fb864229f9f4d Mon Sep 17 00:00:00 2001 From: Ilya Goncharov Date: Wed, 3 Nov 2021 18:10:49 +0300 Subject: [PATCH] [JS IR] Generate references from fake override to body in case of generic superclass --- .../transformers/irToJs/JsClassGenerator.kt | 21 ++++++++++++------- .../fakeOverrideThroughGenericSuperclass.kt | 2 -- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/JsClassGenerator.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/JsClassGenerator.kt index b0f080c9654..e109a14044b 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/JsClassGenerator.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/JsClassGenerator.kt @@ -258,17 +258,14 @@ class JsClassGenerator(private val irClass: IrClass, val context: JsGenerationCo // interface II : I // II.prototype.foo = I.prototype.foo if (!irClass.isInterface) { + val isFakeOverride = declaration.isFakeOverride + val missedOverrides = mutableListOf() declaration.collectRealOverrides() - .find { it.modality != Modality.ABSTRACT } - ?.let { - val implClassDeclaration = it.parent as IrClass - - if (implClassDeclaration.shouldCopyFrom() && it.body != null) { - val reference = context.getNameForStaticDeclaration(it).makeRef() - classModel.postDeclarationBlock.statements += jsAssignment(memberRef, reference).makeStmt() + .onEach { + if (isFakeOverride && it.modality == Modality.ABSTRACT) { + missedOverrides.add(it) } } - declaration.collectRealOverrides() .find { it.modality != Modality.ABSTRACT } ?.let { 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) { val reference = context.getNameForStaticDeclaration(it).makeRef() 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() + } + } } } } diff --git a/compiler/testData/codegen/box/bridges/fakeOverrideThroughGenericSuperclass.kt b/compiler/testData/codegen/box/bridges/fakeOverrideThroughGenericSuperclass.kt index 5697aa3f112..dab809be83a 100644 --- a/compiler/testData/codegen/box/bridges/fakeOverrideThroughGenericSuperclass.kt +++ b/compiler/testData/codegen/box/bridges/fakeOverrideThroughGenericSuperclass.kt @@ -1,8 +1,6 @@ // !LANGUAGE: -AbstractClassMemberNotImplementedWithIntermediateAbstractClass // IGNORE_BACKEND: WASM // WASM_MUTE_REASON: IGNORED_IN_JS -// IGNORE_BACKEND: JS_IR -// IGNORE_BACKEND: JS_IR_ES6 var result = "Fail"