diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/ConstructorProcessing.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/ConstructorProcessing.kt index d811528747a..f3a71eaffd2 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/ConstructorProcessing.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/ConstructorProcessing.kt @@ -73,15 +73,17 @@ internal fun FirScope.processFunctionsAndConstructorsByName( processFunctionsByName(callInfo.name, processor) } +private data class SymbolWithSubstitutor(val symbol: FirClassifierSymbol<*>, val substitutor: ConeSubstitutor) + private fun FirScope.getFirstClassifierOrNull( callInfo: CallInfo, session: FirSession, bodyResolveComponents: BodyResolveComponents -): Pair, ConeSubstitutor>? { +): SymbolWithSubstitutor? { var isSuccessResult = false var isAmbiguousResult = false - var result: Pair, ConeSubstitutor>? = null - processClassifiersByNameWithSubstitution(callInfo.name) { symbol, substitution -> + var result: SymbolWithSubstitutor? = null + processClassifiersByNameWithSubstitution(callInfo.name) { symbol, substitutor -> val classifierDeclaration = symbol.fir var isSuccessCandidate = true if (classifierDeclaration is FirMemberDeclaration) { @@ -103,11 +105,25 @@ private fun FirScope.getFirstClassifierOrNull( isSuccessCandidate = false } - if (result == null || (!isSuccessResult && isSuccessCandidate)) { - isSuccessResult = isSuccessCandidate - result = symbol to substitution - } else { - isAmbiguousResult = true + when { + isSuccessCandidate && !isSuccessResult -> { + // any result is better than no result + isSuccessResult = true + result = SymbolWithSubstitutor(symbol, substitutor) + } + result?.symbol === symbol -> { + // miss identical results + return@processClassifiersByNameWithSubstitution + } + result != null -> { + // results are similar => ambiguity + isAmbiguousResult = true + } + else -> { + // result == null: any result is better than no result + isSuccessResult = isSuccessCandidate + result = SymbolWithSubstitutor(symbol, substitutor) + } } } diff --git a/compiler/testData/diagnostics/tests/imports/DoubleImports.fir.kt b/compiler/testData/diagnostics/tests/imports/DoubleImports.fir.kt deleted file mode 100644 index 873d3314265..00000000000 --- a/compiler/testData/diagnostics/tests/imports/DoubleImports.fir.kt +++ /dev/null @@ -1,41 +0,0 @@ -// FILE: StarImported.kt - -package star - -class SomeClass - -fun foo() {} - -val bar = 1 - -// FILE: ExplicitImported.kt - -package explicit - -class AnotherClass - -fun baz() {} - -val gau = 2 - -// FILE: Test.kt - -import star.* -import star.* -import explicit.AnotherClass -import explicit.AnotherClass -import explicit.baz -import explicit.baz -import explicit.gau -import explicit.gau - -fun useSomeClass(): SomeClass = SomeClass() - -fun useAnotherClass(): AnotherClass = AnotherClass() - -fun test() { - foo() - baz() - val x = bar - val y = gau -} diff --git a/compiler/testData/diagnostics/tests/imports/DoubleImports.kt b/compiler/testData/diagnostics/tests/imports/DoubleImports.kt index 788e0c1f31f..2213c1f30fa 100644 --- a/compiler/testData/diagnostics/tests/imports/DoubleImports.kt +++ b/compiler/testData/diagnostics/tests/imports/DoubleImports.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL // FILE: StarImported.kt package star