Merge commit 'e7de59a7f7b0f85b0718bb530878309e30dd05c1' into dev-release
diff --git a/src/main/java/com/android/tools/r8/naming/ClassNameMapper.java b/src/main/java/com/android/tools/r8/naming/ClassNameMapper.java
index bd44c7b..af62c60 100644
--- a/src/main/java/com/android/tools/r8/naming/ClassNameMapper.java
+++ b/src/main/java/com/android/tools/r8/naming/ClassNameMapper.java
@@ -27,8 +27,6 @@
 import com.google.common.io.CharSource;
 import java.io.BufferedReader;
 import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
 import java.nio.charset.StandardCharsets;
 import java.nio.file.Files;
 import java.nio.file.Path;
@@ -102,11 +100,6 @@
     return new Builder();
   }
 
-  public static ClassNameMapper mapperFromInputStream(InputStream in) throws IOException {
-    return mapperFromBufferedReader(
-        new BufferedReader(new InputStreamReader(in, StandardCharsets.UTF_8)), null);
-  }
-
   public static ClassNameMapper mapperFromFile(Path path) throws IOException {
     return mapperFromFile(path, MISSING_FILE_IS_ERROR);
   }
@@ -119,7 +112,7 @@
         && !path.toFile().exists()) {
       return mapperFromString("");
     }
-    return mapperFromInputStream(Files.newInputStream(path));
+    return mapperFromBufferedReader(Files.newBufferedReader(path, StandardCharsets.UTF_8), null);
   }
 
   public static ClassNameMapper mapperFromString(String contents) throws IOException {
@@ -144,7 +137,7 @@
     return mapperFromBufferedReader(reader, diagnosticsHandler, false);
   }
 
