Deserialization/class reading: pass chosen JvmMetadataVersion whenever possible

This commit is contained in:
Mikhail Glukhikh
2022-12-02 16:38:59 +01:00
parent 52ab565cc6
commit 0c4a0360ac
67 changed files with 399 additions and 163 deletions
@@ -19,6 +19,7 @@ import org.jetbrains.kotlin.compilerRunner.OutputItemsCollector
import org.jetbrains.kotlin.config.CommonConfigurationKeys
import org.jetbrains.kotlin.config.CompilerConfiguration
import org.jetbrains.kotlin.config.JVMConfigurationKeys
import org.jetbrains.kotlin.config.languageVersionSettings
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
import org.jetbrains.kotlin.diagnostics.Severity
import org.jetbrains.kotlin.incremental.isClassFile
@@ -37,6 +38,7 @@ import org.jetbrains.kotlin.resolve.BindingTrace
import org.jetbrains.kotlin.resolve.jvm.JvmClassName
import org.jetbrains.kotlin.resolve.jvm.diagnostics.JvmDeclarationOrigin
import org.jetbrains.kotlin.resolve.jvm.extensions.AnalysisHandlerExtension
import org.jetbrains.kotlin.utils.toMetadataVersion
import org.jetbrains.org.objectweb.asm.ClassReader
import org.jetbrains.org.objectweb.asm.ClassVisitor
import org.jetbrains.org.objectweb.asm.ClassWriter
@@ -124,7 +126,7 @@ class JvmAbiAnalysisHandlerExtension(
for (output in outputs) {
if (!output.file.isClassFile()) continue
val classData = output.classData() ?: continue
val classData = output.classData(compilerConfiguration) ?: continue
val header = classData.classHeader
val isNeededForAbi = when (header.kind) {
KotlinClassHeader.Kind.CLASS -> {
@@ -198,11 +200,13 @@ class JvmAbiAnalysisHandlerExtension(
// null bytes means that file should not be written
private var bytes: ByteArray?
) {
fun classData(): ClassData? =
fun classData(compilerConfiguration: CompilerConfiguration): ClassData? =
when {
bytes == null -> null
!file.isClassFile() -> null
else -> FileBasedKotlinClass.create(bytes!!) { classId, classVersion, classHeader, _ ->
else -> FileBasedKotlinClass.create(
bytes!!, compilerConfiguration.languageVersionSettings.languageVersion.toMetadataVersion()
) { classId, classVersion, classHeader, _ ->
ClassData(classId, classVersion, classHeader)
}
}
@@ -22,6 +22,7 @@ import org.jetbrains.kotlin.resolve.BindingTrace
import org.jetbrains.kotlin.resolve.jvm.JavaDescriptorResolver
import org.jetbrains.kotlin.resolve.jvm.extensions.PackageFragmentProviderExtension
import org.jetbrains.kotlin.storage.StorageManager
import org.jetbrains.kotlin.utils.toMetadataVersion
import kotlin.script.experimental.api.ScriptCompilationConfiguration
import kotlin.script.experimental.jvm.ClassLoaderByConfiguration
@@ -45,10 +46,11 @@ class PackageFragmentFromClassLoaderProviderExtension(
val deserializedDescriptorResolver = DeserializedDescriptorResolver()
val singleModuleClassResolver = SingleModuleClassResolver()
val notFoundClasses = NotFoundClasses(storageManager, module)
val languageVersionSettings = compilerConfiguration.languageVersionSettings
val packagePartProvider =
PackagePartFromClassLoaderProvider(
classLoader,
compilerConfiguration.languageVersionSettings,
languageVersionSettings,
compilerConfiguration[CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY]!!
)
@@ -63,7 +65,8 @@ class PackageFragmentFromClassLoaderProviderExtension(
val deserializationComponentsForJava =
makeDeserializationComponentsForJava(
module, storageManager, notFoundClasses, lazyJavaPackageFragmentProvider,
reflectKotlinClassFinder, deserializedDescriptorResolver, RuntimeErrorReporter
reflectKotlinClassFinder, deserializedDescriptorResolver, RuntimeErrorReporter,
languageVersionSettings.languageVersion.toMetadataVersion()
)
deserializedDescriptorResolver.setComponents(deserializationComponentsForJava)
@@ -11,7 +11,7 @@ import org.jetbrains.kotlin.cli.jvm.compiler.tryLoadModuleMapping
import org.jetbrains.kotlin.config.LanguageVersionSettings
import org.jetbrains.kotlin.load.kotlin.JvmPackagePartProviderBase
import org.jetbrains.kotlin.metadata.jvm.deserialization.ModuleMapping
import org.jetbrains.kotlin.resolve.CompilerDeserializationConfiguration
import org.jetbrains.kotlin.resolve.jvm.JvmCompilerDeserializationConfiguration
import kotlin.script.experimental.jvm.util.forAllMatchingFiles
class PackagePartFromClassLoaderProvider(
@@ -19,7 +19,7 @@ class PackagePartFromClassLoaderProvider(
languageVersionSettings: LanguageVersionSettings,
messageCollector: MessageCollector
) : JvmPackagePartProviderBase<String>() {
override val deserializationConfiguration = CompilerDeserializationConfiguration(languageVersionSettings)
override val deserializationConfiguration = JvmCompilerDeserializationConfiguration(languageVersionSettings)
override val loadedModules: MutableList<ModuleMappingInfo<String>> = SmartList()