summaryrefslogtreecommitdiff
path: root/parser
diff options
context:
space:
mode:
authorMarc Vertes <mvertes@free.fr>2026-01-07 19:06:23 +0100
committerMarc Vertes <mvertes@free.fr>2026-01-07 19:06:23 +0100
commit6875facb39de63eb6353be2f700b9eacb631e9fa (patch)
tree31b8d7c8701df2f52a7b3cecc82dd775c9d9f428 /parser
parentca80eeaa812b49afea75d3084d0c62770e4a8d18 (diff)
fix: improve handling of composite literal struct expressions
Diffstat (limited to 'parser')
-rw-r--r--parser/decl.go4
-rw-r--r--parser/expr.go31
2 files changed, 29 insertions, 6 deletions
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