From bbdcf19123262dcf1fec19444ba5c0060231bbe9 Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Wed, 22 Mar 2017 17:32:22 +0300 Subject: [PATCH] Fix "secondary constructor -> primary" in case of implicit super call So #KT-16903 Fixed --- ...tSecondaryConstructorToPrimaryIntention.kt | 22 +++++++++---------- .../withBaseAliasImplicit.kt | 7 ++++++ .../withBaseAliasImplicit.kt.after | 6 +++++ .../withBaseClassImplicit.kt | 5 +++++ .../withBaseClassImplicit.kt.after | 4 ++++ .../withInterfaceAlias.kt | 7 ++++++ .../withInterfaceAlias.kt.after | 6 +++++ .../intentions/IntentionTestGenerated.java | 18 +++++++++++++++ 8 files changed, 64 insertions(+), 11 deletions(-) create mode 100644 idea/testData/intentions/convertSecondaryConstructorToPrimary/withBaseAliasImplicit.kt create mode 100644 idea/testData/intentions/convertSecondaryConstructorToPrimary/withBaseAliasImplicit.kt.after create mode 100644 idea/testData/intentions/convertSecondaryConstructorToPrimary/withBaseClassImplicit.kt create mode 100644 idea/testData/intentions/convertSecondaryConstructorToPrimary/withBaseClassImplicit.kt.after create mode 100644 idea/testData/intentions/convertSecondaryConstructorToPrimary/withInterfaceAlias.kt create mode 100644 idea/testData/intentions/convertSecondaryConstructorToPrimary/withInterfaceAlias.kt.after diff --git a/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertSecondaryConstructorToPrimaryIntention.kt b/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertSecondaryConstructorToPrimaryIntention.kt index 0580a8f0522..51a3190aa21 100644 --- a/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertSecondaryConstructorToPrimaryIntention.kt +++ b/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertSecondaryConstructorToPrimaryIntention.kt @@ -30,6 +30,7 @@ import org.jetbrains.kotlin.psi.psiUtil.endOffset import org.jetbrains.kotlin.psi.psiUtil.startOffset import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils +import org.jetbrains.kotlin.util.kind class ConvertSecondaryConstructorToPrimaryInspection : IntentionBasedInspection( ConvertSecondaryConstructorToPrimaryIntention::class, @@ -162,17 +163,16 @@ class ConvertSecondaryConstructorToPrimaryIntention : SelfTargetingRangeIntentio element.moveParametersToPrimaryConstructorAndInitializers(constructor, parameterToPropertyMap, context, factory) - val delegationCall = element.getDelegationCall() - val argumentList = delegationCall.valueArgumentList - if (!delegationCall.isImplicit && argumentList != null) { - for (superTypeListEntry in klass.superTypeListEntries) { - val typeReference = superTypeListEntry.typeReference ?: continue - val type = context[BindingContext.TYPE, typeReference] - if ((type?.constructor?.declarationDescriptor as? ClassDescriptor)?.kind == ClassKind.CLASS) { - val superTypeCallEntry = factory.createSuperTypeCallEntry("${typeReference.text}${argumentList.text}") - superTypeListEntry.replace(superTypeCallEntry) - break - } + val argumentList = element.getDelegationCall().valueArgumentList + for (superTypeListEntry in klass.superTypeListEntries) { + val typeReference = superTypeListEntry.typeReference ?: continue + val type = context[BindingContext.TYPE, typeReference] + if ((type?.constructor?.declarationDescriptor as? ClassifierDescriptorWithTypeParameters)?.kind == ClassKind.CLASS) { + val superTypeCallEntry = factory.createSuperTypeCallEntry( + "${typeReference.text}${argumentList?.text ?: "()"}" + ) + superTypeListEntry.replace(superTypeCallEntry) + break } } diff --git a/idea/testData/intentions/convertSecondaryConstructorToPrimary/withBaseAliasImplicit.kt b/idea/testData/intentions/convertSecondaryConstructorToPrimary/withBaseAliasImplicit.kt new file mode 100644 index 00000000000..1a3d21c70f0 --- /dev/null +++ b/idea/testData/intentions/convertSecondaryConstructorToPrimary/withBaseAliasImplicit.kt @@ -0,0 +1,7 @@ +abstract class A + +typealias AS = A + +class C : AS { + constructor() +} \ No newline at end of file diff --git a/idea/testData/intentions/convertSecondaryConstructorToPrimary/withBaseAliasImplicit.kt.after b/idea/testData/intentions/convertSecondaryConstructorToPrimary/withBaseAliasImplicit.kt.after new file mode 100644 index 00000000000..801320426c5 --- /dev/null +++ b/idea/testData/intentions/convertSecondaryConstructorToPrimary/withBaseAliasImplicit.kt.after @@ -0,0 +1,6 @@ +abstract class A + +typealias AS = A + +class C() : AS() { +} \ No newline at end of file diff --git a/idea/testData/intentions/convertSecondaryConstructorToPrimary/withBaseClassImplicit.kt b/idea/testData/intentions/convertSecondaryConstructorToPrimary/withBaseClassImplicit.kt new file mode 100644 index 00000000000..74a4cf54e97 --- /dev/null +++ b/idea/testData/intentions/convertSecondaryConstructorToPrimary/withBaseClassImplicit.kt @@ -0,0 +1,5 @@ +abstract class A + +class C : A { + constructor() +} \ No newline at end of file diff --git a/idea/testData/intentions/convertSecondaryConstructorToPrimary/withBaseClassImplicit.kt.after b/idea/testData/intentions/convertSecondaryConstructorToPrimary/withBaseClassImplicit.kt.after new file mode 100644 index 00000000000..884cf9a77aa --- /dev/null +++ b/idea/testData/intentions/convertSecondaryConstructorToPrimary/withBaseClassImplicit.kt.after @@ -0,0 +1,4 @@ +abstract class A + +class C() : A() { +} \ No newline at end of file diff --git a/idea/testData/intentions/convertSecondaryConstructorToPrimary/withInterfaceAlias.kt b/idea/testData/intentions/convertSecondaryConstructorToPrimary/withInterfaceAlias.kt new file mode 100644 index 00000000000..879c1814984 --- /dev/null +++ b/idea/testData/intentions/convertSecondaryConstructorToPrimary/withInterfaceAlias.kt @@ -0,0 +1,7 @@ +interface A + +typealias AS = A + +class C : AS { + constructor() +} \ No newline at end of file diff --git a/idea/testData/intentions/convertSecondaryConstructorToPrimary/withInterfaceAlias.kt.after b/idea/testData/intentions/convertSecondaryConstructorToPrimary/withInterfaceAlias.kt.after new file mode 100644 index 00000000000..b4dc33f6ff9 --- /dev/null +++ b/idea/testData/intentions/convertSecondaryConstructorToPrimary/withInterfaceAlias.kt.after @@ -0,0 +1,6 @@ +interface A + +typealias AS = A + +class C() : AS { +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java index f429b68287f..69b8d4f4143 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java @@ -5636,12 +5636,24 @@ public class IntentionTestGenerated extends AbstractIntentionTest { doTest(fileName); } + @TestMetadata("withBaseAliasImplicit.kt") + public void testWithBaseAliasImplicit() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/convertSecondaryConstructorToPrimary/withBaseAliasImplicit.kt"); + doTest(fileName); + } + @TestMetadata("withBaseClass.kt") public void testWithBaseClass() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/convertSecondaryConstructorToPrimary/withBaseClass.kt"); doTest(fileName); } + @TestMetadata("withBaseClassImplicit.kt") + public void testWithBaseClassImplicit() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/convertSecondaryConstructorToPrimary/withBaseClassImplicit.kt"); + doTest(fileName); + } + @TestMetadata("withBaseClassNoArgs.kt") public void testWithBaseClassNoArgs() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/convertSecondaryConstructorToPrimary/withBaseClassNoArgs.kt"); @@ -5672,6 +5684,12 @@ public class IntentionTestGenerated extends AbstractIntentionTest { doTest(fileName); } + @TestMetadata("withInterfaceAlias.kt") + public void testWithInterfaceAlias() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/convertSecondaryConstructorToPrimary/withInterfaceAlias.kt"); + doTest(fileName); + } + @TestMetadata("withModifiers.kt") public void testWithModifiers() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/convertSecondaryConstructorToPrimary/withModifiers.kt");