Maintain unknown binary name for kotlin type references
Change-Id: Ic8903104faf05163ce50bc8704048cd8d5df089f
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinTypeReference.java b/src/main/java/com/android/tools/r8/kotlin/KotlinTypeReference.java
index f621afb..dd2be72 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinTypeReference.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinTypeReference.java
@@ -38,17 +38,23 @@
static KotlinTypeReference fromBinaryName(String binaryName, DexItemFactory factory) {
if (DescriptorUtils.isValidBinaryName(binaryName)) {
- return fromDescriptor(DescriptorUtils.getDescriptorFromClassBinaryName(binaryName), factory);
+ return fromDescriptor(
+ DescriptorUtils.getDescriptorFromClassBinaryName(binaryName), factory, binaryName);
}
return new KotlinTypeReference(binaryName);
}
static KotlinTypeReference fromDescriptor(String descriptor, DexItemFactory factory) {
+ return fromDescriptor(descriptor, factory, descriptor);
+ }
+
+ static KotlinTypeReference fromDescriptor(
+ String descriptor, DexItemFactory factory, String unknownValue) {
if (DescriptorUtils.isDescriptor(descriptor)) {
DexType type = factory.createType(descriptor);
return new KotlinTypeReference(type);
}
- return new KotlinTypeReference(descriptor);
+ return new KotlinTypeReference(unknownValue);
}
String toRenamedDescriptorOrDefault(
diff --git a/src/test/java/com/android/tools/r8/kotlin/coroutines/KotlinxCoroutinesTestRunner.java b/src/test/java/com/android/tools/r8/kotlin/coroutines/KotlinxCoroutinesTestRunner.java
index 2da6a3d..8202a9c 100644
--- a/src/test/java/com/android/tools/r8/kotlin/coroutines/KotlinxCoroutinesTestRunner.java
+++ b/src/test/java/com/android/tools/r8/kotlin/coroutines/KotlinxCoroutinesTestRunner.java
@@ -7,12 +7,13 @@
import static com.android.tools.r8.KotlinCompilerTool.KOTLINC;
import static org.junit.Assert.assertEquals;
-import com.android.tools.r8.KotlinTestBase;
import com.android.tools.r8.TestParameters;
import com.android.tools.r8.ToolHelper;
import com.android.tools.r8.ToolHelper.KotlinTargetVersion;
import com.android.tools.r8.ToolHelper.ProcessResult;
+import com.android.tools.r8.kotlin.metadata.KotlinMetadataTestBase;
import com.android.tools.r8.utils.ZipUtils;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Sets;
import java.io.IOException;
@@ -27,7 +28,7 @@
import org.junit.runners.Parameterized;
@RunWith(Parameterized.class)
-public class KotlinxCoroutinesTestRunner extends KotlinTestBase {
+public class KotlinxCoroutinesTestRunner extends KotlinMetadataTestBase {
private static final String PKG = "kotlinx-coroutines-1.3.6";
private static final Path BASE_LIBRARY =
@@ -80,6 +81,7 @@
"-dontwarn org.junit.runners.model.Statement",
"-dontwarn org.junit.rules.TestRule")
.compile()
+ .inspect(inspector -> assertEqualMetadata(new CodeInspector(BASE_LIBRARY), inspector))
.writeToZip();
compileTestSources(baseJar);
// TODO(b/157977713): We should be able to run tests.
diff --git a/src/test/java/com/android/tools/r8/kotlin/metadata/KotlinMetadataTestBase.java b/src/test/java/com/android/tools/r8/kotlin/metadata/KotlinMetadataTestBase.java
index 87b5d10..99aaf1b 100644
--- a/src/test/java/com/android/tools/r8/kotlin/metadata/KotlinMetadataTestBase.java
+++ b/src/test/java/com/android/tools/r8/kotlin/metadata/KotlinMetadataTestBase.java
@@ -3,13 +3,25 @@
// BSD-style license that can be found in the LICENSE file.
package com.android.tools.r8.kotlin.metadata;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
+import static junit.framework.TestCase.assertNotNull;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.junit.Assert.assertNull;
+
import com.android.tools.r8.ToolHelper.KotlinTargetVersion;
import com.android.tools.r8.kotlin.AbstractR8KotlinTestBase;
+import com.android.tools.r8.kotlin.KotlinMetadataWriter;
import com.android.tools.r8.utils.DescriptorUtils;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.FoundClassSubject;
+import junit.framework.TestCase;
+import kotlinx.metadata.jvm.KotlinClassHeader;
+import kotlinx.metadata.jvm.KotlinClassMetadata;
-abstract class KotlinMetadataTestBase extends AbstractR8KotlinTestBase {
+public abstract class KotlinMetadataTestBase extends AbstractR8KotlinTestBase {
- KotlinMetadataTestBase(KotlinTargetVersion targetVersion) {
+ public KotlinMetadataTestBase(KotlinTargetVersion targetVersion) {
super(targetVersion);
}
@@ -27,4 +39,29 @@
static final String KT_FUNCTION1 = "Lkotlin/Function1;";
static final String KT_COMPARABLE = "Lkotlin/Comparable;";
+
+ public void assertEqualMetadata(CodeInspector originalInspector, CodeInspector rewrittenInspector)
+ throws Exception {
+ for (FoundClassSubject clazzSubject : originalInspector.allClasses()) {
+ ClassSubject r8Clazz = rewrittenInspector.clazz(clazzSubject.getOriginalName());
+ assertThat(r8Clazz, isPresent());
+ KotlinClassMetadata originalMetadata = clazzSubject.getKotlinClassMetadata();
+ KotlinClassMetadata rewrittenMetadata = r8Clazz.getKotlinClassMetadata();
+ if (originalMetadata == null) {
+ assertNull(rewrittenMetadata);
+ continue;
+ }
+ assertNotNull(rewrittenMetadata);
+ KotlinClassHeader originalHeader = originalMetadata.getHeader();
+ KotlinClassHeader rewrittenHeader = rewrittenMetadata.getHeader();
+ TestCase.assertEquals(originalHeader.getKind(), rewrittenHeader.getKind());
+ // TODO(b/154199572): Should we check for meta-data version?
+ TestCase.assertEquals(originalHeader.getPackageName(), rewrittenHeader.getPackageName());
+ // We cannot assert equality of the data since it may be ordered differently. Instead we use
+ // the KotlinMetadataWriter.
+ String expected = KotlinMetadataWriter.kotlinMetadataToString("", originalMetadata);
+ String actual = KotlinMetadataWriter.kotlinMetadataToString("", rewrittenMetadata);
+ TestCase.assertEquals(expected, actual);
+ }
+ }
}
diff --git a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewritePassThroughTest.java b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewritePassThroughTest.java
index a17f7dc..71d888c 100644
--- a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewritePassThroughTest.java
+++ b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewritePassThroughTest.java
@@ -4,25 +4,12 @@
package com.android.tools.r8.kotlin.metadata;
-import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
-import static junit.framework.TestCase.assertEquals;
-import static junit.framework.TestCase.assertNotNull;
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.junit.Assert.assertNull;
-
import com.android.tools.r8.TestParameters;
import com.android.tools.r8.ToolHelper;
import com.android.tools.r8.ToolHelper.KotlinTargetVersion;
-import com.android.tools.r8.kotlin.KotlinMetadataWriter;
import com.android.tools.r8.shaking.ProguardKeepAttributes;
-import com.android.tools.r8.utils.codeinspector.ClassSubject;
import com.android.tools.r8.utils.codeinspector.CodeInspector;
-import com.android.tools.r8.utils.codeinspector.FoundClassSubject;
-import java.io.IOException;
import java.util.Collection;
-import java.util.concurrent.ExecutionException;
-import kotlinx.metadata.jvm.KotlinClassHeader;
-import kotlinx.metadata.jvm.KotlinClassMetadata;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
@@ -53,31 +40,8 @@
.addKeepKotlinMetadata()
.addKeepAttributes(ProguardKeepAttributes.RUNTIME_VISIBLE_ANNOTATIONS)
.compile()
- .inspect(this::inspect);
- }
-
- public void inspect(CodeInspector inspector) throws IOException, ExecutionException {
- CodeInspector stdLibInspector = new CodeInspector(ToolHelper.getKotlinStdlibJar());
- for (FoundClassSubject clazzSubject : stdLibInspector.allClasses()) {
- ClassSubject r8Clazz = inspector.clazz(clazzSubject.getOriginalName());
- assertThat(r8Clazz, isPresent());
- KotlinClassMetadata originalMetadata = clazzSubject.getKotlinClassMetadata();
- KotlinClassMetadata rewrittenMetadata = r8Clazz.getKotlinClassMetadata();
- if (originalMetadata == null) {
- assertNull(rewrittenMetadata);
- continue;
- }
- assertNotNull(rewrittenMetadata);
- KotlinClassHeader originalHeader = originalMetadata.getHeader();
- KotlinClassHeader rewrittenHeader = rewrittenMetadata.getHeader();
- assertEquals(originalHeader.getKind(), rewrittenHeader.getKind());
- // TODO(b/154199572): Should we check for meta-data version?
- assertEquals(originalHeader.getPackageName(), rewrittenHeader.getPackageName());
- // We cannot assert equality of the data since it may be ordered differently. Instead we use
- // the KotlinMetadataWriter.
- String expected = KotlinMetadataWriter.kotlinMetadataToString("", originalMetadata);
- String actual = KotlinMetadataWriter.kotlinMetadataToString("", rewrittenMetadata);
- assertEquals(expected, actual);
- }
+ .inspect(
+ inspector ->
+ assertEqualMetadata(new CodeInspector(ToolHelper.getKotlinStdlibJar()), inspector));
}
}