Check the existence of JvmConstructorExtension by using visitor.
Bug: 70169921
Change-Id: I1920844a9e1a8653fdb805efbd9c0e295a9e724d
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataJvmExtensionUtils.java b/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataJvmExtensionUtils.java
index 66208ad..85e3540 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataJvmExtensionUtils.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataJvmExtensionUtils.java
@@ -6,6 +6,9 @@
import com.google.common.collect.ImmutableList;
import java.util.Arrays;
import java.util.List;
+import kotlinx.metadata.KmConstructor;
+import kotlinx.metadata.KmConstructorExtensionVisitor;
+import kotlinx.metadata.KmConstructorVisitor;
import kotlinx.metadata.KmExtensionType;
import kotlinx.metadata.KmFunction;
import kotlinx.metadata.KmFunctionExtensionVisitor;
@@ -13,6 +16,7 @@
import kotlinx.metadata.KmProperty;
import kotlinx.metadata.KmPropertyExtensionVisitor;
import kotlinx.metadata.KmPropertyVisitor;
+import kotlinx.metadata.jvm.JvmConstructorExtensionVisitor;
import kotlinx.metadata.jvm.JvmFieldSignature;
import kotlinx.metadata.jvm.JvmFunctionExtensionVisitor;
import kotlinx.metadata.jvm.JvmMethodSignature;
@@ -73,6 +77,32 @@
}
}
+ static class KmConstructorProcessor {
+ private JvmMethodSignature signature = null;
+
+ KmConstructorProcessor(KmConstructor kmConstructor) {
+ kmConstructor.accept(new KmConstructorVisitor() {
+ @Override
+ public KmConstructorExtensionVisitor visitExtensions(KmExtensionType type) {
+ if (type != JvmConstructorExtensionVisitor.TYPE) {
+ return null;
+ }
+ return new JvmConstructorExtensionVisitor() {
+ @Override
+ public void visit(JvmMethodSignature desc) {
+ assert signature == null : signature.asString();
+ signature = desc;
+ }
+ };
+ }
+ });
+ }
+
+ JvmMethodSignature signature() {
+ return signature;
+ }
+ }
+
static class KmFunctionProcessor {
// Custom name via @JvmName("..."). Otherwise, null.
private JvmMethodSignature signature = null;
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataSynthesizer.java b/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataSynthesizer.java
index 80069a2..5f7843f 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataSynthesizer.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataSynthesizer.java
@@ -16,11 +16,11 @@
import com.android.tools.r8.graph.DexEncodedMethod;
import com.android.tools.r8.graph.DexMethod;
import com.android.tools.r8.graph.DexType;
+import com.android.tools.r8.kotlin.KotlinMetadataJvmExtensionUtils.KmConstructorProcessor;
import com.android.tools.r8.kotlin.KotlinMetadataJvmExtensionUtils.KmFunctionProcessor;
import com.android.tools.r8.kotlin.KotlinMetadataJvmExtensionUtils.KmPropertyProcessor;
import com.android.tools.r8.naming.NamingLens;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
-import com.android.tools.r8.utils.Box;
import java.util.List;
import kotlinx.metadata.KmConstructor;
import kotlinx.metadata.KmFunction;
@@ -263,9 +263,10 @@
}
// TODO(b/70169921): {@link KmConstructor.extensions} is private, i.e., no way to alter!
// Thus, we rely on original metadata for now.
- Box<Boolean> hasJvmExtension = new Box<>(false);
+ KmConstructorProcessor kmConstructorProcessor = new KmConstructorProcessor(original);
+ JvmMethodSignature jvmMethodSignature = kmConstructorProcessor.signature();
KmConstructor kmConstructor =
- hasJvmExtension.get()
+ jvmMethodSignature != null
? original
// TODO(b/70169921): Consult kotlinx.metadata.Flag.Constructor to set IS_PRIMARY.
: new KmConstructor(method.accessFlags.getAsKotlinFlags());