[FIR] Use proper caches in FirDeclaredMemberScopeProvider
This commit is contained in:
committed by
TeamCityServer
parent
15abd839ed
commit
4f764c28cb
+30
-27
@@ -8,38 +8,26 @@ package org.jetbrains.kotlin.fir.scopes.impl
|
|||||||
import org.jetbrains.kotlin.fir.FirSession
|
import org.jetbrains.kotlin.fir.FirSession
|
||||||
import org.jetbrains.kotlin.fir.FirSessionComponent
|
import org.jetbrains.kotlin.fir.FirSessionComponent
|
||||||
import org.jetbrains.kotlin.fir.ThreadSafeMutableState
|
import org.jetbrains.kotlin.fir.ThreadSafeMutableState
|
||||||
|
import org.jetbrains.kotlin.fir.caches.FirCache
|
||||||
|
import org.jetbrains.kotlin.fir.caches.firCachesFactory
|
||||||
|
import org.jetbrains.kotlin.fir.caches.getValue
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirClass
|
import org.jetbrains.kotlin.fir.declarations.FirClass
|
||||||
import org.jetbrains.kotlin.fir.declarations.utils.classId
|
|
||||||
import org.jetbrains.kotlin.fir.resolve.declaredMemberScopeProvider
|
import org.jetbrains.kotlin.fir.resolve.declaredMemberScopeProvider
|
||||||
import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProvider
|
import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProvider
|
||||||
import org.jetbrains.kotlin.fir.scopes.FirScope
|
import org.jetbrains.kotlin.fir.scopes.FirScope
|
||||||
import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol
|
import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol
|
||||||
import org.jetbrains.kotlin.name.ClassId
|
import org.jetbrains.kotlin.name.ClassId
|
||||||
import org.jetbrains.kotlin.name.Name
|
import org.jetbrains.kotlin.name.Name
|
||||||
import org.jetbrains.kotlin.utils.getOrPutNullable
|
|
||||||
|
|
||||||
@ThreadSafeMutableState
|
@ThreadSafeMutableState
|
||||||
class FirDeclaredMemberScopeProvider(val useSiteSession: FirSession) : FirSessionComponent {
|
class FirDeclaredMemberScopeProvider(val useSiteSession: FirSession) : FirSessionComponent {
|
||||||
private val declaredMemberCache = mutableMapOf<FirClass, FirClassDeclaredMemberScope>()
|
private val declaredMemberCache: FirCache<FirClass, FirClassDeclaredMemberScope, DeclaredMemberScopeContext> =
|
||||||
private val nestedClassifierCache = mutableMapOf<FirClass, FirNestedClassifierScope?>()
|
useSiteSession.firCachesFactory.createCache { klass, context ->
|
||||||
|
createDeclaredMemberScope(klass, context.useLazyNestedClassifierScope, context.existingNames, context.symbolProvider)
|
||||||
|
}
|
||||||
|
|
||||||
fun getClassByClassId(classId: ClassId): FirClass? {
|
private val nestedClassifierCache: FirCache<FirClass, FirNestedClassifierScope?, Nothing?> =
|
||||||
for ((clazz, _) in declaredMemberCache) {
|
useSiteSession.firCachesFactory.createCache { klass, _ -> createNestedClassifierScope(klass) }
|
||||||
if (clazz.classId.packageFqName == classId.packageFqName
|
|
||||||
&& clazz.classId.relativeClassName == classId.relativeClassName
|
|
||||||
) {
|
|
||||||
return clazz
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for ((clazz, _) in nestedClassifierCache) {
|
|
||||||
if (clazz.classId.packageFqName == classId.packageFqName
|
|
||||||
&& clazz.classId.relativeClassName == classId.relativeClassName
|
|
||||||
) {
|
|
||||||
return clazz
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return null
|
|
||||||
}
|
|
||||||
|
|
||||||
fun declaredMemberScope(
|
fun declaredMemberScope(
|
||||||
klass: FirClass,
|
klass: FirClass,
|
||||||
@@ -47,15 +35,30 @@ class FirDeclaredMemberScopeProvider(val useSiteSession: FirSession) : FirSessio
|
|||||||
existingNames: List<Name>?,
|
existingNames: List<Name>?,
|
||||||
symbolProvider: FirSymbolProvider?
|
symbolProvider: FirSymbolProvider?
|
||||||
): FirClassDeclaredMemberScope {
|
): FirClassDeclaredMemberScope {
|
||||||
return declaredMemberCache.getOrPut(klass) {
|
return declaredMemberCache.getValue(klass, DeclaredMemberScopeContext(useLazyNestedClassifierScope, existingNames, symbolProvider))
|
||||||
FirClassDeclaredMemberScope(useSiteSession, klass, useLazyNestedClassifierScope, existingNames, symbolProvider)
|
}
|
||||||
}
|
|
||||||
|
private data class DeclaredMemberScopeContext(
|
||||||
|
val useLazyNestedClassifierScope: Boolean,
|
||||||
|
val existingNames: List<Name>?,
|
||||||
|
val symbolProvider: FirSymbolProvider?
|
||||||
|
)
|
||||||
|
|
||||||
|
private fun createDeclaredMemberScope(
|
||||||
|
klass: FirClass,
|
||||||
|
useLazyNestedClassifierScope: Boolean,
|
||||||
|
existingNames: List<Name>?,
|
||||||
|
symbolProvider: FirSymbolProvider?
|
||||||
|
): FirClassDeclaredMemberScope {
|
||||||
|
return FirClassDeclaredMemberScope(useSiteSession, klass, useLazyNestedClassifierScope, existingNames, symbolProvider)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun nestedClassifierScope(klass: FirClass): FirNestedClassifierScope? {
|
fun nestedClassifierScope(klass: FirClass): FirNestedClassifierScope? {
|
||||||
return nestedClassifierCache.getOrPutNullable(klass) {
|
return nestedClassifierCache.getValue(klass)
|
||||||
FirNestedClassifierScope(klass, useSiteSession).takeUnless { it.isEmpty() }
|
}
|
||||||
}
|
|
||||||
|
private fun createNestedClassifierScope(klass: FirClass): FirNestedClassifierScope? {
|
||||||
|
return FirNestedClassifierScope(klass, useSiteSession).takeUnless { it.isEmpty() }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user