[kotlin] fix "IllegalStateException: Could not find stdlib"

The commit removes all the KLib resolution logic,
now Analysis API Standalone clients need to provide all the KLib
list directly.

The resolution logic was removed as too error-prone and requiring compiler configurations.

Kotlin Gradle plugin can provide a full set of required KLibs,
so if a client is a Gradle plugin, this should not be an issue.

Probably, some fancy API which will explicitly perform all KLib dependency searches
should be introduced in the future (KT-63395)

^KT-63126 fixed
This commit is contained in:
Ilya Kirillov
2023-11-06 11:49:46 +01:00
committed by Space Team
parent 1c17f4a835
commit 6aeabc83ea
13 changed files with 206 additions and 13 deletions
@@ -11,7 +11,6 @@ import com.intellij.psi.search.GlobalSearchScope
import org.jetbrains.kotlin.analysis.low.level.api.fir.project.structure.LLFirLibrarySymbolProviderFactory
import org.jetbrains.kotlin.analysis.low.level.api.fir.project.structure.LLFirModuleData
import org.jetbrains.kotlin.analysis.project.structure.KtLibraryModule
import org.jetbrains.kotlin.backend.common.CommonKLibResolver
import org.jetbrains.kotlin.fir.BinaryModuleData
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.deserialization.SingleModuleDataProvider
@@ -23,12 +22,18 @@ import org.jetbrains.kotlin.fir.scopes.FirKotlinScopeProvider
import org.jetbrains.kotlin.fir.session.KlibBasedSymbolProvider
import org.jetbrains.kotlin.fir.session.MetadataSymbolProvider
import org.jetbrains.kotlin.fir.session.NativeForwardDeclarationsSymbolProvider
import org.jetbrains.kotlin.library.KLIB_FILE_EXTENSION
import org.jetbrains.kotlin.library.KotlinLibrary
import org.jetbrains.kotlin.library.ToolingSingleFileKlibResolveStrategy
import org.jetbrains.kotlin.library.metadata.impl.KlibResolvedModuleDescriptorsFactoryImpl.Companion.FORWARD_DECLARATIONS_MODULE_NAME
import org.jetbrains.kotlin.load.kotlin.PackageAndMetadataPartProvider
import org.jetbrains.kotlin.load.kotlin.PackagePartProvider
import org.jetbrains.kotlin.load.kotlin.VirtualFileFinderFactory
import java.lang.IllegalStateException
import java.nio.file.Path
import kotlin.io.path.absolutePathString
import kotlin.io.path.extension
import kotlin.io.path.isDirectory
class LLFirStandaloneLibrarySymbolProviderFactory(private val project: Project) : LLFirLibrarySymbolProviderFactory() {
override fun createJvmLibrarySymbolProvider(
@@ -115,7 +120,7 @@ class LLFirStandaloneLibrarySymbolProviderFactory(private val project: Project)
override fun createBuiltinsSymbolProvider(
session: FirSession,
moduleData: LLFirModuleData,
kotlinScopeProvider: FirKotlinScopeProvider
kotlinScopeProvider: FirKotlinScopeProvider,
): List<FirSymbolProvider> {
return listOf(
FirBuiltinSymbolProvider(session, moduleData, kotlinScopeProvider)
@@ -126,12 +131,19 @@ class LLFirStandaloneLibrarySymbolProviderFactory(private val project: Project)
private fun LLFirModuleData.getLibraryKLibs(): List<KotlinLibrary> {
val ktLibraryModule = ktModule as? KtLibraryModule ?: return emptyList()
val resolveResult = CommonKLibResolver.resolve(
ktLibraryModule.getBinaryRoots().map { it.toString() },
IntellijLogBasedLogger,
lenient = true,
)
return resolveResult.getFullResolvedList().map { it.library }
return ktLibraryModule.getBinaryRoots()
.filter { it.isDirectory() || it.extension == KLIB_FILE_EXTENSION }
.mapNotNull { it.tryResolveAsKLib() }
}
private fun Path.tryResolveAsKLib(): KotlinLibrary? {
return try {
val konanFile = org.jetbrains.kotlin.konan.file.File(absolutePathString())
ToolingSingleFileKlibResolveStrategy.tryResolve(konanFile, IntellijLogBasedLogger)
} catch (e: Exception) {
LOG.warn("Cannot resolve a KLib $this", e)
null
}
}
companion object {