From 0a4542c6c0ca4865fd37a8e58116d38bc2141482 Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Fri, 30 Sep 2016 14:03:56 +0300 Subject: [PATCH] KT-9839 related, secondary constructor to primary: inspection for the single constructor (cherry picked from commit aec0090) --- .../ConvertSecondaryConstructorToPrimary.html | 5 +++ idea/src/META-INF/plugin.xml | 8 +++++ ...tSecondaryConstructorToPrimaryIntention.kt | 31 ++++++++++++------- .../inspectionData/expected.xml | 10 ++++++ .../inspectionData/inspections.test | 1 + .../convertSecondaryToPrimary/test.kt | 19 ++++++++++++ .../codeInsight/InspectionTestGenerated.java | 6 ++++ 7 files changed, 69 insertions(+), 11 deletions(-) create mode 100644 idea/resources/inspectionDescriptions/ConvertSecondaryConstructorToPrimary.html create mode 100644 idea/testData/inspections/convertSecondaryToPrimary/inspectionData/expected.xml create mode 100644 idea/testData/inspections/convertSecondaryToPrimary/inspectionData/inspections.test create mode 100644 idea/testData/inspections/convertSecondaryToPrimary/test.kt diff --git a/idea/resources/inspectionDescriptions/ConvertSecondaryConstructorToPrimary.html b/idea/resources/inspectionDescriptions/ConvertSecondaryConstructorToPrimary.html new file mode 100644 index 00000000000..501951514b8 --- /dev/null +++ b/idea/resources/inspectionDescriptions/ConvertSecondaryConstructorToPrimary.html @@ -0,0 +1,5 @@ + + +This inspection reports secondary constructor that can be replaced with more concise primary constructor + + diff --git a/idea/src/META-INF/plugin.xml b/idea/src/META-INF/plugin.xml index ab075c898fd..4030adc4034 100644 --- a/idea/src/META-INF/plugin.xml +++ b/idea/src/META-INF/plugin.xml @@ -1807,6 +1807,14 @@ language="kotlin" /> + + diff --git a/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertSecondaryConstructorToPrimaryIntention.kt b/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertSecondaryConstructorToPrimaryIntention.kt index b98772b1c47..432ad921d47 100644 --- a/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertSecondaryConstructorToPrimaryIntention.kt +++ b/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertSecondaryConstructorToPrimaryIntention.kt @@ -17,17 +17,26 @@ package org.jetbrains.kotlin.idea.intentions import com.intellij.openapi.editor.Editor +import com.intellij.openapi.util.TextRange import org.jetbrains.kotlin.descriptors.* -import org.jetbrains.kotlin.idea.caches.resolve.analyze import org.jetbrains.kotlin.idea.caches.resolve.analyzeFully +import org.jetbrains.kotlin.idea.inspections.IntentionBasedInspection import org.jetbrains.kotlin.idea.util.CommentSaver import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.psi.* +import org.jetbrains.kotlin.psi.psiUtil.containingClass import org.jetbrains.kotlin.psi.psiUtil.containingClassOrObject import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils -class ConvertSecondaryConstructorToPrimaryIntention : SelfTargetingIntention( +class ConvertSecondaryConstructorToPrimaryInspection : IntentionBasedInspection( + ConvertSecondaryConstructorToPrimaryIntention::class, + { constructor -> constructor.containingClass()?.getSecondaryConstructors()?.size == 1 } +) { + override fun inspectionTarget(element: KtSecondaryConstructor) = element.getConstructorKeyword() +} + +class ConvertSecondaryConstructorToPrimaryIntention : SelfTargetingRangeIntention( KtSecondaryConstructor::class.java, "Convert to primary constructor" ) { @@ -41,22 +50,22 @@ class ConvertSecondaryConstructorToPrimaryIntention : SelfTargetingIntention + + test.kt + 5 + light_idea_test_case + + Convert to primary constructor + Convert to primary constructor + + \ No newline at end of file diff --git a/idea/testData/inspections/convertSecondaryToPrimary/inspectionData/inspections.test b/idea/testData/inspections/convertSecondaryToPrimary/inspectionData/inspections.test new file mode 100644 index 00000000000..648481c052a --- /dev/null +++ b/idea/testData/inspections/convertSecondaryToPrimary/inspectionData/inspections.test @@ -0,0 +1 @@ +// INSPECTION_CLASS: org.jetbrains.kotlin.idea.intentions.ConvertSecondaryConstructorToPrimaryInspection \ No newline at end of file diff --git a/idea/testData/inspections/convertSecondaryToPrimary/test.kt b/idea/testData/inspections/convertSecondaryToPrimary/test.kt new file mode 100644 index 00000000000..89c04a930fc --- /dev/null +++ b/idea/testData/inspections/convertSecondaryToPrimary/test.kt @@ -0,0 +1,19 @@ +class Single { + + val x: Int + + constructor(x: Int) { + this.x = x + } +} + +class NotSingle { + + val x: Int + + constructor(): this(42) + + constructor(x: Int) { + this.x = x + } +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/codeInsight/InspectionTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/codeInsight/InspectionTestGenerated.java index a635b678d9a..2b5b144a278 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/codeInsight/InspectionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/codeInsight/InspectionTestGenerated.java @@ -154,6 +154,12 @@ public class InspectionTestGenerated extends AbstractInspectionTest { doTest(fileName); } + @TestMetadata("convertSecondaryToPrimary/inspectionData/inspections.test") + public void testConvertSecondaryToPrimary_inspectionData_Inspections_test() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/inspections/convertSecondaryToPrimary/inspectionData/inspections.test"); + doTest(fileName); + } + @TestMetadata("equalsAndHashCode/inspectionData/inspections.test") public void testEqualsAndHashCode_inspectionData_Inspections_test() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/inspections/equalsAndHashCode/inspectionData/inspections.test");