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(