diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/scopes/DeclarationsInPackageProvider.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/scopes/DeclarationsInPackageProvider.kt new file mode 100644 index 00000000000..f9bb58efa8d --- /dev/null +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/scopes/DeclarationsInPackageProvider.kt @@ -0,0 +1,73 @@ +/* + * Copyright 2010-2023 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.analysis.api.fir.scopes + +import org.jetbrains.kotlin.analysis.api.fir.KtFirAnalysisSession +import org.jetbrains.kotlin.analysis.providers.impl.forEachNonKotlinPsiElementFinder +import org.jetbrains.kotlin.fir.FirSession +import org.jetbrains.kotlin.fir.extensions.declarationGenerators +import org.jetbrains.kotlin.fir.extensions.extensionService +import org.jetbrains.kotlin.name.FqName +import org.jetbrains.kotlin.name.Name +import org.jetbrains.kotlin.platform.jvm.isJvm + +internal object DeclarationsInPackageProvider { + internal fun getTopLevelClassifierNamesInPackageProvider(packageFqName: FqName, analysisSession: KtFirAnalysisSession): Set { + return buildSet { + addAll(analysisSession.useSiteScopeDeclarationProvider.getTopLevelKotlinClassLikeDeclarationNamesInPackage(packageFqName)) + + when { + analysisSession.targetPlatform.isJvm() -> { + forEachNonKotlinPsiElementFinder(analysisSession.project) { finder -> + finder.findPackage(packageFqName.asString()) + ?.getClasses(analysisSession.useSiteAnalysisScope) + ?.mapNotNullTo(this) { it.name?.let(Name::identifier) } + } + } + } + + addAll(collectGeneratedTopLevelClassifiers(packageFqName, analysisSession.useSiteSession)) + } + } + + internal fun getTopLevelCallableNamesInPackageProvider(packageFqName: FqName, analysisSession: KtFirAnalysisSession): Set { + return buildSet { + addAll(analysisSession.useSiteScopeDeclarationProvider.getTopLevelCallableNamesInPackage(packageFqName)) + addAll(collectGeneratedTopLevelCallables(packageFqName, analysisSession.useSiteSession)) + } + } + + + private fun collectGeneratedTopLevelClassifiers(packageFqName: FqName, session: FirSession): Set { + val declarationGenerators = session.extensionService.declarationGenerators + + val generatedTopLevelClassifiers = declarationGenerators + .asSequence() + .flatMap { + // FIXME this function should be called only once during plugin's lifetime, so this usage is not really correct (2) + it.getTopLevelClassIds() + } + .filter { it.packageFqName == packageFqName } + .map { it.shortClassName } + + return generatedTopLevelClassifiers.toSet() + } + + private fun collectGeneratedTopLevelCallables(packageFqName: FqName, session: FirSession): Set { + val generators = session.extensionService.declarationGenerators + + val generatedTopLevelDeclarations = generators + .asSequence() + .flatMap { + // FIXME this function should be called only once during plugin's lifetime, so this usage is not really correct (1) + it.getTopLevelCallableIds() + } + .filter { it.packageName == packageFqName } + .map { it.callableName } + + return generatedTopLevelDeclarations.toSet() + } +} \ No newline at end of file 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 4da668b0043..522e8ec6acd 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 @@ -14,14 +14,9 @@ import org.jetbrains.kotlin.analysis.api.symbols.KtCallableSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtClassifierSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtConstructorSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtPackageSymbol -import org.jetbrains.kotlin.analysis.providers.impl.forEachNonKotlinPsiElementFinder -import org.jetbrains.kotlin.fir.extensions.FirExtensionService -import org.jetbrains.kotlin.fir.extensions.declarationGenerators -import org.jetbrains.kotlin.fir.extensions.extensionService import org.jetbrains.kotlin.fir.scopes.impl.FirPackageMemberScope import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name -import org.jetbrains.kotlin.platform.jvm.isJvm internal class KtFirPackageScope( private val fqName: FqName, @@ -33,62 +28,12 @@ internal class KtFirPackageScope( FirPackageMemberScope(fqName, analysisSession.useSiteSession) } - private val firExtensionService: FirExtensionService - get() = firScope.session.extensionService - override fun getPossibleCallableNames(): Set = withValidityAssertion { - hashSetOf().apply { - addAll(analysisSession.useSiteScopeDeclarationProvider.getTopLevelCallableNamesInPackage(fqName)) - addAll(collectGeneratedTopLevelCallables()) - } + DeclarationsInPackageProvider.getTopLevelCallableNamesInPackageProvider(fqName, analysisSession) } override fun getPossibleClassifierNames(): Set = withValidityAssertion { - hashSetOf().apply { - addAll(analysisSession.useSiteScopeDeclarationProvider.getTopLevelKotlinClassLikeDeclarationNamesInPackage(fqName)) - - when { - analysisSession.targetPlatform.isJvm() -> { - forEachNonKotlinPsiElementFinder(analysisSession.project) { finder -> - finder.findPackage(fqName.asString()) - ?.getClasses(analysisSession.useSiteAnalysisScope) - ?.mapNotNullTo(this) { it.name?.let(Name::identifier) } - } - } - } - - addAll(collectGeneratedTopLevelClassifiers()) - } - } - - private fun collectGeneratedTopLevelCallables(): Set { - val generators = firExtensionService.declarationGenerators - - val generatedTopLevelDeclarations = generators - .asSequence() - .flatMap { - // FIXME this function should be called only once during plugin's lifetime, so this usage is not really correct (1) - it.getTopLevelCallableIds() - } - .filter { it.packageName == fqName } - .map { it.callableName } - - return generatedTopLevelDeclarations.toSet() - } - - private fun collectGeneratedTopLevelClassifiers(): Set { - val declarationGenerators = firExtensionService.declarationGenerators - - val generatedTopLevelClassifiers = declarationGenerators - .asSequence() - .flatMap { - // FIXME this function should be called only once during plugin's lifetime, so this usage is not really correct (2) - it.getTopLevelClassIds() - } - .filter { it.packageFqName == fqName } - .map { it.shortClassName } - - return generatedTopLevelClassifiers.toSet() + DeclarationsInPackageProvider.getTopLevelClassifierNamesInPackageProvider(fqName, analysisSession) } override fun getCallableSymbols(nameFilter: KtScopeNameFilter): Sequence = withValidityAssertion {