internal/rosa/azalea: improve delimiter insertion

This commit is contained in:
2026-08-08 11:58:30 -05:00
parent bcb92ea346
commit fec6265ac7
+60 -21
View File
@@ -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)
}