[Analysis API] simplify KotlinDeclarationProvider interface

This commit is contained in:
Ilya Kirillov
2022-07-25 22:24:35 +02:00
parent 8c70a4d51d
commit 8be019d9bf
8 changed files with 41 additions and 64 deletions
@@ -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) }
@@ -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)
@@ -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<Name> = withValidityAssertion {
hashSetOf<Name>().apply {
addAll(declarationsProvider.getFunctionsNamesInPackage(fqName))
addAll(declarationsProvider.getPropertyNamesInPackage(fqName))
addAll(declarationProvider.getTopLevelCallableNamesInPackage(fqName))
addAll(collectGeneratedTopLevelCallables())
}
}
override fun getPossibleClassifierNames(): Set<Name> = withValidityAssertion {
hashSetOf<Name>().apply {
addAll(declarationsProvider.getClassNamesInPackage(fqName))
addAll(declarationsProvider.getTypeAliasNamesInPackage(fqName))
addAll(declarationProvider.getTopLevelKotlinClassLikeDeclarationNamesInPackage(fqName))
JavaPsiFacade.getInstance(project)
.findPackage(fqName.asString())
@@ -51,8 +51,7 @@ internal class KtFirStarImportingScope(
override fun getPossibleCallableNames(): Set<Name> = 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<Name> = 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()