Update Kotlin Metadata library to versin 0.9.0
Originally landed with version 0.8.0 in
https://r8-review.git.corp.google.com/c/r8/+/87142
Change-Id: If58b742e2e476c72062041243bfdb05d3e1f5c14
Bug: b/315252098
diff --git a/d8_r8/commonBuildSrc/src/main/kotlin/DependenciesPlugin.kt b/d8_r8/commonBuildSrc/src/main/kotlin/DependenciesPlugin.kt
index fe9bd92..effc693 100644
--- a/d8_r8/commonBuildSrc/src/main/kotlin/DependenciesPlugin.kt
+++ b/d8_r8/commonBuildSrc/src/main/kotlin/DependenciesPlugin.kt
@@ -356,7 +356,7 @@
const val javassist = "3.29.2-GA"
const val junitVersion = "4.13-beta-2"
const val kotlinVersion = "1.9.0"
- const val kotlinMetadataVersion = "0.7.0"
+ const val kotlinMetadataVersion = "0.9.0"
const val mockito = "2.10.0"
const val smaliVersion = "3.0.3"
}
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinClassMetadataReader.java b/src/main/java/com/android/tools/r8/kotlin/KotlinClassMetadataReader.java
index 91d36c7..7ade086 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinClassMetadataReader.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinClassMetadataReader.java
@@ -25,7 +25,7 @@
import java.util.function.Consumer;
import java.util.function.Supplier;
import kotlin.Metadata;
-import kotlinx.metadata.InconsistentKotlinMetadataException;
+import kotlinx.metadata.jvm.JvmMetadataVersion;
import kotlinx.metadata.jvm.KotlinClassMetadata;
import kotlinx.metadata.jvm.KotlinClassMetadata.FileFacade;
import kotlinx.metadata.jvm.KotlinClassMetadata.MultiFileClassFacade;
@@ -181,9 +181,9 @@
Integer xi = extraInt == null ? null : (Integer) extraInt.value.getBoxedValue();
try {
- return KotlinClassMetadata.read(
+ return KotlinClassMetadata.readStrict(
new KotlinMetadataAnnotationWrapper(k, mv, d1, d2, xs, pn, xi));
- } catch (ClassCastException | InconsistentKotlinMetadataException | MetadataError e) {
+ } catch (ClassCastException | IllegalArgumentException | MetadataError e) {
throw new KotlinMetadataException(e);
}
}
@@ -196,15 +196,29 @@
return (Integer) kind.value.getBoxedValue();
}
+ public static Metadata extractMetadataWithPossiblyUnsupportedMetadataVersion(
+ KotlinClassMetadata kMetadata) {
+ JvmMetadataVersion version = kMetadata.getVersion();
+ if (version.getMajor() == 1 && version.getMinor() < 4) {
+ // From version 0.8.0 the kotlin metadata library cannot write metadata below Kotlin version
+ // 1.4. The writer can be tricked by temporarily setting a high enough version.
+ kMetadata.setVersion(KotlinJvmMetadataVersionUtils.MIN_SUPPORTED_VERSION);
+ Metadata metadata = kMetadata.write();
+ kMetadata.setVersion(version);
+ return metadata;
+ }
+ return kMetadata.write();
+ }
+
public static KotlinClassLevelInfo createKotlinInfo(
Kotlin kotlin,
DexClass clazz,
KotlinClassMetadata kMetadata,
AppView<?> appView,
Consumer<DexEncodedMethod> keepByteCode) {
- Metadata metadata = kMetadata.getAnnotationData$kotlinx_metadata_jvm();
+ Metadata metadata = extractMetadataWithPossiblyUnsupportedMetadataVersion(kMetadata);
String packageName = metadata.pn();
- int[] metadataVersion = metadata.mv();
+ int[] metadataVersion = KotlinJvmMetadataVersionUtils.toIntArray(kMetadata.getVersion());
if (kMetadata instanceof KotlinClassMetadata.Class) {
return KotlinClassInfo.create(
(KotlinClassMetadata.Class) kMetadata,
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinJvmMetadataVersionUtils.java b/src/main/java/com/android/tools/r8/kotlin/KotlinJvmMetadataVersionUtils.java
new file mode 100644
index 0000000..acf75d3
--- /dev/null
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinJvmMetadataVersionUtils.java
@@ -0,0 +1,16 @@
+// Copyright (c) 2024, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+package com.android.tools.r8.kotlin;
+
+import kotlinx.metadata.jvm.JvmMetadataVersion;
+
+public class KotlinJvmMetadataVersionUtils {
+
+ public static JvmMetadataVersion MIN_SUPPORTED_VERSION = new JvmMetadataVersion(1, 4, 0);
+
+ public static int[] toIntArray(JvmMetadataVersion version) {
+ return new int[] {version.getMajor(), version.getMinor(), version.getPatch()};
+ }
+}
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataAnnotationWrapper.java b/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataAnnotationWrapper.java
index d34a84f..149fec9 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataAnnotationWrapper.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataAnnotationWrapper.java
@@ -56,10 +56,12 @@
}
public static KotlinMetadataAnnotationWrapper wrap(KotlinClassMetadata classMetadata) {
- Metadata annotationData = classMetadata.getAnnotationData$kotlinx_metadata_jvm();
+ Metadata annotationData =
+ KotlinClassMetadataReader.extractMetadataWithPossiblyUnsupportedMetadataVersion(
+ classMetadata);
return new KotlinMetadataAnnotationWrapper(
annotationData.k(),
- annotationData.mv(),
+ KotlinJvmMetadataVersionUtils.toIntArray(classMetadata.getVersion()),
annotationData.d1(),
annotationData.d2(),
annotationData.xs(),
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 9504a38..76c2314 100644
--- a/src/main/java/com/android/tools/r8/naming/KotlinModuleSynthesizer.java
+++ b/src/main/java/com/android/tools/r8/naming/KotlinModuleSynthesizer.java
@@ -24,7 +24,9 @@
import java.util.List;
import java.util.Map;
import java.util.Optional;
-import kotlinx.metadata.jvm.KotlinModuleMetadata.Writer;
+import kotlinx.metadata.jvm.JvmMetadataVersion;
+import kotlinx.metadata.jvm.KmModule;
+import kotlinx.metadata.jvm.KotlinModuleMetadata;
/**
* The kotlin module synthesizer will scan through all file facades and multiclass files to figure
@@ -155,7 +157,7 @@
}
}
Collections.sort(packagesSorted);
- Writer writer = new Writer();
+ KmModule kmModule = new KmModule();
for (String newPackage : packagesSorted) {
// Calling other visitors than visitPackageParts are currently not supported.
// https://github.com/JetBrains/kotlin/blob/master/libraries/kotlinx-metadata/
@@ -174,14 +176,15 @@
newMultiFiles.put(classPart, rewrittenName);
});
});
- writer.visitPackageParts(
+ kmModule.visitPackageParts(
newPackage,
newFacades.getOrDefault(newPackage, Collections.emptyList()),
newMultiFiles);
}
return Optional.of(
DataEntryResource.fromBytes(
- writer.write(metadataVersion.get()),
+ new KotlinModuleMetadata(kmModule, new JvmMetadataVersion(metadataVersion.get()))
+ .write(),
"META-INF/" + moduleName + ".kotlin_module",
Origin.unknown()));
}
diff --git a/third_party/dependencies.tar.gz.sha1 b/third_party/dependencies.tar.gz.sha1
index 881fd9f..e6e6581 100644
--- a/third_party/dependencies.tar.gz.sha1
+++ b/third_party/dependencies.tar.gz.sha1
@@ -1 +1 @@
-57030c177bc708ee4537eabdb57356a58e46dbc2
\ No newline at end of file
+799dc154db4bd7687d0f22b90590555da831ef95
\ No newline at end of file
diff --git a/tools/create_local_maven_with_dependencies.py b/tools/create_local_maven_with_dependencies.py
index d16762e..36f9d1f 100755
--- a/tools/create_local_maven_with_dependencies.py
+++ b/tools/create_local_maven_with_dependencies.py
@@ -24,7 +24,7 @@
ASM_VERSION = '9.6' # When updating update tools/asmifier.py and Toolhelper as well.
ESPRESSO_VERSION = '3.0.0'
FASTUTIL_VERSION = '7.2.1'
-KOTLIN_METADATA_VERSION = '0.7.0'
+KOTLIN_METADATA_VERSION = '0.9.0'
KOTLIN_VERSION = '1.9.0'
GUAVA_VERSION = '32.1.2-jre'
GSON_VERSION = '2.10.1'