Add test for incorrect application of star in generic signature
Bug: 186547736
Change-Id: I98f64517c5eb2cefdaabb3f38e5d14c966058930
diff --git a/src/main/java/com/android/tools/r8/graph/GenericSignaturePartialTypeArgumentApplier.java b/src/main/java/com/android/tools/r8/graph/GenericSignaturePartialTypeArgumentApplier.java
index 2c17201..4420d43 100644
--- a/src/main/java/com/android/tools/r8/graph/GenericSignaturePartialTypeArgumentApplier.java
+++ b/src/main/java/com/android/tools/r8/graph/GenericSignaturePartialTypeArgumentApplier.java
@@ -37,10 +37,9 @@
}
public static GenericSignaturePartialTypeArgumentApplier build(
- AppView<?> appView, ClassSignature classSignature, Map<String, DexType> substitutions) {
+ DexType objectType, ClassSignature classSignature, Map<String, DexType> substitutions) {
GenericSignaturePartialTypeArgumentApplier applier =
- new GenericSignaturePartialTypeArgumentApplier(
- substitutions, appView.dexItemFactory().objectType);
+ new GenericSignaturePartialTypeArgumentApplier(substitutions, objectType);
classSignature.formalTypeParameters.forEach(
parameter -> applier.introducedClassTypeVariables.add(parameter.name));
return applier;
diff --git a/src/main/java/com/android/tools/r8/graph/GenericSignatureTypeVariableRemover.java b/src/main/java/com/android/tools/r8/graph/GenericSignatureTypeVariableRemover.java
index f33c9c3..23500e9 100644
--- a/src/main/java/com/android/tools/r8/graph/GenericSignatureTypeVariableRemover.java
+++ b/src/main/java/com/android/tools/r8/graph/GenericSignatureTypeVariableRemover.java
@@ -37,7 +37,7 @@
}
GenericSignaturePartialTypeArgumentApplier genericSignatureTypeArgumentApplier =
GenericSignaturePartialTypeArgumentApplier.build(
- appView, clazz.getClassSignature(), substitutions);
+ appView.dexItemFactory().objectType, clazz.getClassSignature(), substitutions);
clazz.setClassSignature(
genericSignatureTypeArgumentApplier.visitClassSignature(clazz.getClassSignature()));
clazz
diff --git a/src/test/java/com/android/tools/r8/graph/genericsignature/GenericSignaturePartialTypeArgumentApplierTest.java b/src/test/java/com/android/tools/r8/graph/genericsignature/GenericSignaturePartialTypeArgumentApplierTest.java
new file mode 100644
index 0000000..f566ca2
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/graph/genericsignature/GenericSignaturePartialTypeArgumentApplierTest.java
@@ -0,0 +1,83 @@
+// Copyright (c) 2021, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+package com.android.tools.r8.graph.genericsignature;
+
+import static com.android.tools.r8.DiagnosticsMatcher.diagnosticMessage;
+import static org.hamcrest.CoreMatchers.containsString;
+import static org.junit.Assert.assertEquals;
+
+import com.android.tools.r8.TestBase;
+import com.android.tools.r8.TestDiagnosticMessages;
+import com.android.tools.r8.TestDiagnosticMessagesImpl;
+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.GenericSignature.MethodTypeSignature;
+import com.android.tools.r8.graph.GenericSignaturePartialTypeArgumentApplier;
+import com.android.tools.r8.origin.Origin;
+import com.google.common.collect.ImmutableMap;
+import java.util.Map;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameters;
+
+@RunWith(Parameterized.class)
+public class GenericSignaturePartialTypeArgumentApplierTest extends TestBase {
+
+ private final TestParameters parameters;
+ private final DexItemFactory itemFactory = new DexItemFactory();
+ private final DexType objectType = itemFactory.objectType;
+
+ @Parameters(name = "{0}")
+ public static TestParametersCollection data() {
+ return getTestParameters().withNoneRuntime().build();
+ }
+
+ public GenericSignaturePartialTypeArgumentApplierTest(TestParameters parameters) {
+ this.parameters = parameters;
+ }
+
+ @Test
+ public void testVariablesInOuterPosition() {
+ // TODO(b/186547736): The expected signature should be (Ljava/lang/Object;)Ljava/lang/Object;
+ runTest(ImmutableMap.of("T", objectType, "R", objectType), "(TT;)TR;", "(*)*")
+ .assertWarningThatMatches(
+ diagnosticMessage(containsString("Invalid signature '(*)*' for method foo")));
+ }
+
+ @Test
+ public void testVariablesInInnerPosition() {
+ runTest(
+ ImmutableMap.of("T", objectType, "R", objectType),
+ "(LList<TT;>;)LList<TR;>;",
+ "(LList<*>;)LList<*>;")
+ .assertNoMessages();
+ }
+
+ private TestDiagnosticMessages runTest(
+ Map<String, DexType> substitutions,
+ String initialSignature,
+ String expectedRewrittenSignature) {
+ GenericSignaturePartialTypeArgumentApplier argumentApplier =
+ GenericSignaturePartialTypeArgumentApplier.build(
+ objectType, ClassSignature.noSignature(), substitutions);
+ TestDiagnosticMessagesImpl diagnosticsHandler = new TestDiagnosticMessagesImpl();
+ MethodTypeSignature methodTypeSignature =
+ argumentApplier.visitMethodSignature(
+ GenericSignature.parseMethodSignature(
+ "foo", initialSignature, Origin.unknown(), itemFactory, diagnosticsHandler));
+ diagnosticsHandler.assertNoMessages();
+ String rewrittenSignature =
+ argumentApplier.visitMethodSignature(methodTypeSignature).toString();
+ assertEquals(expectedRewrittenSignature, rewrittenSignature);
+ GenericSignature.parseMethodSignature(
+ "foo", rewrittenSignature, Origin.unknown(), itemFactory, diagnosticsHandler);
+ return diagnosticsHandler;
+ }
+}