From eabe675dbf135719ce103b7f3bbf62550623c4d3 Mon Sep 17 00:00:00 2001 From: Alexey Sedunov Date: Fri, 5 Feb 2016 16:27:11 +0300 Subject: [PATCH] Create from Usage: Add delegation call to secondary constructor declaration --- .../callableBuilder/CallableBuilder.kt | 15 +++++++++++++++ .../noParametersImplicitSuperCall.kt | 7 +++++++ ... => noParametersImplicitSuperCall.kt.after} | 8 +++++--- .../noParametersSuperCall.kt | 9 +++++++++ .../noParametersSuperCall.kt.after | 11 +++++++++++ ...noParameters.kt => noParametersThisCall.kt} | 2 +- .../noParametersThisCall.kt.after | 7 +++++++ .../idea/quickfix/AbstractQuickFixTest.java | 5 +++++ .../idea/quickfix/QuickFixTestGenerated.java | 18 +++++++++++++++--- 9 files changed, 75 insertions(+), 7 deletions(-) create mode 100644 idea/testData/quickfix/createFromUsage/createSecondaryConstructor/noParametersImplicitSuperCall.kt rename idea/testData/quickfix/createFromUsage/createSecondaryConstructor/{noParameters.kt.after => noParametersImplicitSuperCall.kt.after} (52%) create mode 100644 idea/testData/quickfix/createFromUsage/createSecondaryConstructor/noParametersSuperCall.kt create mode 100644 idea/testData/quickfix/createFromUsage/createSecondaryConstructor/noParametersSuperCall.kt.after rename idea/testData/quickfix/createFromUsage/createSecondaryConstructor/{noParameters.kt => noParametersThisCall.kt} (62%) create mode 100644 idea/testData/quickfix/createFromUsage/createSecondaryConstructor/noParametersThisCall.kt.after 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); }