diff --git a/builtins.go b/builtins.go index e426b069c..5ff1e8475 100644 --- a/builtins.go +++ b/builtins.go @@ -1215,7 +1215,10 @@ func builtinObjectHasEx(i *interpreter, objv value, fnamev value, includeHiddenV return nil, err } h := withHiddenFromBool(includeHidden.value) - hasField := objectHasField(objectBinding(obj), string(fname.getRunes()), h) + + hide, hasField := objectFieldsVisibility(obj)[string(fname.getRunes())] + hasField = hasField && (h == withHidden || hide != ast.ObjectFieldHidden) + return makeValueBoolean(hasField), nil } @@ -2097,12 +2100,12 @@ func builtinAvg(i *interpreter, arrv value) (value, error) { if err != nil { return nil, err } - + len := float64(arr.length()) if len == 0 { return nil, i.Error("Cannot calculate average of an empty array.") } - + sumValue, err := builtinSum(i, arrv) if err != nil { return nil, err @@ -2112,7 +2115,7 @@ func builtinAvg(i *interpreter, arrv value) (value, error) { return nil, err } - avg := sum.value/len + avg := sum.value / len return makeValueNumber(avg), nil } diff --git a/interpreter.go b/interpreter.go index 390d459b6..9e4a61674 100644 --- a/interpreter.go +++ b/interpreter.go @@ -557,7 +557,7 @@ func (i *interpreter) evaluate(a ast.Node, tc tailCallStatus) (value, error) { if err != nil { return nil, err } - hasField := objectHasField(i.stack.getSelfBinding().super(), indexStr.getGoString(), withHidden) + hasField := objectHasField(i.stack.getSelfBinding().super(), indexStr.getGoString()) return makeValueBoolean(hasField), nil case *ast.Function: diff --git a/testdata/std.objectHasEx5.golden b/testdata/std.objectHasEx5.golden new file mode 100644 index 000000000..c508d5366 --- /dev/null +++ b/testdata/std.objectHasEx5.golden @@ -0,0 +1 @@ +false diff --git a/testdata/std.objectHasEx5.jsonnet b/testdata/std.objectHasEx5.jsonnet new file mode 100644 index 000000000..76600ee83 --- /dev/null +++ b/testdata/std.objectHasEx5.jsonnet @@ -0,0 +1 @@ +std.objectHasEx({"x":: null} + {"x": null}, "x", false) diff --git a/testdata/std.objectHasEx5.linter.golden b/testdata/std.objectHasEx5.linter.golden new file mode 100644 index 000000000..e69de29bb diff --git a/testdata/stdlib_smoke_test.golden b/testdata/stdlib_smoke_test.golden index b2e507f81..5a97cfb65 100644 --- a/testdata/stdlib_smoke_test.golden +++ b/testdata/stdlib_smoke_test.golden @@ -88,6 +88,8 @@ "format": "test blah 42", "get": [ 17, + 42, + 18, 42 ], "isArray": true, diff --git a/testdata/stdlib_smoke_test.jsonnet b/testdata/stdlib_smoke_test.jsonnet index 53a6d9537..09d9437f1 100644 --- a/testdata/stdlib_smoke_test.jsonnet +++ b/testdata/stdlib_smoke_test.jsonnet @@ -26,6 +26,8 @@ get: [ std.get(o={a:: 17}, f="a"), std.get(o={a:: 17}, f="a", default=42, inc_hidden=false), + std.get(o={a:: 17} + {a: 18}, f="a", default=42), + std.get(o={a:: 17} + {a: 18}, f="a", default=42, inc_hidden=false), ], // isSomething diff --git a/thunks.go b/thunks.go index 1cccadb60..e98c487cb 100644 --- a/thunks.go +++ b/thunks.go @@ -150,7 +150,7 @@ func (f *plusSuperUnboundField) evaluate(i *interpreter, sb selfBinding, origBin return nil, err } - if !objectHasField(sb.super(), fieldName, withHidden) { + if !objectHasField(sb.super(), fieldName) { return right, nil } diff --git a/value.go b/value.go index f3b760d07..98ec286d6 100644 --- a/value.go +++ b/value.go @@ -730,12 +730,9 @@ func objectIndex(i *interpreter, sb selfBinding, fieldName string) (value, error return val, err } -func objectHasField(sb selfBinding, fieldName string, h hidden) bool { - found, field, _, _, _ := findField(sb.self.uncached, sb.superDepth, fieldName) - if !found || (h == withoutHidden && field.hide == ast.ObjectFieldHidden) { - return false - } - return true +func objectHasField(sb selfBinding, fieldName string) bool { + found, _, _, _, _ := findField(sb.self.uncached, sb.superDepth, fieldName) + return found } type fieldHideMap map[string]ast.ObjectFieldHide