diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/callableBuilder/CallableBuilder.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/callableBuilder/CallableBuilder.kt index 07fa7177844..c9cb3d72581 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/callableBuilder/CallableBuilder.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/callableBuilder/CallableBuilder.kt @@ -66,6 +66,7 @@ import org.jetbrains.kotlin.psi.typeRefHelpers.setReceiverTypeReference import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils import org.jetbrains.kotlin.resolve.DescriptorUtils +import org.jetbrains.kotlin.resolve.descriptorUtil.getSuperClassOrAny import org.jetbrains.kotlin.resolve.scopes.HierarchicalScope import org.jetbrains.kotlin.resolve.scopes.LexicalScopeImpl import org.jetbrains.kotlin.resolve.scopes.LexicalScopeKind @@ -593,6 +594,16 @@ class CallableBuilder(val config: CallableBuilderConfiguration) { if (it > 0) parent.addAfter(psiFactory.createNewLine(it), declarationInPlace) } + if (declarationInPlace is KtSecondaryConstructor) { + val containingClass = declarationInPlace.containingClassOrObject!! + if (containingClass.getPrimaryConstructorParameters().isNotEmpty()) { + declarationInPlace.replaceImplicitDelegationCallWithExplicit(true) + } + else if ((receiverClassDescriptor as ClassDescriptor).getSuperClassOrAny().constructors.all { it.valueParameters.isNotEmpty() }) { + declarationInPlace.replaceImplicitDelegationCallWithExplicit(false) + } + } + return declarationInPlace } } @@ -926,6 +937,10 @@ class CallableBuilder(val config: CallableBuilderConfiguration) { containingFileEditor.caretModel.moveToOffset(range.endOffset) return } + if (declaration is KtSecondaryConstructor && !declaration.hasImplicitDelegationCall()) { + containingFileEditor.caretModel.moveToOffset(declaration.getDelegationCall().valueArgumentList!!.startOffset + 1) + return + } setupEditorSelection(containingFileEditor, declaration) } diff --git a/idea/testData/quickfix/createFromUsage/createSecondaryConstructor/noParametersImplicitSuperCall.kt b/idea/testData/quickfix/createFromUsage/createSecondaryConstructor/noParametersImplicitSuperCall.kt new file mode 100644 index 00000000000..3465313d8f8 --- /dev/null +++ b/idea/testData/quickfix/createFromUsage/createSecondaryConstructor/noParametersImplicitSuperCall.kt @@ -0,0 +1,7 @@ +// "Create secondary constructor" "true" +open class Base() + +class Creation { + constructor(f: Int) +} +val v = Creation() \ No newline at end of file diff --git a/idea/testData/quickfix/createFromUsage/createSecondaryConstructor/noParameters.kt.after b/idea/testData/quickfix/createFromUsage/createSecondaryConstructor/noParametersImplicitSuperCall.kt.after similarity index 52% rename from idea/testData/quickfix/createFromUsage/createSecondaryConstructor/noParameters.kt.after rename to idea/testData/quickfix/createFromUsage/createSecondaryConstructor/noParametersImplicitSuperCall.kt.after index 2ab59cafb5c..2ef02eadf87 100644 --- a/idea/testData/quickfix/createFromUsage/createSecondaryConstructor/noParameters.kt.after +++ b/idea/testData/quickfix/createFromUsage/createSecondaryConstructor/noParametersImplicitSuperCall.kt.after @@ -1,7 +1,9 @@ // "Create secondary constructor" "true" -// ERROR: Primary constructor call expected -class Creation(val f: Int) { +open class Base() + +class Creation { + constructor(f: Int) + constructor() } - val v = Creation() \ No newline at end of file diff --git a/idea/testData/quickfix/createFromUsage/createSecondaryConstructor/noParametersSuperCall.kt b/idea/testData/quickfix/createFromUsage/createSecondaryConstructor/noParametersSuperCall.kt new file mode 100644 index 00000000000..871f7d15151 --- /dev/null +++ b/idea/testData/quickfix/createFromUsage/createSecondaryConstructor/noParametersSuperCall.kt @@ -0,0 +1,9 @@ +// "Create secondary constructor" "true" +// SHOULD_BE_AVAILABLE_AFTER_EXECUTION +// ERROR: No value passed for parameter f +open class Base(val f: Int) + +class Creation: Base { + constructor(f: Int): super(f) +} +val v = Creation() \ No newline at end of file diff --git a/idea/testData/quickfix/createFromUsage/createSecondaryConstructor/noParametersSuperCall.kt.after b/idea/testData/quickfix/createFromUsage/createSecondaryConstructor/noParametersSuperCall.kt.after new file mode 100644 index 00000000000..c41d52d9e1d --- /dev/null +++ b/idea/testData/quickfix/createFromUsage/createSecondaryConstructor/noParametersSuperCall.kt.after @@ -0,0 +1,11 @@ +// "Create secondary constructor" "true" +// SHOULD_BE_AVAILABLE_AFTER_EXECUTION +// ERROR: No value passed for parameter f +open class Base(val f: Int) + +class Creation: Base { + constructor(f: Int): super(f) + + constructor() : super() +} +val v = Creation() \ No newline at end of file diff --git a/idea/testData/quickfix/createFromUsage/createSecondaryConstructor/noParameters.kt b/idea/testData/quickfix/createFromUsage/createSecondaryConstructor/noParametersThisCall.kt similarity index 62% rename from idea/testData/quickfix/createFromUsage/createSecondaryConstructor/noParameters.kt rename to idea/testData/quickfix/createFromUsage/createSecondaryConstructor/noParametersThisCall.kt index e8625b9ecb1..0e2ccf9d415 100644 --- a/idea/testData/quickfix/createFromUsage/createSecondaryConstructor/noParameters.kt +++ b/idea/testData/quickfix/createFromUsage/createSecondaryConstructor/noParametersThisCall.kt @@ -1,4 +1,4 @@ // "Create secondary constructor" "true" -// ERROR: Primary constructor call expected +// ERROR: There's a cycle in the delegation calls chain class Creation(val f: Int) val v = Creation() \ No newline at end of file diff --git a/idea/testData/quickfix/createFromUsage/createSecondaryConstructor/noParametersThisCall.kt.after b/idea/testData/quickfix/createFromUsage/createSecondaryConstructor/noParametersThisCall.kt.after new file mode 100644 index 00000000000..0dbabd7af1d --- /dev/null +++ b/idea/testData/quickfix/createFromUsage/createSecondaryConstructor/noParametersThisCall.kt.after @@ -0,0 +1,7 @@ +// "Create secondary constructor" "true" +// ERROR: There's a cycle in the delegation calls chain +class Creation(val f: Int) { + constructor() : this() +} + +val v = Creation() \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/quickfix/AbstractQuickFixTest.java b/idea/tests/org/jetbrains/kotlin/idea/quickfix/AbstractQuickFixTest.java index b7df8264e34..7ac370985d4 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/quickfix/AbstractQuickFixTest.java +++ b/idea/tests/org/jetbrains/kotlin/idea/quickfix/AbstractQuickFixTest.java @@ -92,6 +92,11 @@ public abstract class AbstractQuickFixTest extends KotlinLightQuickFixTestCase { private static QuickFixTestCase myWrapper; + @Override + protected boolean shouldBeAvailableAfterExecution() { + return InTextDirectivesUtils.isDirectiveDefined(myWrapper.getFile().getText(), "// SHOULD_BE_AVAILABLE_AFTER_EXECUTION"); + } + @NotNull @Override protected LocalInspectionTool[] configureLocalInspectionTools() { diff --git a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java index 7187f679db6..4d9235c69ad 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java @@ -2601,9 +2601,21 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest { doTest(fileName); } - @TestMetadata("noParameters.kt") - public void testNoParameters() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/createFromUsage/createSecondaryConstructor/noParameters.kt"); + @TestMetadata("noParametersImplicitSuperCall.kt") + public void testNoParametersImplicitSuperCall() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/createFromUsage/createSecondaryConstructor/noParametersImplicitSuperCall.kt"); + doTest(fileName); + } + + @TestMetadata("noParametersSuperCall.kt") + public void testNoParametersSuperCall() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/createFromUsage/createSecondaryConstructor/noParametersSuperCall.kt"); + doTest(fileName); + } + + @TestMetadata("noParametersThisCall.kt") + public void testNoParametersThisCall() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/createFromUsage/createSecondaryConstructor/noParametersThisCall.kt"); doTest(fileName); }