FIR: Filter out irrelevant local scopes during resolution

This commit is contained in:
Denis Zharkov
2020-05-12 12:20:09 +03:00
parent beb9a72e9d
commit cd149957ee
4 changed files with 27 additions and 6 deletions
@@ -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()
@@ -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) }
}
}