internal/rosa/azalea: refactor delimiter insertion, add test

This commit is contained in:
2026-08-08 14:25:37 -05:00
parent a81e2f251c
commit 9eb3ecd942
2 changed files with 36 additions and 26 deletions
+15 -16
View File
@@ -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 {