Load JVM built-ins in IDE from module dependencies
Fix built-ins for JVM platform and make them consistent with module's dependency on standard library. Changes don't affect non-JVM platforms. Previously all built-ins in IDE were loaded from classloader and were based on the same pre-serialized .kotlin_builtins files. This approach is generally not correct as built-in declarations differ for different platforms, but it had been working for a while without immediately observalble effects (see KT-33233 for more info). After changes in standard library JvmBuiltins started producing false errors (see KT-39728). To fix this, JVM built-ins in IDE now utilize the same technique as applied in CLI: using dependency on standard library as a module for built-ins instead of artificial module that considers only .kotlin_builtins. Change summary: - Provide JvmBuiltins with kind FROM_DEPENDENCIES for all modules with stdlib dependency in IDE - Add JvmBuiltinsPackageFragmentProvider to JVM-ish module resolvers (JVM and Composite with JVM platform) to support their use as built-ins module - Create KotlinBuiltInsMetadataIndex file index for tracking libraries containing .kotlin_builtins to support JvmBuiltinsPackageFragmentProvider - Create KotlinStdlibIndex file index for tracking kotlin-stdlib(-common), which looks for "Kotlin-Runtime-Component" manifest attribute - Add caching service to track LibraryInfo for kotlin-stdlib(-common) - Put LibraryInfo for kotlin-stdlib(-common) alongside SDKs due to the need to resolve that modules in BuiltInsCache - Update BuiltInsCache to separate JvmBuiltins by module's dependency on stdlib and JDK - Make platform of KotlinSDK common instead of JVM - Set built-ins module lazily in IDE ^KT-33233 Verification Pending
This commit is contained in:
@@ -5,6 +5,7 @@
|
||||
|
||||
package org.jetbrains.kotlin.backend.jvm
|
||||
|
||||
import org.jetbrains.kotlin.analyzer.hasJdkCapability
|
||||
import org.jetbrains.kotlin.backend.common.CodegenUtil
|
||||
import org.jetbrains.kotlin.backend.common.extensions.IrGenerationExtension
|
||||
import org.jetbrains.kotlin.backend.common.extensions.IrPluginContextImpl
|
||||
@@ -115,6 +116,13 @@ class JvmIrCodegenFactory(private val phaseConfig: PhaseConfig) : CodegenFactory
|
||||
|
||||
val dependencies = psi2irContext.moduleDescriptor.allDependencyModules.map {
|
||||
val kotlinLibrary = (it.getCapability(KlibModuleOrigin.CAPABILITY) as? DeserializedKlibModuleOrigin)?.library
|
||||
if (it.hasJdkCapability) {
|
||||
// For IDE environment only, i.e. when compiling for debugger
|
||||
// Deserializer for built-ins module should exist because built-in types returned from SDK belong to that module,
|
||||
// but JDK's built-ins module might not be in current module's dependencies
|
||||
// We have to ensure that deserializer for built-ins module is created
|
||||
irLinker.deserializeIrModuleHeader(it.builtIns.builtInsModule, null)
|
||||
}
|
||||
irLinker.deserializeIrModuleHeader(it, kotlinLibrary)
|
||||
}
|
||||
val irProviders = listOf(irLinker)
|
||||
|
||||
Reference in New Issue
Block a user