From 12f17a6724308143a7e194184b7a36e0eed1149c Mon Sep 17 00:00:00 2001 From: Toshiaki Kameyama Date: Tue, 10 Dec 2019 21:09:31 +0900 Subject: [PATCH] "Add constructor parameters" quick fix should add default parameters from super class (#2869) #KT-33109 Fixed --- .../kotlin/idea/quickfix/SuperClassNotInitialized.kt | 12 ++++++++++-- .../supertypeInitialization/addImport.kt.after | 2 +- .../supertypeInitialization/addParameters.kt.after | 2 +- .../multipleConstructors.kt.after | 2 +- .../quickfix/supertypeInitialization/vararg4.kt | 4 ++++ .../supertypeInitialization/vararg4.kt.after | 4 ++++ .../kotlin/idea/quickfix/QuickFixTestGenerated.java | 5 +++++ 7 files changed, 26 insertions(+), 5 deletions(-) create mode 100644 idea/testData/quickfix/supertypeInitialization/vararg4.kt create mode 100644 idea/testData/quickfix/supertypeInitialization/vararg4.kt.after diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/SuperClassNotInitialized.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/SuperClassNotInitialized.kt index 405218f8f54..4fb10ae7fc0 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/SuperClassNotInitialized.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/SuperClassNotInitialized.kt @@ -40,6 +40,7 @@ import org.jetbrains.kotlin.psi.psiUtil.hasExpectModifier import org.jetbrains.kotlin.renderer.DescriptorRenderer import org.jetbrains.kotlin.renderer.render import org.jetbrains.kotlin.resolve.BindingContext +import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.types.TypeConstructorSubstitution @@ -192,10 +193,17 @@ object SuperClassNotInitialized : KotlinIntentionActionsFactory() { if (type.isSubtypeOf(parameter.type)) continue // use existing parameter } - val parameterText = if (varargElementType != null) + val defaultValue = if (parameter.declaresDefaultValue()) { + (DescriptorToSourceUtils.descriptorToDeclaration(parameter) as? KtParameter) + ?.defaultValue?.text?.let { " = $it" } ?: "" + } else { + "" + } + val parameterText = if (varargElementType != null) { "vararg " + nameRendered + ":" + IdeDescriptorRenderers.SOURCE_CODE.renderType(varargElementType) - else + } else { nameRendered + ":" + IdeDescriptorRenderers.SOURCE_CODE.renderType(parameter.type) + } + defaultValue parametersToAdd.add(KtPsiFactory(element).createParameter(parameterText)) } diff --git a/idea/testData/quickfix/supertypeInitialization/addImport.kt.after b/idea/testData/quickfix/supertypeInitialization/addImport.kt.after index 8b194d9d2a5..c1f45b1effe 100644 --- a/idea/testData/quickfix/supertypeInitialization/addImport.kt.after +++ b/idea/testData/quickfix/supertypeInitialization/addImport.kt.after @@ -2,4 +2,4 @@ import java.io.DataInputStream import java.io.InputStream -class C(`in`: InputStream?) : DataInputStream(`in`) +class C(`in`: InputStream) : DataInputStream(`in`) diff --git a/idea/testData/quickfix/supertypeInitialization/addParameters.kt.after b/idea/testData/quickfix/supertypeInitialization/addParameters.kt.after index 9fe326137d6..eaae08753bc 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(Int, Int)" "true" open class Base(p1: Int, private val p2: Int = 0) -class C(p: Int, p1: Int, p2: Int) : Base(p1, p2) +class C(p: Int, p1: Int, p2: Int = 0) : Base(p1, p2) diff --git a/idea/testData/quickfix/supertypeInitialization/multipleConstructors.kt.after b/idea/testData/quickfix/supertypeInitialization/multipleConstructors.kt.after index 1378ec61d17..14e09b08157 100644 --- a/idea/testData/quickfix/supertypeInitialization/multipleConstructors.kt.after +++ b/idea/testData/quickfix/supertypeInitialization/multipleConstructors.kt.after @@ -2,4 +2,4 @@ // ACTION: Add constructor parameters from ArrayList(Int) import java.util.ArrayList -class C(c: MutableCollection?) : ArrayList(c) +class C(c: MutableCollection) : ArrayList(c) diff --git a/idea/testData/quickfix/supertypeInitialization/vararg4.kt b/idea/testData/quickfix/supertypeInitialization/vararg4.kt new file mode 100644 index 00000000000..721410261bc --- /dev/null +++ b/idea/testData/quickfix/supertypeInitialization/vararg4.kt @@ -0,0 +1,4 @@ +// "Add constructor parameters from A(Array)" "true" +open class A(vararg strings: String = arrayOf("a", "b")) + +class B : A \ No newline at end of file diff --git a/idea/testData/quickfix/supertypeInitialization/vararg4.kt.after b/idea/testData/quickfix/supertypeInitialization/vararg4.kt.after new file mode 100644 index 00000000000..5f67a4a36d7 --- /dev/null +++ b/idea/testData/quickfix/supertypeInitialization/vararg4.kt.after @@ -0,0 +1,4 @@ +// "Add constructor parameters from A(Array)" "true" +open class A(vararg strings: String = arrayOf("a", "b")) + +class B(vararg strings: String = arrayOf("a", "b")) : A(*strings) \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java index 2f8b54c486b..e6ad03db4e3 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java @@ -11804,6 +11804,11 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest { public void testVararg3() throws Exception { runTest("idea/testData/quickfix/supertypeInitialization/vararg3.kt"); } + + @TestMetadata("vararg4.kt") + public void testVararg4() throws Exception { + runTest("idea/testData/quickfix/supertypeInitialization/vararg4.kt"); + } } @TestMetadata("idea/testData/quickfix/suppress")