FIR: Filter out irrelevant local scopes during resolution
This commit is contained in:
+2
-2
@@ -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()
|
||||
|
||||
+15
-1
@@ -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<FirScope> = components.localScopes.asReversedFrozen()
|
||||
private val localScopes: List<FirScope> by lazy(LazyThreadSafetyMode.NONE) {
|
||||
val localScopesBase = components.towerDataContext.localScopes
|
||||
val result = ArrayList<FirScope>()
|
||||
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()
|
||||
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
override fun mayContainName(name: Name) = properties.containsKey(name) || functions[name].isNotEmpty() || classes.containsKey(name)
|
||||
}
|
||||
|
||||
@@ -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) }
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user