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());
});
}