Ensure we null out generic signatures for changed methods and fields

Bug: 215118784
Change-Id: I51dc5e8b204cf290a3452bc985939149312c3cfd
diff --git a/src/main/java/com/android/tools/r8/graph/TreeFixerBase.java b/src/main/java/com/android/tools/r8/graph/TreeFixerBase.java
index 16427bf..f9e2af2 100644
--- a/src/main/java/com/android/tools/r8/graph/TreeFixerBase.java
+++ b/src/main/java/com/android/tools/r8/graph/TreeFixerBase.java
@@ -5,12 +5,14 @@
 package com.android.tools.r8.graph;
 
 import com.android.tools.r8.shaking.AppInfoWithLiveness;
+import com.android.tools.r8.utils.ConsumerUtils;
 import com.android.tools.r8.utils.DescriptorUtils;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.IdentityHashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.function.Consumer;
 
 public abstract class TreeFixerBase {
 
@@ -165,21 +167,28 @@
 
   /** Fixup a list of fields. */
   public DexEncodedField[] fixupFields(List<DexEncodedField> fields) {
+    return fixupFields(fields, ConsumerUtils.emptyConsumer());
+  }
+
+  public DexEncodedField[] fixupFields(
+      List<DexEncodedField> fields, Consumer<DexEncodedField.Builder> consumer) {
     if (fields == null) {
       return DexEncodedField.EMPTY_ARRAY;
     }
     DexEncodedField[] newFields = new DexEncodedField[fields.size()];
     for (int i = 0; i < fields.size(); i++) {
-      newFields[i] = fixupField(fields.get(i));
+      newFields[i] = fixupField(fields.get(i), consumer);
     }
     return newFields;
   }
 
-  private DexEncodedField fixupField(DexEncodedField field) {
+  private DexEncodedField fixupField(
+      DexEncodedField field, Consumer<DexEncodedField.Builder> consumer) {
     DexField fieldReference = field.getReference();
     DexField newFieldReference = fixupFieldReference(fieldReference);
     if (newFieldReference != fieldReference) {
-      return recordFieldChange(field, field.toTypeSubstitutedField(appView, newFieldReference));
+      return recordFieldChange(
+          field, field.toTypeSubstitutedField(appView, newFieldReference, consumer));
     }
     return field;
   }
diff --git a/src/main/java/com/android/tools/r8/optimize/argumentpropagation/ArgumentPropagatorApplicationFixer.java b/src/main/java/com/android/tools/r8/optimize/argumentpropagation/ArgumentPropagatorApplicationFixer.java
index d8757d1..8e3c203 100644
--- a/src/main/java/com/android/tools/r8/optimize/argumentpropagation/ArgumentPropagatorApplicationFixer.java
+++ b/src/main/java/com/android/tools/r8/optimize/argumentpropagation/ArgumentPropagatorApplicationFixer.java
@@ -14,6 +14,8 @@
 import com.android.tools.r8.graph.DexMethod;
 import com.android.tools.r8.graph.DexProgramClass;
 import com.android.tools.r8.graph.DexType;
+import com.android.tools.r8.graph.GenericSignature.FieldTypeSignature;
+import com.android.tools.r8.graph.GenericSignature.MethodTypeSignature;
 import com.android.tools.r8.graph.MethodCollection;
 import com.android.tools.r8.graph.PrunedItems;
 import com.android.tools.r8.graph.RewrittenPrototypeDescription;
@@ -75,8 +77,14 @@
   }
 
   private void fixupFields(DexProgramClass clazz) {
-    clazz.setInstanceFields(fixupFields(clazz.instanceFields()));
-    clazz.setStaticFields(fixupFields(clazz.staticFields()));
+    clazz.setInstanceFields(
+        fixupFields(
+            clazz.instanceFields(),
+            builder -> builder.setGenericSignature(FieldTypeSignature.noSignature())));
+    clazz.setStaticFields(
+        fixupFields(
+            clazz.staticFields(),
+            builder -> builder.setGenericSignature(FieldTypeSignature.noSignature())));
   }
 
   private void fixupMethods(DexProgramClass clazz) {
@@ -97,8 +105,9 @@
                 if (graphLens.hasPrototypeChanges(methodReferenceAfterParameterRemoval)) {
                   RewrittenPrototypeDescription prototypeChanges =
                       graphLens.getPrototypeChanges(methodReferenceAfterParameterRemoval);
-                  builder.apply(prototypeChanges.createParameterAnnotationsRemover(method));
-
+                  builder
+                      .apply(prototypeChanges.createParameterAnnotationsRemover(method))
+                      .setGenericSignature(MethodTypeSignature.noSignature());
                   if (method.isInstance()
                       && prototypeChanges.getArgumentInfoCollection().isArgumentRemoved(0)) {
                     builder
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/unusedarguments/ConstantArgumentUpdateGenericSignatureTest.java b/src/test/java/com/android/tools/r8/ir/optimize/unusedarguments/ConstantArgumentUpdateGenericSignatureTest.java
index 344f519..2619ab8 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/unusedarguments/ConstantArgumentUpdateGenericSignatureTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/unusedarguments/ConstantArgumentUpdateGenericSignatureTest.java
@@ -8,6 +8,7 @@
 import static com.android.tools.r8.utils.codeinspector.Matchers.isPresentAndRenamed;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
 
 import com.android.tools.r8.NeverClassInline;
 import com.android.tools.r8.NeverInline;
@@ -52,8 +53,7 @@
               MethodSubject foo =
                   classA.uniqueMethodThatMatches(method -> !method.isInstanceInitializer());
               assertThat(foo, isPresent());
-              // TODO(b/215118784): The generic signature still has a parameter.
-              assertEquals("(TT;)V", foo.getFinalSignatureAttribute());
+              assertNull(foo.getFinalSignatureAttribute());
               assertEquals("void a()", foo.getFinalSignature().toString());
             });
   }
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/unusedarguments/ConstantArgumentWithUnusedArgumentUpdateGenericSignatureTest.java b/src/test/java/com/android/tools/r8/ir/optimize/unusedarguments/ConstantArgumentWithUnusedArgumentUpdateGenericSignatureTest.java
index de51003..ea624dc 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/unusedarguments/ConstantArgumentWithUnusedArgumentUpdateGenericSignatureTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/unusedarguments/ConstantArgumentWithUnusedArgumentUpdateGenericSignatureTest.java
@@ -8,6 +8,7 @@
 import static com.android.tools.r8.utils.codeinspector.Matchers.isPresentAndRenamed;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
 
 import com.android.tools.r8.NeverClassInline;
 import com.android.tools.r8.NeverInline;
@@ -52,8 +53,7 @@
               MethodSubject foo =
                   classA.uniqueMethodThatMatches(method -> !method.isInstanceInitializer());
               assertThat(foo, isPresent());
-              // TODO(b/215118784): The generic signature still has 3 parameters.
-              assertEquals("(TT;ITT;)V", foo.getFinalSignatureAttribute());
+              assertNull(foo.getFinalSignatureAttribute());
               assertEquals("void a(int)", foo.getFinalSignature().toString());
             });
   }
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/unusedarguments/StaticizeUpdateGenericSignatureTest.java b/src/test/java/com/android/tools/r8/ir/optimize/unusedarguments/StaticizeUpdateGenericSignatureTest.java
index 3daf59c..da960e7 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/unusedarguments/StaticizeUpdateGenericSignatureTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/unusedarguments/StaticizeUpdateGenericSignatureTest.java
@@ -8,6 +8,7 @@
 import static com.android.tools.r8.utils.codeinspector.Matchers.isPresentAndRenamed;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
 
 import com.android.tools.r8.KeepConstantArguments;
 import com.android.tools.r8.NeverClassInline;
