Accept expansion flags expanding to expansion flags in invocation policy.
Fix bug where a null value in the expansion text lead to a NullPointerException.
RELNOTES: None.
PiperOrigin-RevId: 164061496
diff --git a/src/main/java/com/google/devtools/common/options/InvocationPolicyEnforcer.java b/src/main/java/com/google/devtools/common/options/InvocationPolicyEnforcer.java
index 562221d..9d8c13a 100644
--- a/src/main/java/com/google/devtools/common/options/InvocationPolicyEnforcer.java
+++ b/src/main/java/com/google/devtools/common/options/InvocationPolicyEnforcer.java
@@ -349,7 +349,7 @@
repeatableSubflagsInSetValues.put(currentSubflag.getName(), currentSubflag);
} else {
FlagPolicy subflagAsPolicy =
- getSubflagAsPolicy(currentSubflag, originalPolicy, isExpansion);
+ getSingleValueSubflagAsPolicy(currentSubflag, originalPolicy, isExpansion);
// In case any of the expanded flags are themselves expansions, recurse.
expandedPolicies.addAll(expandPolicy(subflagAsPolicy, parser));
}
@@ -425,19 +425,28 @@
* For an expansion flag in an invocation policy, each flag it expands to must be given a
* corresponding policy.
*/
- private static FlagPolicy getSubflagAsPolicy(
+ private static FlagPolicy getSingleValueSubflagAsPolicy(
OptionValueDescription currentSubflag, FlagPolicy originalPolicy, boolean isExpansion)
throws OptionsParsingException {
FlagPolicy subflagAsPolicy = null;
switch (originalPolicy.getOperationCase()) {
case SET_VALUE:
- assert (!currentSubflag.getAllowMultiple());
+ if (currentSubflag.getAllowMultiple()) {
+ throw new AssertionError(
+ "SetValue subflags with allowMultiple should have been dealt with separately and "
+ + "accumulated into a single FlagPolicy.");
+ }
+ // Accept null originalValueStrings, they are expected when the subflag is also an expansion
+ // flag.
+ List<String> subflagValue;
+ if (currentSubflag.getOriginalValueString() == null) {
+ subflagValue = ImmutableList.of();
+ } else {
+ subflagValue = ImmutableList.of(currentSubflag.getOriginalValueString());
+ }
subflagAsPolicy =
getSetValueSubflagAsPolicy(
- currentSubflag.getName(),
- ImmutableList.of(currentSubflag.getOriginalValueString()),
- /*allowMultiple=*/ false,
- originalPolicy);
+ currentSubflag.getName(), subflagValue, /*allowMultiple=*/ false, originalPolicy);
break;
case USE_DEFAULT: