From 6875facb39de63eb6353be2f700b9eacb631e9fa Mon Sep 17 00:00:00 2001 From: Marc Vertes Date: Wed, 7 Jan 2026 19:06:23 +0100 Subject: fix: improve handling of composite literal struct expressions --- parser/expr.go | 31 +++++++++++++++++++++++++++---- 1 file changed, 27 insertions(+), 4 deletions(-) (limited to 'parser/expr.go') diff --git a/parser/expr.go b/parser/expr.go index 3327ec5..3895ea8 100644 --- a/parser/expr.go +++ b/parser/expr.go @@ -89,9 +89,6 @@ func (p *Parser) parseExpr(in Tokens, typeStr string) (out Tokens, err error) { ops = append(ops, t) case lang.Ident: - if i < lin-1 && in[i].Tok == lang.Colon { - continue - } s, sc, ok := p.Symbols.Get(t.Str, p.scope) if ok && sc != "" { t.Str = sc + "/" + t.Str @@ -123,7 +120,7 @@ func (p *Parser) parseExpr(in Tokens, typeStr string) (out Tokens, err error) { } case lang.BraceBlock: - toks, err := p.parseExprStr(t.Block(), typeStr) + toks, err := p.parseComposite(t.Block(), typeStr) out = append(out, toks...) if err != nil { return out, err @@ -163,6 +160,32 @@ func (p *Parser) parseExpr(in Tokens, typeStr string) (out Tokens, err error) { return out, err } +func (p *Parser) parseComposite(s, typ string) (Tokens, error) { + tokens, err := p.Scan(s, false) + if err != nil { + return nil, err + } + + noColon := len(tokens) > 0 && tokens.Index(lang.Colon) == -1 + var result Tokens + for i, sub := range tokens.Split(lang.Comma) { + toks, err := p.parseExpr(sub, typ) + if err != nil { + return result, err + } + if noColon { + // Insert a numeric index key and a colon operator. + result = append(result, scanner.Token{Tok: lang.Int, Str: strconv.Itoa(i)}) + result = append(result, toks...) + result = append(result, scanner.Token{Tok: lang.Colon, Str: ":"}) + } else { + result = append(result, toks...) + } + } + + return result, nil +} + func (p *Parser) parseExprStr(s, typ string) (tokens Tokens, err error) { if tokens, err = p.Scan(s, false); err != nil { return tokens, err -- cgit v1.2.3