diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirAbstractTreeTransformerWithSuperTypes.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirAbstractTreeTransformerWithSuperTypes.kt index 960e3c14e76..4acd17419ca 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirAbstractTreeTransformerWithSuperTypes.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirAbstractTreeTransformerWithSuperTypes.kt @@ -48,11 +48,11 @@ abstract class FirAbstractTreeTransformerWithSuperTypes( firClass.addTypeParametersScope() val companionObject = firClass.companionObject if (companionObject != null) { - towerScope.addScope(nestedClassifierScope(companionObject)) + nestedClassifierScope(companionObject)?.let(towerScope::addScope) } } - towerScope.addScope(nestedClassifierScope(firClass)) + nestedClassifierScope(firClass)?.let(towerScope::addScope) transformElement(firClass, data) } diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirSupertypesResolution.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirSupertypesResolution.kt index 4c0582c9492..7630818b10c 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirSupertypesResolution.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirSupertypesResolution.kt @@ -133,9 +133,9 @@ private fun createScopesForNestedClasses( addIfNotNull(klass.typeParametersScope()) val companionObjects = klass.declarations.filterIsInstance().filter { it.isCompanion } for (companionObject in companionObjects) { - add(nestedClassifierScope(companionObject)) + addIfNotNull(nestedClassifierScope(companionObject)) } - add(nestedClassifierScope(klass)) + addIfNotNull(nestedClassifierScope(klass)) } fun FirRegularClass.resolveSupertypesInTheAir(session: FirSession): List { 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 c9134e4d28a..796b057732b 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 @@ -72,5 +72,7 @@ class FirClassDeclaredMemberScope( override fun processClassifiersByNameWithSubstitution( name: Name, processor: (FirClassifierSymbol<*>, ConeSubstitutor) -> Unit - ) = nestedClassifierScope.processClassifiersByNameWithSubstitution(name, processor) + ) { + nestedClassifierScope?.processClassifiersByNameWithSubstitution(name, processor) + } } diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirDeclaredMemberScopeProvider.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirDeclaredMemberScopeProvider.kt index 2d3785221b0..c5664691567 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirDeclaredMemberScopeProvider.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirDeclaredMemberScopeProvider.kt @@ -13,11 +13,12 @@ import org.jetbrains.kotlin.fir.resolve.declaredMemberScopeProvider import org.jetbrains.kotlin.fir.scopes.FirScope import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.Name +import org.jetbrains.kotlin.utils.getOrPutNullable class FirDeclaredMemberScopeProvider : FirSessionComponent { private val declaredMemberCache = mutableMapOf, FirScope>() - private val nestedClassifierCache = mutableMapOf, FirNestedClassifierScope>() + private val nestedClassifierCache = mutableMapOf, FirNestedClassifierScope?>() fun getClassByClassId(classId: ClassId): FirClass<*>? { for ((clazz, _) in declaredMemberCache) { @@ -48,9 +49,9 @@ class FirDeclaredMemberScopeProvider : FirSessionComponent { } } - fun nestedClassifierScope(klass: FirClass<*>): FirNestedClassifierScope { - return nestedClassifierCache.getOrPut(klass) { - FirNestedClassifierScope(klass) + fun nestedClassifierScope(klass: FirClass<*>): FirNestedClassifierScope? { + return nestedClassifierCache.getOrPutNullable(klass) { + FirNestedClassifierScope(klass).takeUnless { it.isEmpty() } } } } @@ -73,7 +74,7 @@ fun declaredMemberScopeWithLazyNestedScope( .declaredMemberScope(klass, useLazyNestedClassifierScope = true, existingNames = existingNames, symbolProvider = symbolProvider) } -fun nestedClassifierScope(klass: FirClass<*>): FirNestedClassifierScope { +fun nestedClassifierScope(klass: FirClass<*>): FirNestedClassifierScope? { return klass .session .declaredMemberScopeProvider @@ -84,7 +85,8 @@ fun lazyNestedClassifierScope( classId: ClassId, existingNames: List, symbolProvider: FirSymbolProvider -): FirLazyNestedClassifierScope { +): FirLazyNestedClassifierScope? { + if (existingNames.isEmpty()) return null return FirLazyNestedClassifierScope(classId, existingNames, symbolProvider) } diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirNestedClassifierScope.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirNestedClassifierScope.kt index 09256aba202..ee0e2426afe 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirNestedClassifierScope.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirNestedClassifierScope.kt @@ -25,6 +25,8 @@ class FirNestedClassifierScope(val klass: FirClass<*>) : FirScope() { result } + fun isEmpty() = classIndex.isEmpty() + override fun processClassifiersByNameWithSubstitution( name: Name, processor: (FirClassifierSymbol<*>, ConeSubstitutor) -> Unit