Fail gracefully when loading a .bzl file with an unknown or duplicate rule attribute flag
... instead of crashing the server with an IllegalArgumentException or
IllegalStateException.
RELNOTES: None
PiperOrigin-RevId: 360176332
diff --git a/src/main/java/com/google/devtools/build/lib/packages/Attribute.java b/src/main/java/com/google/devtools/build/lib/packages/Attribute.java
index 1e9cfd4..3433d15 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/Attribute.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/Attribute.java
@@ -476,7 +476,7 @@
private Builder<TYPE> setPropertyFlag(PropertyFlag flag, String propertyName) {
Preconditions.checkState(
- !propertyFlags.contains(flag), "%s flag is already set", propertyName);
+ !propertyFlags.contains(flag), "'%s' flag is already set", propertyName);
propertyFlags.add(flag);
return this;
}
@@ -484,15 +484,22 @@
/**
* Sets the property flag of the corresponding name if exists, otherwise throws an Exception.
* Only meant to use from Starlark, do not use from Java.
+ *
+ * @throws EvalException if a property flag with the provided name does not exist or cannot be
+ * set.
*/
- public Builder<TYPE> setPropertyFlag(String propertyName) {
+ public Builder<TYPE> setPropertyFlag(String propertyName) throws EvalException {
PropertyFlag flag = null;
try {
flag = PropertyFlag.valueOf(propertyName);
} catch (IllegalArgumentException e) {
- throw new IllegalArgumentException("unknown attribute flag " + propertyName);
+ throw Starlark.errorf("unknown attribute flag '%s'", propertyName);
}
- setPropertyFlag(flag, propertyName);
+ try {
+ setPropertyFlag(flag, propertyName);
+ } catch (IllegalStateException e) {
+ throw new EvalException(e);
+ }
return this;
}