internal/rosa/azalea: improve delimiter insertion
This commit is contained in:
@@ -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)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user