[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