More correct way to map arguments to parameters
This commit is contained in:
@@ -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.caches.resolve.resolveToDescriptor
|
||||||
import org.jetbrains.kotlin.idea.codeInsight.DescriptorToSourceUtilsIde
|
import org.jetbrains.kotlin.idea.codeInsight.DescriptorToSourceUtilsIde
|
||||||
import org.jetbrains.kotlin.idea.core.KotlinNameSuggester
|
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.idea.core.quickfix.QuickFixUtil
|
||||||
import org.jetbrains.kotlin.psi.JetCallElement
|
import org.jetbrains.kotlin.psi.JetCallElement
|
||||||
import org.jetbrains.kotlin.psi.JetFunctionLiteral
|
import org.jetbrains.kotlin.psi.JetFunctionLiteral
|
||||||
import org.jetbrains.kotlin.psi.ValueArgument
|
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.resolve.lazy.BodyResolveMode
|
||||||
import org.jetbrains.kotlin.types.checker.JetTypeChecker
|
import org.jetbrains.kotlin.types.checker.JetTypeChecker
|
||||||
|
|
||||||
@@ -116,7 +117,15 @@ private fun createFix(callElement: JetCallElement?, context: PsiElement, descrip
|
|||||||
val arguments = callElement!!.valueArguments
|
val arguments = callElement!!.valueArguments
|
||||||
|
|
||||||
if (arguments.size > parameters.size) {
|
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)
|
return AddFunctionParametersFix(callElement, functionDescriptor, hasTypeMismatches)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -124,16 +133,3 @@ private fun createFix(callElement: JetCallElement?, context: PsiElement, descrip
|
|||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun hasTypeMismatches(
|
|
||||||
parameters: List<ValueParameterDescriptor>,
|
|
||||||
arguments: List<ValueArgument>,
|
|
||||||
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
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user