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