From dc7678a70056a1cf52151bd5a04182289149927c Mon Sep 17 00:00:00 2001 From: Mikhail Zarechenskiy Date: Wed, 27 Jun 2018 16:20:45 +0300 Subject: [PATCH] Use smartcast info that related to call in change signature quick fix There is an inconsistency on how we record smartcasts in old and new inference, but we definitely should use all possible information about smartcasts in quick-fixes #KT-25144 Fixed --- .../idea/quickfix/AddFunctionParametersFix.kt | 5 ++++- .../addFunctionParameterWithSmartcastedArgument.kt | 14 ++++++++++++++ ...nctionParameterWithSmartcastedArgument.kt.after | 14 ++++++++++++++ .../idea/quickfix/QuickFixTestGenerated.java | 5 +++++ 4 files changed, 37 insertions(+), 1 deletion(-) create mode 100644 idea/testData/quickfix/changeSignature/addFunctionParameterWithSmartcastedArgument.kt create mode 100644 idea/testData/quickfix/changeSignature/addFunctionParameterWithSmartcastedArgument.kt.after 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");