[FIR] Replace inheritance with delegation for FirProvider and FirSymbolProvider
This commit is contained in:
+1
-1
@@ -748,7 +748,7 @@ class Fir2IrDeclarationStorage(
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun getFirClassByFqName(classId: ClassId): FirClass<*>? {
|
private fun getFirClassByFqName(classId: ClassId): FirClass<*>? {
|
||||||
val declaration = firProvider.getClassLikeSymbolByFqName(classId) ?: firSymbolProvider.getClassLikeSymbolByFqName(classId)
|
val declaration = firSymbolProvider.getClassLikeSymbolByFqName(classId)
|
||||||
return declaration?.fir as? FirClass<*>
|
return declaration?.fir as? FirClass<*>
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -43,12 +43,12 @@ class FirJavaElementFinder(
|
|||||||
private val firProvider = session.firProvider
|
private val firProvider = session.firProvider
|
||||||
|
|
||||||
override fun findPackage(qualifiedName: String): PsiPackage? {
|
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)
|
return PsiPackageImpl(psiManager, qualifiedName)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getClasses(psiPackage: PsiPackage, scope: GlobalSearchScope): Array<PsiClass> {
|
override fun getClasses(psiPackage: PsiPackage, scope: GlobalSearchScope): Array<PsiClass> {
|
||||||
return firProvider
|
return firProvider.symbolProvider
|
||||||
.getClassNamesInPackage(FqName(psiPackage.qualifiedName))
|
.getClassNamesInPackage(FqName(psiPackage.qualifiedName))
|
||||||
.mapNotNull { findClass(psiPackage.qualifiedName + "." + it.identifier, scope) }
|
.mapNotNull { findClass(psiPackage.qualifiedName + "." + it.identifier, scope) }
|
||||||
.toTypedArray()
|
.toTypedArray()
|
||||||
|
|||||||
@@ -49,7 +49,7 @@ class FirJavaModuleBasedSession private constructor(
|
|||||||
FirSymbolProvider::class,
|
FirSymbolProvider::class,
|
||||||
FirCompositeSymbolProvider(
|
FirCompositeSymbolProvider(
|
||||||
listOf(
|
listOf(
|
||||||
firProvider,
|
firProvider.symbolProvider,
|
||||||
JavaSymbolProvider(this, sessionProvider.project, scope),
|
JavaSymbolProvider(this, sessionProvider.project, scope),
|
||||||
dependenciesProvider ?: FirDependenciesSymbolProviderImpl(this)
|
dependenciesProvider ?: FirDependenciesSymbolProviderImpl(this)
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -5,31 +5,26 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.fir.resolve.providers
|
package org.jetbrains.kotlin.fir.resolve.providers
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.fir.FirSessionComponent
|
||||||
import org.jetbrains.kotlin.fir.declarations.*
|
import org.jetbrains.kotlin.fir.declarations.*
|
||||||
import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol
|
import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol
|
||||||
import org.jetbrains.kotlin.fir.symbols.impl.FirClassLikeSymbol
|
import org.jetbrains.kotlin.fir.symbols.impl.FirClassLikeSymbol
|
||||||
import org.jetbrains.kotlin.name.ClassId
|
import org.jetbrains.kotlin.name.ClassId
|
||||||
import org.jetbrains.kotlin.name.FqName
|
import org.jetbrains.kotlin.name.FqName
|
||||||
import org.jetbrains.kotlin.name.Name
|
|
||||||
|
|
||||||
@RequiresOptIn
|
@RequiresOptIn
|
||||||
annotation class FirProviderInternals
|
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
|
open val isPhasedFirAllowed: Boolean get() = false
|
||||||
|
|
||||||
abstract fun getFirClassifierByFqName(classId: ClassId): FirClassLikeDeclaration<*>?
|
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 getFirClassifierContainerFile(fqName: ClassId): FirFile
|
||||||
|
|
||||||
abstract fun getFirClassifierContainerFileIfAny(fqName: ClassId): FirFile?
|
abstract fun getFirClassifierContainerFileIfAny(fqName: ClassId): FirFile?
|
||||||
|
|||||||
+19
-9
@@ -12,6 +12,7 @@ import org.jetbrains.kotlin.fir.declarations.*
|
|||||||
import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticProperty
|
import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticProperty
|
||||||
import org.jetbrains.kotlin.fir.resolve.providers.FirProvider
|
import org.jetbrains.kotlin.fir.resolve.providers.FirProvider
|
||||||
import org.jetbrains.kotlin.fir.resolve.providers.FirProviderInternals
|
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.FirScope
|
||||||
import org.jetbrains.kotlin.fir.scopes.KotlinScopeProvider
|
import org.jetbrains.kotlin.fir.scopes.KotlinScopeProvider
|
||||||
import org.jetbrains.kotlin.fir.scopes.impl.nestedClassifierScope
|
import org.jetbrains.kotlin.fir.scopes.impl.nestedClassifierScope
|
||||||
@@ -23,6 +24,8 @@ import org.jetbrains.kotlin.name.FqName
|
|||||||
import org.jetbrains.kotlin.name.Name
|
import org.jetbrains.kotlin.name.Name
|
||||||
|
|
||||||
class FirProviderImpl(val session: FirSession, val kotlinScopeProvider: KotlinScopeProvider) : FirProvider() {
|
class FirProviderImpl(val session: FirSession, val kotlinScopeProvider: KotlinScopeProvider) : FirProvider() {
|
||||||
|
override val symbolProvider: FirSymbolProvider = SymbolProvider()
|
||||||
|
|
||||||
override fun getFirCallableContainerFile(symbol: FirCallableSymbol<*>): FirFile? {
|
override fun getFirCallableContainerFile(symbol: FirCallableSymbol<*>): FirFile? {
|
||||||
symbol.overriddenSymbol?.let {
|
symbol.overriddenSymbol?.let {
|
||||||
return getFirCallableContainerFile(it)
|
return getFirCallableContainerFile(it)
|
||||||
@@ -36,6 +39,19 @@ class FirProviderImpl(val session: FirSession, val kotlinScopeProvider: KotlinSc
|
|||||||
return state.callableContainerMap[symbol]
|
return state.callableContainerMap[symbol]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun getFirClassifierContainerFile(fqName: ClassId): FirFile {
|
||||||
|
return state.classifierContainerFileMap[fqName] ?: error("Couldn't find container for $fqName")
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun getFirClassifierContainerFileIfAny(fqName: ClassId): FirFile? {
|
||||||
|
return state.classifierContainerFileMap[fqName]
|
||||||
|
}
|
||||||
|
|
||||||
|
fun recordFile(file: FirFile) {
|
||||||
|
recordFile(file, state)
|
||||||
|
}
|
||||||
|
|
||||||
|
private inner class SymbolProvider : FirSymbolProvider() {
|
||||||
override fun getClassLikeSymbolByFqName(classId: ClassId): FirClassLikeSymbol<*>? {
|
override fun getClassLikeSymbolByFqName(classId: ClassId): FirClassLikeSymbol<*>? {
|
||||||
return getFirClassifierByFqName(classId)?.symbol
|
return getFirClassifierByFqName(classId)?.symbol
|
||||||
}
|
}
|
||||||
@@ -50,20 +66,14 @@ class FirProviderImpl(val session: FirSession, val kotlinScopeProvider: KotlinSc
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getFirClassifierContainerFile(fqName: ClassId): FirFile {
|
override fun getPackage(fqName: FqName): FqName? {
|
||||||
return state.classifierContainerFileMap[fqName] ?: error("Couldn't find container for $fqName")
|
if (getFirFilesByPackage(fqName).isNotEmpty()) return fqName
|
||||||
}
|
return null
|
||||||
|
|
||||||
override fun getFirClassifierContainerFileIfAny(fqName: ClassId): FirFile? {
|
|
||||||
return state.classifierContainerFileMap[fqName]
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getClassNamesInPackage(fqName: FqName): Set<Name> {
|
override fun getClassNamesInPackage(fqName: FqName): Set<Name> {
|
||||||
return state.classesInPackage[fqName] ?: emptySet()
|
return state.classesInPackage[fqName] ?: emptySet()
|
||||||
}
|
}
|
||||||
|
|
||||||
fun recordFile(file: FirFile) {
|
|
||||||
recordFile(file, state)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@FirProviderInternals
|
@FirProviderInternals
|
||||||
|
|||||||
+1
-1
@@ -82,7 +82,7 @@ internal class FirIdeJavaModuleBasedSession private constructor(
|
|||||||
FirCompositeSymbolProvider(
|
FirCompositeSymbolProvider(
|
||||||
@OptIn(ExperimentalStdlibApi::class)
|
@OptIn(ExperimentalStdlibApi::class)
|
||||||
buildList {
|
buildList {
|
||||||
add(provider)
|
add(provider.symbolProvider)
|
||||||
add(JavaSymbolProvider(this@apply, sessionProvider.project, searchScope))
|
add(JavaSymbolProvider(this@apply, sessionProvider.project, searchScope))
|
||||||
add(librariesSession.firSymbolProvider)
|
add(librariesSession.firSymbolProvider)
|
||||||
}
|
}
|
||||||
|
|||||||
+18
-13
@@ -13,6 +13,7 @@ import org.jetbrains.kotlin.fir.declarations.*
|
|||||||
import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticProperty
|
import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticProperty
|
||||||
import org.jetbrains.kotlin.fir.resolve.providers.FirProvider
|
import org.jetbrains.kotlin.fir.resolve.providers.FirProvider
|
||||||
import org.jetbrains.kotlin.fir.resolve.providers.FirProviderInternals
|
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.FirScope
|
||||||
import org.jetbrains.kotlin.fir.scopes.KotlinScopeProvider
|
import org.jetbrains.kotlin.fir.scopes.KotlinScopeProvider
|
||||||
import org.jetbrains.kotlin.fir.symbols.impl.FirAccessorSymbol
|
import org.jetbrains.kotlin.fir.symbols.impl.FirAccessorSymbol
|
||||||
@@ -38,6 +39,8 @@ internal class FirIdeProvider(
|
|||||||
val cache: ModuleFileCache,
|
val cache: ModuleFileCache,
|
||||||
searchScope: GlobalSearchScope,
|
searchScope: GlobalSearchScope,
|
||||||
) : FirProvider() {
|
) : FirProvider() {
|
||||||
|
override val symbolProvider: FirSymbolProvider = SymbolProvider()
|
||||||
|
|
||||||
private val indexHelper = IndexHelper(project, searchScope)
|
private val indexHelper = IndexHelper(project, searchScope)
|
||||||
private val packageExistenceChecker = PackageExistenceCheckerForMultipleModules(
|
private val packageExistenceChecker = PackageExistenceCheckerForMultipleModules(
|
||||||
project,
|
project,
|
||||||
@@ -56,19 +59,6 @@ internal class FirIdeProvider(
|
|||||||
override fun getFirClassifierByFqName(classId: ClassId): FirClassLikeDeclaration<*>? =
|
override fun getFirClassifierByFqName(classId: ClassId): FirClassLikeDeclaration<*>? =
|
||||||
providerHelper.getFirClassifierByFqName(classId)
|
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 {
|
override fun getFirClassifierContainerFile(fqName: ClassId): FirFile {
|
||||||
return getFirClassifierContainerFileIfAny(fqName)
|
return getFirClassifierContainerFileIfAny(fqName)
|
||||||
?: error("Couldn't find container for ${fqName}")
|
?: error("Couldn't find container for ${fqName}")
|
||||||
@@ -121,6 +111,20 @@ internal class FirIdeProvider(
|
|||||||
TODO()
|
TODO()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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
|
// TODO this should be reworked because [FirIdeProvider] should not have such method
|
||||||
// used only in completion
|
// used only in completion
|
||||||
override fun getAllCallableNamesInPackage(fqName: FqName): Set<Name> {
|
override fun getAllCallableNamesInPackage(fqName: FqName): Set<Name> {
|
||||||
@@ -129,6 +133,7 @@ internal class FirIdeProvider(
|
|||||||
indexHelper.getTopLevelFunctionsInPackage(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