diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/AddFunctionParametersFix.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/AddFunctionParametersFix.kt index 15af8254dbe..d8787c34e16 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/AddFunctionParametersFix.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/AddFunctionParametersFix.kt @@ -31,6 +31,7 @@ import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.ValueArgument import org.jetbrains.kotlin.psi.psiUtil.getParentOfType import org.jetbrains.kotlin.resolve.BindingContext +import org.jetbrains.kotlin.resolve.calls.callUtil.getCall import org.jetbrains.kotlin.resolve.descriptorUtil.builtIns import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.types.checker.KotlinTypeChecker @@ -89,6 +90,7 @@ class AddFunctionParametersFix( override fun configure(originalDescriptor: KotlinMethodDescriptor): KotlinMethodDescriptor { return originalDescriptor.modify { val callElement = callElement ?: return@modify + val call = callElement.getCall(callElement.analyze()) ?: return@modify val parameters = functionDescriptor.valueParameters val arguments = callElement.valueArguments val validator = CollectingNameValidator() @@ -101,7 +103,8 @@ class AddFunctionParametersFix( validator.addName(parameters[i].name.asString()) val argumentType = expression?.let { val bindingContext = it.analyze() - bindingContext[BindingContext.SMARTCAST, it]?.defaultType ?: bindingContext.getType(it) + val smartCasts = bindingContext[BindingContext.SMARTCAST, it] + smartCasts?.defaultType ?: smartCasts?.type(call) ?: bindingContext.getType(it) } val parameterType = parameters[i].type diff --git a/idea/testData/quickfix/changeSignature/addFunctionParameterWithSmartcastedArgument.kt b/idea/testData/quickfix/changeSignature/addFunctionParameterWithSmartcastedArgument.kt new file mode 100644 index 00000000000..1ca94a0045a --- /dev/null +++ b/idea/testData/quickfix/changeSignature/addFunctionParameterWithSmartcastedArgument.kt @@ -0,0 +1,14 @@ +// "Change the signature of function 'doSmthWithChild'" "true" +// DISABLE-ERRORS +// COMPILER_ARGUMENTS: -XXLanguage:+NewInference + +interface Parent +interface Child : Parent + +fun doSmthWithChild(a: Child) {} + +fun foobar(parent: Parent) { + if (parent is Child) { + doSmthWithChild(parent, 123) + } +} diff --git a/idea/testData/quickfix/changeSignature/addFunctionParameterWithSmartcastedArgument.kt.after b/idea/testData/quickfix/changeSignature/addFunctionParameterWithSmartcastedArgument.kt.after new file mode 100644 index 00000000000..5d6c601a83f --- /dev/null +++ b/idea/testData/quickfix/changeSignature/addFunctionParameterWithSmartcastedArgument.kt.after @@ -0,0 +1,14 @@ +// "Change the signature of function 'doSmthWithChild'" "true" +// DISABLE-ERRORS +// COMPILER_ARGUMENTS: -XXLanguage:+NewInference + +interface Parent +interface Child : Parent + +fun doSmthWithChild(a: Child, i: Int) {} + +fun foobar(parent: Parent) { + if (parent is Child) { + doSmthWithChild(parent, 123) + } +} diff --git a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java index 6afd848efa0..5a7686c9f8a 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java @@ -1537,6 +1537,11 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest { runTest("idea/testData/quickfix/changeSignature/addFunctionParameterWithSmartCast.kt"); } + @TestMetadata("addFunctionParameterWithSmartcastedArgument.kt") + public void testAddFunctionParameterWithSmartcastedArgument() throws Exception { + runTest("idea/testData/quickfix/changeSignature/addFunctionParameterWithSmartcastedArgument.kt"); + } + @TestMetadata("addNothingReturnType.kt") public void testAddNothingReturnType() throws Exception { runTest("idea/testData/quickfix/changeSignature/addNothingReturnType.kt");