Add support for --main-dex-list amd --minimal-mail-dex to compat proguard

Some targets in the Android platform build passed these dx options to the
combined Proguard + dx build that R8 is now doing.

For --main-dex-list the format --main-dex-list=<file> was used.

Bug: 68375939
Change-Id: Ib605876d07fe58f4bbfe1b410eed5c23746c57d1
diff --git a/src/main/java/com/android/tools/r8/compatproguard/CompatProguard.java b/src/main/java/com/android/tools/r8/compatproguard/CompatProguard.java
index a6b45ae..219555e 100644
--- a/src/main/java/com/android/tools/r8/compatproguard/CompatProguard.java
+++ b/src/main/java/com/android/tools/r8/compatproguard/CompatProguard.java
@@ -35,15 +35,18 @@
     public final boolean forceProguardCompatibility;
     public final boolean ignoreMissingClasses;
     public final boolean multiDex;
+    public final String mainDexList;
     public final List<String> proguardConfig;
 
     CompatProguardOptions(List<String> proguardConfig, String output, int minApi,
-        boolean multiDex, boolean forceProguardCompatibility, boolean ignoreMissingClasses) {
+        boolean multiDex, boolean forceProguardCompatibility, boolean ignoreMissingClasses,
+        String mainDexList) {
       this.output = output;
       this.minApi = minApi;
       this.forceProguardCompatibility = forceProguardCompatibility;
       this.ignoreMissingClasses = ignoreMissingClasses;
       this.multiDex = multiDex;
+      this.mainDexList = mainDexList;
       this.proguardConfig = proguardConfig;
     }
 
@@ -53,12 +56,15 @@
       boolean forceProguardCompatibility = false;
       boolean ignoreMissingClasses = false;
       boolean multiDex = false;
+      String mainDexList = null;
+      // These two flags are currently ignored.
+      boolean minimalMainDex = false;
       boolean coreLibrary = false;
 
       ImmutableList.Builder<String> builder = ImmutableList.builder();
       if (args.length > 0) {
-        StringBuilder currentLine = new StringBuilder(args[0]);
-        for (int i = 1; i < args.length; i++) {
+        StringBuilder currentLine = new StringBuilder();
+        for (int i = 0; i < args.length; i++) {
           String arg = args[i];
           if (arg.charAt(0) == '-') {
             if (arg.equals("--min-api")) {
@@ -71,23 +77,34 @@
               output = args[++i];
             } else if (arg.equals("--multi-dex")) {
               multiDex = true;
+            } else if (arg.equals("--main-dex-list")) {
+              mainDexList = args[++i];
+            } else if (arg.startsWith("--main-dex-list=")) {
+              mainDexList = arg.substring("--main-dex-list=".length());
+            } else if (arg.equals("--minimal-main-dex")) {
+              minimalMainDex = true;
             } else if (arg.equals("--core-library")) {
               coreLibrary = true;
             } else if (arg.equals("-outjars")) {
               throw new CompilationException(
                   "Proguard argument -outjar is not supported. Use R8 compatible --output flag");
             } else {
-              builder.add(currentLine.toString());
+              if (currentLine.length() > 0) {
+                builder.add(currentLine.toString());
+              }
               currentLine = new StringBuilder(arg);
             }
           } else {
-            currentLine.append(' ').append(arg);
+            if (currentLine.length() > 0) {
+              currentLine.append(' ');
+            }
+            currentLine.append(arg);
           }
         }
         builder.add(currentLine.toString());
       }
       return new CompatProguardOptions(builder.build(), output, minApi, multiDex,
-          forceProguardCompatibility, ignoreMissingClasses);
+          forceProguardCompatibility, ignoreMissingClasses, mainDexList);
     }
   }
 
@@ -105,6 +122,9 @@
     builder.setOutputPath(Paths.get(options.output))
         .addProguardConfiguration(options.proguardConfig)
         .setMinApiLevel(options.minApi);
+    if (options.mainDexList != null) {
+      builder.addMainDexListFiles(Paths.get(options.mainDexList));
+    }
     AndroidApp result = R8.runInternal(builder.build());
 
     if (!options.multiDex) {
diff --git a/src/test/java/com/android/tools/r8/compatproguard/CompatProguardTest.java b/src/test/java/com/android/tools/r8/compatproguard/CompatProguardTest.java
new file mode 100644
index 0000000..638e700
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/compatproguard/CompatProguardTest.java
@@ -0,0 +1,58 @@
+// Copyright (c) 2017, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+package com.android.tools.r8.compatproguard;
+
+import static org.junit.Assert.assertEquals;
+
+import com.android.tools.r8.compatproguard.CompatProguard.CompatProguardOptions;
+import org.junit.Test;
+
+public class CompatProguardTest {
+
+  private CompatProguardOptions parseArgs(String... args)throws Exception  {
+    return CompatProguard.CompatProguardOptions.parse(args);
+  }
+
+  @Test
+  public void testProguardOptions() throws Exception {
+    CompatProguardOptions options;
+
+    options = parseArgs("-xxx");
+    assertEquals(1, options.proguardConfig.size());
+    options = parseArgs("-xxx", "xxx");
+    assertEquals(1, options.proguardConfig.size());
+    options = parseArgs("-xxx",  "-yyy");
+    assertEquals(2, options.proguardConfig.size());
+    options = parseArgs("-xxx", "xxx", "-yyy", "yyy");
+    assertEquals(2, options.proguardConfig.size());
+  }
+
+  @Test
+  public void testInjarsAndOutput() throws Exception {
+    CompatProguardOptions options;
+    String injars = "input.jar";
+    String output = "outputdir";
+    options = parseArgs("-injars", injars, "--output", output);
+    assertEquals(output, options.output);
+    assertEquals(1, options.proguardConfig.size());
+    options = parseArgs("--output", output, "-injars", injars);
+    assertEquals(1, options.proguardConfig.size());
+  }
+
+  @Test
+  public void testMainDexList() throws Exception {
+    CompatProguardOptions options;
+    String mainDexList = "maindexlist.txt";
+
+    options = parseArgs("--main-dex-list", mainDexList);
+    assertEquals(mainDexList, options.mainDexList);
+    options = parseArgs("--main-dex-list=" + mainDexList);
+    assertEquals(mainDexList, options.mainDexList);
+    options = parseArgs("--main-dex-list", mainDexList, "--minimal-main-dex");
+    assertEquals(mainDexList, options.mainDexList);
+    options = parseArgs("--minimal-main-dex", "--main-dex-list=" + mainDexList);
+    assertEquals(mainDexList, options.mainDexList);
+  }
+}