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/decl.go | 4 ++-- parser/expr.go | 31 +++++++++++++++++++++++++++---- 2 files changed, 29 insertions(+), 6 deletions(-) (limited to 'parser') diff --git a/parser/decl.go b/parser/decl.go index 015f4bd..e418b5e 100644 --- a/parser/decl.go +++ b/parser/decl.go @@ -243,10 +243,10 @@ func (p *Parser) parseImportLine(in Tokens) (out Tokens, err error) { if n == "." { // Import package symbols in the current scope. for k, v := range pkg { - p.Symbols[k] = &symbol.Symbol{Index: symbol.UnsetAddr, PkgPath: pp, Value: v} + p.Symbols[k] = &symbol.Symbol{Index: symbol.UnsetAddr, Name: k, Kind: symbol.Value, PkgPath: pp, Value: v} } } else { - p.Symbols[n] = &symbol.Symbol{Kind: symbol.Pkg, PkgPath: pp, Index: symbol.UnsetAddr} + p.Symbols[n] = &symbol.Symbol{Kind: symbol.Pkg, PkgPath: pp, Index: symbol.UnsetAddr, Name: n} } return out, err } 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