From e3fe1bcf7c3f7f5b6d96667c8f69026ec73e1100 Mon Sep 17 00:00:00 2001 From: Mikhail Zarechenskiy Date: Mon, 27 Apr 2020 03:08:00 +0300 Subject: [PATCH] [NI] Place varargs at the end of value arguments list This is needed to preserve behavior with the OI --- .../tower/KotlinToResolvedCallTransformer.kt | 19 ++++++++++++++++--- .../defaultParametersAndLastVararg.kt | 1 - .../varargAndDefaultParameters.kt | 1 - 3 files changed, 16 insertions(+), 5 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/KotlinToResolvedCallTransformer.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/KotlinToResolvedCallTransformer.kt index 528b574fdae..bca57eba32c 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/KotlinToResolvedCallTransformer.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/KotlinToResolvedCallTransformer.kt @@ -60,9 +60,11 @@ import org.jetbrains.kotlin.types.model.TypeSystemInferenceExtensionContextDeleg import org.jetbrains.kotlin.types.typeUtil.contains import org.jetbrains.kotlin.types.typeUtil.makeNotNullable import org.jetbrains.kotlin.types.typeUtil.makeNullable +import org.jetbrains.kotlin.utils.SmartList import org.jetbrains.kotlin.utils.addToStdlib.cast import org.jetbrains.kotlin.utils.addToStdlib.safeAs import java.util.* +import kotlin.collections.LinkedHashMap class KotlinToResolvedCallTransformer( private val callCheckers: Iterable, @@ -620,16 +622,21 @@ sealed class NewAbstractResolvedCall() : ResolvedCall private fun createValueArguments(): Map = LinkedHashMap().also { result -> + var varargMappings: MutableList>? = null for ((originalParameter, resolvedCallArgument) in argumentMappingByOriginal) { val resultingParameter = resultingDescriptor.valueParameters[originalParameter.index] + result[resultingParameter] = when (resolvedCallArgument) { ResolvedCallArgument.DefaultArgument -> DefaultValueArgument.DEFAULT is ResolvedCallArgument.SimpleArgument -> { val valueArgument = resolvedCallArgument.callArgument.psiCallArgument.valueArgument - if (resultingParameter.isVararg) - VarargValueArgument().apply { addArgument(valueArgument) } - else + if (resultingParameter.isVararg) { + val vararg = VarargValueArgument().apply { addArgument(valueArgument) } + if (varargMappings == null) varargMappings = SmartList() + varargMappings.add(resultingParameter to vararg) + continue + } else ExpressionValueArgument(valueArgument) } is ResolvedCallArgument.VarargArgument -> @@ -638,6 +645,12 @@ sealed class NewAbstractResolvedCall() : ResolvedCall } } } + + if (varargMappings != null) { + for ((parameter, argument) in varargMappings) { + result[parameter] = argument + } + } } } diff --git a/compiler/testData/codegen/boxInline/argumentOrder/defaultParametersAndLastVararg.kt b/compiler/testData/codegen/boxInline/argumentOrder/defaultParametersAndLastVararg.kt index d5e63c8e1a8..b9f1a7f9e0a 100644 --- a/compiler/testData/codegen/boxInline/argumentOrder/defaultParametersAndLastVararg.kt +++ b/compiler/testData/codegen/boxInline/argumentOrder/defaultParametersAndLastVararg.kt @@ -1,4 +1,3 @@ -// !LANGUAGE: -NewInference // IGNORE_BACKEND: JS // NO_CHECK_LAMBDA_INLINING // FILE: 1.kt diff --git a/compiler/testData/codegen/boxInline/argumentOrder/varargAndDefaultParameters.kt b/compiler/testData/codegen/boxInline/argumentOrder/varargAndDefaultParameters.kt index 6dc07cffb56..2c5a638d461 100644 --- a/compiler/testData/codegen/boxInline/argumentOrder/varargAndDefaultParameters.kt +++ b/compiler/testData/codegen/boxInline/argumentOrder/varargAndDefaultParameters.kt @@ -1,4 +1,3 @@ -// !LANGUAGE: -NewInference // IGNORE_BACKEND: JVM_IR // IGNORE_BACKEND: JS, JS_IR // IGNORE_BACKEND_MULTI_MODULE: JVM_IR