From 23749bdde7fa863e06733fd7df3c47d3c15d908a Mon Sep 17 00:00:00 2001 From: Toshiaki Kameyama Date: Mon, 7 Oct 2019 18:22:45 +0900 Subject: [PATCH] Add constructor parameter: add generic types correctly #KT-34203 Fixed --- .../AddConstructorParameterFromSuperTypeCallFix.kt | 13 +++++++------ .../generics.kt | 3 +++ .../generics.kt.after | 3 +++ .../kotlin/idea/quickfix/QuickFixTestGenerated.java | 5 +++++ 4 files changed, 18 insertions(+), 6 deletions(-) create mode 100644 idea/testData/quickfix/addConstructorParameterFromSuperTypeCall/generics.kt create mode 100644 idea/testData/quickfix/addConstructorParameterFromSuperTypeCall/generics.kt.after diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/AddConstructorParameterFromSuperTypeCallFix.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/AddConstructorParameterFromSuperTypeCallFix.kt index b23a6bc55f6..7e2b33703d4 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/AddConstructorParameterFromSuperTypeCallFix.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/AddConstructorParameterFromSuperTypeCallFix.kt @@ -12,19 +12,21 @@ import org.jetbrains.kotlin.diagnostics.DiagnosticFactory import org.jetbrains.kotlin.diagnostics.Errors import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptorIfAny import org.jetbrains.kotlin.idea.core.ShortenReferences -import org.jetbrains.kotlin.name.FqName +import org.jetbrains.kotlin.idea.util.IdeDescriptorRenderers import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.containingClass import org.jetbrains.kotlin.psi.psiUtil.endOffset import org.jetbrains.kotlin.renderer.render -import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameOrNull import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode +import org.jetbrains.kotlin.types.KotlinType class AddConstructorParameterFromSuperTypeCallFix( constructor: KtValueArgumentList, private val parameterName: String, - private val parameterType: FqName + parameterType: KotlinType ) : KotlinQuickFixAction(constructor) { + private val parameterTypeSourceCode = IdeDescriptorRenderers.SOURCE_CODE_TYPES.renderType(parameterType) + override fun getText() = "Add constructor parameter '$parameterName'" override fun getFamilyName() = text @@ -33,7 +35,7 @@ class AddConstructorParameterFromSuperTypeCallFix( val superTypeCallArgList = element ?: return val constructorParamList = superTypeCallArgList.containingClass()?.createPrimaryConstructorIfAbsent()?.valueParameterList ?: return val psiFactory = KtPsiFactory(superTypeCallArgList) - val constructorParam = constructorParamList.addParameter(psiFactory.createParameter("$parameterName: ${parameterType.render()}")) + val constructorParam = constructorParamList.addParameter(psiFactory.createParameter("$parameterName: $parameterTypeSourceCode")) val superTypeCallArg = superTypeCallArgList.addArgument(psiFactory.createArgument(parameterName)) ShortenReferences.DEFAULT.process(constructorParam) editor?.caretModel?.moveToOffset(superTypeCallArg.endOffset) @@ -50,9 +52,8 @@ class AddConstructorParameterFromSuperTypeCallFix( val parameterName = parameter.name.render() val constructor = containingClass.resolveToDescriptorIfAny(BodyResolveMode.PARTIAL)?.constructors?.firstOrNull() ?: return null if (constructor.valueParameters.any { it.name.asString() == parameterName }) return null - val parameterType = parameter.type.constructor.declarationDescriptor?.fqNameOrNull() ?: return null - return AddConstructorParameterFromSuperTypeCallFix(superTypeCallArgList, parameterName, parameterType) + return AddConstructorParameterFromSuperTypeCallFix(superTypeCallArgList, parameterName, parameter.type) } } } \ No newline at end of file diff --git a/idea/testData/quickfix/addConstructorParameterFromSuperTypeCall/generics.kt b/idea/testData/quickfix/addConstructorParameterFromSuperTypeCall/generics.kt new file mode 100644 index 00000000000..3e58071fba7 --- /dev/null +++ b/idea/testData/quickfix/addConstructorParameterFromSuperTypeCall/generics.kt @@ -0,0 +1,3 @@ +// "Add constructor parameter 'foos'" "true" +abstract class Foo(foos: List) +class Bar() : Foo() \ No newline at end of file diff --git a/idea/testData/quickfix/addConstructorParameterFromSuperTypeCall/generics.kt.after b/idea/testData/quickfix/addConstructorParameterFromSuperTypeCall/generics.kt.after new file mode 100644 index 00000000000..592df7011cd --- /dev/null +++ b/idea/testData/quickfix/addConstructorParameterFromSuperTypeCall/generics.kt.after @@ -0,0 +1,3 @@ +// "Add constructor parameter 'foos'" "true" +abstract class Foo(foos: List) +class Bar(foos: List) : Foo(foos) \ 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 1a0d0d3d82b..d6cbca0fd71 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java @@ -401,6 +401,11 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest { runTest("idea/testData/quickfix/addConstructorParameterFromSuperTypeCall/fewerArguments.kt"); } + @TestMetadata("generics.kt") + public void testGenerics() throws Exception { + runTest("idea/testData/quickfix/addConstructorParameterFromSuperTypeCall/generics.kt"); + } + @TestMetadata("hasDifferentNameParameter.kt") public void testHasDifferentNameParameter() throws Exception { runTest("idea/testData/quickfix/addConstructorParameterFromSuperTypeCall/hasDifferentNameParameter.kt");