[Analysis API Standalone] fix common code analysis against a klib

^KT-63007 fixed
diff --git a/analysis/analysis-api-standalone/analysis-api-fir-standalone-base/src/org/jetbrains/kotlin/analysis/api/standalone/base/project/structure/LLFirStandaloneLibrarySymbolProviderFactory.kt b/analysis/analysis-api-standalone/analysis-api-fir-standalone-base/src/org/jetbrains/kotlin/analysis/api/standalone/base/project/structure/LLFirStandaloneLibrarySymbolProviderFactory.kt
index b19740d0..acd1809 100644
--- a/analysis/analysis-api-standalone/analysis-api-fir-standalone-base/src/org/jetbrains/kotlin/analysis/api/standalone/base/project/structure/LLFirStandaloneLibrarySymbolProviderFactory.kt
+++ b/analysis/analysis-api-standalone/analysis-api-fir-standalone-base/src/org/jetbrains/kotlin/analysis/api/standalone/base/project/structure/LLFirStandaloneLibrarySymbolProviderFactory.kt
@@ -60,15 +60,21 @@
         packagePartProvider: PackagePartProvider,
         scope: GlobalSearchScope,
     ): List<FirSymbolProvider> {
-        return listOf(
-            MetadataSymbolProvider(
-                session,
-                moduleDataProvider,
-                kotlinScopeProvider,
-                packagePartProvider as PackageAndMetadataPartProvider,
-                VirtualFileFinderFactory.getInstance(project).create(scope),
+        return buildList {
+            add(
+                MetadataSymbolProvider(
+                    session,
+                    moduleDataProvider,
+                    kotlinScopeProvider,
+                    packagePartProvider as PackageAndMetadataPartProvider,
+                    VirtualFileFinderFactory.getInstance(project).create(scope),
+                )
             )
-        )
+            val kLibs = moduleData.getLibraryKLibs()
+            if (kLibs.isNotEmpty()) {
+                add(KlibBasedSymbolProvider(session, moduleDataProvider, kotlinScopeProvider, kLibs))
+            }
+        }
     }
 
     override fun createNativeLibrarySymbolProvider(
diff --git a/analysis/analysis-api-standalone/testData/sessionBuilder/resolveAgainstCommonKLib/klibSrc/commonKLibFunction.kt b/analysis/analysis-api-standalone/testData/sessionBuilder/resolveAgainstCommonKLib/klibSrc/commonKLibFunction.kt
new file mode 100644
index 0000000..7709693
--- /dev/null
+++ b/analysis/analysis-api-standalone/testData/sessionBuilder/resolveAgainstCommonKLib/klibSrc/commonKLibFunction.kt
@@ -0,0 +1,5 @@
+package commonKLib
+
+fun commonKLibFunction(arg: String): Int {
+
+}
\ No newline at end of file
diff --git a/analysis/analysis-api-standalone/testData/sessionBuilder/resolveAgainstCommonKLib/src/main.kt b/analysis/analysis-api-standalone/testData/sessionBuilder/resolveAgainstCommonKLib/src/main.kt
new file mode 100644
index 0000000..d793126
--- /dev/null
+++ b/analysis/analysis-api-standalone/testData/sessionBuilder/resolveAgainstCommonKLib/src/main.kt
@@ -0,0 +1,5 @@
+import commonKLib.commonKLibFunction
+
+fun main() {
+    commonKLibFunction("aaa")
+}
\ No newline at end of file
diff --git a/analysis/analysis-api-standalone/tests/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/session/builder/StandaloneSessionBuilderTest.kt b/analysis/analysis-api-standalone/tests/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/session/builder/StandaloneSessionBuilderTest.kt
index 901e171..e5cf099 100644
--- a/analysis/analysis-api-standalone/tests/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/session/builder/StandaloneSessionBuilderTest.kt
+++ b/analysis/analysis-api-standalone/tests/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/session/builder/StandaloneSessionBuilderTest.kt
@@ -81,6 +81,38 @@
     }
 
     @Test
+    fun testResolveAgainstCommonKlib() {
+        lateinit var sourceModule: KtSourceModule
+        val session = buildStandaloneAnalysisAPISession {
+            registerProjectService(KtLifetimeTokenProvider::class.java, KtAlwaysAccessibleLifetimeTokenProvider())
+
+            buildKtModuleProvider {
+                platform = CommonPlatforms.defaultCommonPlatform
+                val kLib = addModule(
+                    buildKtLibraryModule {
+                        val compiledKLibRoot = compileCommonKlib(testDataPath("resolveAgainstCommonKLib/klibSrc"))
+                        addBinaryRoot(compiledKLibRoot)
+                        platform = CommonPlatforms.defaultCommonPlatform
+                        libraryName = "klib"
+                    }
+                )
+                sourceModule = addModule(
+                    buildKtSourceModule {
+                        addSourceRoot(testDataPath("resolveAgainstCommonKLib/src"))
+                        addRegularDependency(kLib)
+                        platform = CommonPlatforms.defaultCommonPlatform
+                        moduleName = "source"
+                    }
+                )
+            }
+        }
+        val ktFile = session.modulesWithFiles.getValue(sourceModule).single() as KtFile
+
+        val ktCallExpression = ktFile.findDescendantOfType<KtCallExpression>()!!
+        ktCallExpression.assertIsCallOf(CallableId(FqName("commonKLib"), Name.identifier("commonKLibFunction")))
+    }
+
+    @Test
     fun testKotlinStdlibJvm() {
         doTestKotlinStdLibResolve(JvmPlatforms.defaultJvmPlatform, PathUtil.kotlinPathsForDistDirectory.stdlibPath.toPath())
     }
diff --git a/analysis/analysis-api-standalone/tests/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/session/builder/sessionBuilderTestUtils.kt b/analysis/analysis-api-standalone/tests/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/session/builder/sessionBuilderTestUtils.kt
index 0b7c238..4c0a32f 100644
--- a/analysis/analysis-api-standalone/tests/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/session/builder/sessionBuilderTestUtils.kt
+++ b/analysis/analysis-api-standalone/tests/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/session/builder/sessionBuilderTestUtils.kt
@@ -5,9 +5,37 @@
 
 package org.jetbrains.kotlin.analysis.api.standalone.fir.test.cases.session.builder
 
+import org.jetbrains.kotlin.library.KotlinAbiVersion
+import org.jetbrains.kotlin.library.KotlinLibraryVersioning
+import org.jetbrains.kotlin.library.metadata.KlibMetadataVersion
+import org.jetbrains.kotlin.test.KlibTestUtil
+import org.jetbrains.kotlin.test.util.KtTestUtil
+import java.nio.file.Files
 import java.nio.file.Path
 import java.nio.file.Paths
+import kotlin.io.path.extension
+import kotlin.streams.asSequence
 
 internal fun testDataPath(path: String): Path {
     return Paths.get("analysis/analysis-api-standalone/testData/sessionBuilder").resolve(path)
+}
+
+
+internal fun compileCommonKlib(kLibSourcesRoot: Path): Path {
+    Files.walk(kLibSourcesRoot)
+    val ktFiles = Files.walk(kLibSourcesRoot).asSequence().filter { it.extension == "kt" }.toList()
+    val testKlib = KtTestUtil.tmpDir("testLibrary").resolve("library.klib").toPath()
+    KlibTestUtil.compileCommonSourcesToKlib(
+        ktFiles.map(Path::toFile),
+        libraryName = "library",
+        testKlib.toFile(),
+        libraryVersioning = KotlinLibraryVersioning(
+            libraryVersion = null,
+            compilerVersion = null,
+            abiVersion = KotlinAbiVersion.CURRENT,
+            metadataVersion = KlibMetadataVersion.INSTANCE.toString(),
+        )
+    )
+
+    return testKlib
 }
\ No newline at end of file