bazel syntax: assert validity of results from Java calls
Other than legal Starlark values, the implicit conversion to Starlark
now accepts only null, List, and Map.
- make Attribute.{Computed,LateBound}Default implement StarlarkValue
- move SkylarkType.convertToSkylark to Starlark.fromJava.
- move SkylarkType.isSkylarkAcceptable to Starlark.valid.
- move support for legacy implicit NestedSet conversion to MethodDescriptor.
I was hoping to delete this but there are still a dozen or so clients to fix.
PiperOrigin-RevId: 281382879
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/SkylarkEvaluationTest.java b/src/test/java/com/google/devtools/build/lib/syntax/SkylarkEvaluationTest.java
index 902e964..6b8bb04 100644
--- a/src/test/java/com/google/devtools/build/lib/syntax/SkylarkEvaluationTest.java
+++ b/src/test/java/com/google/devtools/build/lib/syntax/SkylarkEvaluationTest.java
@@ -146,7 +146,7 @@
public void value() {}
@SkylarkCallable(name = "return_bad", documented = false)
public Bad returnBad() {
- return new Bad();
+ return new Bad(); // not a legal Starlark value
}
@SkylarkCallable(name = "struct_field", documented = false, structField = true)
public String structField() {
@@ -520,7 +520,8 @@
public Object getValue(String name) {
switch (name) {
case "field": return "a";
- case "nset": return NestedSetBuilder.stableOrder().build();
+ case "nset":
+ return NestedSetBuilder.stableOrder().build(); // not a legal Starlark value
default: return null;
}
}
@@ -1457,11 +1458,15 @@
}
@Test
- public void testJavaFunctionReturnsMutableObject() throws Exception {
- new SkylarkTest()
- .update("mock", new Mock())
- .testIfExactError(
- "method 'return_bad' returns an object of invalid type Bad", "mock.return_bad()");
+ public void testJavaFunctionReturnsIllegalValue() throws Exception {
+ update("mock", new Mock());
+ IllegalArgumentException e =
+ assertThrows(IllegalArgumentException.class, () -> eval("mock.return_bad()"));
+ assertThat(e)
+ .hasMessageThat()
+ .contains(
+ "cannot expose internal type to Starlark: class"
+ + " com.google.devtools.build.lib.syntax.SkylarkEvaluationTest$Bad");
}
@Test
@@ -1501,10 +1506,15 @@
}
@Test
- public void testClassObjectCannotAccessNestedSet() throws Exception {
- new SkylarkTest()
- .update("mock", new MockClassObject())
- .testIfErrorContains("internal error: type 'NestedSet' is not allowed", "v = mock.nset");
+ public void testFieldReturnsNestedSet() throws Exception {
+ update("mock", new MockClassObject());
+ IllegalArgumentException e =
+ assertThrows(IllegalArgumentException.class, () -> eval("mock.nset"));
+ assertThat(e)
+ .hasMessageThat()
+ .contains(
+ "cannot expose internal type to Starlark: class"
+ + " com.google.devtools.build.lib.collect.nestedset.NestedSet");
}
@Test