diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/tower/FirTowerResolver.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/tower/FirTowerResolver.kt index 353a548f880..c172f3e1644 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/tower/FirTowerResolver.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/tower/FirTowerResolver.kt @@ -23,7 +23,7 @@ class FirTowerResolver( ): CandidateCollector { val candidateFactoriesAndCollectors = buildCandidateFactoriesAndCollectors(info, collector) - val towerResolverSession = FirTowerResolverSession(components, manager, candidateFactoriesAndCollectors) + val towerResolverSession = FirTowerResolverSession(components, manager, candidateFactoriesAndCollectors, info) towerResolverSession.runResolution(info) manager.runTasks() @@ -36,7 +36,7 @@ class FirTowerResolver( ): CandidateCollector { val candidateFactoriesAndCollectors = buildCandidateFactoriesAndCollectors(info, collector) - val towerResolverSession = FirTowerResolverSession(components, manager, candidateFactoriesAndCollectors) + val towerResolverSession = FirTowerResolverSession(components, manager, candidateFactoriesAndCollectors, info) towerResolverSession.runResolutionForDelegatingConstructor(info, constructorClassSymbol) manager.runTasks() diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/tower/FirTowerResolverSession.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/tower/FirTowerResolverSession.kt index 751943d6033..65ff138bd23 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/tower/FirTowerResolverSession.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/tower/FirTowerResolverSession.kt @@ -36,6 +36,7 @@ class FirTowerResolverSession internal constructor( private val components: BodyResolveComponents, private val manager: TowerResolveManager, private val candidateFactoriesAndCollectors: CandidateFactoriesAndCollectors, + private val mainCallInfo: CallInfo, ) { private data class ImplicitReceiver( val receiver: ImplicitReceiverValue<*>, @@ -44,7 +45,20 @@ class FirTowerResolverSession internal constructor( private val session: FirSession get() = components.session - private val localScopes: List = components.localScopes.asReversedFrozen() + private val localScopes: List by lazy(LazyThreadSafetyMode.NONE) { + val localScopesBase = components.towerDataContext.localScopes + val result = ArrayList() + for (i in localScopesBase.lastIndex downTo 0) { + val localScope = localScopesBase[i] + if (localScope.mayContainName(mainCallInfo.name) + || (mainCallInfo.callKind == CallKind.Function && localScope.mayContainName(OperatorNameConventions.INVOKE)) + ) { + result.add(localScope) + } + } + + result + } private val nonLocalTowerDataElements = components.towerDataContext.nonLocalTowerDataElements.asReversedFrozen() diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirLocalScope.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirLocalScope.kt index 776d7bff3b0..0aa1611c32e 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirLocalScope.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirLocalScope.kt @@ -7,8 +7,11 @@ package org.jetbrains.kotlin.fir.scopes.impl import kotlinx.collections.immutable.PersistentMap import kotlinx.collections.immutable.persistentMapOf -import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.NAME_FOR_BACKING_FIELD +import org.jetbrains.kotlin.fir.declarations.FirProperty +import org.jetbrains.kotlin.fir.declarations.FirRegularClass +import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction +import org.jetbrains.kotlin.fir.declarations.FirVariable import org.jetbrains.kotlin.fir.resolve.PersistentMultimap import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor import org.jetbrains.kotlin.fir.scopes.FirScope @@ -69,4 +72,6 @@ class FirLocalScope( processor(klass, ConeSubstitutor.Empty) } } -} \ No newline at end of file + + override fun mayContainName(name: Name) = properties.containsKey(name) || functions[name].isNotEmpty() || classes.containsKey(name) +} diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/scopes/FirScope.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/scopes/FirScope.kt index a3a523e07d2..f129b2b8d43 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/scopes/FirScope.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/scopes/FirScope.kt @@ -31,6 +31,8 @@ abstract class FirScope { open fun processDeclaredConstructors( processor: (FirConstructorSymbol) -> Unit ) {} + + open fun mayContainName(name: Name) = true } enum class ProcessorAction { @@ -61,4 +63,4 @@ inline fun FirScope.processClassifiersByName( noinline processor: (FirClassifierSymbol<*>) -> Unit ) { processClassifiersByNameWithSubstitution(name) { symbol, _ -> processor(symbol) } -} \ No newline at end of file +}