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'