Cleanup parsing of Proguard configuration testing options
Change-Id: I6250cce82f0fcac8b614718c7be30f9b52d06bf9
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 483a80b..0da1602 100644
--- a/src/main/java/com/android/tools/r8/shaking/ProguardConfigurationParser.java
+++ b/src/main/java/com/android/tools/r8/shaking/ProguardConfigurationParser.java
@@ -217,8 +217,7 @@
configurationBuilder.addParsedConfiguration(contents.substring(positionAfterInclude));
}
- private boolean parseOption()
- throws ProguardRuleParserException {
+ private boolean parseOption() throws ProguardRuleParserException {
if (eof()) {
return false;
}
@@ -250,15 +249,11 @@
} else if (acceptString("keepdirectories")) {
configurationBuilder.enableKeepDirectories();
parsePathFilter(configurationBuilder::addKeepDirectories);
- } else if (allowTestOptions && acceptString("keepconstantarguments")) {
- ConstantArgumentRule rule = parseConstantArgumentRule(optionStart);
- configurationBuilder.addRule(rule);
- } else if (allowTestOptions && acceptString("keepunusedarguments")) {
- UnusedArgumentRule rule = parseUnusedArgumentRule(optionStart);
- configurationBuilder.addRule(rule);
} else if (acceptString("keep")) {
- ProguardKeepRule rule = parseKeepRule(optionStart);
- configurationBuilder.addRule(rule);
+ if (!parseTestingOption(optionStart)) {
+ ProguardKeepRule rule = parseKeepRule(optionStart);
+ configurationBuilder.addRule(rule);
+ }
} else if (acceptString("whyareyoukeeping")) {
ProguardWhyAreYouKeepingRule rule = parseWhyAreYouKeepingRule(optionStart);
configurationBuilder.addRule(rule);
@@ -380,28 +375,6 @@
} else if (acceptString("alwaysinline")) {
InlineRule rule = parseInlineRule(InlineRule.Type.ALWAYS, optionStart);
configurationBuilder.addRule(rule);
- } else if (allowTestOptions && acceptString("assumemayhavesideeffects")) {
- ProguardAssumeMayHaveSideEffectsRule rule = parseAssumeMayHaveSideEffectsRule(optionStart);
- configurationBuilder.addRule(rule);
- } else if (allowTestOptions && acceptString("forceinline")) {
- InlineRule rule = parseInlineRule(InlineRule.Type.FORCE, optionStart);
- configurationBuilder.addRule(rule);
- // Insert a matching -checkdiscard rule to ensure force inlining happens.
- ProguardCheckDiscardRule ruled = rule.asProguardCheckDiscardRule();
- configurationBuilder.addRule(ruled);
- } else if (allowTestOptions && acceptString("neverinline")) {
- InlineRule rule = parseInlineRule(InlineRule.Type.NEVER, optionStart);
- configurationBuilder.addRule(rule);
- } else if (allowTestOptions && acceptString("neverclassinline")) {
- ClassInlineRule rule = parseClassInlineRule(ClassInlineRule.Type.NEVER, optionStart);
- configurationBuilder.addRule(rule);
- } else if (allowTestOptions && acceptString("nevermerge")) {
- ClassMergingRule rule = parseClassMergingRule(ClassMergingRule.Type.NEVER, optionStart);
- configurationBuilder.addRule(rule);
- } else if (allowTestOptions && acceptString("neverpropagatevalue")) {
- MemberValuePropagationRule rule =
- parseMemberValuePropagationRule(MemberValuePropagationRule.Type.NEVER, optionStart);
- configurationBuilder.addRule(rule);
} else if (acceptString("adaptclassstrings")) {
parseClassFilter(configurationBuilder::addAdaptClassStringsPattern);
} else if (acceptString("adaptresourcefilenames")) {
@@ -416,7 +389,7 @@
configurationBuilder.setConfigurationDebugging(true);
} else if (acceptString("dontusemixedcaseclassnames")) {
configurationBuilder.setDontUseMixedCaseClassnames(true);
- } else {
+ } else if (!parseTestingOption(optionStart)) {
String unknownOption = acceptString();
String devMessage = "";
if (Version.isDev()
@@ -424,16 +397,68 @@
&& (unknownOption.equals("forceinline") || unknownOption.equals("neverinline"))) {
devMessage = ", this option needs to be turned on explicitly if used for tests.";
}
- unknownOption(unknownOption, optionStart, devMessage);
+ throw unknownOption(unknownOption, optionStart, devMessage);
}
return true;
}
- private void unknownOption(String unknownOption, TextPosition optionStart) {
- unknownOption(unknownOption, optionStart, "");
+ private boolean parseTestingOption(TextPosition optionStart)
+ throws ProguardRuleParserException {
+ if (allowTestOptions) {
+ if (acceptString("assumemayhavesideeffects")) {
+ ProguardAssumeMayHaveSideEffectsRule rule =
+ parseAssumeMayHaveSideEffectsRule(optionStart);
+ configurationBuilder.addRule(rule);
+ return true;
+ }
+ if (acceptString("forceinline")) {
+ InlineRule rule = parseInlineRule(InlineRule.Type.FORCE, optionStart);
+ configurationBuilder.addRule(rule);
+ // Insert a matching -checkdiscard rule to ensure force inlining happens.
+ ProguardCheckDiscardRule ruled = rule.asProguardCheckDiscardRule();
+ configurationBuilder.addRule(ruled);
+ return true;
+ }
+ if (acceptString("keepconstantarguments")) {
+ ConstantArgumentRule rule = parseConstantArgumentRule(optionStart);
+ configurationBuilder.addRule(rule);
+ return true;
+ }
+ if (acceptString("keepunusedarguments")) {
+ UnusedArgumentRule rule = parseUnusedArgumentRule(optionStart);
+ configurationBuilder.addRule(rule);
+ return true;
+ }
+ if (acceptString("neverclassinline")) {
+ ClassInlineRule rule = parseClassInlineRule(ClassInlineRule.Type.NEVER, optionStart);
+ configurationBuilder.addRule(rule);
+ return true;
+ }
+ if (acceptString("neverinline")) {
+ InlineRule rule = parseInlineRule(InlineRule.Type.NEVER, optionStart);
+ configurationBuilder.addRule(rule);
+ return true;
+ }
+ if (acceptString("nevermerge")) {
+ ClassMergingRule rule = parseClassMergingRule(ClassMergingRule.Type.NEVER, optionStart);
+ configurationBuilder.addRule(rule);
+ return true;
+ }
+ if (acceptString("neverpropagatevalue")) {
+ MemberValuePropagationRule rule =
+ parseMemberValuePropagationRule(MemberValuePropagationRule.Type.NEVER, optionStart);
+ configurationBuilder.addRule(rule);
+ return true;
+ }
+ }
+ return false;
}
- private void unknownOption(
+ private RuntimeException unknownOption(String unknownOption, TextPosition optionStart) {
+ throw unknownOption(unknownOption, optionStart, "");
+ }
+
+ private RuntimeException unknownOption(
String unknownOption, TextPosition optionStart, String additionalMessage) {
throw reporter.fatalError((new StringDiagnostic(
"Unknown option \"-" + unknownOption + "\"" + additionalMessage,
@@ -802,7 +827,7 @@
TextPosition start = getPosition();
acceptString("-");
String unknownOption = acceptString();
- unknownOption(unknownOption, start);
+ throw unknownOption(unknownOption, start);
}
} else {
builder.setType(ProguardKeepRuleType.KEEP);
@@ -813,7 +838,7 @@
TextPosition start = getPosition();
acceptString("-");
String unknownOption = acceptString();
- unknownOption(unknownOption, start);
+ throw unknownOption(unknownOption, start);
}
parseRuleModifiers(builder);
}