diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/FirJavaModuleBasedSession.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/FirJavaModuleBasedSession.kt index 6744f5a7217..05f83575815 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/FirJavaModuleBasedSession.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/FirJavaModuleBasedSession.kt @@ -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.FirLibrarySymbolProviderImpl 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.load.java.JavaClassFinder import org.jetbrains.kotlin.load.java.JavaClassFinderImpl @@ -92,7 +92,7 @@ class FirLibrarySession private constructor( ) ) as FirSymbolProvider ) - registerComponent(FirClassDeclaredMemberScopeProvider::class, FirClassDeclaredMemberScopeProvider()) + registerComponent(FirMemberScopeProvider::class, FirMemberScopeProvider()) registerComponent( FirCorrespondingSupertypesCache::class, diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/FirModuleBasedSession.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/FirModuleBasedSession.kt index d0af4653c23..4260f4ecbad 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/FirModuleBasedSession.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/FirModuleBasedSession.kt @@ -8,14 +8,14 @@ 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 +import org.jetbrains.kotlin.fir.scopes.impl.FirMemberScopeProvider abstract class FirModuleBasedSession(override val moduleInfo: ModuleInfo, sessionProvider: FirSessionProvider?) : FirSessionBase(sessionProvider) { init { registerComponent(FirQualifierResolver::class, FirQualifierResolverImpl(this)) registerComponent(FirTypeResolver::class, FirTypeResolverImpl(this)) - registerComponent(FirClassDeclaredMemberScopeProvider::class, FirClassDeclaredMemberScopeProvider()) + registerComponent(FirMemberScopeProvider::class, FirMemberScopeProvider()) } } diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/ResolveUtils.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/ResolveUtils.kt index 7b7cbc5c9ba..3466e3b51c9 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/ResolveUtils.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/ResolveUtils.kt @@ -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.substitution.AbstractConeSubstitutor 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.symbols.* import org.jetbrains.kotlin.fir.symbols.impl.* @@ -41,7 +41,7 @@ inline fun MutableMap.getOrPut(key: K, defaultValue: (K) -> val FirSession.firSymbolProvider: FirSymbolProvider by componentArrayAccessor() val FirSession.firProvider: FirProvider 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<*>? { val firSymbolProvider = useSiteSession.firSymbolProvider diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/Scopes.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/Scopes.kt index 535162217de..ac1e8ab0863 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/Scopes.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/Scopes.kt @@ -18,7 +18,7 @@ fun MutableList.addImportingScopes(file: FirFile, session: FirSession, FirExplicitStarImportingScope(file.imports, session, scopeSession), FirDefaultSimpleImportingScope(session, scopeSession, priority = DefaultImportPriority.LOW), 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) FirExplicitSimpleImportingScope(file.imports, session, scopeSession) ) diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirClassDeclaredMemberScope.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirClassDeclaredMemberScope.kt index a8c0fbdf0cd..5f57b440d96 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirClassDeclaredMemberScope.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirClassDeclaredMemberScope.kt @@ -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.symbols.impl.* import org.jetbrains.kotlin.name.ClassId +import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name -class FirClassDeclaredMemberScopeProvider : FirSessionComponent { +class FirMemberScopeProvider : FirSessionComponent { private val declaredMemberCache = mutableMapOf() private val nestedClassifierCache = mutableMapOf() + private val selfImportingCache = mutableMapOf() fun declaredMemberScope(klass: FirRegularClass): FirClassDeclaredMemberScope { return declaredMemberCache.getOrPut(klass) { @@ -36,6 +38,12 @@ class FirClassDeclaredMemberScopeProvider : FirSessionComponent { FirNestedClassifierScope(klass) } } + + fun selfImportingScope(fqName: FqName, session: FirSession): FirSelfImportingScope { + return selfImportingCache.getOrPut(fqName) { + FirSelfImportingScope(fqName, session) + } + } } fun declaredMemberScope(klass: FirRegularClass): FirClassDeclaredMemberScope { @@ -56,6 +64,10 @@ fun nestedClassifierScope(classId: ClassId, session: FirSession): FirLazyNestedC return FirLazyNestedClassifierScope(classId, session) } +fun selfImportingScope(fqName: FqName, session: FirSession): FirSelfImportingScope { + return session.memberScopeProvider.selfImportingScope(fqName, session) +} + class FirClassDeclaredMemberScope(klass: FirRegularClass) : FirScope() { private val nestedClassifierScope = nestedClassifierScope(klass) diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirSelfImportingScope.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirSelfImportingScope.kt index a0181ff3110..95722826537 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirSelfImportingScope.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirSelfImportingScope.kt @@ -22,7 +22,9 @@ class FirSelfImportingScope(val fqName: FqName, val session: FirSession) : FirSc private val symbolProvider = FirSymbolProvider.getInstance(session) - private val cache = mutableMapOf?>() + private val classifierCache = mutableMapOf?>() + + private val callableCache = mutableMapOf>>() override fun processClassifiersByName( name: Name, @@ -32,7 +34,7 @@ class FirSelfImportingScope(val fqName: FqName, val session: FirSession) : FirSc if (name.asString().isEmpty()) return ProcessorAction.NONE - val symbol = cache.getOrPut(name) { + val symbol = classifierCache.getOrPut(name) { val unambiguousFqName = ClassId(fqName, name) 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 { - val symbols = symbolProvider.getTopLevelCallableSymbols(fqName, name) + val symbols = callableCache.getOrPut(name) { + symbolProvider.getTopLevelCallableSymbols(fqName, name) + } for (symbol in symbols) { if (symbol is FirFunctionSymbol<*> && !processor(symbol)) { 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 { - val symbols = symbolProvider.getTopLevelCallableSymbols(fqName, name) + val symbols = callableCache.getOrPut(name) { + symbolProvider.getTopLevelCallableSymbols(fqName, name) + } for (symbol in symbols) { if (symbol is FirPropertySymbol && !processor(symbol)) { return ProcessorAction.STOP diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/fir/FirResolutionApi.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/fir/FirResolutionApi.kt index c153a24f2af..d91ae88bff1 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/fir/FirResolutionApi.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/fir/FirResolutionApi.kt @@ -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.runResolve 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.impl.FirCallableSymbol import org.jetbrains.kotlin.fir.types.FirErrorTypeRef @@ -39,7 +39,7 @@ private fun FirFile.findCallableMember( packageFqName: FqName, klassFqName: FqName?, declName: Name ): FirCallableDeclaration<*> { val memberScope = - if (klassFqName == null) FirSelfImportingScope(this.packageFqName, session) + if (klassFqName == null) selfImportingScope(this.packageFqName, session) else provider.getClassDeclaredMemberScope(ClassId(packageFqName, klassFqName, false))!! var result: FirCallableDeclaration<*>? = null val processor = { symbol: FirCallableSymbol<*> ->