Skip to content

Commit 94a40b2

Browse files
authored
Fix field visibility in objectHas for extended objects (#737)
1 parent c159b34 commit 94a40b2

9 files changed

+15
-9
lines changed

builtins.go

+4-1
Original file line numberDiff line numberDiff line change
@@ -1224,7 +1224,10 @@ func builtinObjectHasEx(i *interpreter, objv value, fnamev value, includeHiddenV
12241224
return nil, err
12251225
}
12261226
h := withHiddenFromBool(includeHidden.value)
1227-
hasField := objectHasField(objectBinding(obj), string(fname.getRunes()), h)
1227+
1228+
hide, hasField := objectFieldsVisibility(obj)[string(fname.getRunes())]
1229+
hasField = hasField && (h == withHidden || hide != ast.ObjectFieldHidden)
1230+
12281231
return makeValueBoolean(hasField), nil
12291232
}
12301233

interpreter.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -585,7 +585,7 @@ func (i *interpreter) rawevaluate(a ast.Node, tc tailCallStatus) (value, error)
585585
if err != nil {
586586
return nil, err
587587
}
588-
hasField := objectHasField(i.stack.getSelfBinding().super(), indexStr.getGoString(), withHidden)
588+
hasField := objectHasField(i.stack.getSelfBinding().super(), indexStr.getGoString())
589589
return makeValueBoolean(hasField), nil
590590

591591
case *ast.Function:

testdata/std.objectHasEx5.golden

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
false

testdata/std.objectHasEx5.jsonnet

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
std.objectHasEx({"x":: null} + {"x": null}, "x", false)

testdata/std.objectHasEx5.linter.golden

Whitespace-only changes.

testdata/stdlib_smoke_test.golden

+2
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,8 @@
8888
"format": "test blah 42",
8989
"get": [
9090
17,
91+
42,
92+
18,
9193
42
9294
],
9395
"isArray": true,

testdata/stdlib_smoke_test.jsonnet

+2
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@
2626
get: [
2727
std.get(o={a:: 17}, f="a"),
2828
std.get(o={a:: 17}, f="a", default=42, inc_hidden=false),
29+
std.get(o={a:: 17} + {a: 18}, f="a", default=42),
30+
std.get(o={a:: 17} + {a: 18}, f="a", default=42, inc_hidden=false),
2931
],
3032

3133
// isSomething

thunks.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,7 @@ func (f *plusSuperUnboundField) evaluate(i *interpreter, sb selfBinding, origBin
150150
return nil, err
151151
}
152152

153-
if !objectHasField(sb.super(), fieldName, withHidden) {
153+
if !objectHasField(sb.super(), fieldName) {
154154
return right, nil
155155
}
156156

value.go

+3-6
Original file line numberDiff line numberDiff line change
@@ -730,12 +730,9 @@ func objectIndex(i *interpreter, sb selfBinding, fieldName string) (value, error
730730
return val, err
731731
}
732732

733-
func objectHasField(sb selfBinding, fieldName string, h hidden) bool {
734-
found, field, _, _, _ := findField(sb.self.uncached, sb.superDepth, fieldName)
735-
if !found || (h == withoutHidden && field.hide == ast.ObjectFieldHidden) {
736-
return false
737-
}
738-
return true
733+
func objectHasField(sb selfBinding, fieldName string) bool {
734+
found, _, _, _, _ := findField(sb.self.uncached, sb.superDepth, fieldName)
735+
return found
739736
}
740737

741738
type fieldHideMap map[string]ast.ObjectFieldHide

0 commit comments

Comments
 (0)