Cache FirSelfImportingScope and callables inside
This commit is contained in:
@@ -18,7 +18,7 @@ import org.jetbrains.kotlin.fir.resolve.impl.FirCompositeSymbolProvider
|
|||||||
import org.jetbrains.kotlin.fir.resolve.impl.FirDependenciesSymbolProviderImpl
|
import org.jetbrains.kotlin.fir.resolve.impl.FirDependenciesSymbolProviderImpl
|
||||||
import org.jetbrains.kotlin.fir.resolve.impl.FirLibrarySymbolProviderImpl
|
import org.jetbrains.kotlin.fir.resolve.impl.FirLibrarySymbolProviderImpl
|
||||||
import org.jetbrains.kotlin.fir.resolve.impl.FirProviderImpl
|
import org.jetbrains.kotlin.fir.resolve.impl.FirProviderImpl
|
||||||
import org.jetbrains.kotlin.fir.scopes.impl.FirClassDeclaredMemberScopeProvider
|
import org.jetbrains.kotlin.fir.scopes.impl.FirMemberScopeProvider
|
||||||
import org.jetbrains.kotlin.fir.types.FirCorrespondingSupertypesCache
|
import org.jetbrains.kotlin.fir.types.FirCorrespondingSupertypesCache
|
||||||
import org.jetbrains.kotlin.load.java.JavaClassFinder
|
import org.jetbrains.kotlin.load.java.JavaClassFinder
|
||||||
import org.jetbrains.kotlin.load.java.JavaClassFinderImpl
|
import org.jetbrains.kotlin.load.java.JavaClassFinderImpl
|
||||||
@@ -92,7 +92,7 @@ class FirLibrarySession private constructor(
|
|||||||
)
|
)
|
||||||
) as FirSymbolProvider
|
) as FirSymbolProvider
|
||||||
)
|
)
|
||||||
registerComponent(FirClassDeclaredMemberScopeProvider::class, FirClassDeclaredMemberScopeProvider())
|
registerComponent(FirMemberScopeProvider::class, FirMemberScopeProvider())
|
||||||
|
|
||||||
registerComponent(
|
registerComponent(
|
||||||
FirCorrespondingSupertypesCache::class,
|
FirCorrespondingSupertypesCache::class,
|
||||||
|
|||||||
@@ -8,14 +8,14 @@ package org.jetbrains.kotlin.fir
|
|||||||
import org.jetbrains.kotlin.analyzer.ModuleInfo
|
import org.jetbrains.kotlin.analyzer.ModuleInfo
|
||||||
import org.jetbrains.kotlin.fir.resolve.*
|
import org.jetbrains.kotlin.fir.resolve.*
|
||||||
import org.jetbrains.kotlin.fir.resolve.impl.*
|
import org.jetbrains.kotlin.fir.resolve.impl.*
|
||||||
import org.jetbrains.kotlin.fir.scopes.impl.FirClassDeclaredMemberScopeProvider
|
import org.jetbrains.kotlin.fir.scopes.impl.FirMemberScopeProvider
|
||||||
|
|
||||||
abstract class FirModuleBasedSession(override val moduleInfo: ModuleInfo, sessionProvider: FirSessionProvider?) :
|
abstract class FirModuleBasedSession(override val moduleInfo: ModuleInfo, sessionProvider: FirSessionProvider?) :
|
||||||
FirSessionBase(sessionProvider) {
|
FirSessionBase(sessionProvider) {
|
||||||
init {
|
init {
|
||||||
registerComponent(FirQualifierResolver::class, FirQualifierResolverImpl(this))
|
registerComponent(FirQualifierResolver::class, FirQualifierResolverImpl(this))
|
||||||
registerComponent(FirTypeResolver::class, FirTypeResolverImpl(this))
|
registerComponent(FirTypeResolver::class, FirTypeResolverImpl(this))
|
||||||
registerComponent(FirClassDeclaredMemberScopeProvider::class, FirClassDeclaredMemberScopeProvider())
|
registerComponent(FirMemberScopeProvider::class, FirMemberScopeProvider())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ import org.jetbrains.kotlin.fir.references.FirThisReference
|
|||||||
import org.jetbrains.kotlin.fir.resolve.calls.FirNamedReferenceWithCandidate
|
import org.jetbrains.kotlin.fir.resolve.calls.FirNamedReferenceWithCandidate
|
||||||
import org.jetbrains.kotlin.fir.resolve.substitution.AbstractConeSubstitutor
|
import org.jetbrains.kotlin.fir.resolve.substitution.AbstractConeSubstitutor
|
||||||
import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.resultType
|
import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.resultType
|
||||||
import org.jetbrains.kotlin.fir.scopes.impl.FirClassDeclaredMemberScopeProvider
|
import org.jetbrains.kotlin.fir.scopes.impl.FirMemberScopeProvider
|
||||||
import org.jetbrains.kotlin.fir.scopes.impl.withReplacedConeType
|
import org.jetbrains.kotlin.fir.scopes.impl.withReplacedConeType
|
||||||
import org.jetbrains.kotlin.fir.symbols.*
|
import org.jetbrains.kotlin.fir.symbols.*
|
||||||
import org.jetbrains.kotlin.fir.symbols.impl.*
|
import org.jetbrains.kotlin.fir.symbols.impl.*
|
||||||
@@ -41,7 +41,7 @@ inline fun <K, V, VA : V> MutableMap<K, V>.getOrPut(key: K, defaultValue: (K) ->
|
|||||||
val FirSession.firSymbolProvider: FirSymbolProvider by componentArrayAccessor()
|
val FirSession.firSymbolProvider: FirSymbolProvider by componentArrayAccessor()
|
||||||
val FirSession.firProvider: FirProvider by componentArrayAccessor()
|
val FirSession.firProvider: FirProvider by componentArrayAccessor()
|
||||||
val FirSession.correspondingSupertypesCache: FirCorrespondingSupertypesCache by componentArrayAccessor()
|
val FirSession.correspondingSupertypesCache: FirCorrespondingSupertypesCache by componentArrayAccessor()
|
||||||
val FirSession.memberScopeProvider: FirClassDeclaredMemberScopeProvider by componentArrayAccessor()
|
val FirSession.memberScopeProvider: FirMemberScopeProvider by componentArrayAccessor()
|
||||||
|
|
||||||
fun ConeClassLikeLookupTag.toSymbol(useSiteSession: FirSession): FirClassLikeSymbol<*>? {
|
fun ConeClassLikeLookupTag.toSymbol(useSiteSession: FirSession): FirClassLikeSymbol<*>? {
|
||||||
val firSymbolProvider = useSiteSession.firSymbolProvider
|
val firSymbolProvider = useSiteSession.firSymbolProvider
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ fun MutableList<FirScope>.addImportingScopes(file: FirFile, session: FirSession,
|
|||||||
FirExplicitStarImportingScope(file.imports, session, scopeSession),
|
FirExplicitStarImportingScope(file.imports, session, scopeSession),
|
||||||
FirDefaultSimpleImportingScope(session, scopeSession, priority = DefaultImportPriority.LOW),
|
FirDefaultSimpleImportingScope(session, scopeSession, priority = DefaultImportPriority.LOW),
|
||||||
FirDefaultSimpleImportingScope(session, scopeSession, priority = DefaultImportPriority.HIGH),
|
FirDefaultSimpleImportingScope(session, scopeSession, priority = DefaultImportPriority.HIGH),
|
||||||
FirSelfImportingScope(file.packageFqName, session),
|
selfImportingScope(file.packageFqName, session),
|
||||||
// TODO: explicit simple importing scope should have highest priority (higher than inner scopes added in process)
|
// TODO: explicit simple importing scope should have highest priority (higher than inner scopes added in process)
|
||||||
FirExplicitSimpleImportingScope(file.imports, session, scopeSession)
|
FirExplicitSimpleImportingScope(file.imports, session, scopeSession)
|
||||||
)
|
)
|
||||||
|
|||||||
+13
-1
@@ -18,12 +18,14 @@ import org.jetbrains.kotlin.fir.scopes.ProcessorAction.NEXT
|
|||||||
import org.jetbrains.kotlin.fir.scopes.ProcessorAction.STOP
|
import org.jetbrains.kotlin.fir.scopes.ProcessorAction.STOP
|
||||||
import org.jetbrains.kotlin.fir.symbols.impl.*
|
import org.jetbrains.kotlin.fir.symbols.impl.*
|
||||||
import org.jetbrains.kotlin.name.ClassId
|
import org.jetbrains.kotlin.name.ClassId
|
||||||
|
import org.jetbrains.kotlin.name.FqName
|
||||||
import org.jetbrains.kotlin.name.Name
|
import org.jetbrains.kotlin.name.Name
|
||||||
|
|
||||||
class FirClassDeclaredMemberScopeProvider : FirSessionComponent {
|
class FirMemberScopeProvider : FirSessionComponent {
|
||||||
|
|
||||||
private val declaredMemberCache = mutableMapOf<FirRegularClass, FirClassDeclaredMemberScope>()
|
private val declaredMemberCache = mutableMapOf<FirRegularClass, FirClassDeclaredMemberScope>()
|
||||||
private val nestedClassifierCache = mutableMapOf<FirRegularClass, FirNestedClassifierScope>()
|
private val nestedClassifierCache = mutableMapOf<FirRegularClass, FirNestedClassifierScope>()
|
||||||
|
private val selfImportingCache = mutableMapOf<FqName, FirSelfImportingScope>()
|
||||||
|
|
||||||
fun declaredMemberScope(klass: FirRegularClass): FirClassDeclaredMemberScope {
|
fun declaredMemberScope(klass: FirRegularClass): FirClassDeclaredMemberScope {
|
||||||
return declaredMemberCache.getOrPut(klass) {
|
return declaredMemberCache.getOrPut(klass) {
|
||||||
@@ -36,6 +38,12 @@ class FirClassDeclaredMemberScopeProvider : FirSessionComponent {
|
|||||||
FirNestedClassifierScope(klass)
|
FirNestedClassifierScope(klass)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun selfImportingScope(fqName: FqName, session: FirSession): FirSelfImportingScope {
|
||||||
|
return selfImportingCache.getOrPut(fqName) {
|
||||||
|
FirSelfImportingScope(fqName, session)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun declaredMemberScope(klass: FirRegularClass): FirClassDeclaredMemberScope {
|
fun declaredMemberScope(klass: FirRegularClass): FirClassDeclaredMemberScope {
|
||||||
@@ -56,6 +64,10 @@ fun nestedClassifierScope(classId: ClassId, session: FirSession): FirLazyNestedC
|
|||||||
return FirLazyNestedClassifierScope(classId, session)
|
return FirLazyNestedClassifierScope(classId, session)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun selfImportingScope(fqName: FqName, session: FirSession): FirSelfImportingScope {
|
||||||
|
return session.memberScopeProvider.selfImportingScope(fqName, session)
|
||||||
|
}
|
||||||
|
|
||||||
class FirClassDeclaredMemberScope(klass: FirRegularClass) : FirScope() {
|
class FirClassDeclaredMemberScope(klass: FirRegularClass) : FirScope() {
|
||||||
private val nestedClassifierScope = nestedClassifierScope(klass)
|
private val nestedClassifierScope = nestedClassifierScope(klass)
|
||||||
|
|
||||||
|
|||||||
+10
-4
@@ -22,7 +22,9 @@ class FirSelfImportingScope(val fqName: FqName, val session: FirSession) : FirSc
|
|||||||
|
|
||||||
private val symbolProvider = FirSymbolProvider.getInstance(session)
|
private val symbolProvider = FirSymbolProvider.getInstance(session)
|
||||||
|
|
||||||
private val cache = mutableMapOf<Name, FirClassifierSymbol<*>?>()
|
private val classifierCache = mutableMapOf<Name, FirClassifierSymbol<*>?>()
|
||||||
|
|
||||||
|
private val callableCache = mutableMapOf<Name, List<FirCallableSymbol<*>>>()
|
||||||
|
|
||||||
override fun processClassifiersByName(
|
override fun processClassifiersByName(
|
||||||
name: Name,
|
name: Name,
|
||||||
@@ -32,7 +34,7 @@ class FirSelfImportingScope(val fqName: FqName, val session: FirSession) : FirSc
|
|||||||
if (name.asString().isEmpty()) return ProcessorAction.NONE
|
if (name.asString().isEmpty()) return ProcessorAction.NONE
|
||||||
|
|
||||||
|
|
||||||
val symbol = cache.getOrPut(name) {
|
val symbol = classifierCache.getOrPut(name) {
|
||||||
val unambiguousFqName = ClassId(fqName, name)
|
val unambiguousFqName = ClassId(fqName, name)
|
||||||
symbolProvider.getClassLikeSymbolByFqName(unambiguousFqName)
|
symbolProvider.getClassLikeSymbolByFqName(unambiguousFqName)
|
||||||
}
|
}
|
||||||
@@ -45,7 +47,9 @@ class FirSelfImportingScope(val fqName: FqName, val session: FirSession) : FirSc
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun processFunctionsByName(name: Name, processor: (FirFunctionSymbol<*>) -> ProcessorAction): ProcessorAction {
|
override fun processFunctionsByName(name: Name, processor: (FirFunctionSymbol<*>) -> ProcessorAction): ProcessorAction {
|
||||||
val symbols = symbolProvider.getTopLevelCallableSymbols(fqName, name)
|
val symbols = callableCache.getOrPut(name) {
|
||||||
|
symbolProvider.getTopLevelCallableSymbols(fqName, name)
|
||||||
|
}
|
||||||
for (symbol in symbols) {
|
for (symbol in symbols) {
|
||||||
if (symbol is FirFunctionSymbol<*> && !processor(symbol)) {
|
if (symbol is FirFunctionSymbol<*> && !processor(symbol)) {
|
||||||
return ProcessorAction.STOP
|
return ProcessorAction.STOP
|
||||||
@@ -55,7 +59,9 @@ class FirSelfImportingScope(val fqName: FqName, val session: FirSession) : FirSc
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun processPropertiesByName(name: Name, processor: (FirCallableSymbol<*>) -> ProcessorAction): ProcessorAction {
|
override fun processPropertiesByName(name: Name, processor: (FirCallableSymbol<*>) -> ProcessorAction): ProcessorAction {
|
||||||
val symbols = symbolProvider.getTopLevelCallableSymbols(fqName, name)
|
val symbols = callableCache.getOrPut(name) {
|
||||||
|
symbolProvider.getTopLevelCallableSymbols(fqName, name)
|
||||||
|
}
|
||||||
for (symbol in symbols) {
|
for (symbol in symbols) {
|
||||||
if (symbol is FirPropertySymbol && !processor(symbol)) {
|
if (symbol is FirPropertySymbol && !processor(symbol)) {
|
||||||
return ProcessorAction.STOP
|
return ProcessorAction.STOP
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ import org.jetbrains.kotlin.fir.resolve.FirProvider
|
|||||||
import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.FirDesignatedBodyResolveTransformer
|
import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.FirDesignatedBodyResolveTransformer
|
||||||
import org.jetbrains.kotlin.fir.resolve.transformers.runResolve
|
import org.jetbrains.kotlin.fir.resolve.transformers.runResolve
|
||||||
import org.jetbrains.kotlin.fir.scopes.ProcessorAction
|
import org.jetbrains.kotlin.fir.scopes.ProcessorAction
|
||||||
import org.jetbrains.kotlin.fir.scopes.impl.FirSelfImportingScope
|
import org.jetbrains.kotlin.fir.scopes.impl.selfImportingScope
|
||||||
import org.jetbrains.kotlin.fir.symbols.CallableId
|
import org.jetbrains.kotlin.fir.symbols.CallableId
|
||||||
import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol
|
import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol
|
||||||
import org.jetbrains.kotlin.fir.types.FirErrorTypeRef
|
import org.jetbrains.kotlin.fir.types.FirErrorTypeRef
|
||||||
@@ -39,7 +39,7 @@ private fun FirFile.findCallableMember(
|
|||||||
packageFqName: FqName, klassFqName: FqName?, declName: Name
|
packageFqName: FqName, klassFqName: FqName?, declName: Name
|
||||||
): FirCallableDeclaration<*> {
|
): FirCallableDeclaration<*> {
|
||||||
val memberScope =
|
val memberScope =
|
||||||
if (klassFqName == null) FirSelfImportingScope(this.packageFqName, session)
|
if (klassFqName == null) selfImportingScope(this.packageFqName, session)
|
||||||
else provider.getClassDeclaredMemberScope(ClassId(packageFqName, klassFqName, false))!!
|
else provider.getClassDeclaredMemberScope(ClassId(packageFqName, klassFqName, false))!!
|
||||||
var result: FirCallableDeclaration<*>? = null
|
var result: FirCallableDeclaration<*>? = null
|
||||||
val processor = { symbol: FirCallableSymbol<*> ->
|
val processor = { symbol: FirCallableSymbol<*> ->
|
||||||
|
|||||||
Reference in New Issue
Block a user