Convert parameter to receiver: don't remove 'override' and 'vararg' when function has 'vararg' parameter

#KT-28851 Fixed
This commit is contained in:
Toshiaki Kameyama
2019-01-09 18:00:54 +09:00
committed by Mikhail Glukhikh
parent de7adf55ff
commit 225a6ea288
4 changed files with 23 additions and 1 deletions
@@ -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)
}
@@ -0,0 +1,7 @@
interface A {
fun foo(<caret>s: String, vararg args: Any)
}
class B : A {
override fun foo(s: String, vararg args: Any) {
}
}
@@ -0,0 +1,7 @@
interface A {
fun String.foo(vararg args: Any)
}
class B : A {
override fun String.foo(vararg args: Any) {
}
}
@@ -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");