[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");
}
}