eval: allow 'list += x' where x is not iterable but defines list+x (#70)
This is the case for Bazel's depset
(although it really ought to be iterable).
Added regression test using hasfields, which is noniterable but
defines list+hasfields rather arbitraily.
Also: improve UnpackArgs failure when argument is a pointer.
diff --git a/eval_test.go b/eval_test.go
index 9ee38bc..e4d3e3d 100644
--- a/eval_test.go
+++ b/eval_test.go
@@ -186,7 +186,10 @@
frozen bool
}
-var _ skylark.HasAttrs = (*hasfields)(nil)
+var (
+ _ skylark.HasAttrs = (*hasfields)(nil)
+ _ skylark.HasBinary = (*hasfields)(nil)
+)
func (hf *hasfields) String() string { return "hasfields" }
func (hf *hasfields) Type() string { return "hasfields" }
@@ -220,6 +223,17 @@
return names
}
+func (hf *hasfields) Binary(op syntax.Token, y skylark.Value, side skylark.Side) (skylark.Value, error) {
+ // This method exists so we can exercise 'list += x'
+ // where x is not Iterable but defines list+x.
+ if op == syntax.PLUS {
+ if _, ok := y.(*skylark.List); ok {
+ return skylark.MakeInt(42), nil // list+hasfields is 42
+ }
+ }
+ return nil, nil
+}
+
func TestParameterPassing(t *testing.T) {
const filename = "parameters.go"
const src = `