Ensure we print residual signature for fields
Bug: b/280802465
Change-Id: Ica38ed8fa2725b76ef9d5d76b583e41437348a50
diff --git a/src/main/java/com/android/tools/r8/naming/ClassNamingForNameMapper.java b/src/main/java/com/android/tools/r8/naming/ClassNamingForNameMapper.java
index 2323d03..809fd77 100644
--- a/src/main/java/com/android/tools/r8/naming/ClassNamingForNameMapper.java
+++ b/src/main/java/com/android/tools/r8/naming/ClassNamingForNameMapper.java
@@ -517,11 +517,19 @@
void write(ChainableStringConsumer consumer) {
consumer.accept(originalName).accept(" -> ").accept(renamedName).accept(":\n");
+ String spacing = " ";
+
// Print all additional mapping information.
additionalMappingInfo.forEach(info -> consumer.accept("# " + info.serialize()).accept("\n"));
// Print field member namings.
- forAllFieldNamingSorted(m -> consumer.accept(" ").accept(m.toString()).accept("\n"));
+ forAllFieldNamingSorted(
+ fieldMember -> {
+ consumer.accept(spacing).accept(fieldMember.toString()).accept("\n");
+ for (MappingInformation info : fieldMember.getAdditionalMappingInformation()) {
+ consumer.accept(spacing + " # ").accept(info.serialize()).accept("\n");
+ }
+ });
// Sort MappedRanges by sequence number to restore construction order (original Proguard-map
// input).
@@ -531,9 +539,9 @@
}
mappedRangesSorted.sort(Comparator.comparingInt(range -> range.sequenceNumber));
for (MappedRange range : mappedRangesSorted) {
- consumer.accept(" ").accept(range.toString()).accept("\n");
+ consumer.accept(spacing).accept(range.toString()).accept("\n");
for (MappingInformation info : range.getAdditionalMappingInformation()) {
- consumer.accept(" # ").accept(info.serialize()).accept("\n");
+ consumer.accept(spacing + " # ").accept(info.serialize()).accept("\n");
}
}
}
diff --git a/src/main/java/com/android/tools/r8/utils/positions/MappedPositionToClassNameMapperBuilder.java b/src/main/java/com/android/tools/r8/utils/positions/MappedPositionToClassNameMapperBuilder.java
index 262818c..c3780fb 100644
--- a/src/main/java/com/android/tools/r8/utils/positions/MappedPositionToClassNameMapperBuilder.java
+++ b/src/main/java/com/android/tools/r8/utils/positions/MappedPositionToClassNameMapperBuilder.java
@@ -193,14 +193,13 @@
DexField originalField = appView.graphLens().getOriginalFieldSignature(dexField);
DexField residualField =
appView.getNamingLens().lookupField(dexField, appView.dexItemFactory());
- // TODO(b/280802465): We should also check for field type being changed.
- if (residualField.name != originalField.name || originalField.holder != originalType) {
+ if (residualField.name != originalField.name
+ || residualField.getType() != originalField.getType()
+ || originalField.holder != originalType) {
FieldSignature originalSignature =
FieldSignature.fromDexField(originalField, originalField.holder != originalType);
FieldSignature residualSignature = FieldSignature.fromDexField(residualField);
MemberNaming memberNaming = new MemberNaming(originalSignature, residualSignature);
- // TODO(b/280802465): We should always emit the residual signature even if
- // the residual signature is just an alpha renaming of field type.
if (ResidualSignatureMappingInformation.isSupported(mapFileVersion)
&& !originalSignature.type.equals(residualSignature.type)) {
memberNaming.addMappingInformation(fromDexField(residualField), Unreachable::raise);
diff --git a/src/test/java/com/android/tools/r8/naming/FieldMinificationResidualSignatureTest.java b/src/test/java/com/android/tools/r8/naming/FieldMinificationResidualSignatureTest.java
index f3a5ce6..6466424 100644
--- a/src/test/java/com/android/tools/r8/naming/FieldMinificationResidualSignatureTest.java
+++ b/src/test/java/com/android/tools/r8/naming/FieldMinificationResidualSignatureTest.java
@@ -4,6 +4,7 @@
package com.android.tools.r8.naming;
+import static com.android.tools.r8.CollectorsUtils.toSingle;
import static org.junit.Assert.assertEquals;
import com.android.tools.r8.TestBase;
@@ -11,6 +12,7 @@
import com.android.tools.r8.TestParameters;
import com.android.tools.r8.TestParametersCollection;
import com.android.tools.r8.references.FieldReference;
+import com.android.tools.r8.references.Reference;
import com.android.tools.r8.retrace.ProguardMapProducer;
import com.android.tools.r8.retrace.Retracer;
import com.android.tools.r8.utils.AndroidApiLevel;
@@ -55,17 +57,16 @@
Retracer retracer =
Retracer.createDefault(
ProguardMapProducer.fromString(proguardMap), new TestDiagnosticMessagesImpl());
- // TODO(b/280802465): We should emit the residual signature to allow us looking up the original.
assertEquals(
- 0,
- retracer.retraceField(minifiedBField.get()).stream()
- .filter(rfe -> rfe.getField().isKnown())
- .count());
- assertEquals(
- 0,
+ Reference.fieldFromField(Main.class.getDeclaredField("a")),
retracer.retraceField(minifiedMainField.get()).stream()
- .filter(rfe -> rfe.getField().isKnown())
- .count());
+ .map(rfe -> rfe.getField().asKnown().getFieldReference())
+ .collect(toSingle()));
+ assertEquals(
+ Reference.fieldFromField(B.class.getDeclaredField("worldContainer")),
+ retracer.retraceField(minifiedBField.get()).stream()
+ .map(rfe -> rfe.getField().asKnown().getFieldReference())
+ .collect(toSingle()));
}
public static class Main {
diff --git a/src/test/java/com/android/tools/r8/naming/MinifierFieldSignatureTest.java b/src/test/java/com/android/tools/r8/naming/MinifierFieldSignatureTest.java
index 9dc47ba..f49e491 100644
--- a/src/test/java/com/android/tools/r8/naming/MinifierFieldSignatureTest.java
+++ b/src/test/java/com/android/tools/r8/naming/MinifierFieldSignatureTest.java
@@ -204,7 +204,7 @@
FieldSubject anX = lookupAnX(inspector);
FieldSubject anArrayOfX = lookupAnArrayOfX(inspector);
- FieldSubject aFieldsOfX =lookupAFieldsOfX(inspector);
+ FieldSubject aFieldsOfX = lookupAFieldsOfX(inspector);
FieldSubject aFieldsOfXInner = clazz.field("Fields$Inner", "aFieldsOfXInner");
// Check that all fields have been renamed
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/FoundFieldSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/FoundFieldSubject.java
index abc83be..66dc1f2 100644
--- a/src/test/java/com/android/tools/r8/utils/codeinspector/FoundFieldSubject.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/FoundFieldSubject.java
@@ -57,6 +57,13 @@
return signature;
}
+ // First check if we have residual signature information.
+
+ MemberNaming memberNaming = clazz.getNaming().lookup(signature);
+ if (memberNaming != null) {
+ return memberNaming.getOriginalSignature().asFieldSignature();
+ }
+
// Map the type to the original name. This is needed as the in the Proguard map the
// names on the left side are the original names. E.g.
//
@@ -70,9 +77,9 @@
String fieldType = originalType != null ? originalType : obfuscatedType;
FieldSignature lookupSignature = new FieldSignature(signature.name, fieldType);
- MemberNaming memberNaming = clazz.getNaming().lookup(lookupSignature);
+ memberNaming = clazz.getNaming().lookupByOriginalSignature(lookupSignature);
return memberNaming != null
- ? (FieldSignature) memberNaming.getOriginalSignature()
+ ? memberNaming.getOriginalSignature().asFieldSignature()
: lookupSignature;
}