diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/IndexHelper.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/DeclarationProvider.kt similarity index 78% rename from idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/IndexHelper.kt rename to idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/DeclarationProvider.kt index c8027b89025..e97de95239a 100644 --- a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/IndexHelper.kt +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/DeclarationProvider.kt @@ -5,11 +5,9 @@ package org.jetbrains.kotlin.idea.fir.low.level.api -import com.intellij.openapi.progress.ProgressManager import com.intellij.openapi.project.Project import com.intellij.psi.PsiElement import com.intellij.psi.search.GlobalSearchScope -import com.intellij.psi.stubs.StringStubIndexExtension import com.intellij.psi.stubs.StubIndex import com.intellij.psi.stubs.StubIndexKey import org.jetbrains.kotlin.idea.stubindex.* @@ -19,10 +17,8 @@ import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.psi.* -/* -* Move to another module -*/ -internal class IndexHelper(val project: Project, private val scope: GlobalSearchScope) { + +internal class DeclarationProviderByIndexesImpl(val project: Project, private val scope: GlobalSearchScope) : DeclarationProvider() { private val stubIndex: StubIndex = StubIndex.getInstance() private inline fun firstMatchingOrNull( @@ -43,12 +39,12 @@ internal class IndexHelper(val project: Project, private val scope: GlobalSearch return result } - fun classFromIndexByClassId(classId: ClassId) = firstMatchingOrNull( + override fun getClassByClassId(classId: ClassId) = firstMatchingOrNull( KotlinFullClassNameIndex.KEY, classId.asStringForIndexes(), ) { candidate -> candidate.containingKtFile.packageFqName == classId.packageFqName } - fun typeAliasFromIndexByClassId(classId: ClassId): KtTypeAlias? = firstMatchingOrNull( + override fun getTypeAliasByClassId(classId: ClassId): KtTypeAlias? = firstMatchingOrNull( KotlinTopLevelTypeAliasFqNameIndex.KEY, key = classId.asStringForIndexes(), ) { candidate -> candidate.containingKtFile.packageFqName == classId.packageFqName } @@ -57,15 +53,14 @@ internal class IndexHelper(val project: Project, private val scope: GlobalSearch key = classId.asString(), ) - - fun getTopLevelProperties(callableId: CallableId): Collection = + override fun getTopLevelProperties(callableId: CallableId): Collection = KotlinTopLevelPropertyFqnNameIndex.getInstance()[callableId.asStringForIndexes(), project, scope] - fun getTopLevelFunctions(callableId: CallableId): Collection = + override fun getTopLevelFunctions(callableId: CallableId): Collection = KotlinTopLevelFunctionFqnNameIndex.getInstance()[callableId.asStringForIndexes(), project, scope] - fun getClassNamesInPackage(packageFqName: FqName): Set = + override fun getClassNamesInPackage(packageFqName: FqName): Set = KotlinTopLevelClassByPackageIndex.getInstance() .get(packageFqName.asStringForIndexes(), project, scope) .mapNotNullTo(hashSetOf()) { it.nameAsName } @@ -80,7 +75,5 @@ internal class IndexHelper(val project: Project, private val scope: GlobalSearch private fun ClassId.asStringForIndexes(): String = asSingleFqName().asStringForIndexes() - - private fun getShortName(fqName: String) = Name.identifier(fqName.substringAfterLast('.')) } } diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/DeclarationProviderBase.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/DeclarationProviderBase.kt new file mode 100644 index 00000000000..510ad6cad61 --- /dev/null +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/DeclarationProviderBase.kt @@ -0,0 +1,27 @@ +/* + * Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.idea.fir.low.level.api + +import org.jetbrains.kotlin.name.CallableId +import org.jetbrains.kotlin.name.ClassId +import org.jetbrains.kotlin.name.FqName +import org.jetbrains.kotlin.name.Name +import org.jetbrains.kotlin.psi.KtClassOrObject +import org.jetbrains.kotlin.psi.KtNamedFunction +import org.jetbrains.kotlin.psi.KtProperty +import org.jetbrains.kotlin.psi.KtTypeAlias + +abstract class DeclarationProvider { + abstract fun getClassByClassId(classId: ClassId): KtClassOrObject? + + abstract fun getTypeAliasByClassId(classId: ClassId): KtTypeAlias? + + abstract fun getTopLevelProperties(callableId: CallableId): Collection + + abstract fun getTopLevelFunctions(callableId: CallableId): Collection + + abstract fun getClassNamesInPackage(packageFqName: FqName): Set +} \ 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/FirModuleResolveStateConfigurator.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/FirModuleResolveStateConfigurator.kt new file mode 100644 index 00000000000..0b9b435a501 --- /dev/null +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/FirModuleResolveStateConfigurator.kt @@ -0,0 +1,7 @@ +/* + * Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.idea.fir.low.level.api + diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/FirModuleResolveStateConfiguratorIdeImpl.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/FirModuleResolveStateConfiguratorIdeImpl.kt new file mode 100644 index 00000000000..0b9b435a501 --- /dev/null +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/FirModuleResolveStateConfiguratorIdeImpl.kt @@ -0,0 +1,7 @@ +/* + * Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.idea.fir.low.level.api + diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/api/FirModuleResolveStateConfigurator.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/api/FirModuleResolveStateConfigurator.kt new file mode 100644 index 00000000000..7807348d0ea --- /dev/null +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/api/FirModuleResolveStateConfigurator.kt @@ -0,0 +1,13 @@ +/* + * Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.idea.fir.low.level.api.api + +import com.intellij.psi.search.GlobalSearchScope +import org.jetbrains.kotlin.idea.fir.low.level.api.DeclarationProvider + +abstract class FirModuleResolveStateConfigurator { + abstract fun createDeclarationProvider(scope: GlobalSearchScope): DeclarationProvider +} \ 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/api/FirModuleResolveStateConfiguratorIdeImpl.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/api/FirModuleResolveStateConfiguratorIdeImpl.kt new file mode 100644 index 00000000000..e5b71cdf410 --- /dev/null +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/api/FirModuleResolveStateConfiguratorIdeImpl.kt @@ -0,0 +1,16 @@ +/* + * Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.idea.fir.low.level.api.api + +import com.intellij.openapi.project.Project +import com.intellij.psi.search.GlobalSearchScope +import org.jetbrains.kotlin.idea.fir.low.level.api.DeclarationProvider +import org.jetbrains.kotlin.idea.fir.low.level.api.DeclarationProviderByIndexesImpl + +class FirModuleResolveStateConfiguratorIdeImpl(private val project: Project) : FirModuleResolveStateConfigurator() { + override fun createDeclarationProvider(scope: GlobalSearchScope): DeclarationProvider = + DeclarationProviderByIndexesImpl(project, scope) +} \ 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 05ff1cc39e4..1bb04a07acd 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 @@ -7,7 +7,6 @@ package org.jetbrains.kotlin.idea.fir.low.level.api.providers import com.intellij.openapi.components.ServiceManager import com.intellij.openapi.project.Project -import com.intellij.psi.search.GlobalSearchScope import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.NoMutableState import org.jetbrains.kotlin.fir.ThreadSafeMutableState @@ -21,7 +20,7 @@ import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProviderInternals import org.jetbrains.kotlin.fir.scopes.FirKotlinScopeProvider import org.jetbrains.kotlin.fir.symbols.impl.* import org.jetbrains.kotlin.idea.caches.project.ModuleSourceInfo -import org.jetbrains.kotlin.idea.fir.low.level.api.IndexHelper +import org.jetbrains.kotlin.idea.fir.low.level.api.DeclarationProvider import org.jetbrains.kotlin.idea.fir.low.level.api.api.FirModuleResolveStateConfigurator import org.jetbrains.kotlin.idea.fir.low.level.api.file.builder.FirFileBuilder import org.jetbrains.kotlin.idea.fir.low.level.api.file.builder.ModuleFileCache @@ -37,18 +36,17 @@ internal class FirIdeProvider( val kotlinScopeProvider: FirKotlinScopeProvider, firFileBuilder: FirFileBuilder, val cache: ModuleFileCache, - searchScope: GlobalSearchScope, + private val declarationProvider: DeclarationProvider, ) : FirProvider() { override val symbolProvider: FirSymbolProvider = SymbolProvider() - private val indexHelper = IndexHelper(project, searchScope) private val packageExistenceChecker = ServiceManager.getService(project, FirModuleResolveStateConfigurator::class.java) .createPackageExistingCheckerForModule(moduleInfo) private val providerHelper = FirProviderHelper( cache, firFileBuilder, - indexHelper, + declarationProvider, packageExistenceChecker, ) @@ -103,7 +101,7 @@ internal class FirIdeProvider( } override fun getClassNamesInPackage(fqName: FqName): Set = - indexHelper.getClassNamesInPackage(fqName) + declarationProvider.getClassNamesInPackage(fqName) @NoMutableState private inner class SymbolProvider : FirSymbolProvider(session) { diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/providers/FirProviderHelper.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/providers/FirProviderHelper.kt index 7fe1b914fa1..8acbdbcd386 100644 --- a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/providers/FirProviderHelper.kt +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/providers/FirProviderHelper.kt @@ -13,7 +13,7 @@ import org.jetbrains.kotlin.name.CallableId import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol -import org.jetbrains.kotlin.idea.fir.low.level.api.IndexHelper +import org.jetbrains.kotlin.idea.fir.low.level.api.DeclarationProvider import org.jetbrains.kotlin.idea.fir.low.level.api.PackageExistenceChecker import org.jetbrains.kotlin.idea.fir.low.level.api.file.builder.FirFileBuilder import org.jetbrains.kotlin.idea.fir.low.level.api.file.builder.ModuleFileCache @@ -28,15 +28,15 @@ import java.util.* internal class FirProviderHelper( private val cache: ModuleFileCache, private val firFileBuilder: FirFileBuilder, - private val indexHelper: IndexHelper, + private val declarationProvider: DeclarationProvider, private val packageExistenceChecker: PackageExistenceChecker, ) { fun getFirClassifierByFqName(classId: ClassId): FirClassLikeDeclaration<*>? { if (classId.isLocal) return null return executeOrReturnDefaultValueOnPCE(null) { cache.classifierByClassId.computeIfAbsent(classId) { - val ktClass = when (val klass = indexHelper.classFromIndexByClassId(classId)) { - null -> indexHelper.typeAliasFromIndexByClassId(classId) + val ktClass = when (val klass = declarationProvider.getClassByClassId(classId)) { + null -> declarationProvider.getTypeAliasByClassId(classId) else -> if (klass.getClassId() == null) null else klass } ?: return@computeIfAbsent Optional.empty() val firFile = firFileBuilder.buildRawFirFileWithCaching(ktClass.containingKtFile, cache, preferLazyBodies = true) @@ -55,8 +55,8 @@ internal class FirProviderHelper( return executeOrReturnDefaultValueOnPCE(emptyList()) { cache.callableByCallableId.computeIfAbsent(callableId) { val files = Sets.newIdentityHashSet().apply { - indexHelper.getTopLevelFunctions(callableId).mapTo(this) { it.containingKtFile } - indexHelper.getTopLevelProperties(callableId).mapTo(this) { it.containingKtFile } + declarationProvider.getTopLevelFunctions(callableId).mapTo(this) { it.containingKtFile } + declarationProvider.getTopLevelProperties(callableId).mapTo(this) { it.containingKtFile } } @OptIn(ExperimentalStdlibApi::class) buildList { diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/sessions/FirIdeSessionFactory.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/sessions/FirIdeSessionFactory.kt index 13b22138584..83c84d12e48 100644 --- a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/sessions/FirIdeSessionFactory.kt +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/sessions/FirIdeSessionFactory.kt @@ -29,10 +29,10 @@ import org.jetbrains.kotlin.fir.scopes.FirKotlinScopeProvider import org.jetbrains.kotlin.fir.session.* import org.jetbrains.kotlin.idea.caches.project.* import org.jetbrains.kotlin.idea.caches.resolve.IDEPackagePartProvider +import org.jetbrains.kotlin.idea.fir.low.level.api.* import org.jetbrains.kotlin.idea.fir.low.level.api.FirPhaseRunner import org.jetbrains.kotlin.idea.fir.low.level.api.IdeFirPhaseManager -import org.jetbrains.kotlin.idea.fir.low.level.api.IdeSessionComponents -import org.jetbrains.kotlin.idea.fir.low.level.api.SealedClassInheritorsProviderIdeImpl +import org.jetbrains.kotlin.idea.fir.low.level.api.api.FirModuleResolveStateConfigurator import org.jetbrains.kotlin.idea.fir.low.level.api.file.builder.FirFileBuilder import org.jetbrains.kotlin.idea.fir.low.level.api.file.builder.ModuleFileCacheImpl import org.jetbrains.kotlin.idea.fir.low.level.api.fir.caches.FirThreadSafeCachesFactory @@ -58,6 +58,7 @@ import java.nio.file.Paths internal object FirIdeSessionFactory { fun createSourcesSession( project: Project, + configurator: FirModuleResolveStateConfigurator, moduleInfo: ModuleSourceInfo, builtinsAndCloneableSession: FirIdeBuiltinsAndCloneableSession, firPhaseRunner: FirPhaseRunner, @@ -97,7 +98,7 @@ internal object FirIdeSessionFactory { scopeProvider, firFileBuilder, cache, - searchScope + configurator.createDeclarationProvider(searchScope), ) register(FirProvider::class, provider) @@ -130,6 +131,7 @@ internal object FirIdeSessionFactory { .mapTo(this) { createSourcesSession( project, + configurator, it, builtinsAndCloneableSession, firPhaseRunner, diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/sessions/FirIdeSessionProviderStorage.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/sessions/FirIdeSessionProviderStorage.kt index dc4826dca05..0e46f3230dd 100644 --- a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/sessions/FirIdeSessionProviderStorage.kt +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/sessions/FirIdeSessionProviderStorage.kt @@ -5,6 +5,7 @@ package org.jetbrains.kotlin.idea.fir.low.level.api.sessions +import com.intellij.openapi.components.ServiceManager import com.intellij.openapi.project.Project import kotlinx.collections.immutable.PersistentMap import kotlinx.collections.immutable.persistentMapOf @@ -16,6 +17,7 @@ import org.jetbrains.kotlin.fir.moduleData import org.jetbrains.kotlin.fir.session.FirModuleInfoBasedModuleData import org.jetbrains.kotlin.idea.caches.project.LibraryModificationTracker import org.jetbrains.kotlin.idea.caches.project.ModuleSourceInfo +import org.jetbrains.kotlin.idea.fir.low.level.api.api.FirModuleResolveStateConfigurator import org.jetbrains.kotlin.idea.fir.low.level.api.FirPhaseRunner import org.jetbrains.kotlin.idea.fir.low.level.api.util.addValueFor import org.jetbrains.kotlin.idea.fir.low.level.api.util.executeWithoutPCE @@ -25,6 +27,7 @@ import java.util.concurrent.ConcurrentHashMap internal class FirIdeSessionProviderStorage(private val project: Project) { private val sessionsCache = ConcurrentHashMap() + private val configurator = ServiceManager.getService(project, FirModuleResolveStateConfigurator::class.java) private val librariesCache by cachedValue(project, LibraryModificationTracker.getInstance(project)) { LibrariesCache() } @@ -42,6 +45,7 @@ internal class FirIdeSessionProviderStorage(private val project: Project) { val session = executeWithoutPCE { FirIdeSessionFactory.createSourcesSession( project, + configurator, rootModule, builtinsAndCloneableSession, firPhaseRunner,