Fix ProguardMapReader assertion when we have synthesized methods

These are generated by class merging. We insert an extra method to ensure super behaviour.
The extra inserted method maps back to the original method, in addition
to the actual method that also maps back.

The only way we can currently see that this is synthesized by the class merger
is that there is no line numbers for these.

Bug: 120894450
Change-Id: I584af27e50cb45f2b0c7dcbccedcab7e5ab79221
diff --git a/src/main/java/com/android/tools/r8/dex/ApplicationWriter.java b/src/main/java/com/android/tools/r8/dex/ApplicationWriter.java
index 6ba7802..825846e 100644
--- a/src/main/java/com/android/tools/r8/dex/ApplicationWriter.java
+++ b/src/main/java/com/android/tools/r8/dex/ApplicationWriter.java
@@ -34,6 +34,7 @@
 import com.android.tools.r8.graph.InnerClassAttribute;
 import com.android.tools.r8.graph.ObjectToOffsetMapping;
 import com.android.tools.r8.graph.ParameterAnnotationsList;
+import com.android.tools.r8.naming.ClassNameMapper;
 import com.android.tools.r8.naming.NamingLens;
 import com.android.tools.r8.naming.ProguardMapSupplier;
 import com.android.tools.r8.utils.DescriptorUtils;
@@ -326,9 +327,10 @@
           options.reporter, options.usageInformationConsumer, deadCode);
     }
     if (proguardMapContent != null) {
+      assert validateProguardMapParses(proguardMapContent);
       ExceptionUtils.withConsumeResourceHandler(
           options.reporter, options.proguardMapConsumer, proguardMapContent);
-      }
+    }
 
     if (options.proguardSeedsConsumer != null && proguardSeedsData != null) {
       ExceptionUtils.withConsumeResourceHandler(
@@ -382,6 +384,16 @@
     }
   }
 
+  private static boolean validateProguardMapParses(String content) {
+    try {
+      ClassNameMapper.mapperFromString(content);
+    } catch (IOException e) {
+      e.printStackTrace();
+      return false;
+    }
+    return true;
+  }
+
   private void insertAttributeAnnotations() {
     // Convert inner-class attributes to DEX annotations
     for (DexProgramClass clazz : application.classes()) {
diff --git a/src/main/java/com/android/tools/r8/naming/ProguardMapReader.java b/src/main/java/com/android/tools/r8/naming/ProguardMapReader.java
index 5547315..8a1bb87 100644
--- a/src/main/java/com/android/tools/r8/naming/ProguardMapReader.java
+++ b/src/main/java/com/android/tools/r8/naming/ProguardMapReader.java
@@ -195,6 +195,7 @@
   private void parseMemberMappings(ClassNaming.Builder classNamingBuilder) throws IOException {
     MemberNaming activeMemberNaming = null;
     Range previousObfuscatedRange = null;
+    boolean previousWasPotentiallySynthesized = false;
     Signature previousSignature = null;
     String previousRenamedName = null;
     boolean lastRound = false;
@@ -250,7 +251,12 @@
             classNamingBuilder.addMemberEntry(activeMemberNaming);
             activeMemberNaming = null;
           } else {
-            assert (activeMemberNaming.getRenamedName().equals(previousRenamedName));
+            if (activeMemberNaming.getRenamedName().equals(previousRenamedName)) {
+              // The method was potentially synthesized.
+              previousWasPotentiallySynthesized = previousObfuscatedRange == null;
+            } else {
+              assert previousWasPotentiallySynthesized;
+            }
           }
         }
         if (activeMemberNaming == null) {
@@ -279,9 +285,7 @@
 
         // Note that at this point originalRange may be null which either means, it's the same as
         // the obfuscatedRange (identity mapping) or that it's unknown (source line number
-        // information
-        // was not available).
-
+        // information was not available).
         assert signature instanceof MethodSignature;
       }
 
diff --git a/src/test/java/com/android/tools/r8/regress/Regress120894450.java b/src/test/java/com/android/tools/r8/regress/Regress120894450.java
new file mode 100644
index 0000000..5c36107
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/regress/Regress120894450.java
@@ -0,0 +1,23 @@
+// Copyright (c) 2019, 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.regress;
+
+import com.android.tools.r8.TestBase;
+import com.android.tools.r8.naming.ClassNameMapper;
+import com.android.tools.r8.utils.StringUtils;
+import org.junit.Test;
+
+public class Regress120894450 extends TestBase {
+
+  @Test
+  public void test() throws Exception {
+    String testing = StringUtils.lines(
+        "com.google.android.foobar -> EQa:",
+        "    android.os.Handler com.google.android.bar.getRebindHandler() -> o",
+        "    1:2:android.os.Handler com.google.android.bar.getRebindHandler():292:293 -> p",
+        "    3:3:android.os.Handler com.google.android.bar.getRebindHandler():295:295 -> p");
+    ClassNameMapper.mapperFromString(testing);
+  }
+}