[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
     }
 }