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 {}