[Analysis API] Add library sources' content scopes to resolution scopes of `KaLibrarySourceModule`s in `KaBaseResolutionScopeProvider`
`KaLibrarySourceModule` doesn't have any dependencies from the module's perspective.
However, library source modules can still depend on other libraries.
That's why the resolution scope of `KaLibrarySourceModule` must contain the unified content scope of all libraries the project depends on.
This logic is similar to the logic used in `LLFirAbstractSessionFactory.doCreateLibrarySession`.
^KT-74960 fixed
diff --git a/analysis/analysis-api-impl-base/src/org/jetbrains/kotlin/analysis/api/impl/base/components/KaBaseSymbolProvider.kt b/analysis/analysis-api-impl-base/src/org/jetbrains/kotlin/analysis/api/impl/base/components/KaBaseSymbolProvider.kt
index d0e4b17..b4bebc8 100644
--- a/analysis/analysis-api-impl-base/src/org/jetbrains/kotlin/analysis/api/impl/base/components/KaBaseSymbolProvider.kt
+++ b/analysis/analysis-api-impl-base/src/org/jetbrains/kotlin/analysis/api/impl/base/components/KaBaseSymbolProvider.kt
@@ -8,13 +8,9 @@
import com.intellij.openapi.util.registry.Registry
import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.analysis.api.KaImplementationDetail
-import org.jetbrains.kotlin.analysis.api.KaPlatformInterface
import org.jetbrains.kotlin.analysis.api.KaSession
import org.jetbrains.kotlin.analysis.api.getModule
import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion
-import org.jetbrains.kotlin.analysis.api.projectStructure.KaDanglingFileModule
-import org.jetbrains.kotlin.analysis.api.projectStructure.KaLibrarySourceModule
-import org.jetbrains.kotlin.analysis.api.projectStructure.KaModule
import org.jetbrains.kotlin.analysis.api.symbols.KaDeclarationSymbol
import org.jetbrains.kotlin.analysis.api.symbols.KaSymbolProvider
import org.jetbrains.kotlin.analysis.api.utils.errors.withKaModuleEntry
@@ -51,24 +47,13 @@
protected inline fun <T : PsiElement, R> T.createPsiBasedSymbolWithValidityAssertion(builder: () -> R): R = withValidityAssertion {
with(analysisSession) {
if (!canBeAnalysed() && !Registry.`is`("kotlin.analysis.unrelatedSymbolCreation.allowed", false)) {
- if (!useSiteModule.suppressException) {
- throw KaBaseIllegalPsiException(this, this@createPsiBasedSymbolWithValidityAssertion)
- }
+ throw KaBaseIllegalPsiException(this, this@createPsiBasedSymbolWithValidityAssertion)
}
}
builder()
}
- // TODO: drop this suppression for libraries as soon as KT-74960 is fixed
- @OptIn(KaPlatformInterface::class)
- val KaModule.suppressException: Boolean
- get() = when (this) {
- is KaLibrarySourceModule -> true
- is KaDanglingFileModule -> contextModule.suppressException
- else -> false
- }
-
@KaImplementationDetail
class KaBaseIllegalPsiException(session: KaSession, psi: PsiElement) : KotlinIllegalArgumentExceptionWithAttachments(
"The element cannot be analyzed in the context of the current session.\n" +
diff --git a/analysis/analysis-api-impl-base/src/org/jetbrains/kotlin/analysis/api/impl/base/projectStructure/KaBaseResolutionScopeProvider.kt b/analysis/analysis-api-impl-base/src/org/jetbrains/kotlin/analysis/api/impl/base/projectStructure/KaBaseResolutionScopeProvider.kt
index f36a840..2751c06 100644
--- a/analysis/analysis-api-impl-base/src/org/jetbrains/kotlin/analysis/api/impl/base/projectStructure/KaBaseResolutionScopeProvider.kt
+++ b/analysis/analysis-api-impl-base/src/org/jetbrains/kotlin/analysis/api/impl/base/projectStructure/KaBaseResolutionScopeProvider.kt
@@ -7,11 +7,13 @@
import com.intellij.openapi.project.Project
import com.intellij.psi.search.GlobalSearchScope
+import com.intellij.psi.search.ProjectScope
import org.jetbrains.kotlin.analysis.api.KaPlatformInterface
import org.jetbrains.kotlin.analysis.api.platform.projectStructure.KaResolutionScope
import org.jetbrains.kotlin.analysis.api.platform.projectStructure.KaResolutionScopeProvider
import org.jetbrains.kotlin.analysis.api.platform.projectStructure.KotlinGlobalSearchScopeMerger
import org.jetbrains.kotlin.analysis.api.projectStructure.KaBuiltinsModule
+import org.jetbrains.kotlin.analysis.api.projectStructure.KaLibraryModule
import org.jetbrains.kotlin.analysis.api.projectStructure.KaLibrarySourceModule
import org.jetbrains.kotlin.analysis.api.projectStructure.KaModule
import org.jetbrains.kotlin.analysis.decompiler.psi.BuiltinsVirtualFileProvider
@@ -36,6 +38,22 @@
return buildList {
modules.mapTo(this) { it.contentScope }
+ if (module is KaLibrarySourceModule || module is KaLibraryModule) {
+ // `KaLibrarySourceModule` doesn't have any dependencies from the module's perspective.
+ // However, library source modules can still depend on other libraries.
+ // That's why resolution scopes of `KaLibrarySourceModule`s and `KaLibraryModule`s
+ // must contain the unified content scope of all libraries the project depends on.
+ // This logic is similar to the logic used in `LLFirAbstractSessionFactory.doCreateLibrarySession`.
+ //
+ // After KT-64236 all `KaLibrarySourceModule`s and `KaLibraryModule`
+ // will have a separate 'rest libraries module' as a regular dependency.
+ // The content scope of this module will be exactly the library scope of the given project,
+ // so this workaround will no longer be needed.
+ add(
+ ProjectScope.getLibrariesScope(module.project)
+ .intersectWith(GlobalSearchScope.notScope(module.contentScope))
+ )
+ }
if (modules.none { it is KaBuiltinsModule }) {
// `KaBuiltinsModule` is a module containing builtins declarations for the target platform.
// It is never a dependency of any `KaModule`,
diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/LLFirResolveSessionService.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/LLFirResolveSessionService.kt
index 19a64c4..43c02aa 100644
--- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/LLFirResolveSessionService.kt
+++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/LLFirResolveSessionService.kt
@@ -7,27 +7,12 @@
import com.intellij.openapi.project.Project
import org.jetbrains.annotations.TestOnly
-import org.jetbrains.kotlin.analysis.api.projectStructure.KaBuiltinsModule
-import org.jetbrains.kotlin.analysis.api.projectStructure.KaDanglingFileModule
-import org.jetbrains.kotlin.analysis.api.projectStructure.KaLibraryModule
-import org.jetbrains.kotlin.analysis.api.projectStructure.KaLibrarySourceModule
-import org.jetbrains.kotlin.analysis.api.projectStructure.KaModule
-import org.jetbrains.kotlin.analysis.api.projectStructure.KaNotUnderContentRootModule
-import org.jetbrains.kotlin.analysis.api.projectStructure.KaScriptModule
-import org.jetbrains.kotlin.analysis.api.projectStructure.KaSourceModule
+import org.jetbrains.kotlin.analysis.api.projectStructure.*
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.LLFirResolveSession
import org.jetbrains.kotlin.analysis.low.level.api.fir.sessions.LLFirLibraryOrLibrarySourceResolvableModuleSession
import org.jetbrains.kotlin.analysis.low.level.api.fir.sessions.LLFirSession
import org.jetbrains.kotlin.analysis.low.level.api.fir.sessions.LLFirSessionCache
-import org.jetbrains.kotlin.analysis.low.level.api.fir.state.LLDiagnosticProvider
-import org.jetbrains.kotlin.analysis.low.level.api.fir.state.LLEmptyDiagnosticProvider
-import org.jetbrains.kotlin.analysis.low.level.api.fir.state.LLFirResolvableResolveSession
-import org.jetbrains.kotlin.analysis.low.level.api.fir.state.LLModuleProvider
-import org.jetbrains.kotlin.analysis.low.level.api.fir.state.LLModuleResolutionStrategy
-import org.jetbrains.kotlin.analysis.low.level.api.fir.state.LLModuleResolutionStrategyProvider
-import org.jetbrains.kotlin.analysis.low.level.api.fir.state.LLSessionProvider
-import org.jetbrains.kotlin.analysis.low.level.api.fir.state.LLSimpleResolutionStrategyProvider
-import org.jetbrains.kotlin.analysis.low.level.api.fir.state.LLSourceDiagnosticProvider
+import org.jetbrains.kotlin.analysis.low.level.api.fir.state.*
import org.jetbrains.kotlin.analysis.low.level.api.fir.util.errorWithFirSpecificEntries
import org.jetbrains.kotlin.analysis.utils.errors.unexpectedElementError
@@ -102,7 +87,12 @@
private class LLBinaryModuleResolutionStrategyProvider(private val useSiteModule: KaModule) : LLModuleResolutionStrategyProvider {
override fun getKind(module: KaModule): LLModuleResolutionStrategy {
LLFirLibraryOrLibrarySourceResolvableModuleSession.checkIsValidKtModule(module)
- return if (module == useSiteModule) LLModuleResolutionStrategy.LAZY else LLModuleResolutionStrategy.STATIC
+ // Providing `LLModuleResolutionStrategy.LAZY` strategy for `KaLibrarySourceModule` is a workaround,
+ // as `KaLibrarySourceModule` should not be used as dependencies.
+ // It was added after including the project library scope
+ // in resolution scopes of all `KaLibrarySourceModule`s and `KaLibraryModule`s.
+ // See KT-75838
+ return if (module == useSiteModule || module is KaLibrarySourceModule) LLModuleResolutionStrategy.LAZY else LLModuleResolutionStrategy.STATIC
}
}