Add support for --desugared-lib-pg-conf-output in D8
Change-Id: I6b196092284fc494c8ece8ae9a4f3c63254ac6cc
diff --git a/src/main/java/com/android/tools/r8/D8CommandParser.java b/src/main/java/com/android/tools/r8/D8CommandParser.java
index dcd8595..4f5b985 100644
--- a/src/main/java/com/android/tools/r8/D8CommandParser.java
+++ b/src/main/java/com/android/tools/r8/D8CommandParser.java
@@ -3,6 +3,8 @@
// BSD-style license that can be found in the LICENSE file.
package com.android.tools.r8;
+import static com.android.tools.r8.ParseFlagInfoImpl.flag1;
+
import com.android.tools.r8.origin.Origin;
import com.android.tools.r8.origin.PathOrigin;
import com.android.tools.r8.utils.ExceptionDiagnostic;
@@ -34,6 +36,7 @@
"--main-dex-list",
"--main-dex-list-output",
"--desugared-lib",
+ "--desugared-lib-pg-conf-output",
THREAD_COUNT_FLAG);
public static List<ParseFlagInfo> getFlags() {
@@ -64,6 +67,11 @@
"Synthetic classes are with their originating class."))
.add(ParseFlagInfoImpl.flag0("--no-desugaring", "Force disable desugaring."))
.add(ParseFlagInfoImpl.getDesugaredLib())
+ .add(
+ flag1(
+ "--desugared-lib-pg-conf-output",
+ "<file>",
+ "Output the Proguard configuration for L8 to <file>."))
.add(ParseFlagInfoImpl.getMainDexRules())
.add(ParseFlagInfoImpl.getMainDexList())
.add(ParseFlagInfoImpl.getMainDexListOutput())
@@ -291,6 +299,9 @@
builder.setDisableDesugaring(true);
} else if (arg.equals("--desugared-lib")) {
builder.addDesugaredLibraryConfiguration(StringResource.fromFile(Paths.get(nextArg)));
+ } else if (arg.equals("--desugared-lib-pg-conf-output")) {
+ StringConsumer consumer = new StringConsumer.FileConsumer(Paths.get(nextArg));
+ builder.setDesugaredLibraryKeepRuleConsumer(consumer);
} else if (arg.startsWith("--")) {
if (tryParseAssertionArgument(builder, arg, origin)) {
continue;
diff --git a/src/test/java/com/android/tools/r8/D8CommandTest.java b/src/test/java/com/android/tools/r8/D8CommandTest.java
index c592df2..aebb5a6 100644
--- a/src/test/java/com/android/tools/r8/D8CommandTest.java
+++ b/src/test/java/com/android/tools/r8/D8CommandTest.java
@@ -3,9 +3,11 @@
// BSD-style license that can be found in the LICENSE file.
package com.android.tools.r8;
+import static com.android.tools.r8.DiagnosticsMatcher.diagnosticMessage;
import static com.android.tools.r8.R8CommandTest.getOutputPath;
import static com.android.tools.r8.ToolHelper.EXAMPLES_BUILD_DIR;
import static com.android.tools.r8.utils.FileUtils.JAR_EXTENSION;
+import static org.hamcrest.CoreMatchers.containsString;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotEquals;
@@ -699,6 +701,36 @@
}
@Test
+ public void desugaredLibraryWithOutputConf() throws CompilationFailedException, IOException {
+ Path pgout = temp.getRoot().toPath().resolve("pgout.conf");
+ D8Command d8Command =
+ parse(
+ "--desugared-lib",
+ "src/library_desugar/desugar_jdk_libs.json",
+ "--lib",
+ ToolHelper.getAndroidJar(AndroidApiLevel.R).toString(),
+ "--desugared-lib-pg-conf-output",
+ pgout.toString());
+ InternalOptions options = getOptionsWithLoadedDesugaredLibraryConfiguration(d8Command, false);
+ assertFalse(options.machineDesugaredLibrarySpecification.getRewriteType().isEmpty());
+ }
+
+ @Test
+ public void desugaredLibraryWithOutputConfMissingArg() {
+ TestDiagnosticMessagesImpl diagnostics = new TestDiagnosticMessagesImpl();
+ try {
+ parse(
+ diagnostics,
+ "--desugared-lib",
+ "src/library_desugar/desugar_jdk_libs.json",
+ "--desugared-lib-pg-conf-output");
+ fail("Expected parse error");
+ } catch (CompilationFailedException e) {
+ diagnostics.assertErrorsMatch(diagnosticMessage(containsString("Missing parameter")));
+ }
+ }
+
+ @Test
public void pgInputMap() throws CompilationFailedException, IOException, ResourceException {
Path mapFile = temp.newFile().toPath();
FileUtils.writeTextFile(