Add test for incorrect interface bound rewriting in signature
Bug: 185372761
Change-Id: Ia402b559242c51966e422c7dabf697cf15c1f203
diff --git a/src/main/java/com/android/tools/r8/graph/GenericSignature.java b/src/main/java/com/android/tools/r8/graph/GenericSignature.java
index bf7c42b..6c5e392 100644
--- a/src/main/java/com/android/tools/r8/graph/GenericSignature.java
+++ b/src/main/java/com/android/tools/r8/graph/GenericSignature.java
@@ -7,11 +7,11 @@
import static com.android.tools.r8.utils.DescriptorUtils.getDescriptorFromClassBinaryName;
import static com.google.common.base.Predicates.alwaysTrue;
+import com.android.tools.r8.DiagnosticsHandler;
import com.android.tools.r8.errors.Unreachable;
import com.android.tools.r8.naming.NamingLens;
import com.android.tools.r8.origin.Origin;
import com.android.tools.r8.utils.DescriptorUtils;
-import com.android.tools.r8.utils.Reporter;
import com.google.common.collect.ImmutableList;
import java.lang.reflect.GenericSignatureFormatError;
import java.nio.CharBuffer;
@@ -857,7 +857,7 @@
String signature,
Origin origin,
DexItemFactory factory,
- Reporter reporter) {
+ DiagnosticsHandler diagnosticsHandler) {
if (signature == null || signature.isEmpty()) {
return ClassSignature.NO_CLASS_SIGNATURE;
}
@@ -865,7 +865,7 @@
try {
return parser.parseClassSignature(signature);
} catch (GenericSignatureFormatError e) {
- reporter.warning(
+ diagnosticsHandler.warning(
GenericSignatureDiagnostic.invalidClassSignature(signature, className, origin, e));
return ClassSignature.NO_CLASS_SIGNATURE;
}
@@ -876,7 +876,7 @@
String signature,
Origin origin,
DexItemFactory factory,
- Reporter reporter) {
+ DiagnosticsHandler diagnosticsHandler) {
if (signature == null || signature.isEmpty()) {
return NO_FIELD_TYPE_SIGNATURE;
}
@@ -884,7 +884,7 @@
try {
return parser.parseFieldTypeSignature(signature);
} catch (GenericSignatureFormatError e) {
- reporter.warning(
+ diagnosticsHandler.warning(
GenericSignatureDiagnostic.invalidFieldSignature(signature, fieldName, origin, e));
return GenericSignature.NO_FIELD_TYPE_SIGNATURE;
}
@@ -895,7 +895,7 @@
String signature,
Origin origin,
DexItemFactory factory,
- Reporter reporter) {
+ DiagnosticsHandler diagnosticsHandler) {
if (signature == null || signature.isEmpty()) {
return MethodTypeSignature.NO_METHOD_TYPE_SIGNATURE;
}
@@ -903,7 +903,7 @@
try {
return parser.parseMethodTypeSignature(signature);
} catch (GenericSignatureFormatError e) {
- reporter.warning(
+ diagnosticsHandler.warning(
GenericSignatureDiagnostic.invalidMethodSignature(signature, methodName, origin, e));
return MethodTypeSignature.NO_METHOD_TYPE_SIGNATURE;
}
diff --git a/src/main/java/com/android/tools/r8/graph/GenericSignatureTypeRewriter.java b/src/main/java/com/android/tools/r8/graph/GenericSignatureTypeRewriter.java
index 6d31cca..c19d198 100644
--- a/src/main/java/com/android/tools/r8/graph/GenericSignatureTypeRewriter.java
+++ b/src/main/java/com/android/tools/r8/graph/GenericSignatureTypeRewriter.java
@@ -28,7 +28,7 @@
private final DexItemFactory factory;
private final Predicate<DexType> wasPruned;
private final Function<DexType, DexType> lookupType;
- private final DexProgramClass context;
+ private final DexType context;
private final FieldTypeSignature objectTypeSignature;
@@ -39,14 +39,14 @@
? appView.appInfo().withLiveness()::wasPruned
: alwaysFalse(),
appView.graphLens()::lookupType,
- context);
+ context.getType());
}
public GenericSignatureTypeRewriter(
DexItemFactory factory,
Predicate<DexType> wasPruned,
Function<DexType, DexType> lookupType,
- DexProgramClass context) {
+ DexType context) {
this.factory = factory;
this.wasPruned = wasPruned;
this.lookupType = lookupType;
@@ -133,7 +133,7 @@
@Override
public ClassTypeSignature visitSuperClass(ClassTypeSignature classTypeSignature) {
ClassTypeSignature rewritten = classTypeSignature.visit(this);
- return rewritten == null || rewritten.type() == context.type
+ return rewritten == null || rewritten.type() == context
? new ClassTypeSignature(factory.objectType, EMPTY_TYPE_ARGUMENTS)
: rewritten;
}
@@ -150,7 +150,7 @@
@Override
public ClassTypeSignature visitSuperInterface(ClassTypeSignature classTypeSignature) {
ClassTypeSignature rewritten = classTypeSignature.visit(this);
- return rewritten == null || rewritten.type() == context.type ? null : rewritten;
+ return rewritten == null || rewritten.type() == context ? null : rewritten;
}
@Override
diff --git a/src/test/java/com/android/tools/r8/graph/genericsignature/ClassSignatureTest.java b/src/test/java/com/android/tools/r8/graph/genericsignature/ClassSignatureTest.java
index 239d924..af28d8e 100644
--- a/src/test/java/com/android/tools/r8/graph/genericsignature/ClassSignatureTest.java
+++ b/src/test/java/com/android/tools/r8/graph/genericsignature/ClassSignatureTest.java
@@ -8,7 +8,10 @@
import static com.google.common.base.Predicates.alwaysFalse;
import static org.hamcrest.CoreMatchers.containsString;
import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertThrows;
+import static org.junit.Assert.assertTrue;
import com.android.tools.r8.TestBase;
import com.android.tools.r8.TestDiagnosticMessages;
@@ -16,12 +19,15 @@
import com.android.tools.r8.TestParameters;
import com.android.tools.r8.TestParametersCollection;
import com.android.tools.r8.graph.DexItemFactory;
+import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.graph.GenericSignature;
import com.android.tools.r8.graph.GenericSignature.ClassSignature;
import com.android.tools.r8.graph.GenericSignaturePrinter;
+import com.android.tools.r8.graph.GenericSignatureTypeRewriter;
import com.android.tools.r8.naming.NamingLens;
import com.android.tools.r8.origin.Origin;
import com.android.tools.r8.utils.Reporter;
+import java.util.function.Function;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
@@ -153,6 +159,39 @@
assertThrows(AssertionError.class, () -> testParsingAndPrintingError("<>Lfoo/bar/baz<TT;>;"));
}
+ @Test
+ public void testPruningInterfaceBound() {
+ DexItemFactory factory = new DexItemFactory();
+ DexType context = factory.createType("Lj$/util/stream/Node$OfPrimitive;");
+ String className = "j$.util.stream.Node$OfPrimitive";
+ TestDiagnosticMessagesImpl testDiagnosticMessages = new TestDiagnosticMessagesImpl();
+ ClassSignature parsedClassSignature =
+ GenericSignature.parseClassSignature(
+ className,
+ "<T_SPLITR::Lj$/util/Spliterator$OfPrimitive;T_NODE:Ljava/lang/Object;>"
+ + "Ljava/lang/Object;",
+ Origin.unknown(),
+ factory,
+ testDiagnosticMessages);
+ testDiagnosticMessages.assertNoMessages();
+ assertTrue(parsedClassSignature.hasSignature());
+ GenericSignatureTypeRewriter rewriter =
+ new GenericSignatureTypeRewriter(
+ factory,
+ dexType -> dexType.toDescriptorString().equals("Lj$/util/Spliterator$OfPrimitive;"),
+ Function.identity(),
+ context);
+ ClassSignature rewritten = rewriter.rewrite(parsedClassSignature);
+ assertNotNull(rewritten);
+ assertTrue(rewritten.hasSignature());
+ ClassSignature reparsed =
+ GenericSignature.parseClassSignature(
+ className, rewritten.toString(), Origin.unknown(), factory, testDiagnosticMessages);
+ assertFalse(reparsed.hasSignature());
+ testDiagnosticMessages.assertWarningThatMatches(
+ diagnosticMessage(containsString("Invalid signature")));
+ }
+
private void testParsingAndPrintingEqual(String signature) {
ClassSignature parsed =
GenericSignature.parseClassSignature(