diff --git a/core/descriptors/src/org/jetbrains/kotlin/renderer/DescriptorRenderer.kt b/core/descriptors/src/org/jetbrains/kotlin/renderer/DescriptorRenderer.kt index a8429449d38..d11797e9385 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/renderer/DescriptorRenderer.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/renderer/DescriptorRenderer.kt @@ -187,6 +187,7 @@ interface DescriptorRendererOptions { var normalizedVisibilities: Boolean var renderDefaultVisibility: Boolean var renderDefaultModality: Boolean + var renderConstructorDelegation: Boolean var renderActualAnnotationPropertiesInPrimaryConstructor: Boolean var uninferredTypeParameterAsName: Boolean var overrideRenderingPolicy: OverrideRenderingPolicy diff --git a/core/descriptors/src/org/jetbrains/kotlin/renderer/DescriptorRendererImpl.kt b/core/descriptors/src/org/jetbrains/kotlin/renderer/DescriptorRendererImpl.kt index 98d1ddfd64e..970d35d0043 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/renderer/DescriptorRendererImpl.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/renderer/DescriptorRendererImpl.kt @@ -725,8 +725,8 @@ internal class DescriptorRendererImpl( if (renderConstructorKeyword) { builder.append(renderKeyword("constructor")) } + val classDescriptor = constructor.containingDeclaration if (secondaryConstructorsAsPrimary) { - val classDescriptor = constructor.containingDeclaration if (renderConstructorKeyword) { builder.append(" ") } @@ -736,6 +736,19 @@ internal class DescriptorRendererImpl( renderValueParameters(constructor.valueParameters, constructor.hasSynthesizedParameterNames(), builder) + if (renderConstructorDelegation && !constructor.isPrimary && classDescriptor is ClassDescriptor) { + val primaryConstructor = classDescriptor.unsubstitutedPrimaryConstructor + if (primaryConstructor != null) { + val parametersWithoutDefault = primaryConstructor.valueParameters.filter { + !it.declaresDefaultValue() && it.varargElementType == null + } + if (parametersWithoutDefault.isNotEmpty()) { + builder.append(" : ").append(renderKeyword("this")) + builder.append(parametersWithoutDefault.joinToString(prefix = "(", postfix = ")", separator = ", ") { "" }) + } + } + } + if (secondaryConstructorsAsPrimary) { renderWhereSuffix(constructor.typeParameters, builder) } diff --git a/core/descriptors/src/org/jetbrains/kotlin/renderer/DescriptorRendererOptionsImpl.kt b/core/descriptors/src/org/jetbrains/kotlin/renderer/DescriptorRendererOptionsImpl.kt index ed26f60aefb..dbe8a7b4c03 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/renderer/DescriptorRendererOptionsImpl.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/renderer/DescriptorRendererOptionsImpl.kt @@ -18,7 +18,6 @@ package org.jetbrains.kotlin.renderer import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor -import org.jetbrains.kotlin.descriptors.annotations.AnnotationWithTarget import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.types.KotlinType import java.lang.IllegalStateException @@ -82,6 +81,7 @@ internal class DescriptorRendererOptionsImpl : DescriptorRendererOptions { override var normalizedVisibilities by property(false) override var renderDefaultVisibility by property(true) override var renderDefaultModality by property(true) + override var renderConstructorDelegation by property(false) override var renderActualAnnotationPropertiesInPrimaryConstructor by property(false) override var uninferredTypeParameterAsName by property(false) override var includePropertyConstant by property(false) diff --git a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/overrideImplement/OverrideMemberChooserObject.kt b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/overrideImplement/OverrideMemberChooserObject.kt index 68a8259a78f..ef903ab5c59 100644 --- a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/overrideImplement/OverrideMemberChooserObject.kt +++ b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/overrideImplement/OverrideMemberChooserObject.kt @@ -216,6 +216,7 @@ private val ACTUAL_RENDERER = OVERRIDE_RENDERER.withOptions { secondaryConstructorsAsPrimary = false renderDefaultVisibility = false renderDefaultModality = false + renderConstructorDelegation = true renderActualAnnotationPropertiesInPrimaryConstructor = true } diff --git a/idea/testData/multiModuleQuickFix/constructorWithDelegation/common/common.kt b/idea/testData/multiModuleQuickFix/constructorWithDelegation/common/common.kt new file mode 100644 index 00000000000..28968ddb51e --- /dev/null +++ b/idea/testData/multiModuleQuickFix/constructorWithDelegation/common/common.kt @@ -0,0 +1,5 @@ +// "Create actual class for module testModule_JVM (JVM)" "true" + +expect class Constructors(s: String) { + constructor(i: Int) +} \ No newline at end of file diff --git a/idea/testData/multiModuleQuickFix/constructorWithDelegation/common/common.kt.after b/idea/testData/multiModuleQuickFix/constructorWithDelegation/common/common.kt.after new file mode 100644 index 00000000000..28968ddb51e --- /dev/null +++ b/idea/testData/multiModuleQuickFix/constructorWithDelegation/common/common.kt.after @@ -0,0 +1,5 @@ +// "Create actual class for module testModule_JVM (JVM)" "true" + +expect class Constructors(s: String) { + constructor(i: Int) +} \ No newline at end of file diff --git a/idea/testData/multiModuleQuickFix/constructorWithDelegation/jvm/Constructors.kt b/idea/testData/multiModuleQuickFix/constructorWithDelegation/jvm/Constructors.kt new file mode 100644 index 00000000000..5aa9bbe4e88 --- /dev/null +++ b/idea/testData/multiModuleQuickFix/constructorWithDelegation/jvm/Constructors.kt @@ -0,0 +1 @@ +// Constructors: to be implemented \ No newline at end of file diff --git a/idea/testData/multiModuleQuickFix/constructorWithDelegation/jvm/Constructors.kt.after b/idea/testData/multiModuleQuickFix/constructorWithDelegation/jvm/Constructors.kt.after new file mode 100644 index 00000000000..d440022e77a --- /dev/null +++ b/idea/testData/multiModuleQuickFix/constructorWithDelegation/jvm/Constructors.kt.after @@ -0,0 +1,6 @@ +// Constructors: to be implemented +actual class Constructors actual constructor(s: String) { + actual constructor(i: Int) : this() { + TODO("not implemented") //To change body of created functions use File | Settings | File Templates. + } +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixMultiModuleTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixMultiModuleTestGenerated.java index 9a60c5251c4..cb4e81c093b 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixMultiModuleTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixMultiModuleTestGenerated.java @@ -159,6 +159,11 @@ public class QuickFixMultiModuleTestGenerated extends AbstractQuickFixMultiModul runTest("idea/testData/multiModuleQuickFix/companionAbsence/"); } + @TestMetadata("constructorWithDelegation") + public void testConstructorWithDelegation() throws Exception { + runTest("idea/testData/multiModuleQuickFix/constructorWithDelegation/"); + } + @TestMetadata("constructorWithJdk") public void testConstructorWithJdk() throws Exception { runTest("idea/testData/multiModuleQuickFix/constructorWithJdk/");