[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<*>? { 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?
@@ -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
@@ -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)
} }
@@ -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()