Cache declared member scope
This commit is contained in:
committed by
Mikhail Glukhikh
parent
3aadf58354
commit
df9479b607
@@ -8,6 +8,7 @@ package org.jetbrains.kotlin.fir
|
||||
import org.jetbrains.kotlin.analyzer.ModuleInfo
|
||||
import org.jetbrains.kotlin.fir.resolve.*
|
||||
import org.jetbrains.kotlin.fir.resolve.impl.*
|
||||
import org.jetbrains.kotlin.fir.scopes.impl.FirClassDeclaredMemberScopeProvider
|
||||
|
||||
abstract class FirModuleBasedSession(override val moduleInfo: ModuleInfo) : FirSessionBase() {
|
||||
init {
|
||||
@@ -15,6 +16,7 @@ abstract class FirModuleBasedSession(override val moduleInfo: ModuleInfo) : FirS
|
||||
registerComponent(FirProvider::class, firProvider)
|
||||
registerComponent(FirQualifierResolver::class, FirQualifierResolverImpl(this))
|
||||
registerComponent(FirTypeResolver::class, FirTypeResolverImpl(this))
|
||||
registerComponent(FirClassDeclaredMemberScopeProvider::class, FirClassDeclaredMemberScopeProvider())
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -66,7 +66,7 @@ fun FirTypeAlias.buildUseSiteScope(useSiteSession: FirSession, builder: ScopeSes
|
||||
fun FirRegularClass.buildDefaultUseSiteScope(useSiteSession: FirSession, builder: ScopeSession): FirScope {
|
||||
return builder.getOrBuild(symbol, USE_SITE) {
|
||||
|
||||
val declaredScope = builder.getOrBuild(this.symbol, DECLARED) { FirClassDeclaredMemberScope(this) }
|
||||
val declaredScope = builder.getOrBuild(this.symbol, DECLARED) { declaredMemberScope(this) }
|
||||
val scopes = lookupSuperTypes(this, lookupInterfaces = true, deep = false, useSiteSession = useSiteSession)
|
||||
.mapNotNull { useSiteSuperType ->
|
||||
if (useSiteSuperType is ConeClassErrorType) return@mapNotNull null
|
||||
|
||||
+20
-2
@@ -13,13 +13,31 @@ import org.jetbrains.kotlin.fir.scopes.FirScope
|
||||
import org.jetbrains.kotlin.fir.scopes.ProcessorAction
|
||||
import org.jetbrains.kotlin.fir.scopes.ProcessorAction.NEXT
|
||||
import org.jetbrains.kotlin.fir.scopes.ProcessorAction.STOP
|
||||
import org.jetbrains.kotlin.fir.service
|
||||
import org.jetbrains.kotlin.fir.symbols.*
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
|
||||
class FirClassDeclaredMemberScopeProvider {
|
||||
|
||||
val cache = mutableMapOf<FirRegularClass, FirClassDeclaredMemberScope>()
|
||||
fun declaredMemberScope(klass: FirRegularClass): FirClassDeclaredMemberScope {
|
||||
return cache.getOrPut(klass) {
|
||||
FirClassDeclaredMemberScope(klass)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun declaredMemberScope(klass: FirRegularClass): FirClassDeclaredMemberScope {
|
||||
return klass
|
||||
.session
|
||||
.service<FirClassDeclaredMemberScopeProvider>()
|
||||
.declaredMemberScope(klass)
|
||||
}
|
||||
|
||||
class FirClassDeclaredMemberScope(klass: FirRegularClass) : FirScope {
|
||||
private val callablesIndex: Map<Name, List<FirCallableSymbol>> by lazy {
|
||||
private val callablesIndex: Map<Name, List<FirCallableSymbol>> = run {
|
||||
val result = mutableMapOf<Name, MutableList<FirCallableSymbol>>()
|
||||
for (declaration in klass.declarations) {
|
||||
when (declaration) {
|
||||
@@ -38,7 +56,7 @@ class FirClassDeclaredMemberScope(klass: FirRegularClass) : FirScope {
|
||||
}
|
||||
result
|
||||
}
|
||||
private val classIndex: Map<Name, FirClassSymbol> by lazy {
|
||||
private val classIndex: Map<Name, FirClassSymbol> = run {
|
||||
val result = mutableMapOf<Name, FirClassSymbol>()
|
||||
for (declaration in klass.declarations) {
|
||||
if (declaration is FirRegularClass) {
|
||||
|
||||
Reference in New Issue
Block a user