[Metadata] Remove instantiation of KotlinClassHeader

Bug: b/266682027
Change-Id: I47cfa03267c6f76f2b380bc5c65422635069c2b3
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 d02839a..7bae38e 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinClassMetadataReader.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinClassMetadataReader.java
@@ -23,7 +23,6 @@
 import java.util.function.Consumer;
 import kotlin.Metadata;
 import kotlinx.metadata.InconsistentKotlinMetadataException;
-import kotlinx.metadata.jvm.KotlinClassHeader;
 import kotlinx.metadata.jvm.KotlinClassMetadata;
 import kotlinx.metadata.jvm.KotlinClassMetadata.FileFacade;
 import kotlinx.metadata.jvm.KotlinClassMetadata.MultiFileClassFacade;
@@ -122,8 +121,8 @@
     Integer xi = extraInt == null ? null : (Integer) extraInt.value.getBoxedValue();
 
     try {
-      KotlinClassHeader header = new KotlinClassHeader(k, mv, d1, d2, xs, pn, xi);
-      return KotlinClassMetadata.read(header);
+      return KotlinClassMetadata.read(
+          new KotlinMetadataAnnotationWrapper(k, mv, d1, d2, xs, pn, xi));
     } catch (ClassCastException | InconsistentKotlinMetadataException | MetadataError e) {
       throw new KotlinMetadataException(e);
     }
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 a011e63..efbe154 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataAnnotationWrapper.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataAnnotationWrapper.java
@@ -4,38 +4,120 @@
 
 package com.android.tools.r8.kotlin;
 
+import com.android.tools.r8.errors.Unreachable;
+import java.lang.annotation.Annotation;
+import kotlin.Metadata;
 import kotlinx.metadata.jvm.KotlinClassMetadata;
 
 /***
  * This is a wrapper around kotlin.Metadata needed for tests to access the internal data. The need
  * for the wrapper comes from R8 relocating kotlin.* to com.android.tools.r8.kotlin.* in R8lib but
  * not in tests, so kotlin.Metadata cannot cross the boundary.
+ *
+ * Additionally, it is also used for passing in an instance of kotlin.Metadata which cannot be
+ * instantiated from Java.
  */
-public class KotlinMetadataAnnotationWrapper {
+public class KotlinMetadataAnnotationWrapper implements kotlin.Metadata {
 
-  private final kotlin.Metadata metadata;
+  private static final String[] NULL_STRING_ARRAY = new String[0];
+  private static final int[] NULL_INT_ARRAY = new int[0];
 
-  private KotlinMetadataAnnotationWrapper(kotlin.Metadata metadata) {
-    this.metadata = metadata;
+  private final int kind;
+  private final int[] metadataVersion;
+  private final String[] data1;
+  private final String[] data2;
+  private final int extraInt;
+  private final String extraString;
+  private final String packageName;
+
+  public KotlinMetadataAnnotationWrapper(
+      Integer kind,
+      int[] metadataVersion,
+      String[] data1,
+      String[] data2,
+      String extraString,
+      String packageName,
+      Integer extraInt) {
+    // The default values here are taking from the constructor of KotlinClassHeader.
+    this.kind = kind == null ? 1 : kind;
+    this.metadataVersion = metadataVersion == null ? NULL_INT_ARRAY : metadataVersion;
+    this.data1 = data1 == null ? NULL_STRING_ARRAY : data1;
+    this.data2 = data2 == null ? NULL_STRING_ARRAY : data2;
+    this.extraString = extraString == null ? "" : extraString;
+    this.packageName = packageName == null ? "" : packageName;
+    this.extraInt = extraInt == null ? 0 : extraInt;
   }
 
   public static KotlinMetadataAnnotationWrapper wrap(KotlinClassMetadata classMetadata) {
-    return new KotlinMetadataAnnotationWrapper(classMetadata.getAnnotationData());
+    Metadata annotationData = classMetadata.getAnnotationData();
+    return new KotlinMetadataAnnotationWrapper(
+        annotationData.k(),
+        annotationData.mv(),
+        annotationData.d1(),
+        annotationData.d2(),
+        annotationData.xs(),
+        annotationData.pn(),
+        annotationData.xi());
   }
 
   public int kind() {
-    return metadata.k();
+    return kind;
   }
 
   public String[] data1() {
-    return metadata.d1();
+    return data1;
   }
 
   public String[] data2() {
-    return metadata.d2();
+    return data2;
   }
 
   public String packageName() {
-    return metadata.pn();
+    return pn();
+  }
+
+  @Override
+  public int[] bv() {
+    throw new Unreachable("Field is deprecated and should not be used");
+  }
+
+  @Override
+  public String[] d1() {
+    return data1;
+  }
+
+  @Override
+  public String[] d2() {
+    return data2;
+  }
+
+  @Override
+  public int xi() {
+    return extraInt;
+  }
+
+  @Override
+  public String xs() {
+    return extraString;
+  }
+
+  @Override
+  public int k() {
+    return kind;
+  }
+
+  @Override
+  public int[] mv() {
+    return metadataVersion;
+  }
+
+  @Override
+  public String pn() {
+    return packageName;
+  }
+
+  @Override
+  public Class<? extends Annotation> annotationType() {
+    throw new Unreachable("Should never be called");
   }
 }