From fe783d7121a382c43ee94b1d1f2c75c3983e2fb3 Mon Sep 17 00:00:00 2001 From: Nikolay Lunyak Date: Wed, 5 Jul 2023 17:31:12 +0300 Subject: [PATCH] [FIR] Require equivalent candidates to have the same parameters order NB: In general, it's unclear what to do in cases like the following one, even when sometimes we could, indeed, prefer something: ``` fun foo(a: Int, b: String, c: Boolean) fun foo(b: String, c: Boolean, a: Int) foo(c = false, b = "", a = 0) ``` ^KT-55933 Fixed --- .../jvm/ConeEquivalentCallConflictResolver.kt | 15 +++++++++++---- .../diagnostics/tests/ambiguityNamedVararg.fir.kt | 12 ------------ .../diagnostics/tests/ambiguityNamedVararg.kt | 1 + .../resolve/overloadConflicts/varargsMixed.fir.kt | 2 +- 4 files changed, 13 insertions(+), 17 deletions(-) delete mode 100644 compiler/testData/diagnostics/tests/ambiguityNamedVararg.fir.kt diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/resolve/calls/jvm/ConeEquivalentCallConflictResolver.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/resolve/calls/jvm/ConeEquivalentCallConflictResolver.kt index 07a1329307f..b6f53e60ce9 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/resolve/calls/jvm/ConeEquivalentCallConflictResolver.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/resolve/calls/jvm/ConeEquivalentCallConflictResolver.kt @@ -6,10 +6,7 @@ package org.jetbrains.kotlin.fir.resolve.calls.jvm import org.jetbrains.kotlin.fir.containingClassLookupTag -import org.jetbrains.kotlin.fir.declarations.FirCallableDeclaration -import org.jetbrains.kotlin.fir.declarations.FirConstructor -import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction -import org.jetbrains.kotlin.fir.declarations.FirVariable +import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.utils.isExpect import org.jetbrains.kotlin.fir.resolve.BodyResolveComponents import org.jetbrains.kotlin.fir.resolve.calls.AbstractConeCallConflictResolver @@ -71,12 +68,22 @@ class ConeEquivalentCallConflictResolver( if (first is FirVariable != second is FirVariable) { return false } + if (!firstCandidate.orderOfMappedArguments.contentEquals(secondCandidate.orderOfMappedArguments)) { + return false + } val firstSignature = createFlatSignature(firstCandidate, first) val secondSignature = createFlatSignature(secondCandidate, second) return compareCallsByUsedArguments(firstSignature, secondSignature, discriminateGenerics = false, useOriginalSamTypes = false) && compareCallsByUsedArguments(secondSignature, firstSignature, discriminateGenerics = false, useOriginalSamTypes = false) } + private val Candidate.orderOfMappedArguments: IntArray? + get() { + val function = symbol.fir as? FirFunction ?: return null + val parametersToIndices = function.valueParameters.mapIndexed { index, it -> it to index }.toMap() + return argumentMapping?.map { parametersToIndices[it.value] ?: error("Unmapped argument in arguments mapping") }?.toIntArray() + } + private fun createFlatSignature(call: Candidate, declaration: FirCallableDeclaration): FlatSignature { return when (declaration) { is FirSimpleFunction -> createFlatSignature(call, declaration) diff --git a/compiler/testData/diagnostics/tests/ambiguityNamedVararg.fir.kt b/compiler/testData/diagnostics/tests/ambiguityNamedVararg.fir.kt deleted file mode 100644 index 4044f6fa3a6..00000000000 --- a/compiler/testData/diagnostics/tests/ambiguityNamedVararg.fir.kt +++ /dev/null @@ -1,12 +0,0 @@ -// DIAGNOSTICS: -DEBUG_INFO_MISSING_UNRESOLVED -// ISSUE: KT-55933 - -fun swapVararg(vararg namedVararg: String, named: Int){} -fun swapVararg(named: Int, vararg namedVararg: String){} - -val x = swapVararg(named = 42, namedVararg = arrayOf("1", "2"),) - -fun swap(string: String, int: Int){} -fun swap(int: Int, string: String){} - -val y = swap(int = 42, string = "2") diff --git a/compiler/testData/diagnostics/tests/ambiguityNamedVararg.kt b/compiler/testData/diagnostics/tests/ambiguityNamedVararg.kt index 045b5c48d3e..cd049140f83 100644 --- a/compiler/testData/diagnostics/tests/ambiguityNamedVararg.kt +++ b/compiler/testData/diagnostics/tests/ambiguityNamedVararg.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL // DIAGNOSTICS: -DEBUG_INFO_MISSING_UNRESOLVED // ISSUE: KT-55933 diff --git a/compiler/testData/diagnostics/tests/resolve/overloadConflicts/varargsMixed.fir.kt b/compiler/testData/diagnostics/tests/resolve/overloadConflicts/varargsMixed.fir.kt index e72dd034e0c..bbd1b14884b 100644 --- a/compiler/testData/diagnostics/tests/resolve/overloadConflicts/varargsMixed.fir.kt +++ b/compiler/testData/diagnostics/tests/resolve/overloadConflicts/varargsMixed.fir.kt @@ -8,6 +8,6 @@ fun overloadedFun5(vararg ss: String) = X1 fun overloadedFun5(s: String, vararg ss: String) = X2 val test1 = overloadedFun5("") -val test2 = overloadedFun5("", "") +val test2 = overloadedFun5("", "") val test3: X2 = overloadedFun5(s = "", ss = "") val test4: X1 = overloadedFun5(ss = "")