Remove JvmBytecodeBinaryVersion from the compiler code

Move it to build-common where it's still used in incremental compilation
caches, and simplify a bit. In the future, it'll make sense to remove it
completely and to avoid writing it to caches. In this commit, I don't do
that to prevent the IC cache version to be updated, causing rebuilds for
all JPS projects.

 #KT-41758
This commit is contained in:
Alexander Udalov
2021-02-15 17:04:34 +01:00
parent d300e05be9
commit f63ffc51ae
9 changed files with 37 additions and 54 deletions
@@ -16,7 +16,6 @@
package org.jetbrains.kotlin.build
import org.jetbrains.kotlin.metadata.jvm.deserialization.JvmBytecodeBinaryVersion
import org.jetbrains.kotlin.metadata.jvm.deserialization.JvmMetadataVersion
/**
@@ -0,0 +1,31 @@
/*
* Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.build
/**
* Bytecode version was in the Kotlin metadata ([Metadata.bytecodeVersion]) since 1.0, but it was never used meaningfully in the compiler,
* outside of one very special case regarding experimental coroutines, which is now obsolete. It is still used in incremental compilation
* caches though. We should probably just pretend that the bytecode version of any Kotlin file from now on is equal to the latest observed
* bytecode version, `1.0.3` (see [INSTANCE]).
*/
class JvmBytecodeBinaryVersion(vararg numbers: Int) {
val major: Int = numbers.getOrNull(0) ?: -1
val minor: Int = numbers.getOrNull(1) ?: -1
val patch: Int = numbers.getOrNull(2) ?: -1
override fun toString(): String = buildString {
append(major)
if (minor != -1) {
append(".$minor")
if (patch != -1) append(".$patch")
}
}
companion object {
@JvmField
val INSTANCE = JvmBytecodeBinaryVersion(1, 0, 3)
}
}
@@ -30,7 +30,6 @@ public final class JvmAnnotationNames {
public static final String METADATA_DESC = "L" + JvmClassName.byFqNameWithoutInnerClasses(METADATA_FQ_NAME).getInternalName() + ";";
public static final String METADATA_VERSION_FIELD_NAME = "mv";
public static final String BYTECODE_VERSION_FIELD_NAME = "bv";
public static final String KIND_FIELD_NAME = "k";
public static final String METADATA_DATA_FIELD_NAME = "d1";
public static final String METADATA_STRINGS_FIELD_NAME = "d2";
@@ -20,7 +20,6 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.kotlin.descriptors.SourceElement;
import org.jetbrains.kotlin.load.java.JvmAnnotationNames;
import org.jetbrains.kotlin.metadata.jvm.deserialization.JvmBytecodeBinaryVersion;
import org.jetbrains.kotlin.metadata.jvm.deserialization.JvmMetadataVersion;
import org.jetbrains.kotlin.name.ClassId;
import org.jetbrains.kotlin.name.FqName;
@@ -51,7 +50,6 @@ public class ReadKotlinClassHeaderAnnotationVisitor implements AnnotationVisitor
}
private int[] metadataVersionArray = null;
private JvmBytecodeBinaryVersion bytecodeVersion = null;
private String extraString = null;
private int extraInt = 0;
private String packageName = null;
@@ -79,17 +77,7 @@ public class ReadKotlinClassHeaderAnnotationVisitor implements AnnotationVisitor
return null;
}
return new KotlinClassHeader(
headerKind,
metadataVersion,
bytecodeVersion != null ? bytecodeVersion : JvmBytecodeBinaryVersion.INSTANCE,
data,
incompatibleData,
strings,
extraString,
extraInt,
packageName
);
return new KotlinClassHeader(headerKind, metadataVersion, data, incompatibleData, strings, extraString, extraInt, packageName);
}
private boolean shouldHaveData() {
@@ -142,11 +130,6 @@ public class ReadKotlinClassHeaderAnnotationVisitor implements AnnotationVisitor
metadataVersionArray = (int[]) value;
}
}
else if (BYTECODE_VERSION_FIELD_NAME.equals(string)) {
if (value instanceof int[]) {
bytecodeVersion = new JvmBytecodeBinaryVersion((int[]) value);
}
}
else if (METADATA_EXTRA_STRING_FIELD_NAME.equals(string)) {
if (value instanceof String) {
extraString = (String) value;
@@ -227,11 +210,6 @@ public class ReadKotlinClassHeaderAnnotationVisitor implements AnnotationVisitor
if ("version".equals(string)) {
if (value instanceof int[]) {
metadataVersionArray = (int[]) value;
// If there's no bytecode binary version in the class file, we assume it to be equal to the metadata version
if (bytecodeVersion == null) {
bytecodeVersion = new JvmBytecodeBinaryVersion((int[]) value);
}
}
}
else if ("multifileClassName".equals(string)) {
@@ -8,13 +8,11 @@ package org.jetbrains.kotlin.load.kotlin.header
import org.jetbrains.kotlin.load.java.JvmAnnotationNames.*
import org.jetbrains.kotlin.load.kotlin.header.KotlinClassHeader.MultifileClassKind.DELEGATING
import org.jetbrains.kotlin.load.kotlin.header.KotlinClassHeader.MultifileClassKind.INHERITING
import org.jetbrains.kotlin.metadata.jvm.deserialization.JvmBytecodeBinaryVersion
import org.jetbrains.kotlin.metadata.jvm.deserialization.JvmMetadataVersion
class KotlinClassHeader(
val kind: Kind,
val metadataVersion: JvmMetadataVersion,
val bytecodeVersion: JvmBytecodeBinaryVersion,
val data: Array<String>?,
val incompatibleData: Array<String>?,
val strings: Array<String>?,
@@ -1,21 +0,0 @@
/*
* Copyright 2010-2018 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.metadata.jvm.deserialization
import org.jetbrains.kotlin.metadata.deserialization.BinaryVersion
/**
* The version of conventions used in bytecode of generated .class files, such as default method naming & signatures,
* internal member name mangling specifics, property getter/setter names, etc.
*/
class JvmBytecodeBinaryVersion(vararg numbers: Int) : BinaryVersion(*numbers) {
override fun isCompatible() = this.isCompatibleTo(INSTANCE)
companion object {
@JvmField
val INSTANCE = JvmBytecodeBinaryVersion(1, 0, 3)
}
}
@@ -5,7 +5,7 @@
package org.jetbrains.kotlin.jps.incremental
import org.jetbrains.kotlin.metadata.jvm.deserialization.JvmBytecodeBinaryVersion
import org.jetbrains.kotlin.build.JvmBytecodeBinaryVersion
import org.jetbrains.kotlin.metadata.jvm.deserialization.JvmMetadataVersion
import org.junit.Assert.assertEquals
import org.junit.Test
@@ -54,4 +54,4 @@ class CacheVersionTest {
).toString()
)
}
}
}
@@ -6,7 +6,7 @@
package org.jetbrains.kotlin.jps.incremental
import org.jetbrains.annotations.TestOnly
import org.jetbrains.kotlin.metadata.jvm.deserialization.JvmBytecodeBinaryVersion
import org.jetbrains.kotlin.build.JvmBytecodeBinaryVersion
import org.jetbrains.kotlin.metadata.jvm.deserialization.JvmMetadataVersion
import java.io.File
import java.io.IOException
@@ -79,4 +79,4 @@ data class CacheVersion(val intValue: Int) {
)
override fun toString(): String = "CacheVersion(caches: $own, bytecode: $bytecode, metadata: $metadata)"
}
}
@@ -7,7 +7,6 @@
package kotlinx.metadata.jvm
import org.jetbrains.kotlin.metadata.jvm.deserialization.JvmBytecodeBinaryVersion
import org.jetbrains.kotlin.metadata.jvm.deserialization.JvmMetadataVersion
/**
@@ -175,6 +174,6 @@ constructor(
level = DeprecationLevel.ERROR
)
@JvmField
val COMPATIBLE_BYTECODE_VERSION = JvmBytecodeBinaryVersion.INSTANCE.toArray().copyOf()
val COMPATIBLE_BYTECODE_VERSION = intArrayOf(1, 0, 3)
}
}