From fec6265ac7dd77ba26c60b3f54cbe9d7312322ae Mon Sep 17 00:00:00 2001 From: mae Date: Fri, 7 Aug 2026 19:46:15 -0500 Subject: [PATCH] internal/rosa/azalea: improve delimiter insertion --- internal/rosa/azalea/azalea.go | 81 +++++++++++++++++++++++++--------- 1 file changed, 60 insertions(+), 21 deletions(-) diff --git a/internal/rosa/azalea/azalea.go b/internal/rosa/azalea/azalea.go index 825786bc..7668de55 100644 --- a/internal/rosa/azalea/azalea.go +++ b/internal/rosa/azalea/azalea.go @@ -364,17 +364,17 @@ func insertSemicolons(r io.Reader) (io.Reader, error) { var buf strings.Builder nlsemi := false nlcomma := false - b := "" + b := new(RuneStack) tok := s.Scan() for tok != scanner.EOF { switch tok { case '\n': - if b[len(b)-1] == '{' && nlsemi { + if b.Peek() == '{' && nlsemi { buf.WriteRune(';') nlsemi = false } - if b[len(b)-1] == '[' && nlcomma { + if b.Peek() == '[' && nlcomma { buf.WriteRune(',') nlcomma = false } @@ -386,38 +386,40 @@ func insertSemicolons(r io.Reader) (io.Reader, error) { nlcomma = false case '{', '[': nlsemi = false + nlcomma = false buf.WriteRune(tok) - b += string(tok) + b.Push(tok) case '}', ']': - if len(b) > 0 && b[len(b)-1] == '{' && nlsemi { - buf.WriteRune(';') - nlsemi = false - } - if len(b) > 0 && b[len(b)-1] == '[' && nlcomma { - buf.WriteRune(',') - nlcomma = false - } - if len(b) > 1 && b[len(b)-1] == '{' { - nlsemi = true - } - if len(b) > 1 && b[len(b)-1] == '[' { + r := b.Pop() + if r == '{' { + if nlsemi { + buf.WriteRune(';') + } nlcomma = true nlsemi = true } - - if len(b) > 1 { - b = b[:len(b)-1] + if r == '[' { + if nlcomma { + buf.WriteRune(',') + } + nlsemi = true } buf.WriteRune(tok) + if b.Peek() == '}' && nlsemi { + buf.WriteRune(';') + } + if b.Peek() == ']' && nlcomma { + buf.WriteRune(',') + } case '+', ':', '=': buf.WriteRune(tok) nlsemi = false nlcomma = false case scanner.String, scanner.RawString, scanner.Int, scanner.Ident: buf.WriteString(s.TokenText()) - if len(b) > 0 && b[len(b)-1] == '{' { + if b.Peek() == '{' { nlsemi = true - } else if len(b) > 0 && b[len(b)-1] == '[' { + } else if b.Peek() == '[' { nlcomma = true } default: @@ -428,3 +430,40 @@ func insertSemicolons(r io.Reader) (io.Reader, error) { } return strings.NewReader(buf.String()), nil } + +type Stack[T any] interface { + Push(T) + Pop() T + Peek() T + Length() int +} +type RuneStack struct { + arr []rune + Stack[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 { + if s.Length() > 0 { + return s.arr[s.Length()-1] + } + return 0 +} +func (s *RuneStack) Pop() rune { + v := s.Peek() + if s.Length() > 1 { + s.arr = s.arr[:s.Length()-1] + } else { + s.arr = make([]rune, 0) + } + return v +} +func (s *RuneStack) Length() int { + return len(s.arr) +}