[FIR] Replace inheritance with delegation for FirProvider and FirSymbolProvider
This commit is contained in:
+2
-2
@@ -748,7 +748,7 @@ class Fir2IrDeclarationStorage(
|
||||
}
|
||||
|
||||
private fun getFirClassByFqName(classId: ClassId): FirClass<*>? {
|
||||
val declaration = firProvider.getClassLikeSymbolByFqName(classId) ?: firSymbolProvider.getClassLikeSymbolByFqName(classId)
|
||||
val declaration = firSymbolProvider.getClassLikeSymbolByFqName(classId)
|
||||
return declaration?.fir as? FirClass<*>
|
||||
}
|
||||
|
||||
@@ -1063,4 +1063,4 @@ class Fir2IrDeclarationStorage(
|
||||
Name.identifier("valueOf") to IrSyntheticBodyKind.ENUM_VALUEOF
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -43,12 +43,12 @@ class FirJavaElementFinder(
|
||||
private val firProvider = session.firProvider
|
||||
|
||||
override fun findPackage(qualifiedName: String): PsiPackage? {
|
||||
if (firProvider.getClassNamesInPackage(FqName(qualifiedName)).isEmpty()) return null
|
||||
if (firProvider.symbolProvider.getClassNamesInPackage(FqName(qualifiedName)).isEmpty()) return null
|
||||
return PsiPackageImpl(psiManager, qualifiedName)
|
||||
}
|
||||
|
||||
override fun getClasses(psiPackage: PsiPackage, scope: GlobalSearchScope): Array<PsiClass> {
|
||||
return firProvider
|
||||
return firProvider.symbolProvider
|
||||
.getClassNamesInPackage(FqName(psiPackage.qualifiedName))
|
||||
.mapNotNull { findClass(psiPackage.qualifiedName + "." + it.identifier, scope) }
|
||||
.toTypedArray()
|
||||
|
||||
@@ -49,7 +49,7 @@ class FirJavaModuleBasedSession private constructor(
|
||||
FirSymbolProvider::class,
|
||||
FirCompositeSymbolProvider(
|
||||
listOf(
|
||||
firProvider,
|
||||
firProvider.symbolProvider,
|
||||
JavaSymbolProvider(this, sessionProvider.project, scope),
|
||||
dependenciesProvider ?: FirDependenciesSymbolProviderImpl(this)
|
||||
)
|
||||
|
||||
@@ -5,31 +5,26 @@
|
||||
|
||||
package org.jetbrains.kotlin.fir.resolve.providers
|
||||
|
||||
import org.jetbrains.kotlin.fir.FirSessionComponent
|
||||
import org.jetbrains.kotlin.fir.declarations.*
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirClassLikeSymbol
|
||||
import org.jetbrains.kotlin.name.ClassId
|
||||
import org.jetbrains.kotlin.name.FqName
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
|
||||
@RequiresOptIn
|
||||
annotation class FirProviderInternals
|
||||
|
||||
abstract class FirProvider : FirSymbolProvider() {
|
||||
abstract class FirProvider : FirSessionComponent {
|
||||
/**
|
||||
* [symbolProvider] for [FirProvider] may provide only symbols from sources of current module
|
||||
*/
|
||||
abstract val symbolProvider: FirSymbolProvider
|
||||
|
||||
open val isPhasedFirAllowed: Boolean get() = false
|
||||
|
||||
abstract fun getFirClassifierByFqName(classId: ClassId): FirClassLikeDeclaration<*>?
|
||||
|
||||
abstract override fun getClassLikeSymbolByFqName(classId: ClassId): FirClassLikeSymbol<*>?
|
||||
|
||||
abstract override fun getTopLevelCallableSymbols(packageFqName: FqName, name: Name): List<FirCallableSymbol<*>>
|
||||
|
||||
override fun getPackage(fqName: FqName): FqName? {
|
||||
if (getFirFilesByPackage(fqName).isNotEmpty()) return fqName
|
||||
return null
|
||||
}
|
||||
|
||||
abstract fun getFirClassifierContainerFile(fqName: ClassId): FirFile
|
||||
|
||||
abstract fun getFirClassifierContainerFileIfAny(fqName: ClassId): FirFile?
|
||||
@@ -49,4 +44,4 @@ abstract class FirProvider : FirSymbolProvider() {
|
||||
|
||||
@FirProviderInternals
|
||||
abstract fun recordGeneratedMember(owner: FirAnnotatedDeclaration, klass: FirDeclaration)
|
||||
}
|
||||
}
|
||||
|
||||
+28
-18
@@ -12,6 +12,7 @@ import org.jetbrains.kotlin.fir.declarations.*
|
||||
import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticProperty
|
||||
import org.jetbrains.kotlin.fir.resolve.providers.FirProvider
|
||||
import org.jetbrains.kotlin.fir.resolve.providers.FirProviderInternals
|
||||
import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProvider
|
||||
import org.jetbrains.kotlin.fir.scopes.FirScope
|
||||
import org.jetbrains.kotlin.fir.scopes.KotlinScopeProvider
|
||||
import org.jetbrains.kotlin.fir.scopes.impl.nestedClassifierScope
|
||||
@@ -23,6 +24,8 @@ import org.jetbrains.kotlin.name.FqName
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
|
||||
class FirProviderImpl(val session: FirSession, val kotlinScopeProvider: KotlinScopeProvider) : FirProvider() {
|
||||
override val symbolProvider: FirSymbolProvider = SymbolProvider()
|
||||
|
||||
override fun getFirCallableContainerFile(symbol: FirCallableSymbol<*>): FirFile? {
|
||||
symbol.overriddenSymbol?.let {
|
||||
return getFirCallableContainerFile(it)
|
||||
@@ -36,20 +39,6 @@ class FirProviderImpl(val session: FirSession, val kotlinScopeProvider: KotlinSc
|
||||
return state.callableContainerMap[symbol]
|
||||
}
|
||||
|
||||
override fun getClassLikeSymbolByFqName(classId: ClassId): FirClassLikeSymbol<*>? {
|
||||
return getFirClassifierByFqName(classId)?.symbol
|
||||
}
|
||||
|
||||
override fun getTopLevelCallableSymbols(packageFqName: FqName, name: Name): List<FirCallableSymbol<*>> {
|
||||
return (state.callableMap[CallableId(packageFqName, null, name)] ?: emptyList())
|
||||
}
|
||||
|
||||
override fun getNestedClassifierScope(classId: ClassId): FirScope? {
|
||||
return (getFirClassifierByFqName(classId) as? FirRegularClass)?.let {
|
||||
nestedClassifierScope(it)
|
||||
}
|
||||
}
|
||||
|
||||
override fun getFirClassifierContainerFile(fqName: ClassId): FirFile {
|
||||
return state.classifierContainerFileMap[fqName] ?: error("Couldn't find container for $fqName")
|
||||
}
|
||||
@@ -58,14 +47,35 @@ class FirProviderImpl(val session: FirSession, val kotlinScopeProvider: KotlinSc
|
||||
return state.classifierContainerFileMap[fqName]
|
||||
}
|
||||
|
||||
override fun getClassNamesInPackage(fqName: FqName): Set<Name> {
|
||||
return state.classesInPackage[fqName] ?: emptySet()
|
||||
}
|
||||
|
||||
fun recordFile(file: FirFile) {
|
||||
recordFile(file, state)
|
||||
}
|
||||
|
||||
private inner class SymbolProvider : FirSymbolProvider() {
|
||||
override fun getClassLikeSymbolByFqName(classId: ClassId): FirClassLikeSymbol<*>? {
|
||||
return getFirClassifierByFqName(classId)?.symbol
|
||||
}
|
||||
|
||||
override fun getTopLevelCallableSymbols(packageFqName: FqName, name: Name): List<FirCallableSymbol<*>> {
|
||||
return (state.callableMap[CallableId(packageFqName, null, name)] ?: emptyList())
|
||||
}
|
||||
|
||||
override fun getNestedClassifierScope(classId: ClassId): FirScope? {
|
||||
return (getFirClassifierByFqName(classId) as? FirRegularClass)?.let {
|
||||
nestedClassifierScope(it)
|
||||
}
|
||||
}
|
||||
|
||||
override fun getPackage(fqName: FqName): FqName? {
|
||||
if (getFirFilesByPackage(fqName).isNotEmpty()) return fqName
|
||||
return null
|
||||
}
|
||||
|
||||
override fun getClassNamesInPackage(fqName: FqName): Set<Name> {
|
||||
return state.classesInPackage[fqName] ?: emptySet()
|
||||
}
|
||||
}
|
||||
|
||||
@FirProviderInternals
|
||||
override fun recordGeneratedClass(owner: FirAnnotatedDeclaration, klass: FirRegularClass) {
|
||||
klass.accept(FirRecorder, state to owner.file)
|
||||
|
||||
+2
-2
@@ -82,7 +82,7 @@ internal class FirIdeJavaModuleBasedSession private constructor(
|
||||
FirCompositeSymbolProvider(
|
||||
@OptIn(ExperimentalStdlibApi::class)
|
||||
buildList {
|
||||
add(provider)
|
||||
add(provider.symbolProvider)
|
||||
add(JavaSymbolProvider(this@apply, sessionProvider.project, searchScope))
|
||||
add(librariesSession.firSymbolProvider)
|
||||
}
|
||||
@@ -93,4 +93,4 @@ internal class FirIdeJavaModuleBasedSession private constructor(
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+25
-20
@@ -13,6 +13,7 @@ import org.jetbrains.kotlin.fir.declarations.*
|
||||
import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticProperty
|
||||
import org.jetbrains.kotlin.fir.resolve.providers.FirProvider
|
||||
import org.jetbrains.kotlin.fir.resolve.providers.FirProviderInternals
|
||||
import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProvider
|
||||
import org.jetbrains.kotlin.fir.scopes.FirScope
|
||||
import org.jetbrains.kotlin.fir.scopes.KotlinScopeProvider
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirAccessorSymbol
|
||||
@@ -38,6 +39,8 @@ internal class FirIdeProvider(
|
||||
val cache: ModuleFileCache,
|
||||
searchScope: GlobalSearchScope,
|
||||
) : FirProvider() {
|
||||
override val symbolProvider: FirSymbolProvider = SymbolProvider()
|
||||
|
||||
private val indexHelper = IndexHelper(project, searchScope)
|
||||
private val packageExistenceChecker = PackageExistenceCheckerForMultipleModules(
|
||||
project,
|
||||
@@ -56,19 +59,6 @@ internal class FirIdeProvider(
|
||||
override fun getFirClassifierByFqName(classId: ClassId): FirClassLikeDeclaration<*>? =
|
||||
providerHelper.getFirClassifierByFqName(classId)
|
||||
|
||||
override fun getTopLevelCallableSymbols(packageFqName: FqName, name: Name): List<FirCallableSymbol<*>> =
|
||||
providerHelper.getTopLevelCallableSymbols(packageFqName, name)
|
||||
|
||||
override fun getPackage(fqName: FqName): FqName? =
|
||||
providerHelper.getPackage(fqName)
|
||||
|
||||
override fun getNestedClassifierScope(classId: ClassId): FirScope? =
|
||||
providerHelper.getNestedClassifierScope(classId)
|
||||
|
||||
override fun getClassLikeSymbolByFqName(classId: ClassId): FirClassLikeSymbol<*>? {
|
||||
return getFirClassifierByFqName(classId)?.symbol
|
||||
}
|
||||
|
||||
override fun getFirClassifierContainerFile(fqName: ClassId): FirFile {
|
||||
return getFirClassifierContainerFileIfAny(fqName)
|
||||
?: error("Couldn't find container for ${fqName}")
|
||||
@@ -121,14 +111,29 @@ internal class FirIdeProvider(
|
||||
TODO()
|
||||
}
|
||||
|
||||
// TODO this should be reworked because [FirIdeProvider] should not have such method
|
||||
// used only in completion
|
||||
override fun getAllCallableNamesInPackage(fqName: FqName): Set<Name> {
|
||||
return hashSetOf<Name>().apply {
|
||||
indexHelper.getTopLevelPropertiesInPackage(fqName).mapNotNullTo(this) { it.nameAsName }
|
||||
indexHelper.getTopLevelFunctionsInPackage(fqName).mapNotNullTo(this) { it.nameAsName }
|
||||
private inner class SymbolProvider : FirSymbolProvider() {
|
||||
override fun getTopLevelCallableSymbols(packageFqName: FqName, name: Name): List<FirCallableSymbol<*>> =
|
||||
providerHelper.getTopLevelCallableSymbols(packageFqName, name)
|
||||
|
||||
override fun getPackage(fqName: FqName): FqName? =
|
||||
providerHelper.getPackage(fqName)
|
||||
|
||||
override fun getNestedClassifierScope(classId: ClassId): FirScope? =
|
||||
providerHelper.getNestedClassifierScope(classId)
|
||||
|
||||
override fun getClassLikeSymbolByFqName(classId: ClassId): FirClassLikeSymbol<*>? {
|
||||
return getFirClassifierByFqName(classId)?.symbol
|
||||
}
|
||||
|
||||
// TODO this should be reworked because [FirIdeProvider] should not have such method
|
||||
// used only in completion
|
||||
override fun getAllCallableNamesInPackage(fqName: FqName): Set<Name> {
|
||||
return hashSetOf<Name>().apply {
|
||||
indexHelper.getTopLevelPropertiesInPackage(fqName).mapNotNullTo(this) { it.nameAsName }
|
||||
indexHelper.getTopLevelFunctionsInPackage(fqName).mapNotNullTo(this) { it.nameAsName }
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
internal val FirSession.firIdeProvider: FirIdeProvider by FirSession.sessionComponentAccessor()
|
||||
internal val FirSession.firIdeProvider: FirIdeProvider by FirSession.sessionComponentAccessor()
|
||||
|
||||
Reference in New Issue
Block a user