KT-35258 Refactor mapArgumentsToParameters

- We assume that, if method has no stable parameters names, `parametersByName` should be empty
This commit is contained in:
Roman Golyshev
2019-12-27 16:40:25 +03:00
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++
} }
} }