[Analysis API] refactoring, extract top level name collecting to a separate file

out of KtFirPackageScope
This commit is contained in:
Ilya Kirillov
2023-05-15 16:13:22 +02:00
committed by Space Team
parent 51c04b624f
commit 50c49838ba
2 changed files with 75 additions and 57 deletions
@@ -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<Name> {
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<Name> {
return buildSet {
addAll(analysisSession.useSiteScopeDeclarationProvider.getTopLevelCallableNamesInPackage(packageFqName))
addAll(collectGeneratedTopLevelCallables(packageFqName, analysisSession.useSiteSession))
}
}
private fun collectGeneratedTopLevelClassifiers(packageFqName: FqName, session: FirSession): Set<Name> {
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<Name> {
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()
}
}
@@ -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<Name> = withValidityAssertion {
hashSetOf<Name>().apply {
addAll(analysisSession.useSiteScopeDeclarationProvider.getTopLevelCallableNamesInPackage(fqName))
addAll(collectGeneratedTopLevelCallables())
}
DeclarationsInPackageProvider.getTopLevelCallableNamesInPackageProvider(fqName, analysisSession)
}
override fun getPossibleClassifierNames(): Set<Name> = withValidityAssertion {
hashSetOf<Name>().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<Name> {
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<Name> {
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<KtCallableSymbol> = withValidityAssertion {