[LL API] Pass contextual modules to 'KotlinDeclarationProvider' factory

^KT-57559 Fixed
This commit is contained in:
Yan Zhulanow
2023-04-18 17:26:43 +09:00
committed by Space Team
parent e9c077220f
commit d3cb41cbab
8 changed files with 26 additions and 23 deletions
@@ -169,7 +169,7 @@ private constructor(
}
useSiteScopeDeclarationProvider = CompositeKotlinDeclarationProvider.create(
buildList {
add(project.createDeclarationProvider(useSiteAnalysisScope))
add(project.createDeclarationProvider(useSiteAnalysisScope, useSiteModule))
extensionTools.mapTo(this) { it.declarationProvider }
}
)
@@ -182,7 +182,6 @@ private constructor(
)
}
fun getScopeSessionFor(session: FirSession): ScopeSession = withValidityAssertion { firResolveSession.getScopeSessionFor(session) }
companion object {
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.analysis.providers
import com.intellij.openapi.project.Project
import com.intellij.psi.search.GlobalSearchScope
import org.jetbrains.kotlin.analysis.project.structure.KtModule
import org.jetbrains.kotlin.name.CallableId
import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.name.FqName
@@ -47,9 +48,10 @@ public abstract class KotlinDeclarationProvider {
}
public abstract class KotlinDeclarationProviderFactory {
public abstract fun createDeclarationProvider(searchScope: GlobalSearchScope): KotlinDeclarationProvider
public abstract fun createDeclarationProvider(scope: GlobalSearchScope, contextualModule: KtModule?): KotlinDeclarationProvider
}
public fun Project.createDeclarationProvider(searchScope: GlobalSearchScope): KotlinDeclarationProvider =
this.getService(KotlinDeclarationProviderFactory::class.java)
.createDeclarationProvider(searchScope)
public fun Project.createDeclarationProvider(scope: GlobalSearchScope, module: KtModule?): KotlinDeclarationProvider {
return getService(KotlinDeclarationProviderFactory::class.java)
.createDeclarationProvider(scope, module)
}
@@ -25,6 +25,7 @@ import org.jetbrains.annotations.TestOnly
import org.jetbrains.kotlin.analysis.decompiler.psi.KotlinBuiltInDecompiler
import org.jetbrains.kotlin.analysis.decompiler.stub.file.ClsKotlinBinaryClassCache
import org.jetbrains.kotlin.analysis.decompiler.stub.file.KotlinClsStubBuilder
import org.jetbrains.kotlin.analysis.project.structure.KtModule
import org.jetbrains.kotlin.analysis.providers.KotlinDeclarationProvider
import org.jetbrains.kotlin.analysis.providers.KotlinDeclarationProviderFactory
import org.jetbrains.kotlin.fileClasses.javaFileFacadeFqName
@@ -342,8 +343,8 @@ public class KotlinStaticDeclarationProviderFactory(
}
}
override fun createDeclarationProvider(searchScope: GlobalSearchScope): KotlinDeclarationProvider {
return KotlinStaticDeclarationProvider(index, searchScope)
override fun createDeclarationProvider(scope: GlobalSearchScope, contextualModule: KtModule?): KotlinDeclarationProvider {
return KotlinStaticDeclarationProvider(index, scope)
}
}
@@ -88,7 +88,7 @@ internal fun LLFirSourcesSession.registerCompilerPluginServices(
register(FirRegisteredPluginAnnotations::class, LLFirIdeRegisteredPluginAnnotations(this, annotationsResolver))
register(
FirPredicateBasedProvider::class,
LLFirIdePredicateBasedProvider(this, annotationsResolver, project.createDeclarationProvider(projectWithDependenciesScope))
LLFirIdePredicateBasedProvider(this, annotationsResolver, project.createDeclarationProvider(projectWithDependenciesScope, module))
)
}
@@ -9,6 +9,7 @@ import com.intellij.openapi.project.Project
import com.intellij.psi.search.GlobalSearchScope
import org.jetbrains.kotlin.analysis.low.level.api.fir.caches.NullableCaffeineCache
import org.jetbrains.kotlin.analysis.low.level.api.fir.project.structure.llFirModuleData
import org.jetbrains.kotlin.analysis.low.level.api.fir.sessions.LLFirSession
import org.jetbrains.kotlin.analysis.low.level.api.fir.util.LLFirSymbolProviderNameCacheBase
import org.jetbrains.kotlin.analysis.project.structure.KtModule
import org.jetbrains.kotlin.analysis.providers.KotlinDeclarationProvider
@@ -125,10 +126,10 @@ internal class LLFirCombinedKotlinSymbolProvider private constructor(
symbolNameCache.getTopLevelCallableNamesInPackage(packageFqName)
companion object {
fun merge(session: FirSession, project: Project, providers: List<LLFirProvider.SymbolProvider>): FirSymbolProvider? =
fun merge(session: LLFirSession, project: Project, providers: List<LLFirProvider.SymbolProvider>): FirSymbolProvider? =
if (providers.size > 1) {
val combinedScope = GlobalSearchScope.union(providers.map { it.session.llFirModuleData.ktModule.contentScope })
val declarationProvider = project.createDeclarationProvider(combinedScope)
val declarationProvider = project.createDeclarationProvider(combinedScope, session.ktModule)
LLFirCombinedKotlinSymbolProvider(session, project, providers, declarationProvider)
} else providers.singleOrNull()
}
@@ -143,7 +143,7 @@ internal class LLFirSessionCache(private val project: Project) {
val provider = LLFirProvider(
this,
components,
project.createDeclarationProvider(contentScope),
project.createDeclarationProvider(contentScope, module),
project.createPackageProvider(contentScope),
/* Source modules can contain `kotlin` package only if `-Xallow-kotlin-package` is specified, this is handled in LLFirProvider */
canContainKotlinPackage = false,
@@ -230,7 +230,7 @@ internal class LLFirSessionCache(private val project: Project) {
val provider = LLFirProvider(
this,
components,
project.createDeclarationProvider(contentScope),
project.createDeclarationProvider(contentScope, module),
project.createPackageProvider(contentScope),
canContainKotlinPackage = true,
)
@@ -535,7 +535,7 @@ internal class LLFirSessionCache(private val project: Project) {
* create a combined symbol provider.
*/
private fun List<FirSymbolProvider>.mergeDependencySymbolProvidersInto(
session: FirSession,
session: LLFirSession,
destination: MutableList<FirSymbolProvider>,
) {
SymbolProviderMerger(this, destination).apply {
@@ -50,7 +50,7 @@ internal open class JvmStubBasedFirDeserializedSymbolProvider(
scope: GlobalSearchScope,
private val initialOrigin: FirDeclarationOrigin
) : FirSymbolProvider(session) {
private val declarationProvider by lazy(LazyThreadSafetyMode.PUBLICATION) { project.createDeclarationProvider(scope) }
private val declarationProvider by lazy(LazyThreadSafetyMode.PUBLICATION) { project.createDeclarationProvider(scope, module = null) }
private val moduleData = moduleDataProvider.getModuleData(null)
private val packageSetWithTopLevelCallableDeclarations: Set<String> by lazy(LazyThreadSafetyMode.PUBLICATION) {
declarationProvider.computePackageSetWithTopLevelCallableDeclarations()
@@ -40,25 +40,25 @@ class SymbolKotlinAsJavaSupport(project: Project) : KotlinAsJavaSupportBase<KtMo
override fun findClassOrObjectDeclarationsInPackage(
packageFqName: FqName,
searchScope: GlobalSearchScope
): Collection<KtClassOrObject> = project.createDeclarationProvider(searchScope).run {
): Collection<KtClassOrObject> = project.createDeclarationProvider(searchScope, module = null).run {
getTopLevelKotlinClassLikeDeclarationNamesInPackage(packageFqName).flatMap {
getAllClassesByClassId(ClassId.topLevel(packageFqName.child(it)))
}
}
override fun findFilesForPackage(packageFqName: FqName, searchScope: GlobalSearchScope): Collection<KtFile> = buildSet {
addAll(project.createDeclarationProvider(searchScope).findFilesForFacadeByPackage(packageFqName))
addAll(project.createDeclarationProvider(searchScope, module = null).findFilesForFacadeByPackage(packageFqName))
findClassOrObjectDeclarationsInPackage(packageFqName, searchScope).mapTo(this) {
it.containingKtFile
}
}
override fun findFilesForFacadeByPackage(packageFqName: FqName, searchScope: GlobalSearchScope): Collection<KtFile> {
return project.createDeclarationProvider(searchScope).findFilesForFacadeByPackage(packageFqName)
return project.createDeclarationProvider(searchScope, module = null).findFilesForFacadeByPackage(packageFqName)
}
override fun findFilesForScript(scriptFqName: FqName, searchScope: GlobalSearchScope): Collection<KtScript> {
return project.createDeclarationProvider(searchScope).findFilesForScript(scriptFqName)
return project.createDeclarationProvider(searchScope, module = null).findFilesForScript(scriptFqName)
}
private fun FqName.toClassIdSequence(): Sequence<ClassId> {
@@ -80,9 +80,9 @@ class SymbolKotlinAsJavaSupport(project: Project) : KotlinAsJavaSupportBase<KtMo
override fun findClassOrObjectDeclarations(fqName: FqName, searchScope: GlobalSearchScope): Collection<KtClassOrObject> =
fqName.toClassIdSequence().flatMap {
project.createDeclarationProvider(searchScope).getAllClassesByClassId(it)
project.createDeclarationProvider(searchScope, module = null).getAllClassesByClassId(it)
}
.filter { it.isFromSourceOrLibraryBinary(project) }
.filter { it.isFromSourceOrLibraryBinary() }
.toSet()
override fun packageExists(fqName: FqName, scope: GlobalSearchScope): Boolean =
@@ -146,7 +146,7 @@ class SymbolKotlinAsJavaSupport(project: Project) : KotlinAsJavaSupportBase<KtMo
override fun facadeIsApplicable(module: KtModule, file: KtFile): Boolean = module.isFromSourceOrLibraryBinary()
override fun getKotlinInternalClasses(fqName: FqName, scope: GlobalSearchScope): Collection<PsiClass> {
val facadeKtFiles = project.createDeclarationProvider(scope).findInternalFilesForFacade(fqName)
val facadeKtFiles = project.createDeclarationProvider(scope, null).findInternalFilesForFacade(fqName)
if (facadeKtFiles.isEmpty()) return emptyList()
val partShortName = fqName.shortName().asString()
@@ -171,7 +171,7 @@ class SymbolKotlinAsJavaSupport(project: Project) : KotlinAsJavaSupportBase<KtMo
}
override fun findFilesForFacade(facadeFqName: FqName, searchScope: GlobalSearchScope): Collection<KtFile> {
return project.createDeclarationProvider(searchScope).findFilesForFacade(facadeFqName)
return project.createDeclarationProvider(searchScope, module = null).findFilesForFacade(facadeFqName)
}
override fun getFakeLightClass(classOrObject: KtClassOrObject): KtFakeLightClass = SymbolBasedFakeLightClass(classOrObject)