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 a2d942a9287..1e93d088610 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 @@ -15,6 +15,7 @@ import org.jetbrains.kotlin.fir.resolve.FirSymbolProvider 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.scopes.impl.FirClassDeclaredMemberScopeProvider import org.jetbrains.kotlin.load.java.JavaClassFinder import org.jetbrains.kotlin.load.java.JavaClassFinderImpl import org.jetbrains.kotlin.load.kotlin.KotlinClassFinder @@ -78,6 +79,7 @@ class FirLibrarySession private constructor( FirSymbolProvider::class, firSymbolProvider ) + registerComponent(FirClassDeclaredMemberScopeProvider::class, FirClassDeclaredMemberScopeProvider()) } companion object { diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/JavaSymbolProvider.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/JavaSymbolProvider.kt index a8b98d340b1..0554b706772 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/JavaSymbolProvider.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/JavaSymbolProvider.kt @@ -23,8 +23,8 @@ import org.jetbrains.kotlin.fir.java.scopes.JavaClassUseSiteScope import org.jetbrains.kotlin.fir.resolve.* import org.jetbrains.kotlin.fir.resolve.transformers.firUnsafe import org.jetbrains.kotlin.fir.scopes.FirScope -import org.jetbrains.kotlin.fir.scopes.impl.FirClassDeclaredMemberScope import org.jetbrains.kotlin.fir.scopes.impl.FirSuperTypeScope +import org.jetbrains.kotlin.fir.scopes.impl.declaredMemberScope import org.jetbrains.kotlin.fir.symbols.CallableId import org.jetbrains.kotlin.fir.symbols.ConeCallableSymbol import org.jetbrains.kotlin.fir.symbols.ConeClassLikeSymbol @@ -60,7 +60,7 @@ class JavaSymbolProvider( override fun getClassDeclaredMemberScope(classId: ClassId): FirScope? { val classSymbol = getClassLikeSymbolByFqName(classId) as? FirClassSymbol ?: return null - return FirClassDeclaredMemberScope(classSymbol.fir) + return declaredMemberScope(classSymbol.fir) } override fun getClassUseSiteMemberScope( @@ -89,7 +89,7 @@ class JavaSymbolProvider( scopeSession: ScopeSession ): JavaClassUseSiteScope { return scopeSession.getOrBuild(regularClass.symbol, JAVA_USE_SITE) { - val declaredScope = scopeSession.getOrBuild(regularClass.symbol, DECLARED) { FirClassDeclaredMemberScope(regularClass) } + val declaredScope = scopeSession.getOrBuild(regularClass.symbol, DECLARED) { declaredMemberScope(regularClass) } val superTypeEnhancementScopes = lookupSuperTypes(regularClass, lookupInterfaces = true, deep = false, useSiteSession = useSiteSession) .mapNotNull { useSiteSuperType -> diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/deserialization/KotlinDeserializedJvmSymbolsProvider.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/deserialization/KotlinDeserializedJvmSymbolsProvider.kt index 8a9230e2fef..c87213def56 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/deserialization/KotlinDeserializedJvmSymbolsProvider.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/deserialization/KotlinDeserializedJvmSymbolsProvider.kt @@ -27,9 +27,8 @@ import org.jetbrains.kotlin.fir.references.FirErrorNamedReference import org.jetbrains.kotlin.fir.references.FirResolvedCallableReferenceImpl import org.jetbrains.kotlin.fir.resolve.* import org.jetbrains.kotlin.fir.resolve.transformers.firSafeNullable -import org.jetbrains.kotlin.fir.resolve.transformers.firUnsafe import org.jetbrains.kotlin.fir.scopes.FirScope -import org.jetbrains.kotlin.fir.scopes.impl.FirClassDeclaredMemberScope +import org.jetbrains.kotlin.fir.scopes.impl.declaredMemberScope import org.jetbrains.kotlin.fir.service import org.jetbrains.kotlin.fir.symbols.* import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol @@ -393,7 +392,9 @@ class KotlinDeserializedJvmSymbolsProvider( } override fun getClassDeclaredMemberScope(classId: ClassId) = - findRegularClass(classId)?.let(::FirClassDeclaredMemberScope) + findRegularClass(classId)?.let { + declaredMemberScope(it) + } private fun getPackageParts(packageFqName: FqName): Collection { return packagePartsCache.getOrPut(packageFqName) { 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 ceca019b6be..618a3738401 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/FirModuleBasedSession.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/FirModuleBasedSession.kt @@ -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()) } } diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/SupertypeUtils.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/SupertypeUtils.kt index 7320de30bad..85275609bab 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/SupertypeUtils.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/SupertypeUtils.kt @@ -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 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 37858bd222c..729682a832d 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 @@ -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() + fun declaredMemberScope(klass: FirRegularClass): FirClassDeclaredMemberScope { + return cache.getOrPut(klass) { + FirClassDeclaredMemberScope(klass) + } + } +} + +fun declaredMemberScope(klass: FirRegularClass): FirClassDeclaredMemberScope { + return klass + .session + .service() + .declaredMemberScope(klass) +} + class FirClassDeclaredMemberScope(klass: FirRegularClass) : FirScope { - private val callablesIndex: Map> by lazy { + private val callablesIndex: Map> = run { val result = mutableMapOf>() for (declaration in klass.declarations) { when (declaration) { @@ -38,7 +56,7 @@ class FirClassDeclaredMemberScope(klass: FirRegularClass) : FirScope { } result } - private val classIndex: Map by lazy { + private val classIndex: Map = run { val result = mutableMapOf() for (declaration in klass.declarations) { if (declaration is FirRegularClass) {