-  private static ClassNameMapper mapperFromBufferedReader(
+  public static ClassNameMapper mapperFromBufferedReader(
       BufferedReader reader, DiagnosticsHandler diagnosticsHandler, boolean allowEmptyMappedRanges)
       throws IOException {
     try (ProguardMapReader proguardReader =
diff --git a/src/main/java/com/android/tools/r8/retrace/ProguardMapProducer.java b/src/main/java/com/android/tools/r8/retrace/ProguardMapProducer.java
index 7e66ed3..81b7f30 100644
--- a/src/main/java/com/android/tools/r8/retrace/ProguardMapProducer.java
+++ b/src/main/java/com/android/tools/r8/retrace/ProguardMapProducer.java
@@ -5,26 +5,24 @@
 package com.android.tools.r8.retrace;
 
 import com.android.tools.r8.Keep;
-import java.io.BufferedReader;
 import java.io.IOException;
 import java.io.Reader;
+import java.io.StringReader;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.Path;
 
 /** Interface for producing a string format of a mapping file. */
 @Keep
 public interface ProguardMapProducer {
 
-  String get() throws IOException;
+  Reader get() throws IOException;
 
-  static ProguardMapProducer fromReader(Reader reader) {
-    return () -> {
-      try (BufferedReader br = new BufferedReader(reader)) {
-        StringBuilder sb = new StringBuilder();
-        String line;
-        while ((line = br.readLine()) != null) {
-          sb.append(line).append('\n');
-        }
-        return sb.toString();
-      }
-    };
+  static ProguardMapProducer fromString(String proguardMapString) {
+    return () -> new StringReader(proguardMapString);
+  }
+
+  static ProguardMapProducer fromPath(Path path) {
+    return () -> Files.newBufferedReader(path, StandardCharsets.UTF_8);
   }
 }
diff --git a/src/main/java/com/android/tools/r8/retrace/Retrace.java b/src/main/java/com/android/tools/r8/retrace/Retrace.java
index 813ae66..71d88c3 100644
--- a/src/main/java/com/android/tools/r8/retrace/Retrace.java
+++ b/src/main/java/com/android/tools/r8/retrace/Retrace.java
@@ -123,15 +123,7 @@
           new StringDiagnostic(String.format("Could not find mapping file '%s'.", mappingPath)));
       throw new RetraceAbortException();
     }
-    return () -> {
-      try {
-        return new String(Files.readAllBytes(path));
-      } catch (IOException e) {
-        diagnosticsHandler.error(
-            new StringDiagnostic(String.format("Could not open mapping file '%s'.", mappingPath)));
-        throw new RuntimeException(e);
-      }
-    };
+    return ProguardMapProducer.fromPath(Paths.get(mappingPath));
   }
 
   private static List<String> getStackTraceFromFile(
diff --git a/src/main/java/com/android/tools/r8/retrace/internal/DirectClassNameMapperProguardMapProducer.java b/src/main/java/com/android/tools/r8/retrace/internal/DirectClassNameMapperProguardMapProducer.java
index db73155..b243ff5 100644
--- a/src/main/java/com/android/tools/r8/retrace/internal/DirectClassNameMapperProguardMapProducer.java
+++ b/src/main/java/com/android/tools/r8/retrace/internal/DirectClassNameMapperProguardMapProducer.java
@@ -6,13 +6,14 @@
 
 import com.android.tools.r8.naming.ClassNameMapper;
 import com.android.tools.r8.retrace.ProguardMapProducer;
+import java.io.BufferedReader;
 
 public interface DirectClassNameMapperProguardMapProducer extends ProguardMapProducer {
 
   ClassNameMapper getClassNameMapper();
 
   @Override
-  default String get() {
+  default BufferedReader get() {
     throw new RuntimeException("Should not be called for DirectClassNameMapperProguardMapProducer");
   }
 }
diff --git a/src/main/java/com/android/tools/r8/retrace/internal/RetracerImpl.java b/src/main/java/com/android/tools/r8/retrace/internal/RetracerImpl.java
index d25afab..03f515b 100644
--- a/src/main/java/com/android/tools/r8/retrace/internal/RetracerImpl.java
+++ b/src/main/java/com/android/tools/r8/retrace/internal/RetracerImpl.java
@@ -13,6 +13,7 @@
 import com.android.tools.r8.retrace.InvalidMappingFileException;
 import com.android.tools.r8.retrace.ProguardMapProducer;
 import com.android.tools.r8.retrace.Retracer;
+import java.io.BufferedReader;
 
 /** A default implementation for the retrace api using the ClassNameMapper defined in R8. */
 public class RetracerImpl implements Retracer {
@@ -32,7 +33,8 @@
     }
     try {
       ClassNameMapper classNameMapper =
-          ClassNameMapper.mapperFromString(proguardMapProducer.get(), diagnosticsHandler, true);
+          ClassNameMapper.mapperFromBufferedReader(
+              new BufferedReader(proguardMapProducer.get()), diagnosticsHandler, true);
       return new RetracerImpl(classNameMapper);
     } catch (Throwable throwable) {
       throw new InvalidMappingFileException(throwable);
diff --git a/src/test/java/com/android/tools/r8/cf/bootstrap/BootstrapCurrentEqualityTest.java b/src/test/java/com/android/tools/r8/cf/bootstrap/BootstrapCurrentEqualityTest.java
index f2660ef..b385fd6 100644
--- a/src/test/java/com/android/tools/r8/cf/bootstrap/BootstrapCurrentEqualityTest.java
+++ b/src/test/java/com/android/tools/r8/cf/bootstrap/BootstrapCurrentEqualityTest.java
@@ -24,6 +24,7 @@
 import com.android.tools.r8.TestRuntime;
 import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.ToolHelper.ProcessResult;
+import com.android.tools.r8.retrace.ProguardMapProducer;
 import com.android.tools.r8.retrace.Retrace;
 import com.android.tools.r8.retrace.RetraceCommand;
 import com.android.tools.r8.utils.FileUtils;
@@ -146,17 +147,7 @@
     RetraceCommand retraceCommand =
         RetraceCommand.builder()
             .setStackTrace(StringUtils.splitLines(processResult.stderr))
-            .setProguardMapProducer(
-                () -> {
-                  Path mappingFile = r8R8Release.getSecond();
-                  try {
-                    return new String(Files.readAllBytes(mappingFile));
-                  } catch (IOException e) {
-                    e.printStackTrace();
-                    throw new RuntimeException(
-                        "Could not read mapping file " + mappingFile.toString());
-                  }
-                })
+            .setProguardMapProducer(ProguardMapProducer.fromPath(r8R8Release.getSecond()))
             .setRetracedStackTraceConsumer(
                 retraced -> {
                   int expectedIndex = -1;
diff --git a/src/test/java/com/android/tools/r8/internal/retrace/RetraceTests.java b/src/test/java/com/android/tools/r8/internal/retrace/RetraceTests.java
index 949b787..441fd68 100644
--- a/src/test/java/com/android/tools/r8/internal/retrace/RetraceTests.java
+++ b/src/test/java/com/android/tools/r8/internal/retrace/RetraceTests.java
@@ -13,6 +13,7 @@
 import com.android.tools.r8.internal.retrace.stacktraces.CronetStackTrace;
 import com.android.tools.r8.internal.retrace.stacktraces.FinskyStackTrace;
 import com.android.tools.r8.internal.retrace.stacktraces.VelvetStackTrace;
+import com.android.tools.r8.retrace.ProguardMapProducer;
 import com.android.tools.r8.retrace.Retrace;
 import com.android.tools.r8.retrace.RetraceCommand;
 import com.android.tools.r8.retrace.stacktraces.StackTraceForTest;
@@ -183,7 +184,7 @@
     TestDiagnosticMessagesImpl diagnosticsHandler = new TestDiagnosticMessagesImpl();
     RetraceCommand retraceCommand =
         RetraceCommand.builder(diagnosticsHandler)
-            .setProguardMapProducer(stackTraceForTest::mapping)
+            .setProguardMapProducer(ProguardMapProducer.fromString(stackTraceForTest.mapping()))
             .setStackTrace(stackTraceForTest.obfuscatedStackTrace())
             .setRegularExpression(regularExpression)
             .setRetracedStackTraceConsumer(
diff --git a/src/test/java/com/android/tools/r8/naming/retrace/StackTrace.java b/src/test/java/com/android/tools/r8/naming/retrace/StackTrace.java
index 34d84c4..74eeed2 100644
--- a/src/test/java/com/android/tools/r8/naming/retrace/StackTrace.java
+++ b/src/test/java/com/android/tools/r8/naming/retrace/StackTrace.java
@@ -11,6 +11,7 @@
 import com.android.tools.r8.SingleTestRunResult;
 import com.android.tools.r8.ToolHelper.DexVm;
 import com.android.tools.r8.references.ClassReference;
+import com.android.tools.r8.retrace.ProguardMapProducer;
 import com.android.tools.r8.retrace.Retrace;
 import com.android.tools.r8.retrace.RetraceCommand;
 import com.android.tools.r8.utils.StringUtils;
@@ -311,7 +312,7 @@
     Box box = new Box();
     Retrace.run(
         RetraceCommand.builder()
-            .setProguardMapProducer(() -> map)
+            .setProguardMapProducer(ProguardMapProducer.fromString(map))
             .setStackTrace(
                 stackTraceLines.stream()
                     .map(line -> line.originalLine)
diff --git a/src/test/java/com/android/tools/r8/retrace/DuplicateMappingsTest.java b/src/test/java/com/android/tools/r8/retrace/DuplicateMappingsTest.java
index bbe2d5b..22fcef4 100644
--- a/src/test/java/com/android/tools/r8/retrace/DuplicateMappingsTest.java
+++ b/src/test/java/com/android/tools/r8/retrace/DuplicateMappingsTest.java
@@ -40,12 +40,12 @@
     Retrace.run(
         RetraceCommand.builder(diagnosticsHandler)
             .setProguardMapProducer(
-                () ->
+                ProguardMapProducer.fromString(
                     StringUtils.lines(
                         "com.android.tools.r8.retrace.SourceFileTest$ClassWithCustomFileName ->"
                             + " com.android.tools.r8.retrace.a:",
                         "# {'id':'sourceFile','fileName':'foobarbaz.java'}",
-                        "# {'id':'sourceFile','fileName':'foobarbaz2.java'}"))
+                        "# {'id':'sourceFile','fileName':'foobarbaz2.java'}")))
             .setStackTrace(ImmutableList.of())
             .setRetracedStackTraceConsumer(
                 strings -> {
diff --git a/src/test/java/com/android/tools/r8/retrace/RetraceFieldTests.java b/src/test/java/com/android/tools/r8/retrace/RetraceFieldTests.java
index 3ff24fa..e07b776 100644
--- a/src/test/java/com/android/tools/r8/retrace/RetraceFieldTests.java
+++ b/src/test/java/com/android/tools/r8/retrace/RetraceFieldTests.java
@@ -20,6 +20,8 @@
 
   private void runRetraceTest(MappingForTest mappingForTest, Consumer<Retracer> inspection) {
     inspection.accept(
-        Retracer.createDefault(mappingForTest::mapping, new TestDiagnosticMessagesImpl()));
+        Retracer.createDefault(
+            ProguardMapProducer.fromString(mappingForTest.mapping()),
+            new TestDiagnosticMessagesImpl()));
   }
 }
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 84bc19c..22d4f15 100644
--- a/src/test/java/com/android/tools/r8/retrace/RetraceTests.java
+++ b/src/test/java/com/android/tools/r8/retrace/RetraceTests.java
@@ -120,7 +120,7 @@
     NullStackTrace nullStackTrace = new NullStackTrace();
     RetraceCommand retraceCommand =
         RetraceCommand.builder(diagnosticsHandler)
-            .setProguardMapProducer(nullStackTrace::mapping)
+            .setProguardMapProducer(ProguardMapProducer.fromString(nullStackTrace.mapping()))
             .setStackTrace(nullStackTrace.obfuscatedStackTrace())
             .setRetracedStackTraceConsumer(retraced -> fail())
             .build();
@@ -257,7 +257,9 @@
   private void inspectRetraceTest(
       StackTraceForTest stackTraceForTest, Consumer<Retracer> inspection) {
     inspection.accept(
-        Retracer.createDefault(stackTraceForTest::mapping, new TestDiagnosticMessagesImpl()));
+        Retracer.createDefault(
+            ProguardMapProducer.fromString(stackTraceForTest.mapping()),
+            new TestDiagnosticMessagesImpl()));
   }
 
   private TestDiagnosticMessagesImpl runRetraceTest(StackTraceForTest stackTraceForTest)
@@ -298,7 +300,7 @@
       TestDiagnosticMessagesImpl diagnosticsHandler = new TestDiagnosticMessagesImpl();
       RetraceCommand retraceCommand =
           RetraceCommand.builder(diagnosticsHandler)
-              .setProguardMapProducer(stackTraceForTest::mapping)
+              .setProguardMapProducer(ProguardMapProducer.fromString(stackTraceForTest.mapping()))
               .setStackTrace(stackTraceForTest.obfuscatedStackTrace())
               .setRegularExpression(useRegExpParsing ? DEFAULT_REGULAR_EXPRESSION : null)
               .setRetracedStackTraceConsumer(
diff --git a/src/test/java/com/android/tools/r8/retrace/RetraceVerboseTests.java b/src/test/java/com/android/tools/r8/retrace/RetraceVerboseTests.java
index d217689..bcca0af 100644
--- a/src/test/java/com/android/tools/r8/retrace/RetraceVerboseTests.java
+++ b/src/test/java/com/android/tools/r8/retrace/RetraceVerboseTests.java
@@ -63,7 +63,7 @@
     TestDiagnosticMessagesImpl diagnosticsHandler = new TestDiagnosticMessagesImpl();
     RetraceCommand retraceCommand =
         RetraceCommand.builder(diagnosticsHandler)
-            .setProguardMapProducer(stackTraceForTest::mapping)
+            .setProguardMapProducer(ProguardMapProducer.fromString(stackTraceForTest.mapping()))
             .setStackTrace(stackTraceForTest.obfuscatedStackTrace())
             .setRegularExpression(useRegExpParsing ? DEFAULT_REGULAR_EXPRESSION : null)
             .setVerbose(true)
diff --git a/src/test/java/com/android/tools/r8/retrace/StackTraceRegularExpressionParserTests.java b/src/test/java/com/android/tools/r8/retrace/StackTraceRegularExpressionParserTests.java
index 333cc9f..40ec50f 100644
--- a/src/test/java/com/android/tools/r8/retrace/StackTraceRegularExpressionParserTests.java
+++ b/src/test/java/com/android/tools/r8/retrace/StackTraceRegularExpressionParserTests.java
@@ -805,7 +805,7 @@
     TestDiagnosticMessagesImpl diagnosticsHandler = new TestDiagnosticMessagesImpl();
     RetraceCommand retraceCommand =
         RetraceCommand.builder(diagnosticsHandler)
-            .setProguardMapProducer(stackTraceForTest::mapping)
+            .setProguardMapProducer(ProguardMapProducer.fromString(stackTraceForTest.mapping()))
             .setStackTrace(stackTraceForTest.obfuscatedStackTrace())
             .setRetracedStackTraceConsumer(
                 retraced -> {