Separate field and method namings

Change-Id: Ic4f8bdaae24bedaa39a073b80ac709df84a21931
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 98293ab..28cdcf5 100644
--- a/src/main/java/com/android/tools/r8/naming/ClassNamingForNameMapper.java
+++ b/src/main/java/com/android/tools/r8/naming/ClassNamingForNameMapper.java
@@ -40,7 +40,7 @@
     private final Map<MethodSignature, MemberNaming> methodMembers = Maps.newHashMap();
     private final Map<FieldSignature, MemberNaming> fieldMembers = Maps.newHashMap();
     private final Map<String, List<MappedRange>> mappedRangesByName = Maps.newHashMap();
-    private final Map<String, List<MemberNaming>> mappedNamingsByName = Maps.newHashMap();
+    private final Map<String, List<MemberNaming>> mappedFieldNamingsByName = Maps.newHashMap();
     private final Map<Signature, List<MappingInformation>> additionalMappings = Maps.newHashMap();
 
     private Builder(String renamedName, String originalName) {
@@ -54,10 +54,10 @@
         methodMembers.put(entry.getRenamedSignature().asMethodSignature(), entry);
       } else {
         fieldMembers.put(entry.getRenamedSignature().asFieldSignature(), entry);
+        mappedFieldNamingsByName
+            .computeIfAbsent(entry.getRenamedName(), m -> new ArrayList<>())
+            .add(entry);
       }
-      mappedNamingsByName
-          .computeIfAbsent(entry.getRenamedName(), m -> new ArrayList<>())
-          .add(entry);
       return this;
     }
 
@@ -119,7 +119,7 @@
           methodMembers,
           fieldMembers,
           map,
-          mappedNamingsByName,
+          mappedFieldNamingsByName,
           additionalMappings);
     }
 
@@ -249,7 +249,7 @@
   /** Map of renamed name -> MappedRangesOfName */
   public final Map<String, MappedRangesOfName> mappedRangesByRenamedName;
 
-  public final Map<String, List<MemberNaming>> mappedNamingsByName;
+  public final Map<String, List<MemberNaming>> mappedFieldNamingsByName;
 
   private final Map<Signature, List<MappingInformation>> additionalMappings;
 
@@ -259,14 +259,14 @@
       Map<MethodSignature, MemberNaming> methodMembers,
       Map<FieldSignature, MemberNaming> fieldMembers,
       Map<String, MappedRangesOfName> mappedRangesByRenamedName,
-      Map<String, List<MemberNaming>> mappedNamingsByName,
+      Map<String, List<MemberNaming>> mappedFieldNamingsByName,
       Map<Signature, List<MappingInformation>> additionalMappings) {
     this.renamedName = renamedName;
     this.originalName = originalName;
     this.methodMembers = ImmutableMap.copyOf(methodMembers);
     this.fieldMembers = ImmutableMap.copyOf(fieldMembers);
     this.mappedRangesByRenamedName = mappedRangesByRenamedName;
-    this.mappedNamingsByName = mappedNamingsByName;
+    this.mappedFieldNamingsByName = mappedFieldNamingsByName;
     this.additionalMappings = additionalMappings;
   }
 
