[FIR] Replace inheritance with delegation for FirProvider and FirSymbolProvider

This commit is contained in:
Dmitriy Novozhilov
2020-08-11 17:22:01 +03:00
parent ad9e41b828
commit d5bb87cd1f
7 changed files with 67 additions and 57 deletions
@@ -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)
}
}
@@ -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)
@@ -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(
}
}
}
}
}
@@ -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()