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 var buf strings.Builder
nlsemi := false nlsemi := false
nlcomma := false nlcomma := false
b := "" b := new(RuneStack)
tok := s.Scan() tok := s.Scan()
for tok != scanner.EOF { for tok != scanner.EOF {
switch tok { switch tok {
case '\n': case '\n':
if b[len(b)-1] == '{' && nlsemi { if b.Peek() == '{' && nlsemi {
buf.WriteRune(';') buf.WriteRune(';')
nlsemi = false nlsemi = false
} }
if b[len(b)-1] == '[' && nlcomma { if b.Peek() == '[' && nlcomma {
buf.WriteRune(',') buf.WriteRune(',')
nlcomma = false nlcomma = false
} }
@@ -386,38 +386,40 @@ func insertSemicolons(r io.Reader) (io.Reader, error) {
nlcomma = false nlcomma = false
case '{', '[': case '{', '[':
nlsemi = false nlsemi = false
nlcomma = false
buf.WriteRune(tok) buf.WriteRune(tok)
b += string(tok) b.Push(tok)
case '}', ']': case '}', ']':
if len(b) > 0 && b[len(b)-1] == '{' && nlsemi { r := b.Pop()
buf.WriteRune(';') if r == '{' {
nlsemi = false if nlsemi {
} buf.WriteRune(';')
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] == '[' {
nlcomma = true nlcomma = true
nlsemi = true nlsemi = true
} }
if r == '[' {
if len(b) > 1 { if nlcomma {
b = b[:len(b)-1] buf.WriteRune(',')
}
nlsemi = true
} }
buf.WriteRune(tok) buf.WriteRune(tok)
if b.Peek() == '}' && nlsemi {
buf.WriteRune(';')
}
if b.Peek() == ']' && nlcomma {
buf.WriteRune(',')
}
case '+', ':', '=': case '+', ':', '=':
buf.WriteRune(tok) buf.WriteRune(tok)
nlsemi = false nlsemi = false
nlcomma = false nlcomma = false
case scanner.String, scanner.RawString, scanner.Int, scanner.Ident: case scanner.String, scanner.RawString, scanner.Int, scanner.Ident:
buf.WriteString(s.TokenText()) buf.WriteString(s.TokenText())
if len(b) > 0 && b[len(b)-1] == '{' { if b.Peek() == '{' {
nlsemi = true nlsemi = true
} else if len(b) > 0 && b[len(b)-1] == '[' { } else if b.Peek() == '[' {
nlcomma = true nlcomma = true
} }
default: default:
@@ -428,3 +430,40 @@ func insertSemicolons(r io.Reader) (io.Reader, error) {
} }
return strings.NewReader(buf.String()), nil 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)
}