forked from rosa/hakurei
internal/rosa/azalea: refactor delimiter insertion, add test
This commit is contained in:
@@ -303,7 +303,7 @@ func (ScanError) Error() string {
|
||||
|
||||
// Parse parses expressions from r.
|
||||
func Parse(r io.Reader) (e []any, err error) {
|
||||
r, err = insertDelimiters(r)
|
||||
r = 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 insertDelimiters(r io.Reader) (io.Reader, error) {
|
||||
func insertDelimiters(r io.Reader) io.Reader {
|
||||
var s scanner.Scanner
|
||||
s.Init(r)
|
||||
s.Mode = scanner.ScanIdents |
|
||||
@@ -361,44 +361,43 @@ func insertDelimiters(r io.Reader) (io.Reader, error) {
|
||||
s.Whitespace = 0
|
||||
s.IsIdentRune = isIdentRune
|
||||
|
||||
var buf strings.Builder
|
||||
var b strings.Builder
|
||||
nldelim := false
|
||||
b := new(runeStack)
|
||||
delim := new(runeStack)
|
||||
|
||||
for tok := s.Scan(); tok != scanner.EOF; tok = s.Scan() {
|
||||
switch tok {
|
||||
case '{', '[':
|
||||
nldelim = false
|
||||
if tok == '{' {
|
||||
b.Push(';')
|
||||
delim.Push(';')
|
||||
} else {
|
||||
b.Push(',')
|
||||
delim.Push(',')
|
||||
}
|
||||
buf.WriteRune(tok)
|
||||
b.WriteRune(tok)
|
||||
case scanner.String, scanner.RawString, scanner.Int, scanner.Ident:
|
||||
buf.WriteString(s.TokenText())
|
||||
b.WriteString(s.TokenText())
|
||||
nldelim = true
|
||||
case '+', ':', '=', ',', ';':
|
||||
nldelim = false
|
||||
buf.WriteRune(tok)
|
||||
b.WriteRune(tok)
|
||||
case '\n':
|
||||
if nldelim {
|
||||
buf.WriteRune(b.Peek())
|
||||
b.WriteRune(delim.Peek())
|
||||
nldelim = false
|
||||
}
|
||||
buf.WriteRune(tok)
|
||||
case '}', ']':
|
||||
if nldelim {
|
||||
buf.WriteRune(b.Peek())
|
||||
b.WriteRune(delim.Peek())
|
||||
}
|
||||
b.Pop()
|
||||
delim.Pop()
|
||||
nldelim = true
|
||||
buf.WriteRune(tok)
|
||||
b.WriteRune(tok)
|
||||
default:
|
||||
buf.WriteRune(tok)
|
||||
b.WriteRune(tok)
|
||||
}
|
||||
}
|
||||
return strings.NewReader(buf.String()), nil
|
||||
return strings.NewReader(b.String())
|
||||
}
|
||||
|
||||
type runeStack struct {
|
||||
|
||||
Reference in New Issue
Block a user