diff --git a/internal/rosa/azalea/azalea.go b/internal/rosa/azalea/azalea.go index 982fea2d..226292c3 100644 --- a/internal/rosa/azalea/azalea.go +++ b/internal/rosa/azalea/azalea.go @@ -303,7 +303,7 @@ func (ScanError) Error() string { // Parse parses expressions from r. func Parse(r io.Reader) (e []any, err error) { - r, err = insertDelimiters(r) + r = insertDelimiters(r) var p parser p.s.Init(r) @@ -349,7 +349,7 @@ func isIdentRune(ch rune, i int) bool { } return ch > 0 && ch < rune(len(idents)) && idents[ch] } -func insertDelimiters(r io.Reader) (io.Reader, error) { +func insertDelimiters(r io.Reader) io.Reader { var s scanner.Scanner s.Init(r) s.Mode = scanner.ScanIdents | @@ -361,44 +361,43 @@ func insertDelimiters(r io.Reader) (io.Reader, error) { s.Whitespace = 0 s.IsIdentRune = isIdentRune - var buf strings.Builder + var b strings.Builder nldelim := false - b := new(runeStack) + delim := new(runeStack) for tok := s.Scan(); tok != scanner.EOF; tok = s.Scan() { switch tok { case '{', '[': nldelim = false if tok == '{' { - b.Push(';') + delim.Push(';') } else { - b.Push(',') + delim.Push(',') } - buf.WriteRune(tok) + b.WriteRune(tok) case scanner.String, scanner.RawString, scanner.Int, scanner.Ident: - buf.WriteString(s.TokenText()) + b.WriteString(s.TokenText()) nldelim = true case '+', ':', '=', ',', ';': nldelim = false - buf.WriteRune(tok) + b.WriteRune(tok) case '\n': if nldelim { - buf.WriteRune(b.Peek()) + b.WriteRune(delim.Peek()) nldelim = false } - buf.WriteRune(tok) case '}', ']': if nldelim { - buf.WriteRune(b.Peek()) + b.WriteRune(delim.Peek()) } - b.Pop() + delim.Pop() nldelim = true - buf.WriteRune(tok) + b.WriteRune(tok) default: - buf.WriteRune(tok) + b.WriteRune(tok) } } - return strings.NewReader(buf.String()), nil + return strings.NewReader(b.String()) } type runeStack struct { diff --git a/internal/rosa/azalea/azalea_test.go b/internal/rosa/azalea/azalea_test.go index 87b202a1..44faf8a5 100644 --- a/internal/rosa/azalea/azalea_test.go +++ b/internal/rosa/azalea/azalea_test.go @@ -64,7 +64,22 @@ func TestParse(t *testing.T) { {"missing array delimiter", `[ v0 v1 ]`, nil, TokenError{',', scanner.Ident}}, {"truncated array", `[ "\x00"`, nil, ExprError(scanner.EOF)}, - + {"array of func", "[\nf {\n v = v\n v2 =\n v2\n }\n g {\n w = w\n w2 = w2\n}\n]\n", []any{Array{ + Val{Func{ + Ident: Ident("f"), + Args: []Arg{ + {K: []Ident{Ident("v")}, V: Val{Ident("v")}}, + {K: []Ident{Ident("v2")}, V: Val{Ident("v2")}}, + }, + }}, + Val{Func{ + Ident: Ident("g"), + Args: []Arg{ + {K: []Ident{Ident("w")}, V: Val{Ident("w")}}, + {K: []Ident{Ident("w2")}, V: Val{Ident("w2")}}, + }, + }}, + }}, nil}, {"gcc", gccSample, []any{Func{ Ident: Ident("gcc"), Package: true, @@ -153,8 +168,7 @@ func TestParse(t *testing.T) { {K: []Ident{Ident("version")}, V: Val{String("26.2.0")}, R: true}, {K: []Ident{Ident("source")}, V: Val{Func{ - Ident: Ident("remoteGitLab"), - Package: false, + Ident: Ident("remoteGitLab"), Args: []Arg{ {K: []Ident{Ident("domain")}, V: Val{String("gitlab.freedesktop.org")}}, {K: []Ident{Ident("suffix")}, V: Val{String("mesa/mesa")}}, @@ -162,7 +176,7 @@ func TestParse(t *testing.T) { {K: []Ident{Ident("checksum")}, V: Val{String("UPnIdpo5wUsE938GXY-YyYDzfF62enRoEzCYRyLLPvzBhBbP4wZ8nDiKsjivcs5v")}}, }, }}}, - {K: []Ident{Ident("exec")}, V: Val{Func{Ident: Ident("meson"), Package: false, Args: []Arg{ + {K: []Ident{Ident("exec")}, V: Val{Func{Ident: Ident("meson"), Args: []Arg{ {K: []Ident{Ident("setup")}, V: Val{[]KV{ {K: String("platforms"), V: Val{String("x11,wayland")}}, {K: String("video-codecs"), V: Val{String("all")}}, @@ -170,8 +184,7 @@ func TestParse(t *testing.T) { {K: String("gbm"), V: Val{String("enabled")}}, {K: String("egl"), V: Val{String("enabled")}}, {K: String("gallium-drivers"), V: Val{Func{ - Ident: Ident("join"), - Package: false, + Ident: Ident("join"), Args: []Arg{ {K: []Ident{Ident("elems")}, V: Val{Array{ Val{String("asahi")}, @@ -198,8 +211,7 @@ func TestParse(t *testing.T) { }, }}}, {K: String("vulkan-drivers"), V: Val{Func{ - Ident: Ident("join"), - Package: false, + Ident: Ident("join"), Args: []Arg{ {K: []Ident{Ident("elems")}, V: Val{Array{ Val{String("amd")}, @@ -217,8 +229,7 @@ func TestParse(t *testing.T) { {K: []Ident{Ident("sep")}, V: Val{String(",")}}}, }}}, {K: String("vulkan-layers"), V: Val{Func{ - Ident: Ident("join"), - Package: false, + Ident: Ident("join"), Args: []Arg{ {K: []Ident{Ident("elems")}, V: Val{Array{ Val{String("device-select")},