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);