diff --git a/basic/error.go b/basic/error.go index fec162d..0f74179 100644 --- a/basic/error.go +++ b/basic/error.go @@ -4,6 +4,7 @@ import ( "errors" "asciigoat.org/core/lexer" + "asciigoat.org/ini/parser" ) var ( @@ -11,23 +12,11 @@ var ( ) func newErrInvalidToken(t *token) *lexer.Error { - err := &lexer.Error{ - Line: t.pos.Line, - Column: t.pos.Column, - Content: t.value, - Err: errInvalidToken, - } - return err + return parser.NewError(t.pos, t.value, "", errInvalidToken) } func (dec *decoder) OnError(pos lexer.Position, content string, err error) error { - err = &lexer.Error{ - Line: pos.Line, - Column: pos.Column, - Content: content, - Err: err, - } - + err = parser.NewError(pos, content, "", err) dec.executeFinal() return err } diff --git a/parser/error.go b/parser/error.go new file mode 100644 index 0000000..3cc5a53 --- /dev/null +++ b/parser/error.go @@ -0,0 +1,27 @@ +package parser + +import ( + "asciigoat.org/core/lexer" +) + +// NewError creates a lexer.Error using a lexer.Position +func NewError(pos lexer.Position, content, hint string, err error) *lexer.Error { + return &lexer.Error{ + Line: pos.Line, + Column: pos.Column, + Content: content, + Hint: hint, + Err: err, + } +} + +// ErrPlusPosition returns a copy of the given [lexer.Error] +// offsetting the Line/Column information. +func ErrPlusPosition(pos lexer.Position, e *lexer.Error) *lexer.Error { + pos.Add(lexer.Position{ + Line: e.Line, + Column: e.Column, + }) + + return NewError(pos, e.Content, e.Hint, e.Err) +} diff --git a/parser/parser.go b/parser/parser.go index 570e766..5e4c5b8 100644 --- a/parser/parser.go +++ b/parser/parser.go @@ -31,13 +31,7 @@ func defaultOnToken(pos lexer.Position, typ TokenType, value string) error { func defaultOnError(pos lexer.Position, content string, err error) error { log.Printf("%s:%v:%v: %q: %s", "error", pos.Line, pos.Column, content, err) - return lexer.Error{ - Line: pos.Line, - Column: pos.Column, - - Content: content, - Err: err, - } + return NewError(pos, content, "", err) } func (p *Parser) setDefaults() {