diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/ir/IrBuilder.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/ir/IrBuilder.kt index 3b3fcee7cde..6db3bead190 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/ir/IrBuilder.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/ir/IrBuilder.kt @@ -189,12 +189,13 @@ object JsIrBuilder { isVar: Boolean = false, isConst: Boolean = false, isLateinit: Boolean = false, - initializer: IrExpression? = null + initializer: IrExpression? = null, + origin: IrDeclarationOrigin = SYNTHESIZED_DECLARATION ): IrVariable = buildVariable( parent, UNDEFINED_OFFSET, UNDEFINED_OFFSET, - SYNTHESIZED_DECLARATION, + origin, Name.identifier(name), type, isVar, diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/ES6ConstructorCallLowering.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/ES6ConstructorCallLowering.kt index 62640c841e0..de869cf16a3 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/ES6ConstructorCallLowering.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/ES6ConstructorCallLowering.kt @@ -44,12 +44,10 @@ class ES6ConstructorCallLowering(val context: JsIrBackendContext) : BodyLowering } } - val isDelegatingCall = - expression.isSyntheticDelegatingReplacement && currentFunction != null && currentFunction.parentAsClass != irClass + val isDelegatingCall = expression.isSyntheticDelegatingReplacement && currentFunction != null val factoryFunctionCall = JsIrBuilder.buildCall( factoryFunction.symbol, - superQualifierSymbol = irClass.symbol.takeIf { isDelegatingCall }, origin = if (isDelegatingCall) ES6_DELEGATING_CONSTRUCTOR_REPLACEMENT else JsStatementOrigins.SYNTHESIZED_STATEMENT ).apply { copyValueArgumentsFrom(expression, factoryFunction) diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/ES6ConstructorLowering.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/ES6ConstructorLowering.kt index 091ef8356ec..7feb079c2dd 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/ES6ConstructorLowering.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/ES6ConstructorLowering.kt @@ -155,7 +155,8 @@ class ES6ConstructorLowering(val context: JsIrBackendContext) : DeclarationTrans type = irClass.defaultType, parent = this, name = Namer.SYNTHETIC_RECEIVER_NAME, - initializer = initializer + initializer = initializer, + origin = IrDeclarationOrigin.IR_TEMPORARY_VARIABLE ) } diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/ES6PrimaryConstructorOptimizationLowering.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/ES6PrimaryConstructorOptimizationLowering.kt index 6587a04016f..acb1f01a9af 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/ES6PrimaryConstructorOptimizationLowering.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/ES6PrimaryConstructorOptimizationLowering.kt @@ -226,7 +226,9 @@ class ES6CollectPrimaryConstructorsWhichCouldBeOptimizedLowering(private val con } private fun IrClass.canBeOptimized(): Boolean { - return superClass?.symbol != context.throwableClass && !isSubclassOfExternalClassWithRequiredBoxParameter() && !hasPrimaryDelegatedToSecondaryOrSecondaryToPrimary() + return superClass?.symbol != context.throwableClass && + !isSubclassOfExternalClassWithRequiredBoxParameter() && + !hasPrimaryDelegatedToSecondaryOrSecondaryToPrimary() } private fun IrClass.hasPrimaryDelegatedToSecondaryOrSecondaryToPrimary(): Boolean { diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/IrElementToJsStatementTransformer.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/IrElementToJsStatementTransformer.kt index ec3e3145c3e..366be417dfa 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/IrElementToJsStatementTransformer.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/IrElementToJsStatementTransformer.kt @@ -7,6 +7,7 @@ package org.jetbrains.kotlin.ir.backend.js.transformers.irToJs import org.jetbrains.kotlin.backend.common.ir.inlineFunction import org.jetbrains.kotlin.backend.common.ir.innerInlinedBlockOrThis +import org.jetbrains.kotlin.ir.backend.js.ir.JsIrBuilder import org.jetbrains.kotlin.ir.backend.js.utils.JsGenerationContext import org.jetbrains.kotlin.ir.backend.js.utils.emptyScope import org.jetbrains.kotlin.ir.backend.js.utils.isTheLastReturnStatementIn diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/jsAstUtils.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/jsAstUtils.kt index ac014991d9c..8a736a42c91 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/jsAstUtils.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/jsAstUtils.kt @@ -205,7 +205,7 @@ fun translateCall( Pair(function, superQualifier.owner) } - if (expression.isSyntheticDelegatingReplacement || currentDispatchReceiver.canUseSuperRef(context, klass)) { + if (currentDispatchReceiver.canUseSuperRef(context, klass)) { return JsInvocation(JsNameRef(context.getNameForMemberFunction(target), JsSuperRef()), arguments) } diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/BoxJsTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/BoxJsTestGenerated.java index 39a5dbce42c..dcb3ad47a35 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/BoxJsTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/BoxJsTestGenerated.java @@ -4478,6 +4478,12 @@ public class BoxJsTestGenerated extends AbstractBoxJsTest { runTest("js/js.translator/testData/box/inheritance/definitionOrder.kt"); } + @Test + @TestMetadata("delegatingToSecondaryCtor.kt") + public void testDelegatingToSecondaryCtor() throws Exception { + runTest("js/js.translator/testData/box/inheritance/delegatingToSecondaryCtor.kt"); + } + @Test @TestMetadata("fromFakeClasses.kt") public void testFromFakeClasses() throws Exception { diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirJsBoxTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirJsBoxTestGenerated.java index 7ccdaacc6c4..8306cc5d03c 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirJsBoxTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirJsBoxTestGenerated.java @@ -5106,6 +5106,12 @@ public class FirJsBoxTestGenerated extends AbstractFirJsBoxTest { runTest("js/js.translator/testData/box/inheritance/definitionOrder.kt"); } + @Test + @TestMetadata("delegatingToSecondaryCtor.kt") + public void testDelegatingToSecondaryCtor() throws Exception { + runTest("js/js.translator/testData/box/inheritance/delegatingToSecondaryCtor.kt"); + } + @Test @TestMetadata("fromFakeClasses.kt") public void testFromFakeClasses() throws Exception { diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrBoxJsES6TestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrBoxJsES6TestGenerated.java index 9e0ddbccd87..d6f9bec823e 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrBoxJsES6TestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrBoxJsES6TestGenerated.java @@ -5212,6 +5212,12 @@ public class IrBoxJsES6TestGenerated extends AbstractIrBoxJsES6Test { runTest("js/js.translator/testData/box/inheritance/definitionOrder.kt"); } + @Test + @TestMetadata("delegatingToSecondaryCtor.kt") + public void testDelegatingToSecondaryCtor() throws Exception { + runTest("js/js.translator/testData/box/inheritance/delegatingToSecondaryCtor.kt"); + } + @Test @TestMetadata("fromFakeClasses.kt") public void testFromFakeClasses() throws Exception { diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrBoxJsTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrBoxJsTestGenerated.java index 41b3c88e91e..4def27bfc9e 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrBoxJsTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrBoxJsTestGenerated.java @@ -5106,6 +5106,12 @@ public class IrBoxJsTestGenerated extends AbstractIrBoxJsTest { runTest("js/js.translator/testData/box/inheritance/definitionOrder.kt"); } + @Test + @TestMetadata("delegatingToSecondaryCtor.kt") + public void testDelegatingToSecondaryCtor() throws Exception { + runTest("js/js.translator/testData/box/inheritance/delegatingToSecondaryCtor.kt"); + } + @Test @TestMetadata("fromFakeClasses.kt") public void testFromFakeClasses() throws Exception { diff --git a/js/js.translator/testData/box/inheritance/delegatingToSecondaryCtor.kt b/js/js.translator/testData/box/inheritance/delegatingToSecondaryCtor.kt new file mode 100644 index 00000000000..a3523ce98a0 --- /dev/null +++ b/js/js.translator/testData/box/inheritance/delegatingToSecondaryCtor.kt @@ -0,0 +1,16 @@ +// EXPECTED_REACHABLE_NODES: 1344 +open class MyClass1 private constructor(val value: String) { + constructor(i: Int): this(i.toString()) +} + +class MyClass2 : MyClass1 { + constructor(i: Int): super(i) +} + +fun test(x: Any) = x is MyClass2 + +fun box(): String { + val b = test(MyClass2(0)) + + return if (b) "OK" else "NOT OK" +} \ No newline at end of file