Allow whitespace in keep rule modifier list

Bug: 78442725
Change-Id: I116c176295914233e5ad3b4e8515dd8cadb17f0b
diff --git a/src/main/java/com/android/tools/r8/shaking/ProguardConfigurationParser.java b/src/main/java/com/android/tools/r8/shaking/ProguardConfigurationParser.java
index 38aa903..9b89374 100644
--- a/src/main/java/com/android/tools/r8/shaking/ProguardConfigurationParser.java
+++ b/src/main/java/com/android/tools/r8/shaking/ProguardConfigurationParser.java
@@ -615,7 +615,9 @@
     }
 
     private void parseRuleModifiers(ProguardKeepRule.Builder builder) {
+      skipWhitespace();
       while (acceptChar(',')) {
+        skipWhitespace();
         if (acceptString("allow")) {
           if (acceptString("shrinking")) {
             builder.getModifiersBuilder().setAllowsShrinking(true);
@@ -627,6 +629,7 @@
         } else if (acceptString("includedescriptorclasses")) {
           builder.getModifiersBuilder().setIncludeDescriptorClasses(true);
         }
+        skipWhitespace();
       }
     }
 
diff --git a/src/test/java/com/android/tools/r8/shaking/ProguardConfigurationParserTest.java b/src/test/java/com/android/tools/r8/shaking/ProguardConfigurationParserTest.java
index da4d57f..89a7291 100644
--- a/src/test/java/com/android/tools/r8/shaking/ProguardConfigurationParserTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/ProguardConfigurationParserTest.java
@@ -808,6 +808,33 @@
   }
 
   @Test
+  public void parseKeepModifiers() {
+    List<String> ws = ImmutableList.of("", " ", "   ", "\t", " \t", " \t", " \t ", " \t\t \t ");
+
+    for (String before : ws) {
+      for (String after : ws) {
+        reset();
+        ProguardConfiguration config = parseAndVerifyParserEndsCleanly(ImmutableList.of(
+            "-keep"
+                + before + "," + after + "includedescriptorclasses"
+                + before + "," + after + "allowshrinking"
+                + before + "," + after + "allowobfuscation"
+                + before + "," + after + "allowoptimization "
+                + "class A { *; }"
+        ));
+      }
+    }
+  }
+
+  @Test
+  public void regress78442725() {
+    parseAndVerifyParserEndsCleanly(ImmutableList.of(
+        "-keep, includedescriptorclasses class in.uncod.android.bypass.Document { *; }",
+        "-keep, includedescriptorclasses class in.uncod.android.bypass.Element { *; }"
+    ));
+  }
+
+  @Test
   public void parseSeeds() throws Exception {
     ProguardConfigurationParser parser =
         new ProguardConfigurationParser(new DexItemFactory(), reporter);