Add argfile to d8/r8 command syntax description

Bug: 149635074
Change-Id: I63b97f93e6a67b83db7156869e2dc29194737fba
diff --git a/src/main/java/com/android/tools/r8/D8CommandParser.java b/src/main/java/com/android/tools/r8/D8CommandParser.java
index fda08a6..f66fff8 100644
--- a/src/main/java/com/android/tools/r8/D8CommandParser.java
+++ b/src/main/java/com/android/tools/r8/D8CommandParser.java
@@ -111,8 +111,9 @@
           "\n",
           Iterables.concat(
               Arrays.asList(
-                  "Usage: d8 [options] <input-files>",
+                  "Usage: d8 [options] [@<argfile>] <input-files>",
                   " where <input-files> are any combination of dex, class, zip, jar, or apk files",
+                  " and each <argfile> is a file containing additional arguments (one per line)",
                   " and options are:",
                   "  --debug                 # Compile with debugging information (default).",
                   "  --release               # Compile without debugging information.",
@@ -258,6 +259,8 @@
           builder.error(new StringDiagnostic("Unknown option: " + arg, origin));
           continue;
         }
+      } else if (arg.startsWith("@")) {
+        builder.error(new StringDiagnostic("Recursive @argfiles are not supported: ", origin));
       } else {
         builder.addProgramFiles(Paths.get(arg));
       }
diff --git a/src/main/java/com/android/tools/r8/R8CommandParser.java b/src/main/java/com/android/tools/r8/R8CommandParser.java
index f1541bd..22ebb5e 100644
--- a/src/main/java/com/android/tools/r8/R8CommandParser.java
+++ b/src/main/java/com/android/tools/r8/R8CommandParser.java
@@ -52,8 +52,9 @@
           "\n",
           Iterables.concat(
               Arrays.asList(
-                  "Usage: r8 [options] <input-files>",
+                  "Usage: r8 [options] [@<argfile>] <input-files>",
                   " where <input-files> are any combination of dex, class, zip, jar, or apk files",
+                  " and each <argfile> is a file containing additional arguments (one per line)",
                   " and options are:",
                   "  --release               # Compile without debugging information (default).",
                   "  --debug                 # Compile with debugging information.",
@@ -223,6 +224,8 @@
           builder.error(new StringDiagnostic("Unknown option: " + arg, argsOrigin));
           continue;
         }
+      } else if (arg.startsWith("@")) {
+        builder.error(new StringDiagnostic("Recursive @argfiles are not supported: ", argsOrigin));
       } else {
         builder.addProgramFiles(Paths.get(arg));
       }
diff --git a/src/test/java/com/android/tools/r8/D8CommandTest.java b/src/test/java/com/android/tools/r8/D8CommandTest.java
index fbacef6..14d460e 100644
--- a/src/test/java/com/android/tools/r8/D8CommandTest.java
+++ b/src/test/java/com/android/tools/r8/D8CommandTest.java
@@ -142,6 +142,24 @@
                 handler).build()));
   }
 
+  @Test(expected = CompilationFailedException.class)
+  public void recursiveFlagsFile() throws Throwable {
+    Path working = temp.getRoot().toPath();
+    Path flagsFile = working.resolve("flags.txt");
+    Path recursiveFlagsFile = working.resolve("recursive_flags.txt");
+    Path input = Paths.get(EXAMPLES_BUILD_DIR + "/arithmetic.jar").toAbsolutePath();
+    FileUtils.writeTextFile(recursiveFlagsFile, "--output", "output.zip");
+    FileUtils.writeTextFile(
+        flagsFile, "--min-api", "24", input.toString(), "@" + recursiveFlagsFile);
+    DiagnosticsChecker.checkErrorsContains(
+        "Recursive @argfiles are not supported",
+        handler ->
+            D8.run(
+                D8Command.parse(
+                        new String[] {"@" + flagsFile.toString()}, EmbeddedOrigin.INSTANCE, handler)
+                    .build()));
+  }
+
   @Test
   public void printsHelpOnNoInput() throws Throwable {
     ProcessResult result = ToolHelper.forkD8(temp.getRoot().toPath());
diff --git a/src/test/java/com/android/tools/r8/R8CommandTest.java b/src/test/java/com/android/tools/r8/R8CommandTest.java
index cc92bf3..4a703d7 100644
--- a/src/test/java/com/android/tools/r8/R8CommandTest.java
+++ b/src/test/java/com/android/tools/r8/R8CommandTest.java
@@ -143,7 +143,6 @@
     assertEquals(Tool.R8, marker.getTool());
   }
 
-
   @Test(expected=CompilationFailedException.class)
   public void nonExistingFlagsFile() throws Throwable {
     Path working = temp.getRoot().toPath();
@@ -157,6 +156,24 @@
                 handler).build()));
   }
 
+  @Test(expected = CompilationFailedException.class)
+  public void recursiveFlagsFile() throws Throwable {
+    Path working = temp.getRoot().toPath();
+    Path flagsFile = working.resolve("flags.txt");
+    Path recursiveFlagsFile = working.resolve("recursive_flags.txt");
+    Path input = Paths.get(EXAMPLES_BUILD_DIR + "/arithmetic.jar").toAbsolutePath();
+    FileUtils.writeTextFile(recursiveFlagsFile, "--output", "output.zip");
+    FileUtils.writeTextFile(
+        flagsFile, "--min-api", "24", input.toString(), "@" + recursiveFlagsFile);
+    DiagnosticsChecker.checkErrorsContains(
+        "Recursive @argfiles are not supported",
+        handler ->
+            R8.run(
+                R8Command.parse(
+                        new String[] {"@" + flagsFile.toString()}, EmbeddedOrigin.INSTANCE, handler)
+                    .build()));
+  }
+
   @Test
   public void printsHelpOnNoInput() throws Throwable {
     ProcessResult result = ToolHelper.forkR8(temp.getRoot().toPath());