From a81e2f251c8adcde0b5867e4b095371f4ee120b6 Mon Sep 17 00:00:00 2001 From: mae Date: Sat, 8 Aug 2026 11:57:17 -0500 Subject: [PATCH] internal/rosa/azalea: simplified delimiter insertion function --- internal/rosa/azalea/azalea.go | 100 +++++++++++---------------------- 1 file changed, 33 insertions(+), 67 deletions(-) diff --git a/internal/rosa/azalea/azalea.go b/internal/rosa/azalea/azalea.go index ac0212d4..982fea2d 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 = insertSemicolons(r) + r, err = 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 insertSemicolons(r io.Reader) (io.Reader, error) { +func insertDelimiters(r io.Reader) (io.Reader, error) { var s scanner.Scanner s.Init(r) s.Mode = scanner.ScanIdents | @@ -362,94 +362,60 @@ func insertSemicolons(r io.Reader) (io.Reader, error) { s.IsIdentRune = isIdentRune var buf strings.Builder - nlsemi := false - nlcomma := false - b := new(RuneStack) + nldelim := false + b := new(runeStack) - tok := s.Scan() - for tok != scanner.EOF { + for tok := s.Scan(); tok != scanner.EOF; tok = s.Scan() { switch tok { - case '\n': - if b.Peek() == '{' && nlsemi { - buf.WriteRune(';') - nlsemi = false - } - if b.Peek() == '[' && nlcomma { - buf.WriteRune(',') - nlcomma = false - } - case ';': - buf.WriteRune(tok) - nlsemi = false - case ',': - buf.WriteRune(tok) - nlcomma = false case '{', '[': - nlsemi = false - nlcomma = false - buf.WriteRune(tok) - b.Push(tok) - case '}', ']': - r := b.Pop() - if r == '{' { - if nlsemi { - buf.WriteRune(';') - } - nlcomma = true - nlsemi = true - } - if r == '[' { - if nlcomma { - buf.WriteRune(',') - } - nlsemi = true + nldelim = false + if tok == '{' { + b.Push(';') + } else { + b.Push(',') } buf.WriteRune(tok) - case '+', ':', '=': - buf.WriteRune(tok) - nlsemi = false - nlcomma = false case scanner.String, scanner.RawString, scanner.Int, scanner.Ident: buf.WriteString(s.TokenText()) - if b.Peek() == '{' { - nlsemi = true - } else if b.Peek() == '[' { - nlcomma = true + nldelim = true + case '+', ':', '=', ',', ';': + nldelim = false + buf.WriteRune(tok) + case '\n': + if nldelim { + buf.WriteRune(b.Peek()) + nldelim = false } + buf.WriteRune(tok) + case '}', ']': + if nldelim { + buf.WriteRune(b.Peek()) + } + b.Pop() + nldelim = true + buf.WriteRune(tok) default: - buf.WriteString(s.TokenText()) + buf.WriteRune(tok) } - - tok = s.Scan() } return strings.NewReader(buf.String()), nil } -type Stack[T any] interface { - Push(T) - Pop() T - Peek() T - Length() int -} -type RuneStack struct { +type runeStack struct { arr []rune - Stack[rune] } -func (s *RuneStack) Push(r rune) { +func (s *runeStack) Push(r rune) { s.arr = append(s.arr, r) } -func (s *RuneStack) String() string { - return string(s.arr) -} -func (s *RuneStack) Peek() rune { +func (s *runeStack) Peek() rune { if s.Length() > 0 { return s.arr[s.Length()-1] } - return 0 + return '\n' } -func (s *RuneStack) Pop() rune { +func (s *runeStack) Pop() rune { v := s.Peek() if s.Length() > 1 { s.arr = s.arr[:s.Length()-1] @@ -458,6 +424,6 @@ func (s *RuneStack) Pop() rune { } return v } -func (s *RuneStack) Length() int { +func (s *runeStack) Length() int { return len(s.arr) }