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 d6ac0cb2963..b3258008d2b 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 @@ -70,7 +70,7 @@ class FirJavaModuleBasedSession private constructor( } class FirLibrarySession private constructor( - moduleInfo: ModuleInfo, + override val moduleInfo: ModuleInfo, sessionProvider: FirProjectSessionProvider, ) : FirSession(sessionProvider) { companion object { diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/scopes/JavaClassMembersEnhancementScope.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/scopes/JavaClassMembersEnhancementScope.kt index 35f6a287e8d..e81bff6d9a2 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/scopes/JavaClassMembersEnhancementScope.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/scopes/JavaClassMembersEnhancementScope.kt @@ -105,6 +105,10 @@ class JavaClassMembersEnhancementScope( return useSiteMemberScope.getCallableNames() } + override fun getClassifierNames(): Set { + return useSiteMemberScope.getClassifierNames() + } + override fun mayContainName(name: Name): Boolean { return useSiteMemberScope.mayContainName(name) } diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/scopes/JavaClassStaticEnhancementScope.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/scopes/JavaClassStaticEnhancementScope.kt index 28e63999ffd..a10c49a0d5e 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/scopes/JavaClassStaticEnhancementScope.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/scopes/JavaClassStaticEnhancementScope.kt @@ -8,6 +8,7 @@ package org.jetbrains.kotlin.fir.java.scopes import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.java.enhancement.FirSignatureEnhancement import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor +import org.jetbrains.kotlin.fir.scopes.FirContainingNamesAwareScope import org.jetbrains.kotlin.fir.scopes.FirScope import org.jetbrains.kotlin.fir.symbols.impl.* import org.jetbrains.kotlin.name.Name @@ -15,8 +16,8 @@ import org.jetbrains.kotlin.name.Name class JavaClassStaticEnhancementScope( session: FirSession, owner: FirRegularClassSymbol, - private val useSiteStaticScope: FirScope, -) : FirScope() { + private val useSiteStaticScope: JavaClassStaticUseSiteScope, +) : FirScope(), FirContainingNamesAwareScope { private val signatureEnhancement = FirSignatureEnhancement(owner.fir, session) { emptyList() } @@ -53,6 +54,11 @@ class JavaClassStaticEnhancementScope( return useSiteStaticScope.getCallableNames() } + override fun getClassifierNames(): Set { + return useSiteStaticScope.getClassifierNames() + } + + override fun mayContainName(name: Name): Boolean { return useSiteStaticScope.mayContainName(name) } diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/scopes/JavaClassStaticUseSiteScope.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/scopes/JavaClassStaticUseSiteScope.kt index d906da48928..bd6ce009fd4 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/scopes/JavaClassStaticUseSiteScope.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/scopes/JavaClassStaticUseSiteScope.kt @@ -7,7 +7,9 @@ package org.jetbrains.kotlin.fir.java.scopes import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.java.JavaTypeParameterStack +import org.jetbrains.kotlin.fir.scopes.FirContainingNamesAwareScope import org.jetbrains.kotlin.fir.scopes.FirScope +import org.jetbrains.kotlin.fir.scopes.getContainingCallableNamesIfPresent import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirVariableSymbol @@ -21,7 +23,7 @@ class JavaClassStaticUseSiteScope internal constructor( private val superClassScope: FirScope, private val superTypesScopes: List, javaTypeParameterStack: JavaTypeParameterStack, -) : FirScope() { +) : FirScope(), FirContainingNamesAwareScope { private val functions = hashMapOf>>() private val properties = hashMapOf>>() private val overrideChecker = JavaOverrideChecker(session, javaTypeParameterStack) @@ -83,9 +85,19 @@ class JavaClassStaticUseSiteScope internal constructor( @OptIn(ExperimentalStdlibApi::class) override fun getCallableNames(): Set { return buildSet { - addAll(declaredMemberScope.getCallableNames()) + addAll(declaredMemberScope.getContainingCallableNamesIfPresent()) for (superTypesScope in superTypesScopes) { - addAll(superTypesScope.getCallableNames()) + addAll(superTypesScope.getContainingCallableNamesIfPresent()) + } + } + } + + @OptIn(ExperimentalStdlibApi::class) + override fun getClassifierNames(): Set { + return buildSet { + addAll(declaredMemberScope.getContainingCallableNamesIfPresent()) + for (superTypesScope in superTypesScopes) { + addAll(superTypesScope.getContainingCallableNamesIfPresent()) } } } diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/scopes/JavaClassUseSiteMemberScope.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/scopes/JavaClassUseSiteMemberScope.kt index 6aec79ee8ba..d20582f48f2 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/scopes/JavaClassUseSiteMemberScope.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/scopes/JavaClassUseSiteMemberScope.kt @@ -16,6 +16,8 @@ import org.jetbrains.kotlin.fir.java.declarations.* import org.jetbrains.kotlin.fir.resolve.calls.FirSyntheticPropertiesScope import org.jetbrains.kotlin.fir.scopes.FirScope import org.jetbrains.kotlin.fir.scopes.FirTypeScope +import org.jetbrains.kotlin.fir.scopes.getContainingCallableNamesIfPresent +import org.jetbrains.kotlin.fir.scopes.getContainingClassifierNamesIfPresent import org.jetbrains.kotlin.fir.scopes.impl.AbstractFirUseSiteMemberScope import org.jetbrains.kotlin.fir.symbols.CallableId import org.jetbrains.kotlin.fir.symbols.impl.* @@ -46,11 +48,11 @@ class JavaClassUseSiteMemberScope( } override fun getCallableNames(): Set { - return declaredMemberScope.getCallableNames() + superTypesScope.getCallableNames() + return declaredMemberScope.getContainingCallableNamesIfPresent() + superTypesScope.getCallableNames() } override fun getClassifierNames(): Set { - return declaredMemberScope.getClassifierNames() + superTypesScope.getClassifierNames() + return declaredMemberScope.getContainingClassifierNamesIfPresent() + superTypesScope.getClassifierNames() } private fun generateAccessorSymbol( diff --git a/compiler/fir/jvm/src/org/jetbrains/kotlin/fir/scopes/jvm/JvmMappedScope.kt b/compiler/fir/jvm/src/org/jetbrains/kotlin/fir/scopes/jvm/JvmMappedScope.kt index f24e18446d6..0ed2d776a1c 100644 --- a/compiler/fir/jvm/src/org/jetbrains/kotlin/fir/scopes/jvm/JvmMappedScope.kt +++ b/compiler/fir/jvm/src/org/jetbrains/kotlin/fir/scopes/jvm/JvmMappedScope.kt @@ -8,9 +8,7 @@ package org.jetbrains.kotlin.fir.scopes.jvm import org.jetbrains.kotlin.builtins.jvm.JvmBuiltInsSettings import org.jetbrains.kotlin.fir.declarations.FirRegularClass import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor -import org.jetbrains.kotlin.fir.scopes.FirTypeScope -import org.jetbrains.kotlin.fir.scopes.FirScope -import org.jetbrains.kotlin.fir.scopes.ProcessorAction +import org.jetbrains.kotlin.fir.scopes.* import org.jetbrains.kotlin.fir.symbols.impl.* import org.jetbrains.kotlin.name.Name @@ -77,11 +75,11 @@ class JvmMappedScope( } override fun getCallableNames(): Set { - return declaredMemberScope.getCallableNames() + return declaredMemberScope.getContainingCallableNamesIfPresent() } override fun getClassifierNames(): Set { - return declaredMemberScope.getClassifierNames() + return declaredMemberScope.getContainingClassifierNamesIfPresent() } companion object { diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/AbstractFirUseSiteMemberScope.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/AbstractFirUseSiteMemberScope.kt index db9f5846f88..b561fec3158 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/AbstractFirUseSiteMemberScope.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/AbstractFirUseSiteMemberScope.kt @@ -9,10 +9,7 @@ import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.declarations.FirFunction import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor -import org.jetbrains.kotlin.fir.scopes.FirOverrideChecker -import org.jetbrains.kotlin.fir.scopes.FirScope -import org.jetbrains.kotlin.fir.scopes.FirTypeScope -import org.jetbrains.kotlin.fir.scopes.ProcessorAction +import org.jetbrains.kotlin.fir.scopes.* import org.jetbrains.kotlin.fir.symbols.impl.* import org.jetbrains.kotlin.name.Name @@ -132,6 +129,10 @@ abstract class AbstractFirUseSiteMemberScope( } override fun getCallableNames(): Set { - return declaredMemberScope.getCallableNames() + superTypesScope.getCallableNames() + return declaredMemberScope.getContainingCallableNamesIfPresent() + superTypesScope.getCallableNames() + } + + override fun getClassifierNames(): Set { + return declaredMemberScope.getContainingClassifierNamesIfPresent() + superTypesScope.getClassifierNames() } } 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 6a2f6438a92..dff840da6fa 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 @@ -8,7 +8,9 @@ package org.jetbrains.kotlin.fir.scopes.impl import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProvider import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor +import org.jetbrains.kotlin.fir.scopes.FirContainingNamesAwareScope import org.jetbrains.kotlin.fir.scopes.FirScope +import org.jetbrains.kotlin.fir.scopes.getContainingClassifierNamesIfPresent import org.jetbrains.kotlin.fir.symbols.impl.* import org.jetbrains.kotlin.name.Name @@ -17,8 +19,8 @@ class FirClassDeclaredMemberScope( useLazyNestedClassifierScope: Boolean = false, existingNames: List? = null, symbolProvider: FirSymbolProvider? = null -) : FirScope() { - private val nestedClassifierScope = if (useLazyNestedClassifierScope) { +) : FirScope(), FirContainingNamesAwareScope { + private val nestedClassifierScope: FirScope? = if (useLazyNestedClassifierScope) { lazyNestedClassifierScope(klass.symbol.classId, existingNames!!, symbolProvider!!) } else { nestedClassifierScope(klass) @@ -82,7 +84,7 @@ class FirClassDeclaredMemberScope( } override fun getClassifierNames(): Set { - return nestedClassifierScope?.getClassifierNames().orEmpty() + return nestedClassifierScope?.getContainingClassifierNamesIfPresent().orEmpty() } } 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 0f13db670db..2fb503d8e6e 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 @@ -17,7 +17,7 @@ import org.jetbrains.kotlin.utils.getOrPutNullable class FirDeclaredMemberScopeProvider : FirSessionComponent { - private val declaredMemberCache = mutableMapOf, FirScope>() + private val declaredMemberCache = mutableMapOf, FirClassDeclaredMemberScope>() private val nestedClassifierCache = mutableMapOf, FirNestedClassifierScope?>() fun getClassByClassId(classId: ClassId): FirClass<*>? { @@ -43,7 +43,7 @@ class FirDeclaredMemberScopeProvider : FirSessionComponent { useLazyNestedClassifierScope: Boolean, existingNames: List?, symbolProvider: FirSymbolProvider? - ): FirScope { + ): FirClassDeclaredMemberScope { return declaredMemberCache.getOrPut(klass) { FirClassDeclaredMemberScope(klass, useLazyNestedClassifierScope, existingNames, symbolProvider) } @@ -56,7 +56,7 @@ class FirDeclaredMemberScopeProvider : FirSessionComponent { } } -fun declaredMemberScope(klass: FirClass<*>): FirScope { +fun declaredMemberScope(klass: FirClass<*>): FirClassDeclaredMemberScope { return klass .session .declaredMemberScopeProvider diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirIntegerLiteralTypeScope.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirIntegerLiteralTypeScope.kt index a38e869a93d..106e94fda67 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirIntegerLiteralTypeScope.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirIntegerLiteralTypeScope.kt @@ -106,6 +106,10 @@ class FirIntegerLiteralTypeScope(private val session: FirSession, val isUnsigned propertySymbol: FirPropertySymbol, processor: (FirPropertySymbol, Int) -> ProcessorAction ): ProcessorAction = ProcessorAction.NEXT + + override fun getCallableNames(): Set = ALL_OPERATORS.keys + + override fun getClassifierNames(): Set = emptySet() } @OptIn(FirImplementationDetail::class) diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirLazyNestedClassifierScope.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirLazyNestedClassifierScope.kt index 22c9a3c2cfc..682de8ada59 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirLazyNestedClassifierScope.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirLazyNestedClassifierScope.kt @@ -7,6 +7,7 @@ package org.jetbrains.kotlin.fir.scopes.impl import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProvider import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor +import org.jetbrains.kotlin.fir.scopes.FirContainingNamesAwareScope import org.jetbrains.kotlin.fir.scopes.FirScope import org.jetbrains.kotlin.fir.symbols.impl.FirClassifierSymbol import org.jetbrains.kotlin.name.ClassId @@ -19,7 +20,7 @@ class FirLazyNestedClassifierScope( val classId: ClassId, private val existingNames: List, private val symbolProvider: FirSymbolProvider -) : FirScope() { +) : FirScope(), FirContainingNamesAwareScope { override fun processClassifiersByNameWithSubstitution( name: Name, processor: (FirClassifierSymbol<*>, ConeSubstitutor) -> Unit @@ -33,7 +34,7 @@ class FirLazyNestedClassifierScope( processor(symbol, ConeSubstitutor.Empty) } - override fun getClassifierNames(): Set { - return existingNames.toSet() - } + override fun getClassifierNames(): Set = existingNames.toSet() + + override fun getCallableNames(): Set = emptySet() } diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirLocalScope.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirLocalScope.kt index 90cb94c1469..c3b257d3bda 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirLocalScope.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirLocalScope.kt @@ -14,6 +14,7 @@ import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction import org.jetbrains.kotlin.fir.declarations.FirVariable import org.jetbrains.kotlin.fir.resolve.PersistentMultimap import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor +import org.jetbrains.kotlin.fir.scopes.FirContainingNamesAwareScope import org.jetbrains.kotlin.fir.scopes.FirScope import org.jetbrains.kotlin.fir.symbols.impl.* import org.jetbrains.kotlin.name.Name @@ -22,7 +23,7 @@ class FirLocalScope private constructor( val properties: PersistentMap>, val functions: PersistentMultimap>, val classes: PersistentMap -) : FirScope() { +) : FirScope(), FirContainingNamesAwareScope { constructor() : this(persistentMapOf(), PersistentMultimap(), persistentMapOf()) fun storeClass(klass: FirRegularClass): FirLocalScope { @@ -72,4 +73,5 @@ class FirLocalScope private constructor( override fun mayContainName(name: Name) = properties.containsKey(name) || functions[name].isNotEmpty() || classes.containsKey(name) override fun getCallableNames(): Set = properties.keys + functions.keys + override fun getClassifierNames(): Set = classes.keys } 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 ff40c5d44ac..464a831cc02 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 @@ -10,6 +10,7 @@ import org.jetbrains.kotlin.fir.declarations.FirRegularClass import org.jetbrains.kotlin.fir.declarations.FirTypeParameterRef import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutorByMap +import org.jetbrains.kotlin.fir.scopes.FirContainingNamesAwareScope import org.jetbrains.kotlin.fir.scopes.FirScope import org.jetbrains.kotlin.fir.symbols.ConeTypeParameterLookupTag import org.jetbrains.kotlin.fir.symbols.impl.FirClassifierSymbol @@ -18,7 +19,7 @@ import org.jetbrains.kotlin.fir.types.ConeKotlinType import org.jetbrains.kotlin.fir.types.impl.ConeTypeParameterTypeImpl import org.jetbrains.kotlin.name.Name -class FirNestedClassifierScope(val klass: FirClass<*>) : FirScope() { +class FirNestedClassifierScope(val klass: FirClass<*>) : FirScope(), FirContainingNamesAwareScope { private val classIndex: Map = run { val result = mutableMapOf() for (declaration in klass.declarations) { @@ -44,9 +45,9 @@ class FirNestedClassifierScope(val klass: FirClass<*>) : FirScope() { fun getClassifierByName(name: Name): FirRegularClassSymbol? = classIndex[name] - override fun getClassifierNames(): Set { - return classIndex.keys - } + override fun getClassifierNames(): Set = classIndex.keys + + override fun getCallableNames(): Set = emptySet() } fun FirTypeParameterRef.toConeType(): ConeKotlinType = ConeTypeParameterTypeImpl(ConeTypeParameterLookupTag(symbol), isNullable = false) \ No newline at end of file diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirPackageMemberScope.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirPackageMemberScope.kt index 4ec235c62bc..950398edda3 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirPackageMemberScope.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirPackageMemberScope.kt @@ -56,8 +56,4 @@ class FirPackageMemberScope(val fqName: FqName, val session: FirSession) : FirSc } } } - - override fun getCallableNames(): Set { - return symbolProvider.getAllCallableNamesInPackage(fqName) - } } diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirStaticScope.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirStaticScope.kt index 2680407d6ff..ecc31ee1edf 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirStaticScope.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirStaticScope.kt @@ -10,6 +10,7 @@ import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction import org.jetbrains.kotlin.fir.declarations.isStatic import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor import org.jetbrains.kotlin.fir.scopes.FirScope +import org.jetbrains.kotlin.fir.scopes.getContainingCallableNamesIfPresent import org.jetbrains.kotlin.fir.symbols.impl.FirClassifierSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirVariableSymbol @@ -35,8 +36,4 @@ class FirStaticScope(private val delegateScope: FirScope) : FirScope() { } } } - - override fun getCallableNames(): Set { - return delegateScope.getCallableNames() - } } diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/scopes/FirCompositeScope.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/scopes/FirCompositeScope.kt index f69443fca30..4f6fbe520fa 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/scopes/FirCompositeScope.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/scopes/FirCompositeScope.kt @@ -11,7 +11,7 @@ import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirVariableSymbol import org.jetbrains.kotlin.name.Name -class FirCompositeScope(val scopes: Iterable) : FirScope() { +class FirCompositeScope(val scopes: Iterable) : FirScope(), FirContainingNamesAwareScope { override fun processClassifiersByNameWithSubstitution( name: Name, @@ -46,10 +46,10 @@ class FirCompositeScope(val scopes: Iterable) : FirScope() { } override fun getCallableNames(): Set { - return scopes.flatMapTo(mutableSetOf()) { it.getCallableNames() } + return scopes.flatMapTo(hashSetOf()) { it.getContainingCallableNamesIfPresent() } } override fun getClassifierNames(): Set { - return scopes.flatMapTo(hashSetOf()) { it.getClassifierNames() } + return scopes.flatMapTo(hashSetOf()) { it.getContainingClassifierNamesIfPresent() } } } diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/scopes/FirContainingNamesAwareScope.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/scopes/FirContainingNamesAwareScope.kt new file mode 100644 index 00000000000..812db2cea99 --- /dev/null +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/scopes/FirContainingNamesAwareScope.kt @@ -0,0 +1,20 @@ +/* + * Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.fir.scopes + +import org.jetbrains.kotlin.name.Name + +interface FirContainingNamesAwareScope { + fun getCallableNames(): Set + + fun getClassifierNames(): Set +} + +fun FirScope.getContainingCallableNamesIfPresent(): Set = + if (this is FirContainingNamesAwareScope) getCallableNames() else emptySet() + +fun FirScope.getContainingClassifierNamesIfPresent(): Set = + if (this is FirContainingNamesAwareScope) getClassifierNames() else emptySet() diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/scopes/FirScope.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/scopes/FirScope.kt index 994bf9ff1c4..c671b67256f 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/scopes/FirScope.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/scopes/FirScope.kt @@ -33,10 +33,6 @@ abstract class FirScope { ) {} open fun mayContainName(name: Name) = true - - open fun getCallableNames(): Set = emptySet() - - open fun getClassifierNames(): Set = emptySet() } fun FirTypeScope.processOverriddenFunctionsAndSelf( diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/scopes/FirTypeScope.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/scopes/FirTypeScope.kt index c5d5e407789..34aa97d2f90 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/scopes/FirTypeScope.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/scopes/FirTypeScope.kt @@ -8,8 +8,9 @@ package org.jetbrains.kotlin.fir.scopes import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol +import org.jetbrains.kotlin.name.Name -abstract class FirTypeScope : FirScope() { +abstract class FirTypeScope : FirScope(), FirContainingNamesAwareScope { // Currently, this function and its property brother both have very weak guarantees // - It may silently do nothing on symbols originated from different scope instance // - It may return the same overridden symbols more then once in case of substitution @@ -96,5 +97,9 @@ abstract class FirTypeScope : FirScope() { propertySymbol: FirPropertySymbol, processor: (FirPropertySymbol, Int) -> ProcessorAction ): ProcessorAction = ProcessorAction.NEXT + + override fun getCallableNames(): Set = emptySet() + + override fun getClassifierNames(): Set = emptySet() } } diff --git a/idea/idea-frontend-api/src/org/jetbrains/kotlin/idea/frontend/api/scopes/KtScope.kt b/idea/idea-frontend-api/src/org/jetbrains/kotlin/idea/frontend/api/scopes/KtScope.kt index 3f83eabeade..7bcbe52688a 100644 --- a/idea/idea-frontend-api/src/org/jetbrains/kotlin/idea/frontend/api/scopes/KtScope.kt +++ b/idea/idea-frontend-api/src/org/jetbrains/kotlin/idea/frontend/api/scopes/KtScope.kt @@ -7,21 +7,32 @@ package org.jetbrains.kotlin.idea.frontend.api.scopes import org.jetbrains.kotlin.idea.frontend.api.ValidityTokenOwner import org.jetbrains.kotlin.idea.frontend.api.symbols.* +import org.jetbrains.kotlin.idea.frontend.api.withValidityAssertion +import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name interface KtScope : ValidityTokenOwner { // TODO check that names are accessible // maybe return some kind of lazy set - fun getAllNames(): Set + fun getAllNames(): Set = withValidityAssertion { getCallableNames() + getClassLikeSymbolNames() } + fun getCallableNames(): Set fun getClassLikeSymbolNames(): Set - fun getAllSymbols(): Sequence + fun getAllSymbols(): Sequence = withValidityAssertion { + sequence { + yieldAll(getCallableSymbols()) + yieldAll(getClassClassLikeSymbols()) + } + } + fun getCallableSymbols(): Sequence fun getClassClassLikeSymbols(): Sequence - fun containsName(name: Name): Boolean + fun containsName(name: Name): Boolean = withValidityAssertion { + name in getCallableNames() || name in getClassLikeSymbolNames() + } } interface KtCompositeScope : KtScope { @@ -37,7 +48,7 @@ interface KtDeclaredMemberScope : KtScope { } interface KtPackageScope : KtScope, KtSubstitutedScope { - val owner: KtPackageSymbol + val fqName: FqName } interface KtUnsubstitutedScope : KtScope { diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/scopes/KtFirDeclaredMemberScope.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/scopes/KtFirDeclaredMemberScope.kt index adf4033ab58..9c216250f85 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/scopes/KtFirDeclaredMemberScope.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/scopes/KtFirDeclaredMemberScope.kt @@ -5,10 +5,9 @@ package org.jetbrains.kotlin.idea.frontend.api.fir.scopes -import org.jetbrains.kotlin.fir.scopes.FirScope -import org.jetbrains.kotlin.fir.scopes.impl.declaredMemberScope -import org.jetbrains.kotlin.idea.frontend.api.ValidityTokenOwner +import org.jetbrains.kotlin.fir.scopes.impl.FirClassDeclaredMemberScope import org.jetbrains.kotlin.idea.frontend.api.ValidityToken +import org.jetbrains.kotlin.idea.frontend.api.ValidityTokenOwner import org.jetbrains.kotlin.idea.frontend.api.fir.KtSymbolByFirBuilder import org.jetbrains.kotlin.idea.frontend.api.fir.symbols.KtFirClassOrObjectSymbol import org.jetbrains.kotlin.idea.frontend.api.fir.utils.weakRef @@ -17,13 +16,13 @@ import org.jetbrains.kotlin.idea.frontend.api.scopes.KtUnsubstitutedScope internal class KtFirDeclaredMemberScope( override val owner: KtFirClassOrObjectSymbol, - firScope: FirScope, + firScope: FirClassDeclaredMemberScope, token: ValidityToken, builder: KtSymbolByFirBuilder -) : KtFirDelegatingScope(builder, token), +) : KtFirDelegatingScope(builder, token), KtDeclaredMemberScope, - KtUnsubstitutedScope, + KtUnsubstitutedScope, ValidityTokenOwner { - override val firScope: FirScope by weakRef(firScope) + override val firScope: FirClassDeclaredMemberScope by weakRef(firScope) } diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/scopes/KtFirDelegatingScope.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/scopes/KtFirDelegatingScope.kt index cfb9236ec32..a3793cb2c52 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/scopes/KtFirDelegatingScope.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/scopes/KtFirDelegatingScope.kt @@ -9,13 +9,13 @@ import org.jetbrains.kotlin.fir.declarations.FirClassLikeDeclaration import org.jetbrains.kotlin.fir.declarations.FirDeclaration import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction +import org.jetbrains.kotlin.fir.scopes.FirContainingNamesAwareScope import org.jetbrains.kotlin.fir.scopes.FirScope import org.jetbrains.kotlin.fir.scopes.processClassifiersByName import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol import org.jetbrains.kotlin.fir.symbols.PossiblyFirFakeOverrideSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol import org.jetbrains.kotlin.idea.frontend.api.ValidityToken -import org.jetbrains.kotlin.idea.frontend.api.ValidityTokenOwner import org.jetbrains.kotlin.idea.frontend.api.fir.KtSymbolByFirBuilder import org.jetbrains.kotlin.idea.frontend.api.fir.utils.cached import org.jetbrains.kotlin.idea.frontend.api.scopes.KtScope @@ -25,12 +25,12 @@ import org.jetbrains.kotlin.idea.frontend.api.symbols.KtSymbol import org.jetbrains.kotlin.idea.frontend.api.withValidityAssertion import org.jetbrains.kotlin.name.Name -internal abstract class KtFirDelegatingScope( +internal abstract class KtFirDelegatingScope( private val builder: KtSymbolByFirBuilder, final override val token: ValidityToken -) : KtScope { +) : KtScope where S : FirContainingNamesAwareScope, S : FirScope { - abstract val firScope: FirScope + abstract val firScope: S private val allNamesCached by cached { getCallableNames() + getClassLikeSymbolNames() @@ -46,62 +46,58 @@ internal abstract class KtFirDelegatingScope( firScope.getClassifierNames() } - override fun getAllSymbols(): Sequence = withValidityAssertion { - sequence { - yieldAll(getCallableSymbols()) - yieldAll(getClassClassLikeSymbols()) - } - } - override fun getCallableSymbols(): Sequence = withValidityAssertion { - sequence { - getCallableNames().forEach { name -> - val callables = mutableListOf() - firScope.processFunctionsByName(name) { firSymbol -> - (firSymbol.fir as? FirSimpleFunction)?.let { fir -> - callables.add(builder.buildFunctionSymbol(fir, firSymbol.realDeclarationOrigin())) - } - } - firScope.processPropertiesByName(name) { firSymbol -> - val symbol = when { - firSymbol is FirPropertySymbol && firSymbol.isFakeOverride -> { - builder.buildVariableSymbol(firSymbol.fir, firSymbol.realDeclarationOrigin()) - } - else -> builder.buildCallableSymbol(firSymbol.fir) - } - callables.add(symbol) - } - yieldAll(callables) - } - } + firScope.getCallableSymbols(getCallableNames(), builder) } override fun getClassClassLikeSymbols(): Sequence = withValidityAssertion { - sequence { - getClassLikeSymbolNames().forEach { name -> - val classLikeSymbols = mutableListOf() - firScope.processClassifiersByName(name) { firSymbol -> - (firSymbol.fir as? FirClassLikeDeclaration<*>)?.let { - classLikeSymbols.add(builder.buildClassLikeSymbol(it)) - } - } - yieldAll(classLikeSymbols) - } - } + firScope.getClassLikeSymbols(getClassLikeSymbolNames(), builder) } override fun containsName(name: Name): Boolean = withValidityAssertion { name in getAllNames() } - companion object { - private fun FirBasedSymbol<*>.realDeclarationOrigin(): FirDeclarationOrigin? { - if (this !is PossiblyFirFakeOverrideSymbol<*, *> || !isFakeOverride) return null - var current: FirBasedSymbol<*>? = this.overriddenSymbol - while (current is PossiblyFirFakeOverrideSymbol<*, *> && current.isFakeOverride) { - current = current.overriddenSymbol +} + +private fun FirBasedSymbol<*>.realDeclarationOrigin(): FirDeclarationOrigin? { + if (this !is PossiblyFirFakeOverrideSymbol<*, *> || !isFakeOverride) return null + var current: FirBasedSymbol<*>? = this.overriddenSymbol + while (current is PossiblyFirFakeOverrideSymbol<*, *> && current.isFakeOverride) { + current = current.overriddenSymbol + } + return (current?.fir as? FirDeclaration)?.origin +} + +internal fun FirScope.getCallableSymbols(callableNames: Collection, builder: KtSymbolByFirBuilder) = sequence { + callableNames.forEach { name -> + val callables = mutableListOf() + processFunctionsByName(name) { firSymbol -> + (firSymbol.fir as? FirSimpleFunction)?.let { fir -> + callables.add(builder.buildFunctionSymbol(fir, firSymbol.realDeclarationOrigin())) } - return (current?.fir as? FirDeclaration)?.origin } + processPropertiesByName(name) { firSymbol -> + val symbol = when { + firSymbol is FirPropertySymbol && firSymbol.isFakeOverride -> { + builder.buildVariableSymbol(firSymbol.fir, firSymbol.realDeclarationOrigin()) + } + else -> builder.buildCallableSymbol(firSymbol.fir) + } + callables.add(symbol) + } + yieldAll(callables) + } +} + +internal fun FirScope.getClassLikeSymbols(classLikeNames: Collection, builder: KtSymbolByFirBuilder) = sequence { + classLikeNames.forEach { name -> + val classLikeSymbols = mutableListOf() + processClassifiersByName(name) { firSymbol -> + (firSymbol.fir as? FirClassLikeDeclaration<*>)?.let { + classLikeSymbols.add(builder.buildClassLikeSymbol(it)) + } + } + yieldAll(classLikeSymbols) } } \ No newline at end of file diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/scopes/KtFirMemberScope.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/scopes/KtFirMemberScope.kt index fdfbb006809..2029d0c0ba7 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/scopes/KtFirMemberScope.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/scopes/KtFirMemberScope.kt @@ -5,7 +5,7 @@ package org.jetbrains.kotlin.idea.frontend.api.fir.scopes -import org.jetbrains.kotlin.fir.scopes.FirScope +import org.jetbrains.kotlin.fir.scopes.FirTypeScope import org.jetbrains.kotlin.idea.frontend.api.ValidityToken import org.jetbrains.kotlin.idea.frontend.api.ValidityTokenOwner import org.jetbrains.kotlin.idea.frontend.api.fir.KtSymbolByFirBuilder @@ -16,10 +16,10 @@ import org.jetbrains.kotlin.idea.frontend.api.scopes.KtUnsubstitutedScope internal class KtFirMemberScope( override val owner: KtFirClassOrObjectSymbol, - firScope: FirScope, + firScope: FirTypeScope, token: ValidityToken, builder: KtSymbolByFirBuilder -) : KtFirDelegatingScope(builder, token), KtMemberScope, KtUnsubstitutedScope, ValidityTokenOwner { - override val firScope: FirScope by weakRef(firScope) +) : KtFirDelegatingScope(builder, token), KtMemberScope, KtUnsubstitutedScope, ValidityTokenOwner { + override val firScope: FirTypeScope by weakRef(firScope) } diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/scopes/KtFirNonStarImportingScope.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/scopes/KtFirNonStarImportingScope.kt index e3ac3113f8b..2829b0a2771 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/scopes/KtFirNonStarImportingScope.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/scopes/KtFirNonStarImportingScope.kt @@ -11,17 +11,20 @@ import org.jetbrains.kotlin.idea.frontend.api.ValidityTokenOwner import org.jetbrains.kotlin.idea.frontend.api.ValidityToken import org.jetbrains.kotlin.idea.frontend.api.fir.KtSymbolByFirBuilder import org.jetbrains.kotlin.idea.frontend.api.fir.utils.cached +import org.jetbrains.kotlin.idea.frontend.api.fir.utils.weakRef import org.jetbrains.kotlin.idea.frontend.api.scopes.KtNonStarImportingScope import org.jetbrains.kotlin.idea.frontend.api.scopes.NonStarImport +import org.jetbrains.kotlin.idea.frontend.api.symbols.KtCallableSymbol +import org.jetbrains.kotlin.idea.frontend.api.symbols.KtClassLikeSymbol import org.jetbrains.kotlin.idea.frontend.api.withValidityAssertion import org.jetbrains.kotlin.name.Name internal class KtFirNonStarImportingScope( firScope: FirAbstractSimpleImportingScope, - builder: KtSymbolByFirBuilder, - token: ValidityToken -) : KtFirDelegatingScope(builder, token), KtNonStarImportingScope, ValidityTokenOwner { - override val firScope: FirAbstractSimpleImportingScope = firScope + private val builder: KtSymbolByFirBuilder, + override val token: ValidityToken +) : KtNonStarImportingScope, ValidityTokenOwner { + private val firScope: FirAbstractSimpleImportingScope by weakRef(firScope) @OptIn(ExperimentalStdlibApi::class) override val imports: List by cached { @@ -39,6 +42,14 @@ internal class KtFirNonStarImportingScope( } } + override fun getCallableSymbols(): Sequence = withValidityAssertion { + firScope.getCallableSymbols(getCallableNames(), builder) + } + + override fun getClassClassLikeSymbols(): Sequence = withValidityAssertion { + firScope.getClassLikeSymbols(getClassLikeSymbolNames(), builder) + } + override fun getCallableNames(): Set = withValidityAssertion { imports.mapNotNullTo(hashSetOf()) { it.callableName } @@ -48,6 +59,5 @@ internal class KtFirNonStarImportingScope( imports.mapNotNullTo((hashSetOf())) { it.relativeClassName?.shortName() } } - override val isDefaultImportingScope: Boolean = withValidityAssertion { firScope is FirDefaultSimpleImportingScope } } diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/scopes/KtFirPackageScope.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/scopes/KtFirPackageScope.kt index 9ec7962c68d..789d59cb7cc 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/scopes/KtFirPackageScope.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/scopes/KtFirPackageScope.kt @@ -5,23 +5,44 @@ package org.jetbrains.kotlin.idea.frontend.api.fir.scopes -import org.jetbrains.kotlin.fir.FirSession -import org.jetbrains.kotlin.fir.scopes.FirScope +import com.intellij.psi.search.GlobalSearchScope +import org.jetbrains.kotlin.fir.resolve.firProvider import org.jetbrains.kotlin.fir.scopes.impl.FirPackageMemberScope -import org.jetbrains.kotlin.idea.frontend.api.ValidityTokenOwner import org.jetbrains.kotlin.idea.frontend.api.ValidityToken +import org.jetbrains.kotlin.idea.frontend.api.ValidityTokenOwner import org.jetbrains.kotlin.idea.frontend.api.fir.KtSymbolByFirBuilder import org.jetbrains.kotlin.idea.frontend.api.fir.symbols.KtFirPackageSymbol import org.jetbrains.kotlin.idea.frontend.api.fir.utils.weakRef import org.jetbrains.kotlin.idea.frontend.api.scopes.KtPackageScope +import org.jetbrains.kotlin.idea.frontend.api.symbols.KtCallableSymbol +import org.jetbrains.kotlin.idea.frontend.api.symbols.KtClassLikeSymbol +import org.jetbrains.kotlin.idea.frontend.api.symbols.KtSymbol +import org.jetbrains.kotlin.idea.frontend.api.withValidityAssertion +import org.jetbrains.kotlin.name.FqName +import org.jetbrains.kotlin.name.Name internal class KtFirPackageScope( - override val owner: KtFirPackageSymbol, - token: ValidityToken, - builder: KtSymbolByFirBuilder, - session: FirSession, -) : KtPackageScope, KtFirDelegatingScope(builder, token), ValidityTokenOwner { - override val firScope: FirScope by weakRef { - FirPackageMemberScope(owner.fqName, session) + firScope: FirPackageMemberScope, + private val builder: KtSymbolByFirBuilder, + override val token: ValidityToken, +) : KtPackageScope, ValidityTokenOwner { + private val firScope by weakRef(firScope) + override val fqName: FqName get() = firScope.fqName + private val provider get() = firScope.session.firProvider + + override fun getCallableNames(): Set = withValidityAssertion { + provider.getAllCallableNamesInPackage(fqName) + } + + override fun getClassLikeSymbolNames(): Set = withValidityAssertion { + provider.getClassNamesInPackage(fqName) + } + + override fun getCallableSymbols(): Sequence = withValidityAssertion { + firScope.getCallableSymbols(getCallableNames(), builder) + } + + override fun getClassClassLikeSymbols(): Sequence = withValidityAssertion { + firScope.getClassLikeSymbols(getClassLikeSymbolNames(), builder) } } \ No newline at end of file diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/scopes/KtFirScopeProvider.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/scopes/KtFirScopeProvider.kt index 7f76bc93a73..caa6031e545 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/scopes/KtFirScopeProvider.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/scopes/KtFirScopeProvider.kt @@ -9,12 +9,14 @@ import com.intellij.openapi.project.Project import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.declarations.FirFile import org.jetbrains.kotlin.fir.resolve.ScopeSession -import org.jetbrains.kotlin.fir.resolve.buildUseSiteMemberScope import org.jetbrains.kotlin.fir.resolve.scope +import org.jetbrains.kotlin.fir.scopes.FirContainingNamesAwareScope import org.jetbrains.kotlin.fir.scopes.FirScope import org.jetbrains.kotlin.fir.scopes.impl.FirAbstractSimpleImportingScope import org.jetbrains.kotlin.fir.scopes.impl.FirAbstractStarImportingScope +import org.jetbrains.kotlin.fir.scopes.impl.FirPackageMemberScope import org.jetbrains.kotlin.fir.scopes.impl.declaredMemberScope +import org.jetbrains.kotlin.fir.scopes.unsubstitutedScope import org.jetbrains.kotlin.idea.fir.getOrBuildFirOfType import org.jetbrains.kotlin.idea.fir.low.level.api.FirModuleResolveState import org.jetbrains.kotlin.idea.fir.low.level.api.LowLevelFirApiFacade @@ -23,7 +25,6 @@ import org.jetbrains.kotlin.idea.frontend.api.ValidityTokenOwner import org.jetbrains.kotlin.idea.frontend.api.fir.FirScopeRegistry import org.jetbrains.kotlin.idea.frontend.api.fir.KtSymbolByFirBuilder import org.jetbrains.kotlin.idea.frontend.api.fir.symbols.KtFirClassOrObjectSymbol -import org.jetbrains.kotlin.idea.frontend.api.fir.symbols.KtFirPackageSymbol import org.jetbrains.kotlin.idea.frontend.api.fir.types.KtFirType import org.jetbrains.kotlin.idea.frontend.api.fir.utils.weakRef import org.jetbrains.kotlin.idea.frontend.api.scopes.* @@ -57,7 +58,7 @@ internal class KtFirScopeProvider( override fun getMemberScope(classSymbol: KtClassOrObjectSymbol): KtMemberScope = withValidityAssertion { memberScopeCache.getOrPut(classSymbol) { check(classSymbol is KtFirClassOrObjectSymbol) - val firScope = classSymbol.fir.buildUseSiteMemberScope(classSymbol.fir.session, ScopeSession()).also(firScopeStorage::register) + val firScope = classSymbol.fir.unsubstitutedScope(classSymbol.fir.session, ScopeSession()).also(firScopeStorage::register) KtFirMemberScope(classSymbol, firScope, token, builder) } } @@ -72,8 +73,9 @@ internal class KtFirScopeProvider( override fun getPackageScope(packageSymbol: KtPackageSymbol): KtPackageScope = withValidityAssertion { packageMemberScopeCache.getOrPut(packageSymbol) { - check(packageSymbol is KtFirPackageSymbol) - KtFirPackageScope(packageSymbol, token, builder, session) + val firPackageScope = FirPackageMemberScope(packageSymbol.fqName, session/*TODO use correct session here*/) + .also(firScopeStorage::register) + KtFirPackageScope(firPackageScope, builder, token) } } @@ -123,15 +125,16 @@ internal class KtFirScopeProvider( return when (firScope) { is FirAbstractSimpleImportingScope -> KtFirNonStarImportingScope(firScope, builder, token) is FirAbstractStarImportingScope -> KtFirStarImportingScope(firScope, builder, project, token) - else -> { - // todo create concrete KtScope here instead of a generic one - KtFirDelegatingScopeImpl(firScope, builder, token) - } + is FirPackageMemberScope -> KtFirPackageScope(firScope, builder, token) + is FirContainingNamesAwareScope -> KtFirDelegatingScopeImpl(firScope, builder, token) + else -> TODO(firScope::class.toString()) } } } -private class KtFirDelegatingScopeImpl(firScope: FirScope, builder: KtSymbolByFirBuilder, token: ValidityToken) : - KtFirDelegatingScope(builder, token), ValidityTokenOwner { - override val firScope: FirScope by weakRef(firScope) +private class KtFirDelegatingScopeImpl( + firScope: S, builder: KtSymbolByFirBuilder, + token: ValidityToken +) : KtFirDelegatingScope(builder, token), ValidityTokenOwner where S : FirContainingNamesAwareScope, S : FirScope { + override val firScope: S by weakRef(firScope) } diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/scopes/KtFirStarImportingScope.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/scopes/KtFirStarImportingScope.kt index aa24a7ed028..111bc1a6a7f 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/scopes/KtFirStarImportingScope.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/scopes/KtFirStarImportingScope.kt @@ -7,15 +7,21 @@ package org.jetbrains.kotlin.idea.frontend.api.fir.scopes import com.intellij.openapi.project.Project import com.intellij.psi.search.GlobalSearchScope +import org.jetbrains.kotlin.fir.scopes.getContainingCallableNamesIfPresent +import org.jetbrains.kotlin.fir.scopes.getContainingClassifierNamesIfPresent import org.jetbrains.kotlin.fir.scopes.impl.FirAbstractStarImportingScope import org.jetbrains.kotlin.fir.scopes.impl.FirDefaultStarImportingScope import org.jetbrains.kotlin.idea.frontend.api.ValidityTokenOwner import org.jetbrains.kotlin.idea.frontend.api.ValidityToken import org.jetbrains.kotlin.idea.frontend.api.fir.KtSymbolByFirBuilder import org.jetbrains.kotlin.idea.frontend.api.fir.utils.cached +import org.jetbrains.kotlin.idea.frontend.api.fir.utils.weakRef import org.jetbrains.kotlin.idea.frontend.api.scopes.Import import org.jetbrains.kotlin.idea.frontend.api.scopes.KtStarImportingScope import org.jetbrains.kotlin.idea.frontend.api.scopes.StarImport +import org.jetbrains.kotlin.idea.frontend.api.symbols.KtCallableSymbol +import org.jetbrains.kotlin.idea.frontend.api.symbols.KtClassLikeSymbol +import org.jetbrains.kotlin.idea.frontend.api.symbols.KtSymbol import org.jetbrains.kotlin.idea.frontend.api.withValidityAssertion import org.jetbrains.kotlin.idea.stubindex.KotlinTopLevelClassByPackageIndex import org.jetbrains.kotlin.idea.stubindex.KotlinTopLevelFunctionByPackageIndex @@ -27,11 +33,11 @@ import org.jetbrains.kotlin.psi.KtClassOrObject internal class KtFirStarImportingScope( firScope: FirAbstractStarImportingScope, - builder: KtSymbolByFirBuilder, + private val builder: KtSymbolByFirBuilder, project: Project, - token: ValidityToken, -) : KtFirDelegatingScope(builder, token), KtStarImportingScope, ValidityTokenOwner { - override val firScope: FirAbstractStarImportingScope = firScope + override val token: ValidityToken, +) : KtStarImportingScope, ValidityTokenOwner { + private val firScope: FirAbstractStarImportingScope by weakRef(firScope) override val isDefaultImportingScope: Boolean = withValidityAssertion { firScope is FirDefaultStarImportingScope } private val packageHelper = PackageIndexHelper(project) @@ -45,6 +51,14 @@ internal class KtFirStarImportingScope( } } + override fun getCallableSymbols(): Sequence = withValidityAssertion { + firScope.getCallableSymbols(getCallableNames(), builder) + } + + override fun getClassClassLikeSymbols(): Sequence = withValidityAssertion { + firScope.getClassLikeSymbols(getClassLikeSymbolNames(), builder) + } + // todo cache? @OptIn(ExperimentalStdlibApi::class) override fun getCallableNames(): Set = withValidityAssertion { @@ -53,7 +67,7 @@ internal class KtFirStarImportingScope( packageHelper.getPackageTopLevelCallables(import.packageFqName) } else { //member val classId = import.resolvedClassId ?: error("Class id should not be null as relativeClassName is not null") - firScope.getStaticsScope(classId)?.getCallableNames().orEmpty() + firScope.getStaticsScope(classId)?.getContainingCallableNamesIfPresent().orEmpty() } } } @@ -64,7 +78,7 @@ internal class KtFirStarImportingScope( packageHelper.getPackageTopLevelClassifiers(import.packageFqName) } else { val classId = import.resolvedClassId ?: error("Class id should not be null as relativeClassName is not null") - firScope.getStaticsScope(classId)?.getClassifierNames().orEmpty() + firScope.getStaticsScope(classId)?.getContainingClassifierNamesIfPresent().orEmpty() } } }