@@ -53,7 +54,7 @@
               assertThat(classA, isPresentAndRenamed());
               MethodSubject foo = classA.uniqueMethod();
               assertThat(foo, isPresent());
-              assertEquals("(TT;)Ljava/lang/String;", foo.getFinalSignatureAttribute());
+              assertNull(foo.getFinalSignatureAttribute());
               assertEquals(
                   "java.lang.String a(java.lang.Object)", foo.getFinalSignature().toString());
             });
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/unusedarguments/UnusedArgumentUpdateGenericSignatureTest.java b/src/test/java/com/android/tools/r8/ir/optimize/unusedarguments/UnusedArgumentUpdateGenericSignatureTest.java
index be8700e..4ebb10e 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/unusedarguments/UnusedArgumentUpdateGenericSignatureTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/unusedarguments/UnusedArgumentUpdateGenericSignatureTest.java
@@ -8,6 +8,7 @@
 import static com.android.tools.r8.utils.codeinspector.Matchers.isPresentAndRenamed;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
 
 import com.android.tools.r8.NeverClassInline;
 import com.android.tools.r8.NeverInline;
@@ -54,8 +55,7 @@
               MethodSubject foo =
                   classA.uniqueMethodThatMatches(method -> !method.isInstanceInitializer());
               assertThat(foo, isPresent());
-              // TODO(b/215118784): The generic signature still has a parameter.
-              assertEquals("(TT;)Ljava/lang/String;", foo.getFinalSignatureAttribute());
+              assertNull(foo.getFinalSignatureAttribute());
               assertEquals("java.lang.String a()", foo.getFinalSignature().toString());
             });
   }