From 5d1d44dfd3a26dd0a9f1dc7a3385a1c8b3f2b628 Mon Sep 17 00:00:00 2001 From: Valentin Kipyatkov Date: Wed, 14 Oct 2015 17:47:15 +0300 Subject: [PATCH] More correct way to map arguments to parameters --- .../quickfix/ChangeFunctionSignatureFix.kt | 26 ++++++++----------- 1 file changed, 11 insertions(+), 15 deletions(-) diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/ChangeFunctionSignatureFix.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/ChangeFunctionSignatureFix.kt index a403b7a91aa..ede6f492a6c 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/ChangeFunctionSignatureFix.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/ChangeFunctionSignatureFix.kt @@ -34,11 +34,12 @@ import org.jetbrains.kotlin.idea.caches.resolve.analyze import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptor import org.jetbrains.kotlin.idea.codeInsight.DescriptorToSourceUtilsIde import org.jetbrains.kotlin.idea.core.KotlinNameSuggester +import org.jetbrains.kotlin.idea.core.mapArgumentsToParameters import org.jetbrains.kotlin.idea.core.quickfix.QuickFixUtil import org.jetbrains.kotlin.psi.JetCallElement import org.jetbrains.kotlin.psi.JetFunctionLiteral import org.jetbrains.kotlin.psi.ValueArgument -import org.jetbrains.kotlin.resolve.BindingContext +import org.jetbrains.kotlin.resolve.calls.callUtil.getCall import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode import org.jetbrains.kotlin.types.checker.JetTypeChecker @@ -116,7 +117,15 @@ private fun createFix(callElement: JetCallElement?, context: PsiElement, descrip val arguments = callElement!!.valueArguments if (arguments.size > parameters.size) { - val hasTypeMismatches = hasTypeMismatches(parameters, arguments, callElement.analyze()) + val bindingContext = callElement.analyze() + val call = callElement.getCall(bindingContext) ?: return null + val argumentToParameter = call.mapArgumentsToParameters(functionDescriptor) + val hasTypeMismatches = argumentToParameter.any { + val argument = it.key + val parameter = it.value + val argumentType = argument.getArgumentExpression()?.let { bindingContext.getType(it) } + argumentType == null || !JetTypeChecker.DEFAULT.isSubtypeOf(argumentType, parameter.type) + } return AddFunctionParametersFix(callElement, functionDescriptor, hasTypeMismatches) } } @@ -124,16 +133,3 @@ private fun createFix(callElement: JetCallElement?, context: PsiElement, descrip return null } -private fun hasTypeMismatches( - parameters: List, - arguments: List, - bindingContext: BindingContext -): Boolean { - assert(parameters.size <= arguments.size) // number of parameters must not be greater than the number of arguments (it's called only for TOO_MANY_ARGUMENTS error) - for ((parameter, argument) in parameters.zip(arguments)) { - val argumentType = argument.getArgumentExpression()?.let { bindingContext.getType(it) } - if (argumentType == null || !JetTypeChecker.DEFAULT.isSubtypeOf(argumentType, parameter.type)) return true - } - return false -} -