From 977fd8f5913bd251fe69ae368001bf69c8e7ce30 Mon Sep 17 00:00:00 2001 From: Alexey Andreev Date: Mon, 3 Oct 2016 14:54:08 +0300 Subject: [PATCH] KT-12707: support case when secondary super constructor has optional parameters --- .../callFromPrimaryWithNamedArgs.kt | 11 +++++++++++ .../callFromPrimaryWithOptionalArgs.kt | 11 +++++++++++ .../codegen/BlackBoxCodegenTestGenerated.java | 12 ++++++++++++ .../SecondaryConstructorTestGenerated.java | 12 ++++++++++++ .../initializer/ClassInitializerTranslator.java | 13 +++++++++++++ 5 files changed, 59 insertions(+) create mode 100644 compiler/testData/codegen/box/secondaryConstructors/callFromPrimaryWithNamedArgs.kt create mode 100644 compiler/testData/codegen/box/secondaryConstructors/callFromPrimaryWithOptionalArgs.kt diff --git a/compiler/testData/codegen/box/secondaryConstructors/callFromPrimaryWithNamedArgs.kt b/compiler/testData/codegen/box/secondaryConstructors/callFromPrimaryWithNamedArgs.kt new file mode 100644 index 00000000000..30fc0208f2c --- /dev/null +++ b/compiler/testData/codegen/box/secondaryConstructors/callFromPrimaryWithNamedArgs.kt @@ -0,0 +1,11 @@ +open class A(val result: String) { + constructor(x: Int = 11, y: Int = 22, z: Int = 33) : this("$x$y$z") +} + +class B() : A(y = 44) + +fun box(): String { + val result = B().result + if (result != "114433") return "fail: $result" + return "OK" +} \ No newline at end of file diff --git a/compiler/testData/codegen/box/secondaryConstructors/callFromPrimaryWithOptionalArgs.kt b/compiler/testData/codegen/box/secondaryConstructors/callFromPrimaryWithOptionalArgs.kt new file mode 100644 index 00000000000..71955e44537 --- /dev/null +++ b/compiler/testData/codegen/box/secondaryConstructors/callFromPrimaryWithOptionalArgs.kt @@ -0,0 +1,11 @@ +open class A(val result: String) { + constructor(x: Int, y: Int = 99) : this("$x$y") +} + +class B(x: Int) : A(x) + +fun box(): String { + val result = B(11).result + if (result != "1199") return "fail: $result" + 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 d42f48519c0..b397e72bfac 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java @@ -14482,6 +14482,18 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { doTest(fileName); } + @TestMetadata("callFromPrimaryWithNamedArgs.kt") + public void testCallFromPrimaryWithNamedArgs() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/secondaryConstructors/callFromPrimaryWithNamedArgs.kt"); + doTest(fileName); + } + + @TestMetadata("callFromPrimaryWithOptionalArgs.kt") + public void testCallFromPrimaryWithOptionalArgs() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/secondaryConstructors/callFromPrimaryWithOptionalArgs.kt"); + doTest(fileName); + } + @TestMetadata("callFromSubClass.kt") public void testCallFromSubClass() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/secondaryConstructors/callFromSubClass.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 b0564c04637..742e4034660 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 @@ -101,6 +101,18 @@ public class SecondaryConstructorTestGenerated extends AbstractSecondaryConstruc doTest(fileName); } + @TestMetadata("callFromPrimaryWithNamedArgs.kt") + public void testCallFromPrimaryWithNamedArgs() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/secondaryConstructors/callFromPrimaryWithNamedArgs.kt"); + doTest(fileName); + } + + @TestMetadata("callFromPrimaryWithOptionalArgs.kt") + public void testCallFromPrimaryWithOptionalArgs() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/secondaryConstructors/callFromPrimaryWithOptionalArgs.kt"); + doTest(fileName); + } + @TestMetadata("callFromSubClass.kt") public void testCallFromSubClass() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/secondaryConstructors/callFromSubClass.kt"); diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/initializer/ClassInitializerTranslator.java b/js/js.translator/src/org/jetbrains/kotlin/js/translate/initializer/ClassInitializerTranslator.java index ad8ddea2de1..a1cfe71016b 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/initializer/ClassInitializerTranslator.java +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/initializer/ClassInitializerTranslator.java @@ -36,7 +36,9 @@ import org.jetbrains.kotlin.psi.KtClassOrObject; import org.jetbrains.kotlin.psi.KtEnumEntry; import org.jetbrains.kotlin.psi.KtParameter; import org.jetbrains.kotlin.resolve.DescriptorUtils; +import org.jetbrains.kotlin.resolve.calls.model.DefaultValueArgument; import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall; +import org.jetbrains.kotlin.resolve.calls.model.ResolvedValueArgument; import org.jetbrains.kotlin.types.KotlinType; import java.util.ArrayList; @@ -206,6 +208,17 @@ public final class ClassInitializerTranslator extends AbstractTranslator { addCallToSuperMethod(arguments, initializer); } else { + int maxValueArgumentIndex = 0; + for (ValueParameterDescriptor arg : superCall.getValueArguments().keySet()) { + ResolvedValueArgument resolvedArg = superCall.getValueArguments().get(arg); + if (!(resolvedArg instanceof DefaultValueArgument)) { + maxValueArgumentIndex = Math.max(maxValueArgumentIndex, arg.getIndex() + 1); + } + } + int padSize = superDescriptor.getValueParameters().size() - maxValueArgumentIndex; + while (padSize-- > 0) { + arguments.add(Namer.getUndefinedExpression()); + } addCallToSuperSecondaryConstructor(arguments, superDescriptor); } }