From 576d8d1c1019c234991a9a25b251651e03b082e2 Mon Sep 17 00:00:00 2001 From: Marco Pennekamp Date: Mon, 16 Oct 2023 20:40:31 +0200 Subject: [PATCH] [AA] Allow declaration provider package set computation to return `null` - This is in line with the API of `FirSymbolNamesProvider`. It only makes sense to compute package sets for source and library modules. Also, source module package set computation in the IDE is currently broken, so it's good to be able to return `null` in the meantime. - This also allows the removal of the workaround for source modules in `LLFirProviderHelper`, as the IDE declaration provider can now return `null` itself in this case. ^KTIJ-27411 --- .../kotlin/analysis/providers/KotlinDeclarationProvider.kt | 7 ++++++- .../CompositeKotlinDeclarationProvider.kt | 5 +++-- .../low/level/api/fir/providers/LLFirProviderHelper.kt | 5 +---- .../level/api/fir/util/LLFirKotlinSymbolNamesProvider.kt | 2 +- 4 files changed, 11 insertions(+), 8 deletions(-) diff --git a/analysis/analysis-api-providers/src/org/jetbrains/kotlin/analysis/providers/KotlinDeclarationProvider.kt b/analysis/analysis-api-providers/src/org/jetbrains/kotlin/analysis/providers/KotlinDeclarationProvider.kt index 29c4b2d1fea..a838d315ac2 100644 --- a/analysis/analysis-api-providers/src/org/jetbrains/kotlin/analysis/providers/KotlinDeclarationProvider.kt +++ b/analysis/analysis-api-providers/src/org/jetbrains/kotlin/analysis/providers/KotlinDeclarationProvider.kt @@ -45,7 +45,12 @@ public abstract class KotlinDeclarationProvider : KotlinComposableProvider { public abstract fun findFilesForScript(scriptFqName: FqName): Collection - public abstract fun computePackageSetWithTopLevelCallableDeclarations(): Set + /** + * Calculates the set of package names which can be provided by this declaration provider and contain callables. + * + * The set may contain false positives. `null` may be returned if the package set is too expensive or impossible to compute. + */ + public abstract fun computePackageSetWithTopLevelCallableDeclarations(): Set? } public abstract class KotlinDeclarationProviderFactory { diff --git a/analysis/analysis-api-providers/src/org/jetbrains/kotlin/analysis/providers/impl/declarationProviders/CompositeKotlinDeclarationProvider.kt b/analysis/analysis-api-providers/src/org/jetbrains/kotlin/analysis/providers/impl/declarationProviders/CompositeKotlinDeclarationProvider.kt index de023ba7773..af3318e848e 100644 --- a/analysis/analysis-api-providers/src/org/jetbrains/kotlin/analysis/providers/impl/declarationProviders/CompositeKotlinDeclarationProvider.kt +++ b/analysis/analysis-api-providers/src/org/jetbrains/kotlin/analysis/providers/impl/declarationProviders/CompositeKotlinDeclarationProvider.kt @@ -13,6 +13,7 @@ import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.psi.* +import org.jetbrains.kotlin.utils.flatMapToNullableSet public class CompositeKotlinDeclarationProvider private constructor( override val providers: List @@ -65,8 +66,8 @@ public class CompositeKotlinDeclarationProvider private constructor( return providers.flatMapTo(mutableListOf()) { it.findFilesForScript(scriptFqName) } } - override fun computePackageSetWithTopLevelCallableDeclarations(): Set { - return providers.flatMapTo(mutableSetOf()) { it.computePackageSetWithTopLevelCallableDeclarations() } + override fun computePackageSetWithTopLevelCallableDeclarations(): Set? { + return providers.flatMapToNullableSet { it.computePackageSetWithTopLevelCallableDeclarations() } } public companion object { diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/providers/LLFirProviderHelper.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/providers/LLFirProviderHelper.kt index a60dac80e30..852f3a79a1b 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/providers/LLFirProviderHelper.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/providers/LLFirProviderHelper.kt @@ -102,10 +102,7 @@ internal class LLFirProviderHelper( val symbolNameCache = FirCompositeCachedSymbolNamesProvider.create( firSession, listOfNotNull( - object : LLFirKotlinSymbolNamesProvider(declarationProvider, allowKotlinPackage) { - // This is a temporary workaround for KTIJ-25536. - override fun getPackageNamesWithTopLevelCallables(): Set? = null - }, + LLFirKotlinSymbolNamesProvider(declarationProvider, allowKotlinPackage), extensionTool?.symbolNamesProvider, ) ) diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/util/LLFirKotlinSymbolNamesProvider.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/util/LLFirKotlinSymbolNamesProvider.kt index 1d128061b3e..50f11ba928f 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/util/LLFirKotlinSymbolNamesProvider.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/util/LLFirKotlinSymbolNamesProvider.kt @@ -31,7 +31,7 @@ internal open class LLFirKotlinSymbolNamesProvider( } override fun getPackageNamesWithTopLevelCallables(): Set? { - val packageNames = declarationProvider.computePackageSetWithTopLevelCallableDeclarations() + val packageNames = declarationProvider.computePackageSetWithTopLevelCallableDeclarations() ?: return null if (allowKotlinPackage == false && packageNames.any { it.isKotlinPackage() }) { return packageNames.filterToSetOrEmpty { !it.isKotlinPackage() }