Allow structField callables to specify useSkylarkSemantics, useLocation, and useEnvironment
Unfortunately this doesn't work for all callers, namely NativeInfo objects, as they may have structField callables invoked from contexts that have no environment available.
RELNOTES[INC]: Skylark structs (using struct()) may no longer have to_json and to_proto overridden.
PiperOrigin-RevId: 201376969
diff --git a/src/main/java/com/google/devtools/build/lib/packages/StructProvider.java b/src/main/java/com/google/devtools/build/lib/packages/StructProvider.java
index 21f8475..4396b43 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/StructProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/StructProvider.java
@@ -38,8 +38,14 @@
@Override
public Info createStruct(SkylarkDict<?, ?> kwargs, Location loc) throws EvalException {
- return SkylarkInfo.createSchemaless(
- this, kwargs.getContents(String.class, Object.class, "kwargs"), loc);
+ Map<String, Object> kwargsMap = kwargs.getContents(String.class, Object.class, "kwargs");
+ if (kwargsMap.containsKey("to_json")) {
+ throw new EvalException(loc, "cannot override built-in struct function 'to_json'");
+ }
+ if (kwargsMap.containsKey("to_proto")) {
+ throw new EvalException(loc, "cannot override built-in struct function 'to_proto'");
+ }
+ return SkylarkInfo.createSchemaless(this, kwargsMap, loc);
}
/**