aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/packages/SkylarkClassObjectConstructor.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/packages/SkylarkClassObjectConstructor.java')
-rw-r--r--src/main/java/com/google/devtools/build/lib/packages/SkylarkClassObjectConstructor.java32
1 files changed, 27 insertions, 5 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/packages/SkylarkClassObjectConstructor.java b/src/main/java/com/google/devtools/build/lib/packages/SkylarkClassObjectConstructor.java
index 0854822e43..e4788334c3 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/SkylarkClassObjectConstructor.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/SkylarkClassObjectConstructor.java
@@ -41,7 +41,7 @@ public final class SkylarkClassObjectConstructor extends BaseFunction implements
* "struct" function.
*/
public static final SkylarkClassObjectConstructor STRUCT =
- createNative("struct");
+ createNativeConstructable("struct");
private static final FunctionSignature.WithValues<Object, SkylarkType> SIGNATURE =
@@ -50,22 +50,39 @@ public final class SkylarkClassObjectConstructor extends BaseFunction implements
@Nullable
private Key key;
+ /**
+ * Some native declared providers are not constructable from Skylark.
+ */
+ private final boolean isConstructable;
+
private SkylarkClassObjectConstructor(String name, Location location) {
super(name, SIGNATURE, location);
+ // All Skylark-defined declared providers are constructable.
+ this.isConstructable = true;
}
- private SkylarkClassObjectConstructor(String name) {
- this(name, Location.BUILTIN);
- key = new NativeKey();
+ private SkylarkClassObjectConstructor(String name, boolean isConstructable) {
+ super(name, SIGNATURE, Location.BUILTIN);
+ this.key = new NativeKey();
+ this.isConstructable = isConstructable;
}
/**
* Create a native Declared Provider ({@link SkylarkClassObject} constructor)
*/
public static SkylarkClassObjectConstructor createNative(String name) {
- return new SkylarkClassObjectConstructor(name);
+ return new SkylarkClassObjectConstructor(name, false);
+ }
+
+ /**
+ * Create a native Declared Provider ({@link SkylarkClassObject} constructor)
+ * that can be constructed from Skylark.
+ */
+ public static SkylarkClassObjectConstructor createNativeConstructable(String name) {
+ return new SkylarkClassObjectConstructor(name, true);
}
+
/**
* Create a Skylark-defined Declared Provider ({@link SkylarkClassObject} constructor)
*
@@ -78,6 +95,11 @@ public final class SkylarkClassObjectConstructor extends BaseFunction implements
@Override
protected Object call(Object[] args, @Nullable FuncallExpression ast, @Nullable Environment env)
throws EvalException, InterruptedException {
+ if (!isConstructable) {
+ Location loc = ast != null ? ast.getLocation() : Location.BUILTIN;
+ throw new EvalException(loc,
+ String.format("'%s' cannot be constructed from Skylark", getPrintableName()));
+ }
@SuppressWarnings("unchecked")
Map<String, Object> kwargs = (Map<String, Object>) args[0];
return new SkylarkClassObject(this, kwargs, ast != null ? ast.getLocation() : Location.BUILTIN);