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");