From 291e2f6df08a8fb35ed1bb1d0a6864822fce1f72 Mon Sep 17 00:00:00 2001 From: Matthew Nibecker Date: Fri, 11 Sep 2026 12:58:37 -0700 Subject: [PATCH] sfmt: Support optional fields in record expressions --- compiler/sfmt/ast.go | 3 +++ compiler/sfmt/dag.go | 3 +++ compiler/sfmt/ztests/optional-field.yaml | 13 +++++++++++++ 3 files changed, 19 insertions(+) create mode 100644 compiler/sfmt/ztests/optional-field.yaml diff --git a/compiler/sfmt/ast.go b/compiler/sfmt/ast.go index 81e927ce5..28c70bc97 100644 --- a/compiler/sfmt/ast.go +++ b/compiler/sfmt/ast.go @@ -185,6 +185,9 @@ func (c *canon) expr(e ast.Expr, parent string) { switch e := elem.(type) { case *ast.FieldElem: c.write(sup.QuotedName(e.Name.Text)) + if e.Opt { + c.write("?") + } c.write(":") c.expr(e.Value, "") case *ast.ExprElem: diff --git a/compiler/sfmt/dag.go b/compiler/sfmt/dag.go index 5af4bd7a5..f5db9b0af 100644 --- a/compiler/sfmt/dag.go +++ b/compiler/sfmt/dag.go @@ -220,6 +220,9 @@ func (c *canonDAG) recordElems(elems []dag.RecordElem) { switch e := elem.(type) { case *dag.Field: c.write(sup.QuotedName(e.Name)) + if e.Opt { + c.write("?") + } c.write(":") c.expr(e.Value, "") case *dag.Spread: diff --git a/compiler/sfmt/ztests/optional-field.yaml b/compiler/sfmt/ztests/optional-field.yaml new file mode 100644 index 000000000..fb28e96ce --- /dev/null +++ b/compiler/sfmt/ztests/optional-field.yaml @@ -0,0 +1,13 @@ +script: | + super compile -C 'values {x?:1}' + echo === + super compile -dag -C 'values {x?:1}' + +outputs: + - name: stdout + data: | + values {x?:1} + === + null + | values {x?:1} + | output main