diff --git a/builtins.go b/builtins.go index 9f67ffc..e002a1e 100644 --- a/builtins.go +++ b/builtins.go @@ -1224,7 +1224,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 } diff --git a/interpreter.go b/interpreter.go index 5f82ab9..4bec1f6 100644 --- a/interpreter.go +++ b/interpreter.go @@ -585,7 +585,7 @@ func (i *interpreter) rawevaluate(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 0000000..c508d53 --- /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 0000000..76600ee --- /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 0000000..e69de29 diff --git a/testdata/stdlib_smoke_test.golden b/testdata/stdlib_smoke_test.golden index 184df18..3b2e863 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 1ac4f33..ca9ccf8 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 1cccadb..e98c487 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 f3b760d..98ec286 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