diff --git a/compiler/testData/codegen/box/secondaryConstructors/defaultParametersNotDuplicated.kt b/compiler/testData/codegen/box/secondaryConstructors/defaultParametersNotDuplicated.kt new file mode 100644 index 00000000000..409e42f9ec0 --- /dev/null +++ b/compiler/testData/codegen/box/secondaryConstructors/defaultParametersNotDuplicated.kt @@ -0,0 +1,15 @@ +var global = 0 + +fun sideEffect() = global++ + +class A(val x: String) { + constructor(y: Int = sideEffect(), z: (Int) -> Int = { it + sideEffect() }) : this("$y:${z(y)}") {} +} + +fun box(): String { + var a = A() + if (a.x != "0:1") return "failed1: ${a.x}" + if (global != 2) return "failed2: ${global}" + + return "OK" +} \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java index bbacfbb562f..49e2bc2c5e5 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java @@ -12862,6 +12862,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { doTest(fileName); } + @TestMetadata("defaultParametersNotDuplicated.kt") + public void testDefaultParametersNotDuplicated() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/secondaryConstructors/defaultParametersNotDuplicated.kt"); + doTest(fileName); + } + @TestMetadata("delegationWithPrimary.kt") public void testDelegationWithPrimary() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/secondaryConstructors/delegationWithPrimary.kt"); diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/SecondaryConstructorTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/SecondaryConstructorTestGenerated.java index d5cb1ee0992..05e2735ec80 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/SecondaryConstructorTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/SecondaryConstructorTestGenerated.java @@ -113,6 +113,12 @@ public class SecondaryConstructorTestGenerated extends AbstractSecondaryConstruc doTest(fileName); } + @TestMetadata("defaultParametersNotDuplicated.kt") + public void testDefaultParametersNotDuplicated() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/secondaryConstructors/defaultParametersNotDuplicated.kt"); + doTest(fileName); + } + @TestMetadata("delegationWithPrimary.kt") public void testDelegationWithPrimary() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/secondaryConstructors/delegationWithPrimary.kt"); diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/utils/FunctionBodyTranslator.java b/js/js.translator/src/org/jetbrains/kotlin/js/translate/utils/FunctionBodyTranslator.java index de5763e5329..649769e528b 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/utils/FunctionBodyTranslator.java +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/utils/FunctionBodyTranslator.java @@ -20,6 +20,7 @@ import com.google.dart.compiler.backend.js.ast.*; import com.google.dart.compiler.backend.js.ast.metadata.MetadataProperties; import org.jetbrains.annotations.NotNull; import org.jetbrains.kotlin.builtins.KotlinBuiltIns; +import org.jetbrains.kotlin.descriptors.ConstructorDescriptor; import org.jetbrains.kotlin.descriptors.FunctionDescriptor; import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor; import org.jetbrains.kotlin.js.translate.context.Namer; @@ -88,7 +89,11 @@ public final class FunctionBodyTranslator extends AbstractTranslator { private JsBlock translate() { KtExpression jetBodyExpression = declaration.getBodyExpression(); assert jetBodyExpression != null : "Cannot translate a body of an abstract function."; - JsBlock jsBlock = new JsBlock(setDefaultValueForArguments(descriptor, context())); + JsBlock jsBlock = new JsBlock(); + if (!(descriptor instanceof ConstructorDescriptor) || ((ConstructorDescriptor) descriptor).isPrimary()) { + jsBlock.getStatements().addAll(setDefaultValueForArguments(descriptor, context())); + } + jsBlock.getStatements().addAll(mayBeWrapWithReturn(Translation.translateExpression(jetBodyExpression, context(), jsBlock)).getStatements()); return jsBlock; }