From 225a6ea2884fb873766bc81c8b3b8b16e0ac57f7 Mon Sep 17 00:00:00 2001 From: Toshiaki Kameyama Date: Wed, 9 Jan 2019 18:00:54 +0900 Subject: [PATCH] Convert parameter to receiver: don't remove 'override' and 'vararg' when function has 'vararg' parameter #KT-28851 Fixed --- .../refactoring/changeSignature/KotlinParameterInfo.kt | 5 ++++- .../intentions/convertParameterToReceiver/hasVararg.kt | 7 +++++++ .../convertParameterToReceiver/hasVararg.kt.after | 7 +++++++ .../kotlin/idea/intentions/IntentionTestGenerated.java | 5 +++++ 4 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 idea/testData/intentions/convertParameterToReceiver/hasVararg.kt create mode 100644 idea/testData/intentions/convertParameterToReceiver/hasVararg.kt.after diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/KotlinParameterInfo.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/KotlinParameterInfo.kt index a644c0d5a52..ffc3570949c 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/KotlinParameterInfo.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/KotlinParameterInfo.kt @@ -33,6 +33,7 @@ import org.jetbrains.kotlin.psi.psiUtil.quoteIfNeeded import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils import org.jetbrains.kotlin.resolve.calls.callUtil.getResolvedCall +import org.jetbrains.kotlin.resolve.calls.components.isVararg import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode import org.jetbrains.kotlin.resolve.scopes.receivers.ImplicitReceiver import org.jetbrains.kotlin.types.isError @@ -153,7 +154,9 @@ class KotlinParameterInfo @JvmOverloads constructor ( val defaultRendering = currentTypeInfo.render() val typeSubstitutor = inheritedCallable.typeSubstitutor ?: return defaultRendering val currentBaseFunction = inheritedCallable.baseFunction.currentCallableDescriptor ?: return defaultRendering - val parameterType = currentBaseFunction.valueParameters[parameterIndex].type + val parameter = currentBaseFunction.valueParameters[parameterIndex] + if (parameter.isVararg) return defaultRendering + val parameterType = parameter.type if (parameterType.isError) return defaultRendering return parameterType.renderTypeWithSubstitution(typeSubstitutor, defaultRendering, true) } diff --git a/idea/testData/intentions/convertParameterToReceiver/hasVararg.kt b/idea/testData/intentions/convertParameterToReceiver/hasVararg.kt new file mode 100644 index 00000000000..9afaea95147 --- /dev/null +++ b/idea/testData/intentions/convertParameterToReceiver/hasVararg.kt @@ -0,0 +1,7 @@ +interface A { + fun foo(s: String, vararg args: Any) +} +class B : A { + override fun foo(s: String, vararg args: Any) { + } +} \ No newline at end of file diff --git a/idea/testData/intentions/convertParameterToReceiver/hasVararg.kt.after b/idea/testData/intentions/convertParameterToReceiver/hasVararg.kt.after new file mode 100644 index 00000000000..8d400aa99cf --- /dev/null +++ b/idea/testData/intentions/convertParameterToReceiver/hasVararg.kt.after @@ -0,0 +1,7 @@ +interface A { + fun String.foo(vararg args: Any) +} +class B : A { + override fun String.foo(vararg args: Any) { + } +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java index db289d073c7..166e564618e 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java @@ -6051,6 +6051,11 @@ public class IntentionTestGenerated extends AbstractIntentionTest { runTest("idea/testData/intentions/convertParameterToReceiver/functionExpressionWithThisConflict.kt"); } + @TestMetadata("hasVararg.kt") + public void testHasVararg() throws Exception { + runTest("idea/testData/intentions/convertParameterToReceiver/hasVararg.kt"); + } + @TestMetadata("lambdaParameter.kt") public void testLambdaParameter() throws Exception { runTest("idea/testData/intentions/convertParameterToReceiver/lambdaParameter.kt");