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;
+  }
+}