diff --git a/src/main/java/com/android/tools/r8/retrace/RetraceClassResult.java b/src/main/java/com/android/tools/r8/retrace/RetraceClassResult.java
index 4ca10b6..945aa0f 100644
--- a/src/main/java/com/android/tools/r8/retrace/RetraceClassResult.java
+++ b/src/main/java/com/android/tools/r8/retrace/RetraceClassResult.java
@@ -44,7 +44,7 @@
     return lookup(
         fieldName,
         (mapper, name) -> {
-          List<MemberNaming> memberNamings = mapper.mappedNamingsByName.get(name);
+          List<MemberNaming> memberNamings = mapper.mappedFieldNamingsByName.get(name);
           if (memberNamings == null || memberNamings.isEmpty()) {
             return null;
           }
@@ -163,7 +163,7 @@
       return lookup(
           fieldName,
           (mapper, name) -> {
-            List<MemberNaming> memberNamings = mapper.mappedNamingsByName.get(name);
+            List<MemberNaming> memberNamings = mapper.mappedFieldNamingsByName.get(name);
             if (memberNamings == null || memberNamings.isEmpty()) {
               return null;
             }
diff --git a/src/test/java/com/android/tools/r8/retrace/RetraceTests.java b/src/test/java/com/android/tools/r8/retrace/RetraceTests.java
index d7a5246..731e807 100644
--- a/src/test/java/com/android/tools/r8/retrace/RetraceTests.java
+++ b/src/test/java/com/android/tools/r8/retrace/RetraceTests.java
@@ -14,6 +14,7 @@
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.TestDiagnosticMessagesImpl;
 import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.naming.ClassNameMapper;
 import com.android.tools.r8.retrace.Retrace.RetraceAbortException;
 import com.android.tools.r8.retrace.stacktraces.ActualBotStackTraceBase;
 import com.android.tools.r8.retrace.stacktraces.ActualIdentityStackTrace;
@@ -29,6 +30,7 @@
 import com.android.tools.r8.retrace.stacktraces.InlineSourceFileContextStackTrace;
 import com.android.tools.r8.retrace.stacktraces.InlineWithLineNumbersStackTrace;
 import com.android.tools.r8.retrace.stacktraces.InvalidStackTrace;
+import com.android.tools.r8.retrace.stacktraces.MemberFieldOverlapStackTrace;
 import com.android.tools.r8.retrace.stacktraces.NamedModuleStackTrace;
 import com.android.tools.r8.retrace.stacktraces.NullStackTrace;
 import com.android.tools.r8.retrace.stacktraces.ObfucatedExceptionClassStackTrace;
@@ -41,6 +43,7 @@
 import com.google.common.collect.ImmutableList;
 import java.util.Collection;
 import java.util.List;
+import java.util.function.Consumer;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
@@ -191,6 +194,22 @@
     runRetraceTest(new InlineSourceFileContextStackTrace());
   }
 
+  @Test
+  public void testMemberFieldOverlapStackTrace() throws Exception {
+    MemberFieldOverlapStackTrace stackTraceForTest = new MemberFieldOverlapStackTrace();
+    runRetraceTest(stackTraceForTest);
+    inspectRetraceTest(stackTraceForTest, stackTraceForTest::inspectField);
+  }
+
+  private void inspectRetraceTest(
+      StackTraceForTest stackTraceForTest, Consumer<RetraceApi> inspection) throws Exception {
+    TestDiagnosticMessagesImpl diagnosticsHandler = new TestDiagnosticMessagesImpl();
+    ClassNameMapper classNameMapper =
+        ClassNameMapper.mapperFromString(stackTraceForTest.mapping(), diagnosticsHandler);
+    RetraceApi retracer = Retracer.create(classNameMapper);
+    inspection.accept(retracer);
+  }
+
   private TestDiagnosticMessagesImpl runRetraceTest(StackTraceForTest stackTraceForTest) {
     TestDiagnosticMessagesImpl diagnosticsHandler = new TestDiagnosticMessagesImpl();
     RetraceCommand retraceCommand =
diff --git a/src/test/java/com/android/tools/r8/retrace/stacktraces/MemberFieldOverlapStackTrace.java b/src/test/java/com/android/tools/r8/retrace/stacktraces/MemberFieldOverlapStackTrace.java
new file mode 100644
index 0000000..9071654
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/retrace/stacktraces/MemberFieldOverlapStackTrace.java
@@ -0,0 +1,48 @@
+// Copyright (c) 2020, 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.retrace.stacktraces;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import com.android.tools.r8.references.Reference;
+import com.android.tools.r8.retrace.RetraceApi;
+import com.android.tools.r8.retrace.RetraceFieldResult;
+import com.android.tools.r8.utils.StringUtils;
+import java.util.Arrays;
+import java.util.List;
+
+public class MemberFieldOverlapStackTrace implements StackTraceForTest {
+
+  @Override
+  public List<String> obfuscatedStackTrace() {
+    return Arrays.asList(
+        "Exception in thread \"main\" java.lang.NullPointerException", "\tat a.A.a(Bar.java:1)");
+  }
+
+  @Override
+  public String mapping() {
+    return StringUtils.lines("foo.Bar -> a.A:", "  1:1:int method():5 -> a", "  int field -> a");
+  }
+
+  @Override
+  public List<String> retracedStackTrace() {
+    return Arrays.asList(
+        "Exception in thread \"main\" java.lang.NullPointerException",
+        "\tat foo.Bar.method(Bar.java:5)");
+  }
+
+  @Override
+  public int expectedWarnings() {
+    return 1;
+  }
+
+  public void inspectField(RetraceApi retracer) {
+    RetraceFieldResult result =
+        retracer.retrace(Reference.classFromTypeName("a.A")).lookupField("field");
+    assertTrue(result.stream().findAny().isPresent());
+    assertFalse(result.isAmbiguous());
+  }
+}