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