Fix incorrect handling of mixed named/positional arguments

^KT-40404 Fixed
This commit is contained in:
Denis Zharkov
2020-07-23 16:12:34 +03:00
parent d083297366
commit dc6efa5a61
9 changed files with 63 additions and 7 deletions
@@ -69,7 +69,7 @@ class ArgumentsToParametersMapper(
private class CallArgumentProcessor(
val descriptor: CallableDescriptor,
val allowMixedNamedAndPositionArguments: Boolean
val languageSettingsAllowMixedNamedAndPositionArguments: Boolean
) {
val result: MutableMap<ValueParameterDescriptor, ResolvedCallArgument> = LinkedHashMap()
private var state = State.POSITION_ARGUMENTS
@@ -148,6 +148,9 @@ class ArgumentsToParametersMapper(
addDiagnostic(NamedArgumentNotAllowed(argument, descriptor))
}
val stateAllowsMixedNamedAndPositionArguments = state != State.NAMED_ONLY_ARGUMENTS
state = State.NAMED_ONLY_ARGUMENTS
val parameter = findParameterByName(argument, name) ?: return
addDiagnostic(NamedArgumentReference(argument, parameter))
@@ -159,7 +162,8 @@ class ArgumentsToParametersMapper(
result[parameter.original] = ResolvedCallArgument.SimpleArgument(argument)
if (allowMixedNamedAndPositionArguments && parameters.getOrNull(currentPositionedParameterIndex)?.original == parameter.original) {
if (stateAllowsMixedNamedAndPositionArguments && languageSettingsAllowMixedNamedAndPositionArguments &&
parameters.getOrNull(currentPositionedParameterIndex)?.original == parameter.original) {
state = State.POSITION_ARGUMENTS
currentPositionedParameterIndex++
}
@@ -212,7 +216,6 @@ class ArgumentsToParametersMapper(
if (state == State.VARARG_POSITION) {
completeVarargPositionArguments()
}
state = State.NAMED_ONLY_ARGUMENTS
processNamedArgument(argument, argumentName)
}