KT-35258 Refactor mapArgumentsToParameters
- We assume that, if method has no stable parameters names, `parametersByName` should be empty
This commit is contained in:
committed by
Roman Golyshev
parent
82ddd700ce
commit
bd713db70e
@@ -25,6 +25,7 @@ import org.jetbrains.kotlin.resolve.DelegatingBindingTrace
|
|||||||
import org.jetbrains.kotlin.resolve.QualifiedExpressionResolver
|
import org.jetbrains.kotlin.resolve.QualifiedExpressionResolver
|
||||||
import org.jetbrains.kotlin.resolve.bindingContextUtil.getDataFlowInfoBefore
|
import org.jetbrains.kotlin.resolve.bindingContextUtil.getDataFlowInfoBefore
|
||||||
import org.jetbrains.kotlin.resolve.calls.CallResolver
|
import org.jetbrains.kotlin.resolve.calls.CallResolver
|
||||||
|
import org.jetbrains.kotlin.resolve.calls.components.isVararg
|
||||||
import org.jetbrains.kotlin.resolve.calls.context.BasicCallResolutionContext
|
import org.jetbrains.kotlin.resolve.calls.context.BasicCallResolutionContext
|
||||||
import org.jetbrains.kotlin.resolve.calls.context.CheckArgumentTypesMode
|
import org.jetbrains.kotlin.resolve.calls.context.CheckArgumentTypesMode
|
||||||
import org.jetbrains.kotlin.resolve.calls.context.ContextDependency
|
import org.jetbrains.kotlin.resolve.calls.context.ContextDependency
|
||||||
@@ -39,12 +40,15 @@ import org.jetbrains.kotlin.types.checker.KotlinTypeChecker
|
|||||||
import org.jetbrains.kotlin.types.typeUtil.isSubtypeOf
|
import org.jetbrains.kotlin.types.typeUtil.isSubtypeOf
|
||||||
import java.util.*
|
import java.util.*
|
||||||
|
|
||||||
|
/**
|
||||||
|
* See `ArgumentsToParametersMapper` class in the compiler.
|
||||||
|
*/
|
||||||
fun Call.mapArgumentsToParameters(targetDescriptor: CallableDescriptor): Map<ValueArgument, ValueParameterDescriptor> {
|
fun Call.mapArgumentsToParameters(targetDescriptor: CallableDescriptor): Map<ValueArgument, ValueParameterDescriptor> {
|
||||||
val parameters = targetDescriptor.valueParameters
|
val parameters = targetDescriptor.valueParameters
|
||||||
if (parameters.isEmpty()) return emptyMap()
|
if (parameters.isEmpty()) return emptyMap()
|
||||||
|
|
||||||
val map = HashMap<ValueArgument, ValueParameterDescriptor>()
|
val map = HashMap<ValueArgument, ValueParameterDescriptor>()
|
||||||
val parametersByName = parameters.associateBy { it.name }
|
val parametersByName = if (targetDescriptor.hasStableParameterNames()) parameters.associateBy { it.name } else emptyMap()
|
||||||
|
|
||||||
var positionalArgumentIndex: Int? = 0
|
var positionalArgumentIndex: Int? = 0
|
||||||
|
|
||||||
@@ -55,11 +59,9 @@ fun Call.mapArgumentsToParameters(targetDescriptor: CallableDescriptor): Map<Val
|
|||||||
val argumentName = argument.getArgumentName()?.asName
|
val argumentName = argument.getArgumentName()?.asName
|
||||||
|
|
||||||
if (argumentName != null) {
|
if (argumentName != null) {
|
||||||
if (targetDescriptor.hasStableParameterNames()) {
|
val parameter = parametersByName[argumentName]
|
||||||
val parameter = parametersByName[argumentName]
|
if (parameter != null) {
|
||||||
if (parameter != null) {
|
map[argument] = parameter
|
||||||
map[argument] = parameter
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
positionalArgumentIndex = null
|
positionalArgumentIndex = null
|
||||||
} else {
|
} else {
|
||||||
@@ -67,7 +69,7 @@ fun Call.mapArgumentsToParameters(targetDescriptor: CallableDescriptor): Map<Val
|
|||||||
val parameter = parameters[positionalArgumentIndex]
|
val parameter = parameters[positionalArgumentIndex]
|
||||||
map[argument] = parameter
|
map[argument] = parameter
|
||||||
|
|
||||||
if (parameter.varargElementType == null) {
|
if (!parameter.isVararg) {
|
||||||
positionalArgumentIndex++
|
positionalArgumentIndex++
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user