FIR: Filter out irrelevant local scopes during resolution
This commit is contained in:
+2
-2
@@ -23,7 +23,7 @@ class FirTowerResolver(
|
|||||||
): CandidateCollector {
|
): CandidateCollector {
|
||||||
val candidateFactoriesAndCollectors = buildCandidateFactoriesAndCollectors(info, collector)
|
val candidateFactoriesAndCollectors = buildCandidateFactoriesAndCollectors(info, collector)
|
||||||
|
|
||||||
val towerResolverSession = FirTowerResolverSession(components, manager, candidateFactoriesAndCollectors)
|
val towerResolverSession = FirTowerResolverSession(components, manager, candidateFactoriesAndCollectors, info)
|
||||||
towerResolverSession.runResolution(info)
|
towerResolverSession.runResolution(info)
|
||||||
|
|
||||||
manager.runTasks()
|
manager.runTasks()
|
||||||
@@ -36,7 +36,7 @@ class FirTowerResolver(
|
|||||||
): CandidateCollector {
|
): CandidateCollector {
|
||||||
val candidateFactoriesAndCollectors = buildCandidateFactoriesAndCollectors(info, collector)
|
val candidateFactoriesAndCollectors = buildCandidateFactoriesAndCollectors(info, collector)
|
||||||
|
|
||||||
val towerResolverSession = FirTowerResolverSession(components, manager, candidateFactoriesAndCollectors)
|
val towerResolverSession = FirTowerResolverSession(components, manager, candidateFactoriesAndCollectors, info)
|
||||||
towerResolverSession.runResolutionForDelegatingConstructor(info, constructorClassSymbol)
|
towerResolverSession.runResolutionForDelegatingConstructor(info, constructorClassSymbol)
|
||||||
|
|
||||||
manager.runTasks()
|
manager.runTasks()
|
||||||
|
|||||||
+15
-1
@@ -36,6 +36,7 @@ class FirTowerResolverSession internal constructor(
|
|||||||
private val components: BodyResolveComponents,
|
private val components: BodyResolveComponents,
|
||||||
private val manager: TowerResolveManager,
|
private val manager: TowerResolveManager,
|
||||||
private val candidateFactoriesAndCollectors: CandidateFactoriesAndCollectors,
|
private val candidateFactoriesAndCollectors: CandidateFactoriesAndCollectors,
|
||||||
|
private val mainCallInfo: CallInfo,
|
||||||
) {
|
) {
|
||||||
private data class ImplicitReceiver(
|
private data class ImplicitReceiver(
|
||||||
val receiver: ImplicitReceiverValue<*>,
|
val receiver: ImplicitReceiverValue<*>,
|
||||||
@@ -44,7 +45,20 @@ class FirTowerResolverSession internal constructor(
|
|||||||
|
|
||||||
private val session: FirSession get() = components.session
|
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()
|
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.PersistentMap
|
||||||
import kotlinx.collections.immutable.persistentMapOf
|
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.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.PersistentMultimap
|
||||||
import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor
|
import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor
|
||||||
import org.jetbrains.kotlin.fir.scopes.FirScope
|
import org.jetbrains.kotlin.fir.scopes.FirScope
|
||||||
@@ -69,4 +72,6 @@ class FirLocalScope(
|
|||||||
processor(klass, ConeSubstitutor.Empty)
|
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(
|
open fun processDeclaredConstructors(
|
||||||
processor: (FirConstructorSymbol) -> Unit
|
processor: (FirConstructorSymbol) -> Unit
|
||||||
) {}
|
) {}
|
||||||
|
|
||||||
|
open fun mayContainName(name: Name) = true
|
||||||
}
|
}
|
||||||
|
|
||||||
enum class ProcessorAction {
|
enum class ProcessorAction {
|
||||||
|
|||||||
Reference in New Issue
Block a user