[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
@@ -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()