From 610e2df5f5397bf993c0173e067fc6b1b55059ca Mon Sep 17 00:00:00 2001 From: Celestino Amoroso Date: Thu, 30 Apr 2026 07:06:20 +0200 Subject: [PATCH] operator-dot: added support to access dict value by exprssion; example: D.key, D."key", D.expr --- operator-dot.go | 11 +++++++++++ t_dict_test.go | 3 +++ 2 files changed, 14 insertions(+) diff --git a/operator-dot.go b/operator-dot.go index 2d99755..bcbf1ac 100644 --- a/operator-dot.go +++ b/operator-dot.go @@ -44,6 +44,17 @@ func evalDot(ctx kern.ExprContext, opTerm *term) (v any, err error) { } else { err = indexTerm.tk.ErrorExpectedGot("identifier") } + case *kern.DictType: + s := opTerm.children[1].symbol() + if s == SymVariable || s == SymString { + src := opTerm.children[1].Source() + if len(src) > 1 && src[0] == '"' && src[len(src)-1] == '"' { + src = src[1 : len(src)-1] + } + v, err = unboxedValue.GetItem(src) + } else if rightValue, err = opTerm.children[1].Compute(ctx); err == nil { + v, err = unboxedValue.GetItem(rightValue) + } default: if rightValue, err = opTerm.children[1].Compute(ctx); err == nil { err = opTerm.errIncompatibleTypes(leftValue, rightValue) diff --git a/t_dict_test.go b/t_dict_test.go index 1e58bdc..ce764de 100644 --- a/t_dict_test.go +++ b/t_dict_test.go @@ -39,6 +39,9 @@ func TestDictParser(t *testing.T) { //"b":2, "c":3 }`, map[any]any{"a": 1, "c": 3}, nil}, + /* 13 */ {`D={"a":1, "b":2}; D."a"`, int64(1), nil}, + /* 14 */ {`D={"a":1, "b":2}; D.a`, int64(1), nil}, + /* 15 */ {`D={1:"a", 2:"b", 3:"c"}; D.(1+2)`, "c", nil}, } succeeded := 0