From 6797ac7cf2e0505c104f8140214f5c06013d6e93 Mon Sep 17 00:00:00 2001 From: Jinseong Jeon Date: Thu, 31 Mar 2022 10:35:50 -0700 Subject: [PATCH] AA: populate index in factory, not provider --- .../impl/KotlinStaticDeclarationProvider.kt | 169 ++++++++++-------- 1 file changed, 97 insertions(+), 72 deletions(-) diff --git a/analysis/analysis-api-providers/src/org/jetbrains/kotlin/analysis/providers/impl/KotlinStaticDeclarationProvider.kt b/analysis/analysis-api-providers/src/org/jetbrains/kotlin/analysis/providers/impl/KotlinStaticDeclarationProvider.kt index 84e89b3f89c..fe428ec6b36 100644 --- a/analysis/analysis-api-providers/src/org/jetbrains/kotlin/analysis/providers/impl/KotlinStaticDeclarationProvider.kt +++ b/analysis/analysis-api-providers/src/org/jetbrains/kotlin/analysis/providers/impl/KotlinStaticDeclarationProvider.kt @@ -16,22 +16,104 @@ import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.psi.* -public class KotlinStaticDeclarationProvider( - scope: GlobalSearchScope, - ktFiles: Collection +public class KotlinStaticDeclarationIndex { + internal val facadeFileMap: MutableMap> = mutableMapOf() + internal val classMap: MutableMap> = mutableMapOf() + internal val typeAliasMap: MutableMap> = mutableMapOf() + internal val topLevelFunctionMap: MutableMap> = mutableMapOf() + internal val topLevelPropertyMap: MutableMap> = mutableMapOf() +} + +public class KotlinStaticDeclarationProvider internal constructor( + private val index: KotlinStaticDeclarationIndex, + private val scope: GlobalSearchScope, ) : KotlinDeclarationProvider() { - private val index = Index() + private val KtElement.inScope: Boolean + get() = containingKtFile.virtualFile in scope - private class Index { - val facadeFileMap: MutableMap> = mutableMapOf() - val classMap: MutableMap> = mutableMapOf() - val typeAliasMap: MutableMap> = mutableMapOf() - val topLevelFunctionMap: MutableMap> = mutableMapOf() - val topLevelPropertyMap: MutableMap> = mutableMapOf() + override fun getClassesByClassId(classId: ClassId): Collection = + index.classMap[classId.packageFqName] + ?.filter { ktClassOrObject -> + ktClassOrObject.getClassId() == classId && ktClassOrObject.inScope + } + ?: emptyList() + + override fun getTypeAliasesByClassId(classId: ClassId): Collection = + index.typeAliasMap[classId.packageFqName] + ?.filter { ktTypeAlias -> + ktTypeAlias.getClassId() == classId && ktTypeAlias.inScope + } + ?: emptyList() + + override fun getClassNamesInPackage(packageFqName: FqName): Set = + index.classMap[packageFqName] + ?.filter { ktClassOrObject -> + ktClassOrObject.inScope + } + ?.mapNotNullTo(mutableSetOf()) { it.nameAsName } + ?: emptySet() + + override fun getTypeAliasNamesInPackage(packageFqName: FqName): Set = + index.typeAliasMap[packageFqName] + ?.filter { ktTypeAlias -> + ktTypeAlias.inScope + } + ?.mapNotNullTo(mutableSetOf()) { it.nameAsName } + ?: emptySet() + + override fun getPropertyNamesInPackage(packageFqName: FqName): Set = + index.topLevelPropertyMap[packageFqName] + ?.filter { ktProperty -> + ktProperty.inScope + } + ?.mapNotNullTo(mutableSetOf()) { it.nameAsName } + ?: emptySet() + + override fun getFunctionsNamesInPackage(packageFqName: FqName): Set = + index.topLevelFunctionMap[packageFqName] + ?.filter { ktNamedFunction -> + ktNamedFunction.inScope + } + ?.mapNotNullTo(mutableSetOf()) { it.nameAsName } + ?: emptySet() + + override fun getFacadeFilesInPackage(packageFqName: FqName): Collection = + index.facadeFileMap[packageFqName] + ?.filter { ktFile -> + ktFile.virtualFile in scope + } + ?: emptyList() + + override fun findFilesForFacade(facadeFqName: FqName): Collection { + if (facadeFqName.shortNameOrSpecial().isSpecial) return emptyList() + return getFacadeFilesInPackage(facadeFqName.parent()) //TODO Not work correctly for classes with JvmPackageName + .filter { it.javaFileFacadeFqName == facadeFqName } } - private class KtDeclarationRecorder(private val index: Index) : KtVisitorVoid() { + override fun getTopLevelProperties(callableId: CallableId): Collection = + index.topLevelPropertyMap[callableId.packageName] + ?.filter { ktProperty -> + ktProperty.nameAsName == callableId.callableName && ktProperty.inScope + } + ?: emptyList() + + override fun getTopLevelFunctions(callableId: CallableId): Collection = + index.topLevelFunctionMap[callableId.packageName] + ?.filter { ktNamedFunction -> + ktNamedFunction.nameAsName == callableId.callableName && ktNamedFunction.inScope + } + ?: emptyList() + +} + +public class KotlinStaticDeclarationProviderFactory( + files: Collection +) : KotlinDeclarationProviderFactory() { + + private val index = KotlinStaticDeclarationIndex() + + private class KtDeclarationRecorder(private val index: KotlinStaticDeclarationIndex) : KtVisitorVoid() { override fun visitElement(element: PsiElement) { element.acceptChildren(this) @@ -87,69 +169,12 @@ public class KotlinStaticDeclarationProvider( init { val recorder = KtDeclarationRecorder(index) - ktFiles - .filter { - scope.contains(it.virtualFile) - } - .forEach { - it.accept(recorder) - } + files.forEach { + it.accept(recorder) + } } - override fun getClassesByClassId(classId: ClassId): Collection = - index.classMap[classId.packageFqName] - ?.filter { it.getClassId() == classId } - ?: emptyList() - - override fun getTypeAliasesByClassId(classId: ClassId): Collection = - index.typeAliasMap[classId.packageFqName] - ?.filter { it.getClassId() == classId } - ?: emptyList() - - override fun getClassNamesInPackage(packageFqName: FqName): Set = - index.classMap[packageFqName] - ?.mapNotNullTo(mutableSetOf()) { it.nameAsName } - ?: emptySet() - - override fun getTypeAliasNamesInPackage(packageFqName: FqName): Set = - index.typeAliasMap[packageFqName] - ?.mapNotNullTo(mutableSetOf()) { it.nameAsName } - ?: emptySet() - - override fun getPropertyNamesInPackage(packageFqName: FqName): Set = - index.topLevelPropertyMap[packageFqName] - ?.mapNotNullTo(mutableSetOf()) { it.nameAsName } - ?: emptySet() - - override fun getFunctionsNamesInPackage(packageFqName: FqName): Set = - index.topLevelFunctionMap[packageFqName] - ?.mapNotNullTo(mutableSetOf()) { it.nameAsName } - ?: emptySet() - - override fun getFacadeFilesInPackage(packageFqName: FqName): Collection = - index.facadeFileMap[packageFqName] - ?: emptyList() - - override fun findFilesForFacade(facadeFqName: FqName): Collection { - if (facadeFqName.shortNameOrSpecial().isSpecial) return emptyList() - return getFacadeFilesInPackage(facadeFqName.parent()) //TODO Not work correctly for classes with JvmPackageName - .filter { it.javaFileFacadeFqName == facadeFqName } - } - - override fun getTopLevelProperties(callableId: CallableId): Collection = - index.topLevelPropertyMap[callableId.packageName] - ?.filter { it.nameAsName == callableId.callableName } - ?: emptyList() - - override fun getTopLevelFunctions(callableId: CallableId): Collection = - index.topLevelFunctionMap[callableId.packageName] - ?.filter { it.nameAsName == callableId.callableName } - ?: emptyList() - -} - -public class KotlinStaticDeclarationProviderFactory(private val files: Collection) : KotlinDeclarationProviderFactory() { override fun createDeclarationProvider(searchScope: GlobalSearchScope): KotlinDeclarationProvider { - return KotlinStaticDeclarationProvider(searchScope, files) + return KotlinStaticDeclarationProvider(index, searchScope) } }