diff --git a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/scopes/impl/FirTypeIntersectionScope.kt b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/scopes/impl/FirTypeIntersectionScope.kt index 733698612df..c7df498e22f 100644 --- a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/scopes/impl/FirTypeIntersectionScope.kt +++ b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/scopes/impl/FirTypeIntersectionScope.kt @@ -68,24 +68,14 @@ class FirTypeIntersectionScope private constructor( if (name in absentClassifiers) { return } - val accepted = HashSet>() - val pending = mutableListOf>() - var empty = true - for (scope in scopes) { - scope.processClassifiersByNameWithSubstitution(name) { symbol, substitution -> - empty = false - if (symbol !in accepted) { - pending += symbol - processor(symbol, substitution) - } - } - accepted += pending - pending.clear() - } - if (empty) { + val classifiersWithSubstitution = intersectionContext.collectClassifiers(name) + if (classifiersWithSubstitution.isEmpty()) { absentClassifiers += name + return + } + for ((symbol, substitution) in classifiersWithSubstitution) { + processor(symbol, substitution) } - super.processClassifiersByNameWithSubstitution(name, processor) } @Suppress("UNCHECKED_CAST") diff --git a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/scopes/impl/FirTypeIntersectionScopeContext.kt b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/scopes/impl/FirTypeIntersectionScopeContext.kt index a256a357ec1..0133bdb26ae 100644 --- a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/scopes/impl/FirTypeIntersectionScopeContext.kt +++ b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/scopes/impl/FirTypeIntersectionScopeContext.kt @@ -14,6 +14,7 @@ import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.utils.isExpect import org.jetbrains.kotlin.fir.declarations.utils.modality import org.jetbrains.kotlin.fir.declarations.utils.visibility +import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor import org.jetbrains.kotlin.fir.scopes.* import org.jetbrains.kotlin.fir.scopes.impl.FirIntersectionOverrideStorage.ContextForIntersectionOverrideConstruction import org.jetbrains.kotlin.fir.symbols.impl.* @@ -46,6 +47,24 @@ class FirTypeIntersectionScopeContext( ) : this(chosenSymbol, listOf(overriddenMember)) } + @OptIn(PrivateForInline::class) + fun collectClassifiers(name: Name): List, ConeSubstitutor>> { + val accepted = HashSet>() + val pending = mutableListOf>() + val result = mutableListOf, ConeSubstitutor>>() + for (scope in scopes) { + scope.processClassifiersByNameWithSubstitution(name) { symbol, substitution -> + if (symbol !in accepted) { + pending += symbol + result += symbol to substitution + } + } + accepted += pending + pending.clear() + } + return result + } + @OptIn(PrivateForInline::class) inline fun > collectCallables( name: Name,