From d5bb87cd1f272ee4142274c0e87e9cc4256e1d11 Mon Sep 17 00:00:00 2001 From: Dmitriy Novozhilov Date: Tue, 11 Aug 2020 17:22:01 +0300 Subject: [PATCH] [FIR] Replace inheritance with delegation for FirProvider and FirSymbolProvider --- .../fir/backend/Fir2IrDeclarationStorage.kt | 4 +- .../kotlin/fir/java/FirJavaElementFinder.kt | 4 +- .../fir/java/FirJavaModuleBasedSession.kt | 2 +- .../fir/resolve/providers/FirProvider.kt | 19 +++----- .../resolve/providers/impl/FirProviderImpl.kt | 46 +++++++++++-------- .../level/api/FirIdeJavaModuleBasedSession.kt | 4 +- .../low/level/api/providers/FirIdeProvider.kt | 45 ++++++++++-------- 7 files changed, 67 insertions(+), 57 deletions(-) diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrDeclarationStorage.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrDeclarationStorage.kt index 40155633e09..a48c7f1067e 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrDeclarationStorage.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrDeclarationStorage.kt @@ -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 ) } -} \ No newline at end of file +} diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/FirJavaElementFinder.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/FirJavaElementFinder.kt index a27d79e178a..ea08c906fc7 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/FirJavaElementFinder.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/FirJavaElementFinder.kt @@ -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 { - return firProvider + return firProvider.symbolProvider .getClassNamesInPackage(FqName(psiPackage.qualifiedName)) .mapNotNull { findClass(psiPackage.qualifiedName + "." + it.identifier, scope) } .toTypedArray() diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/FirJavaModuleBasedSession.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/FirJavaModuleBasedSession.kt index b3258008d2b..047309463d6 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/FirJavaModuleBasedSession.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/FirJavaModuleBasedSession.kt @@ -49,7 +49,7 @@ class FirJavaModuleBasedSession private constructor( FirSymbolProvider::class, FirCompositeSymbolProvider( listOf( - firProvider, + firProvider.symbolProvider, JavaSymbolProvider(this, sessionProvider.project, scope), dependenciesProvider ?: FirDependenciesSymbolProviderImpl(this) ) diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/providers/FirProvider.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/providers/FirProvider.kt index e1923286ed1..1375012fbd3 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/providers/FirProvider.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/providers/FirProvider.kt @@ -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> - - 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) -} \ No newline at end of file +} diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/providers/impl/FirProviderImpl.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/providers/impl/FirProviderImpl.kt index 71688e17700..3178fde423e 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/providers/impl/FirProviderImpl.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/providers/impl/FirProviderImpl.kt @@ -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> { - 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 { - 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> { + 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 { + return state.classesInPackage[fqName] ?: emptySet() + } + } + @FirProviderInternals override fun recordGeneratedClass(owner: FirAnnotatedDeclaration, klass: FirRegularClass) { klass.accept(FirRecorder, state to owner.file) diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/FirIdeJavaModuleBasedSession.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/FirIdeJavaModuleBasedSession.kt index 7404c775f73..b7f54168a99 100644 --- a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/FirIdeJavaModuleBasedSession.kt +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/FirIdeJavaModuleBasedSession.kt @@ -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( } } } -} \ No newline at end of file +} diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/providers/FirIdeProvider.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/providers/FirIdeProvider.kt index b35759076f2..65c1b677a66 100644 --- a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/providers/FirIdeProvider.kt +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/providers/FirIdeProvider.kt @@ -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> = - 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 { - return hashSetOf().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> = + 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 { + return hashSetOf().apply { + indexHelper.getTopLevelPropertiesInPackage(fqName).mapNotNullTo(this) { it.nameAsName } + indexHelper.getTopLevelFunctionsInPackage(fqName).mapNotNullTo(this) { it.nameAsName } + } } } } -internal val FirSession.firIdeProvider: FirIdeProvider by FirSession.sessionComponentAccessor() \ No newline at end of file +internal val FirSession.firIdeProvider: FirIdeProvider by FirSession.sessionComponentAccessor()