Maintain preamble for existing maps when composing in D8/R8

Bug: b/297927590
Change-Id: I4712d54aedc77fef3de37d641e0d71ce88439fef
diff --git a/src/main/java/com/android/tools/r8/MapConsumerToPartitionMapConsumer.java b/src/main/java/com/android/tools/r8/MapConsumerToPartitionMapConsumer.java
index fcd3113..2fd47d9 100644
--- a/src/main/java/com/android/tools/r8/MapConsumerToPartitionMapConsumer.java
+++ b/src/main/java/com/android/tools/r8/MapConsumerToPartitionMapConsumer.java
@@ -10,7 +10,9 @@
 import com.android.tools.r8.naming.ProguardMapMarkerInfo;
 import com.android.tools.r8.retrace.ProguardMapPartitioner;
 import com.android.tools.r8.retrace.internal.ProguardMapProducerInternal;
+import com.android.tools.r8.utils.ListUtils;
 import java.io.IOException;
+import java.util.List;
 
 public class MapConsumerToPartitionMapConsumer implements MapConsumer {
 
@@ -27,7 +29,9 @@
       ProguardMapMarkerInfo makerInfo,
       ClassNameMapper classNameMapper) {
     try {
-      classNameMapper.setPreamble(makerInfo.toPreamble());
+      List<String> newPreamble =
+          ListUtils.joinNewArrayList(makerInfo.toPreamble(), classNameMapper.getPreamble());
+      classNameMapper.setPreamble(newPreamble);
       partitionMapConsumer.acceptMappingPartitionMetadata(
           ProguardMapPartitioner.builder(diagnosticsHandler)
               .setProguardMapProducer(new ProguardMapProducerInternal(classNameMapper))
diff --git a/src/main/java/com/android/tools/r8/dex/ApplicationReader.java b/src/main/java/com/android/tools/r8/dex/ApplicationReader.java
index b58107d..d18a979 100644
--- a/src/main/java/com/android/tools/r8/dex/ApplicationReader.java
+++ b/src/main/java/com/android/tools/r8/dex/ApplicationReader.java
@@ -280,14 +280,13 @@
         executorService.submit(
             () -> {
               try {
-                String content = map.getString();
                 builder.setProguardMap(
                     ClassNameMapper.mapperFromString(
-                        content,
+                        map.getString(),
                         options.reporter,
                         options.mappingComposeOptions().allowEmptyMappedRanges,
                         options.testing.enableExperimentalMapFileVersion,
-                        false));
+                        true));
               } catch (IOException | ResourceException e) {
                 throw new CompilationError("Failure to read proguard map file", e, map.getOrigin());
               }
diff --git a/src/main/java/com/android/tools/r8/naming/ProguardMapStringConsumer.java b/src/main/java/com/android/tools/r8/naming/ProguardMapStringConsumer.java
index be3d3ba..71b60d9 100644
--- a/src/main/java/com/android/tools/r8/naming/ProguardMapStringConsumer.java
+++ b/src/main/java/com/android/tools/r8/naming/ProguardMapStringConsumer.java
@@ -7,6 +7,7 @@
 import com.android.tools.r8.DiagnosticsHandler;
 import com.android.tools.r8.StringConsumer;
 import com.android.tools.r8.utils.ChainableStringConsumer;
+import com.android.tools.r8.utils.StringUtils;
 
 /***
  * Default implementation of a MapConsumer that wraps around a string consumer for streamed string
@@ -29,6 +30,7 @@
       ClassNameMapper classNameMapper) {
     this.diagnosticsHandler = diagnosticsHandler;
     accept(markerInfo.serializeToString());
+    accept(StringUtils.unixLines(classNameMapper.getPreamble()));
     classNameMapper.write(this);
   }
 
diff --git a/src/test/java/com/android/tools/r8/mappingcompose/ComposeUnknownJsonD8Test.java b/src/test/java/com/android/tools/r8/mappingcompose/ComposeUnknownJsonD8Test.java
index fa42cf9..032f5da 100644
--- a/src/test/java/com/android/tools/r8/mappingcompose/ComposeUnknownJsonD8Test.java
+++ b/src/test/java/com/android/tools/r8/mappingcompose/ComposeUnknownJsonD8Test.java
@@ -5,7 +5,6 @@
 
 import static com.android.tools.r8.mappingcompose.ComposeTestHelpers.doubleToSingleQuote;
 import static org.hamcrest.CoreMatchers.containsString;
-import static org.hamcrest.CoreMatchers.not;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.Assert.assertTrue;
 
@@ -56,7 +55,10 @@
                 assertTrue(options.mappingComposeOptions().enableExperimentalMappingComposition))
         .apply(b -> b.getBuilder().setProguardInputMapFile(inputMap))
         .apply(testBuilder)
-        .compile();
+        .allowStdoutMessages()
+        .collectStdout()
+        .compile()
+        .assertStdoutThatMatches(containsString("Info: Could not find a handler for custom_info"));
   }
 
   @Test
@@ -67,8 +69,7 @@
             builder
                 .getBuilder()
                 .setProguardMapConsumer((string, handler) -> mappingComposed.append(string)));
-    // TODO(b/297927590): Should contain input preamble.
-    assertThat(doubleToSingleQuote(mappingComposed.toString()), not(containsString(CUSTOM_DATA)));
+    assertThat(doubleToSingleQuote(mappingComposed.toString()), containsString(CUSTOM_DATA));
   }
 
   @Test
@@ -99,8 +100,7 @@
         .setConsumer((string, handler) -> mappingComposed.append(string))
         .build()
         .run();
-    // TODO(b/297927590): Should contain input preamble.
-    assertThat(doubleToSingleQuote(mappingComposed.toString()), not(containsString(CUSTOM_DATA)));
+    assertThat(doubleToSingleQuote(mappingComposed.toString()), containsString(CUSTOM_DATA));
   }
 
   public static class A {}