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
@@ -17,6 +17,7 @@
package org.jetbrains.kotlin.build
import org.jetbrains.kotlin.incremental.LocalFileKotlinClass
import org.jetbrains.kotlin.metadata.jvm.deserialization.JvmMetadataVersion
import org.jetbrains.kotlin.metadata.jvm.deserialization.ModuleMapping
import org.jetbrains.kotlin.utils.sure
import java.io.File
@@ -32,9 +33,10 @@ open class GeneratedFile(
class GeneratedJvmClass(
sourceFiles: Collection<File>,
outputFile: File
outputFile: File,
jvmMetadataVersionFromLanguageVersion: JvmMetadataVersion
) : GeneratedFile(sourceFiles, outputFile) {
val outputClass = LocalFileKotlinClass.create(outputFile).sure {
val outputClass = LocalFileKotlinClass.create(outputFile, jvmMetadataVersionFromLanguageVersion).sure {
"Couldn't load KotlinClass from $outputFile; it may happen because class doesn't have valid Kotlin annotations"
}
}
@@ -18,15 +18,16 @@ package org.jetbrains.kotlin.compilerRunner
import org.jetbrains.kotlin.build.GeneratedFile
import org.jetbrains.kotlin.build.GeneratedJvmClass
import org.jetbrains.kotlin.metadata.jvm.deserialization.JvmMetadataVersion
import java.io.File
data class SimpleOutputItem(val sourceFiles: Collection<File>, val outputFile: File) {
override fun toString(): String =
"$sourceFiles->$outputFile"
"$sourceFiles->$outputFile"
}
fun SimpleOutputItem.toGeneratedFile(): GeneratedFile =
when {
outputFile.name.endsWith(".class") -> GeneratedJvmClass(sourceFiles, outputFile)
else -> GeneratedFile(sourceFiles, outputFile)
}
fun SimpleOutputItem.toGeneratedFile(jvmMetadataVersionFromLanguageVersion: JvmMetadataVersion): GeneratedFile =
when {
outputFile.name.endsWith(".class") -> GeneratedJvmClass(sourceFiles, outputFile, jvmMetadataVersionFromLanguageVersion)
else -> GeneratedFile(sourceFiles, outputFile)
}
@@ -18,6 +18,7 @@ package org.jetbrains.kotlin.incremental
import org.jetbrains.kotlin.load.kotlin.FileBasedKotlinClass
import org.jetbrains.kotlin.load.kotlin.header.KotlinClassHeader
import org.jetbrains.kotlin.metadata.jvm.deserialization.JvmMetadataVersion
import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.resolve.jvm.JvmClassName
import java.io.File
@@ -32,10 +33,12 @@ class LocalFileKotlinClass private constructor(
) : FileBasedKotlinClass(className, classVersion, classHeader, innerClasses) {
companion object {
fun create(file: File): LocalFileKotlinClass? {
fun create(file: File, jvmMetadataVersionFromLanguageVersion: JvmMetadataVersion): LocalFileKotlinClass? {
val fileContents = file.readBytes()
return FileBasedKotlinClass.create(fileContents) {
className, classVersion, classHeader, innerClasses ->
return FileBasedKotlinClass.create(
fileContents,
jvmMetadataVersionFromLanguageVersion
) { className, classVersion, classHeader, innerClasses ->
LocalFileKotlinClass(file, fileContents, className, classVersion, classHeader, innerClasses)
}
}