diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/SuperClassNotInitialized.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/SuperClassNotInitialized.kt index 290bfa4b239..d17b54c51e7 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/SuperClassNotInitialized.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/SuperClassNotInitialized.kt @@ -21,9 +21,11 @@ import com.intellij.openapi.editor.Editor import com.intellij.openapi.project.Project import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.descriptors.ConstructorDescriptor +import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor import org.jetbrains.kotlin.diagnostics.Diagnostic import org.jetbrains.kotlin.idea.caches.resolve.analyze import org.jetbrains.kotlin.idea.caches.resolve.getResolutionFacade +import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptor import org.jetbrains.kotlin.idea.core.isVisible import org.jetbrains.kotlin.idea.util.IdeDescriptorRenderers import org.jetbrains.kotlin.idea.util.ShortenReferences @@ -32,6 +34,7 @@ import org.jetbrains.kotlin.psi.psiUtil.replaced import org.jetbrains.kotlin.renderer.DescriptorRenderer import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.types.TypeUtils +import org.jetbrains.kotlin.types.typeUtil.isSubtypeOf import java.util.ArrayList public object SuperClassNotInitialized : JetIntentionActionsFactory() { @@ -109,12 +112,26 @@ public object SuperClassNotInitialized : JetIntentionActionsFactory() { val typeRefsToShorten = ArrayList() if (!superParameters.isEmpty()) { val parameterList = classDeclaration.getOrCreatePrimaryConstructorParameterList() + val oldParameters = parameterList.getParameters() + val parametersToAdd = ArrayList() for (parameter in superParameters) { val name = renderer.renderName(parameter.getName()) - val parameterText = name + ":" + renderer.renderType(parameter.getType()) - val newParameter = parameterList.addParameter(factory.createParameter(parameterText)) - typeRefsToShorten.add(newParameter.getTypeReference()) parameterNames.add(name) + + val nameString = parameter.getName().asString() + val existingParameter = oldParameters.firstOrNull { it.getName() == nameString } + if (existingParameter != null) { + val type = (existingParameter.resolveToDescriptor() as ValueParameterDescriptor).getType() + if (type.isSubtypeOf(parameter.getType())) continue // use existing parameter + } + + val parameterText = name + ":" + renderer.renderType(parameter.getType()) + parametersToAdd.add(factory.createParameter(parameterText)) + } + + for (parameter in parametersToAdd) { + val newParameter = parameterList.addParameter(parameter) + typeRefsToShorten.add(newParameter.getTypeReference()) } } diff --git a/idea/testData/quickfix/supertypeInitialization/addParameters.kt b/idea/testData/quickfix/supertypeInitialization/addParameters.kt index e25f40a2bbb..1a3b519f7ee 100644 --- a/idea/testData/quickfix/supertypeInitialization/addParameters.kt +++ b/idea/testData/quickfix/supertypeInitialization/addParameters.kt @@ -1,4 +1,4 @@ // "Add constructor parameters from Base(p1: Int, p2: Int)" "true" -open class Base(p1: Int, val p2: Int) +open class Base(p1: Int, private val p2: Int) class C(p: Int) : Base diff --git a/idea/testData/quickfix/supertypeInitialization/addParameters.kt.after b/idea/testData/quickfix/supertypeInitialization/addParameters.kt.after index d335f5ee72a..81b53ff5d26 100644 --- a/idea/testData/quickfix/supertypeInitialization/addParameters.kt.after +++ b/idea/testData/quickfix/supertypeInitialization/addParameters.kt.after @@ -1,4 +1,4 @@ // "Add constructor parameters from Base(p1: Int, p2: Int)" "true" -open class Base(p1: Int, val p2: Int) +open class Base(p1: Int, private val p2: Int) class C(p: Int, p1: Int, p2: Int) : Base(p1, p2) diff --git a/idea/testData/quickfix/supertypeInitialization/someParametersAlreadyExist.kt b/idea/testData/quickfix/supertypeInitialization/someParametersAlreadyExist.kt new file mode 100644 index 00000000000..d1a49e8e87c --- /dev/null +++ b/idea/testData/quickfix/supertypeInitialization/someParametersAlreadyExist.kt @@ -0,0 +1,8 @@ +// "Add constructor parameters from Base(p1: Int, p2: Int, p3: Any, p4: String, p5: String)" "true" +// ERROR: Redeclaration: p4 +// ERROR: Redeclaration: p4 +// ERROR: Redeclaration: p4 +// ERROR: Redeclaration: p4 +open class Base(p1: Int, private val p2: Int, p3: Any, p4: String, p5: T) + +class C(p: Int, p2: Int, p3: String, p4: Any, p5: String) : Base diff --git a/idea/testData/quickfix/supertypeInitialization/someParametersAlreadyExist.kt.after b/idea/testData/quickfix/supertypeInitialization/someParametersAlreadyExist.kt.after new file mode 100644 index 00000000000..852e6182757 --- /dev/null +++ b/idea/testData/quickfix/supertypeInitialization/someParametersAlreadyExist.kt.after @@ -0,0 +1,8 @@ +// "Add constructor parameters from Base(p1: Int, p2: Int, p3: Any, p4: String, p5: String)" "true" +// ERROR: Redeclaration: p4 +// ERROR: Redeclaration: p4 +// ERROR: Redeclaration: p4 +// ERROR: Redeclaration: p4 +open class Base(p1: Int, private val p2: Int, p3: Any, p4: String, p5: T) + +class C(p: Int, p2: Int, p3: String, p4: Any, p5: String, p1: Int, p4: String) : Base(p1, p2, p3, p4, p5) diff --git a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java index b7ed90fdbdc..a8aa7f278b9 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java @@ -4046,6 +4046,12 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest { String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/supertypeInitialization/primaryConstructorInaccessible.kt"); doTest(fileName); } + + @TestMetadata("someParametersAlreadyExist.kt") + public void testSomeParametersAlreadyExist() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/supertypeInitialization/someParametersAlreadyExist.kt"); + doTest(fileName); + } } @TestMetadata("idea/testData/quickfix/suppress")