diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/KtFirAnalysisSession.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/KtFirAnalysisSession.kt index 5ea5b43ea78..4d0a2011f2e 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/KtFirAnalysisSession.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/KtFirAnalysisSession.kt @@ -6,6 +6,7 @@ package org.jetbrains.kotlin.analysis.api.fir import com.intellij.openapi.project.Project +import com.intellij.psi.search.GlobalSearchScope import org.jetbrains.kotlin.analysis.api.KtAnalysisApiInternals import org.jetbrains.kotlin.analysis.api.KtAnalysisSession import org.jetbrains.kotlin.analysis.api.components.* @@ -140,8 +141,8 @@ private constructor( internal val firSymbolProvider: FirSymbolProvider get() = useSiteSession.symbolProvider internal val targetPlatform: TargetPlatform get() = useSiteSession.moduleData.platform - internal val useSiteScopeDeclarationProvider: KotlinDeclarationProvider = - project.createDeclarationProvider(analysisScopeProviderImpl.getAnalysisScope()) + val useSiteAnalisisScope: GlobalSearchScope = analysisScopeProviderImpl.getAnalysisScope() + val useSiteScopeDeclarationProvider: KotlinDeclarationProvider = project.createDeclarationProvider(useSiteAnalisisScope) fun getScopeSessionFor(session: FirSession): ScopeSession = withValidityAssertion { firResolveSession.getScopeSessionFor(session) } diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirScopeProvider.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirScopeProvider.kt index 433294aa9d0..a282cf973c8 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirScopeProvider.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirScopeProvider.kt @@ -46,6 +46,7 @@ import org.jetbrains.kotlin.fir.scopes.impl.* import org.jetbrains.kotlin.fir.scopes.unsubstitutedScope import org.jetbrains.kotlin.fir.symbols.ensureResolved import org.jetbrains.kotlin.fir.symbols.impl.* +import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.psi.KtElement import org.jetbrains.kotlin.psi.KtFile @@ -159,14 +160,7 @@ internal class KtFirScopeProvider( override fun getPackageScope(packageSymbol: KtPackageSymbol): KtScope { return packageMemberScopeCache.getOrPut(packageSymbol) { - KtFirPackageScope( - packageSymbol.fqName, - project, - builder, - token, - GlobalSearchScope.allScope(project), // TODO - analysisSession.targetPlatform, - ) + createPackageScope(packageSymbol.fqName) } } @@ -232,19 +226,24 @@ internal class KtFirScopeProvider( return when (firScope) { is FirAbstractSimpleImportingScope -> KtFirNonStarImportingScope(firScope, builder, token) is FirAbstractStarImportingScope -> KtFirStarImportingScope(firScope, builder, analysisSession.useSiteScopeDeclarationProvider, token) - is FirPackageMemberScope -> KtFirPackageScope( - firScope.fqName, - project, - builder, - token, - GlobalSearchScope.allScope(project), // todo - analysisSession.targetPlatform - ) + is FirPackageMemberScope -> createPackageScope(firScope.fqName) is FirContainingNamesAwareScope -> KtFirDelegatingScope(firScope, builder, token) else -> TODO(firScope::class.toString()) } } + private fun createPackageScope(fqName: FqName): KtFirPackageScope { + return KtFirPackageScope( + fqName, + project, + builder, + token, + analysisSession.useSiteAnalisisScope, + analysisSession.useSiteScopeDeclarationProvider, + analysisSession.targetPlatform + ) + } + private fun convertToKtTypeScope(firScope: FirScope): KtTypeScope { return when (firScope) { is FirContainingNamesAwareScope -> KtFirDelegatingTypeScope(firScope, builder, token) diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/scopes/KtFirPackageScope.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/scopes/KtFirPackageScope.kt index 33a76b34bf6..2d5b02a2d33 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/scopes/KtFirPackageScope.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/scopes/KtFirPackageScope.kt @@ -17,7 +17,7 @@ import org.jetbrains.kotlin.analysis.api.symbols.KtConstructorSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtPackageSymbol import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeToken import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion -import org.jetbrains.kotlin.analysis.providers.createDeclarationProvider +import org.jetbrains.kotlin.analysis.providers.KotlinDeclarationProvider import org.jetbrains.kotlin.analysis.providers.createPackageProvider import org.jetbrains.kotlin.fir.extensions.FirExtensionService import org.jetbrains.kotlin.fir.extensions.declarationGenerators @@ -34,9 +34,9 @@ internal class KtFirPackageScope( private val builder: KtSymbolByFirBuilder, override val token: KtLifetimeToken, private val searchScope: GlobalSearchScope, + private val declarationProvider: KotlinDeclarationProvider, private val targetPlatform: TargetPlatform, ) : KtScope { - private val declarationsProvider = project.createDeclarationProvider(searchScope) private val packageProvider = project.createPackageProvider(searchScope) private val firScope: FirPackageMemberScope by lazy(LazyThreadSafetyMode.PUBLICATION) { @@ -48,17 +48,14 @@ internal class KtFirPackageScope( override fun getPossibleCallableNames(): Set = withValidityAssertion { hashSetOf().apply { - addAll(declarationsProvider.getFunctionsNamesInPackage(fqName)) - addAll(declarationsProvider.getPropertyNamesInPackage(fqName)) - + addAll(declarationProvider.getTopLevelCallableNamesInPackage(fqName)) addAll(collectGeneratedTopLevelCallables()) } } override fun getPossibleClassifierNames(): Set = withValidityAssertion { hashSetOf().apply { - addAll(declarationsProvider.getClassNamesInPackage(fqName)) - addAll(declarationsProvider.getTypeAliasNamesInPackage(fqName)) + addAll(declarationProvider.getTopLevelKotlinClassLikeDeclarationNamesInPackage(fqName)) JavaPsiFacade.getInstance(project) .findPackage(fqName.asString()) diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/scopes/KtFirStarImportingScope.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/scopes/KtFirStarImportingScope.kt index a783121b2c2..7af86eab20e 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/scopes/KtFirStarImportingScope.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/scopes/KtFirStarImportingScope.kt @@ -51,8 +51,7 @@ internal class KtFirStarImportingScope( override fun getPossibleCallableNames(): Set = withValidityAssertion { imports.flatMapTo(hashSetOf()) { import: Import -> if (import.relativeClassName == null) { // top level callable - declarationProvider.getFunctionsNamesInPackage(import.packageFqName) + - declarationProvider.getPropertyNamesInPackage(import.packageFqName) + declarationProvider.getTopLevelCallableNamesInPackage(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() @@ -69,8 +68,7 @@ internal class KtFirStarImportingScope( override fun getPossibleClassifierNames(): Set = withValidityAssertion { imports.flatMapTo(hashSetOf()) { import -> if (import.relativeClassName == null) { - declarationProvider.getClassNamesInPackage(import.packageFqName) + - declarationProvider.getTypeAliasNamesInPackage(import.packageFqName) + declarationProvider.getTopLevelKotlinClassLikeDeclarationNamesInPackage(import.packageFqName) } else { val classId = import.resolvedClassId ?: error("Class id should not be null as relativeClassName is not null") firScope.getStaticsScope(classId)?.getClassifierNames().orEmpty() diff --git a/analysis/analysis-api-providers/src/org/jetbrains/kotlin/analysis/providers/KotlinDeclarationProvider.kt b/analysis/analysis-api-providers/src/org/jetbrains/kotlin/analysis/providers/KotlinDeclarationProvider.kt index ee7366a4e50..8695d1db40a 100644 --- a/analysis/analysis-api-providers/src/org/jetbrains/kotlin/analysis/providers/KotlinDeclarationProvider.kt +++ b/analysis/analysis-api-providers/src/org/jetbrains/kotlin/analysis/providers/KotlinDeclarationProvider.kt @@ -24,14 +24,13 @@ public abstract class KotlinDeclarationProvider { public abstract fun getAllClassesByClassId(classId: ClassId): Collection public abstract fun getAllTypeAliasesByClassId(classId: ClassId): Collection - public abstract fun getClassNamesInPackage(packageFqName: FqName): Set - public abstract fun getTypeAliasNamesInPackage(packageFqName: FqName): Set + public abstract fun getTopLevelKotlinClassLikeDeclarationNamesInPackage(packageFqName: FqName): Set public abstract fun getTopLevelProperties(callableId: CallableId): Collection public abstract fun getTopLevelFunctions(callableId: CallableId): Collection - public abstract fun getPropertyNamesInPackage(packageFqName: FqName): Set - public abstract fun getFunctionsNamesInPackage(packageFqName: FqName): Set + public abstract fun getTopLevelCallableNamesInPackage(packageFqName: FqName): Set + public abstract fun getFacadeFilesInPackage(packageFqName: FqName): Collection public abstract fun findFilesForFacade(facadeFqName: FqName): Collection } diff --git a/analysis/analysis-api-providers/src/org/jetbrains/kotlin/analysis/providers/impl/KotlinStaticDeclarationProvider.kt b/analysis/analysis-api-providers/src/org/jetbrains/kotlin/analysis/providers/impl/KotlinStaticDeclarationProvider.kt index 380fa55c8d2..7ab0013918a 100644 --- a/analysis/analysis-api-providers/src/org/jetbrains/kotlin/analysis/providers/impl/KotlinStaticDeclarationProvider.kt +++ b/analysis/analysis-api-providers/src/org/jetbrains/kotlin/analysis/providers/impl/KotlinStaticDeclarationProvider.kt @@ -51,37 +51,21 @@ public class KotlinStaticDeclarationProvider internal constructor( } ?: emptyList() - override fun getClassNamesInPackage(packageFqName: FqName): Set = - index.classMap[packageFqName] - ?.filter { ktClassOrObject -> - ktClassOrObject.inScope - } - ?.mapNotNullTo(mutableSetOf()) { it.nameAsName } - ?: emptySet() - override fun getTypeAliasNamesInPackage(packageFqName: FqName): Set = - index.typeAliasMap[packageFqName] - ?.filter { ktTypeAlias -> - ktTypeAlias.inScope - } - ?.mapNotNullTo(mutableSetOf()) { it.nameAsName } - ?: emptySet() + override fun getTopLevelKotlinClassLikeDeclarationNamesInPackage(packageFqName: FqName): Set { + val classifiers = index.classMap[packageFqName].orEmpty() + index.typeAliasMap[packageFqName].orEmpty() + return classifiers.filter { it.inScope } + .mapNotNullTo(mutableSetOf()) { it.nameAsName } + } - override fun getPropertyNamesInPackage(packageFqName: FqName): Set = - index.topLevelPropertyMap[packageFqName] - ?.filter { ktProperty -> - ktProperty.inScope - } - ?.mapNotNullTo(mutableSetOf()) { it.nameAsName } - ?: emptySet() - override fun getFunctionsNamesInPackage(packageFqName: FqName): Set = - index.topLevelFunctionMap[packageFqName] - ?.filter { ktNamedFunction -> - ktNamedFunction.inScope - } - ?.mapNotNullTo(mutableSetOf()) { it.nameAsName } - ?: emptySet() + override fun getTopLevelCallableNamesInPackage(packageFqName: FqName): Set { + val callables = index.topLevelPropertyMap[packageFqName].orEmpty() + index.topLevelFunctionMap[packageFqName].orEmpty() + return callables + .filter { it.inScope } + .mapNotNullTo(mutableSetOf()) { it.nameAsName } + } + override fun getFacadeFilesInPackage(packageFqName: FqName): Collection = index.facadeFileMap[packageFqName] diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/providers/LLFirProvider.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/providers/LLFirProvider.kt index 8ab09c94795..b6ae69a8f9b 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/providers/LLFirProvider.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/providers/LLFirProvider.kt @@ -6,7 +6,6 @@ package org.jetbrains.kotlin.analysis.low.level.api.fir.providers import org.jetbrains.kotlin.analysis.low.level.api.fir.LLFirModuleResolveComponents -import org.jetbrains.kotlin.analysis.low.level.api.fir.file.builder.ModuleFileCache import org.jetbrains.kotlin.analysis.providers.KotlinDeclarationProvider import org.jetbrains.kotlin.analysis.providers.KotlinPackageProvider import org.jetbrains.kotlin.fir.FirSession @@ -80,7 +79,7 @@ internal class LLFirProvider( override fun getClassNamesInPackage(fqName: FqName): Set = - declarationProvider.getClassNamesInPackage(fqName) + declarationProvider.getTopLevelKotlinClassLikeDeclarationNamesInPackage(fqName) @NoMutableState private inner class SymbolProvider : FirSymbolProvider(session) { diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/KotlinAsJavaFirSupport.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/KotlinAsJavaFirSupport.kt index 180b87765f3..29b2f435652 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/KotlinAsJavaFirSupport.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/KotlinAsJavaFirSupport.kt @@ -34,7 +34,7 @@ class KotlinAsJavaFirSupport(private val project: Project) : KotlinAsJavaSupport packageFqName: FqName, searchScope: GlobalSearchScope ): Collection = project.createDeclarationProvider(searchScope).run { - getClassNamesInPackage(packageFqName).flatMap { + getTopLevelKotlinClassLikeDeclarationNamesInPackage(packageFqName).flatMap { getAllClassesByClassId(ClassId.topLevel(packageFqName.child(it))) } }