Use JvmMetadataVersion instead of int[] when possible
Change-Id: I1a4999e3c025995d8d47d784cd8c336542f2eaf2
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinClassInfo.java b/src/main/java/com/android/tools/r8/kotlin/KotlinClassInfo.java
index 1b00d0c..023937c 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinClassInfo.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinClassInfo.java
@@ -35,6 +35,7 @@
import kotlin.metadata.KmConstructor;
import kotlin.metadata.KmType;
import kotlin.metadata.jvm.JvmExtensionsKt;
+import kotlin.metadata.jvm.JvmMetadataVersion;
import kotlin.metadata.jvm.JvmMethodSignature;
import kotlin.metadata.jvm.KotlinClassMetadata;
@@ -452,8 +453,8 @@
}
@Override
- public int[] getMetadataVersion() {
- return KotlinJvmMetadataVersionUtils.toIntArray(classMetadata.getVersion());
+ public JvmMetadataVersion getMetadataVersion() {
+ return classMetadata.getVersion();
}
@Override
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinClassLevelInfo.java b/src/main/java/com/android/tools/r8/kotlin/KotlinClassLevelInfo.java
index d634e88..d9f4e16 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinClassLevelInfo.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinClassLevelInfo.java
@@ -9,6 +9,7 @@
import com.android.tools.r8.shaking.EnqueuerMetadataTraceable;
import com.android.tools.r8.utils.Pair;
import kotlin.Metadata;
+import kotlin.metadata.jvm.JvmMetadataVersion;
public interface KotlinClassLevelInfo extends EnqueuerMetadataTraceable {
@@ -60,5 +61,5 @@
String getPackageName();
- int[] getMetadataVersion();
+ JvmMetadataVersion getMetadataVersion();
}
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinFileFacadeInfo.java b/src/main/java/com/android/tools/r8/kotlin/KotlinFileFacadeInfo.java
index 07d4faa..c845cea 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinFileFacadeInfo.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinFileFacadeInfo.java
@@ -14,6 +14,7 @@
import java.util.function.Consumer;
import kotlin.Metadata;
import kotlin.metadata.KmPackage;
+import kotlin.metadata.jvm.JvmMetadataVersion;
import kotlin.metadata.jvm.KotlinClassMetadata.FileFacade;
// Holds information about Metadata.FileFacade
@@ -72,8 +73,8 @@
}
@Override
- public int[] getMetadataVersion() {
- return KotlinJvmMetadataVersionUtils.toIntArray(kmFileFacade.getVersion());
+ public JvmMetadataVersion getMetadataVersion() {
+ return kmFileFacade.getVersion();
}
@Override
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataRewriter.java b/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataRewriter.java
index eb55ca1..5e5ed92 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataRewriter.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataRewriter.java
@@ -4,6 +4,7 @@
package com.android.tools.r8.kotlin;
import static com.android.tools.r8.kotlin.KotlinClassMetadataReader.toKotlinClassMetadata;
+import static com.android.tools.r8.kotlin.KotlinMetadataUtils.VERSION_1_4_0;
import static com.android.tools.r8.kotlin.KotlinMetadataUtils.getInvalidKotlinInfo;
import static com.android.tools.r8.kotlin.KotlinMetadataUtils.getNoKotlinInfo;
import static com.android.tools.r8.kotlin.KotlinMetadataWriter.kotlinMetadataToString;
@@ -29,14 +30,10 @@
import java.util.List;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
+import kotlin.metadata.jvm.JvmMetadataVersion;
public class KotlinMetadataRewriter {
- @SuppressWarnings("UnusedVariable")
- // Due to a bug with nested classes and the lookup of RequirementVersion, we bump all metadata
- // versions to 1.4 if compiled with kotlin 1.3 (1.1.16). For more information, see b/161885097.
- private static final int[] METADATA_VERSION_1_4 = new int[] {1, 4, 0};
-
private static final class WriteMetadataFieldInfo {
final boolean writeKind;
final boolean writeMetadataVersion;
@@ -181,7 +178,7 @@
createKotlinMetadataAnnotation(
kotlinMetadata.getFirst(),
kotlinInfo.getPackageName(),
- getMaxVersion(METADATA_VERSION_1_4, kotlinInfo.getMetadataVersion()),
+ computeMetadataVersion(kotlinInfo.getMetadataVersion()),
writeMetadataFieldInfo)));
return;
}
@@ -189,7 +186,7 @@
createKotlinMetadataAnnotation(
kotlinMetadata.getFirst(),
kotlinInfo.getPackageName(),
- getMaxVersion(METADATA_VERSION_1_4, kotlinInfo.getMetadataVersion()),
+ computeMetadataVersion(kotlinInfo.getMetadataVersion()),
writeMetadataFieldInfo);
clazz.setAnnotations(clazz.annotations().rewrite(anno -> anno == oldMeta ? newMeta : anno));
} catch (Throwable t) {
@@ -240,13 +237,14 @@
private DexAnnotation createKotlinMetadataAnnotation(
kotlin.Metadata metadata,
String packageName,
- int[] metadataVersion,
+ JvmMetadataVersion metadataVersion,
WriteMetadataFieldInfo writeMetadataFieldInfo) {
List<DexAnnotationElement> elements = new ArrayList<>();
if (writeMetadataFieldInfo.writeMetadataVersion) {
elements.add(
new DexAnnotationElement(
- kotlin.metadata.metadataVersion, createIntArray(metadataVersion)));
+ kotlin.metadata.metadataVersion,
+ createIntArray(KotlinJvmMetadataVersionUtils.toIntArray(metadataVersion))));
}
if (writeMetadataFieldInfo.writeKind) {
elements.add(
@@ -297,22 +295,12 @@
return new DexValueArray(values);
}
- // We are not sure that the format is <Major>-<Minor>-<Patch>, the format can be: <Major>-<Minor>.
- private int[] getMaxVersion(int[] one, int[] other) {
- assert one.length == 2 || one.length == 3;
- assert other.length == 2 || other.length == 3;
- if (one[0] != other[0]) {
- return one[0] > other[0] ? one : other;
+ // Due to a bug with nested classes and the lookup of RequirementVersion, we bump all metadata
+ // versions to 1.4 if compiled with kotlin 1.3 (1.1.16). For more information, see b/161885097.
+ private JvmMetadataVersion computeMetadataVersion(JvmMetadataVersion other) {
+ if (VERSION_1_4_0.compareTo(other) >= 0) {
+ return VERSION_1_4_0;
}
- if (one[1] != other[1]) {
- return one[1] > other[1] ? one : other;
- }
- int patchOne = one.length >= 3 ? one[2] : 0;
- int patchOther = other.length >= 3 ? other[2] : 0;
- if (patchOne != patchOther) {
- return patchOne > patchOther ? one : other;
- }
- // They are equal up to patch, just return one.
- return one;
+ return other;
}
}
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataUtils.java b/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataUtils.java
index 9516e45..a4c7ec6 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataUtils.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataUtils.java
@@ -33,7 +33,7 @@
public class KotlinMetadataUtils {
- private static final JvmMetadataVersion VERSION_1_4_0 = new JvmMetadataVersion(1, 4, 0);
+ public static final JvmMetadataVersion VERSION_1_4_0 = new JvmMetadataVersion(1, 4, 0);
private static final NoKotlinInfo NO_KOTLIN_INFO = new NoKotlinInfo("NO_KOTLIN_INFO");
private static final NoKotlinInfo INVALID_KOTLIN_INFO = new NoKotlinInfo("INVALID_KOTLIN_INFO");
@@ -62,7 +62,7 @@
}
@Override
- public int[] getMetadataVersion() {
+ public JvmMetadataVersion getMetadataVersion() {
throw new Unreachable("Should never be called");
}
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinMultiFileClassFacadeInfo.java b/src/main/java/com/android/tools/r8/kotlin/KotlinMultiFileClassFacadeInfo.java
index b5a7771..f29f38b 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinMultiFileClassFacadeInfo.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinMultiFileClassFacadeInfo.java
@@ -16,6 +16,7 @@
import java.util.ArrayList;
import java.util.List;
import kotlin.Metadata;
+import kotlin.metadata.jvm.JvmMetadataVersion;
import kotlin.metadata.jvm.KotlinClassMetadata.MultiFileClassFacade;
// Holds information about Metadata.MultiFileClassFace
@@ -83,8 +84,8 @@
}
@Override
- public int[] getMetadataVersion() {
- return KotlinJvmMetadataVersionUtils.toIntArray(kmMultiFileClassFacade.getVersion());
+ public JvmMetadataVersion getMetadataVersion() {
+ return kmMultiFileClassFacade.getVersion();
}
@Override
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinMultiFileClassPartInfo.java b/src/main/java/com/android/tools/r8/kotlin/KotlinMultiFileClassPartInfo.java
index e18afb0..2f8381b 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinMultiFileClassPartInfo.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinMultiFileClassPartInfo.java
@@ -14,6 +14,7 @@
import java.util.function.Consumer;
import kotlin.Metadata;
import kotlin.metadata.KmPackage;
+import kotlin.metadata.jvm.JvmMetadataVersion;
import kotlin.metadata.jvm.KotlinClassMetadata.MultiFileClassPart;
// Holds information about Metadata.MultiFileClassPartInfo
@@ -70,8 +71,8 @@
}
@Override
- public int[] getMetadataVersion() {
- return KotlinJvmMetadataVersionUtils.toIntArray(classPart.getVersion());
+ public JvmMetadataVersion getMetadataVersion() {
+ return classPart.getVersion();
}
@Override
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinSyntheticClassInfo.java b/src/main/java/com/android/tools/r8/kotlin/KotlinSyntheticClassInfo.java
index 6b3c485..c45373e 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinSyntheticClassInfo.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinSyntheticClassInfo.java
@@ -13,6 +13,7 @@
import com.android.tools.r8.utils.Pair;
import kotlin.Metadata;
import kotlin.metadata.KmLambda;
+import kotlin.metadata.jvm.JvmMetadataVersion;
import kotlin.metadata.jvm.KotlinClassMetadata.SyntheticClass;
// Holds information about a Metadata.SyntheticClass object.
@@ -96,8 +97,8 @@
}
@Override
- public int[] getMetadataVersion() {
- return KotlinJvmMetadataVersionUtils.toIntArray(syntheticClass.getVersion());
+ public JvmMetadataVersion getMetadataVersion() {
+ return syntheticClass.getVersion();
}
@SuppressWarnings("ReferenceEquality")
diff --git a/src/main/java/com/android/tools/r8/naming/KotlinModuleSynthesizer.java b/src/main/java/com/android/tools/r8/naming/KotlinModuleSynthesizer.java
index cbaf559..10e4601 100644
--- a/src/main/java/com/android/tools/r8/naming/KotlinModuleSynthesizer.java
+++ b/src/main/java/com/android/tools/r8/naming/KotlinModuleSynthesizer.java
@@ -110,7 +110,7 @@
private final Map<String, List<Pair<String, String>>> multiClassFacadeOriginalToRenamed =
new LinkedHashMap<>();
private final Map<String, List<String>> multiClassPartToOriginal = new HashMap<>();
- private final Box<int[]> metadataVersion = new Box<>();
+ private final Box<JvmMetadataVersion> metadataVersion = new Box<>();
private KotlinModuleInfoBuilder(String moduleName, AppView<?> appView) {
this.moduleName = moduleName;
@@ -183,8 +183,7 @@
}
return Optional.of(
DataEntryResource.fromBytes(
- new KotlinModuleMetadata(kmModule, new JvmMetadataVersion(metadataVersion.get()))
- .write(),
+ new KotlinModuleMetadata(kmModule, metadataVersion.get()).write(),
"META-INF/" + moduleName + ".kotlin_module",
Origin.unknown()));
}