tweak parsing error

This commit is contained in:
Neemek 2025-03-20 13:06:02 +01:00
parent b1b8e61f57
commit 3fb978638f
Signed by: neemek
GPG key ID: 28360A8951CD0E9B
4 changed files with 13 additions and 9 deletions

View file

@ -101,7 +101,7 @@ func (cmd *RunCmd) Run(ctx *Context) error {
// if there were parsing errors, print them out // if there were parsing errors, print them out
if err != nil { if err != nil {
print(err.(*core.ParsingError).Format([]rune(src))) print(err.(core.ParsingError).Format([]rune(src)))
log.Fatal("Parsing had errors") log.Fatal("Parsing had errors")
} }

View file

@ -94,7 +94,7 @@ func TestAll(t *testing.T) {
tree, err := p.Parse() tree, err := p.Parse()
if err != nil { if err != nil {
print(err.(*ParsingError).Format([]rune(tc.src))) print(err.(ParsingError).Format([]rune(tc.src)))
t.Fatalf("parser had an error") t.Fatalf("parser had an error")
} }

View file

@ -13,12 +13,12 @@ type ParsingError struct {
Causer *Token Causer *Token
} }
func (p *ParsingError) Error() string { func (p ParsingError) Error() string {
return p.Description return p.Description
} }
// Format Print a rich and informative error // Format Print a rich and informative error
func (p *ParsingError) Format(src []rune) string { func (p ParsingError) Format(src []rune) string {
builder := strings.Builder{} builder := strings.Builder{}
lineNumber := 1 lineNumber := 1
@ -38,13 +38,17 @@ func (p *ParsingError) Format(src []rune) string {
} }
} }
builder.WriteString(" \t v ") descriptor := fmt.Sprintf("%d:%d", lineNumber, int(p.Causer.Start)-lineBeginning+1)
builder.WriteString(p.Description) builder.WriteString(p.Description)
builder.WriteRune('\n') builder.WriteRune('\n')
builder.WriteString(fmt.Sprintf(" %d:%d\t | %s", lineNumber, int(p.Causer.Start)-lineBeginning+1, string(src[lineBeginning:lineEnd]))) builder.WriteString(descriptor)
builder.WriteString(" | ")
builder.WriteString(string(src[lineBeginning:lineEnd]))
builder.WriteString("\n\t ^") builder.WriteString("\n")
builder.WriteString(strings.Repeat(" ", len(descriptor)))
builder.WriteString(" ")
for i := lineBeginning; i <= int(p.Causer.Start); i++ { for i := lineBeginning; i <= int(p.Causer.Start); i++ {
builder.WriteRune(' ') builder.WriteRune(' ')
} }
@ -134,7 +138,7 @@ func (p *Parser) advance() {
} }
func (p *Parser) error(error string, causer *Token) error { func (p *Parser) error(error string, causer *Token) error {
return &ParsingError{ return ParsingError{
Description: error, Description: error,
Causer: causer, Causer: causer,
} }

View file

@ -914,7 +914,7 @@ func TestParser_Parse(t *testing.T) {
tree, err := p.Parse() tree, err := p.Parse()
if err != nil { if err != nil {
t.Fatalf("Unexpected error(s): %s", err.(*ParsingError).Format([]rune(SerializeTokens(data.tokens)))) t.Fatalf("Unexpected error(s): %s", err.(ParsingError).Format([]rune(SerializeTokens(data.tokens))))
} }
t.Logf("Checking parsed tree") t.Logf("Checking parsed tree")