![Brandon T. Willard](/assets/img/avatar_default.png)
Compiler and command-line error messages now reflect their Python counterparts. E.g. where Python emits a `SyntaxError`, so does Hy; same for `TypeError`s. Multiple tests have been added that check the format and type of raised exceptions over varying command-line invocations (e.g. interactive and not). A new exception type for `require` errors was added so that they can be treated like normal run-time errors and not compiler errors. The Hy REPL has been further refactored to better match the class-structured API. Now, different error types are handled separately and leverage more base class-provided functionality. Closes hylang/hy#1486.
40 lines
1.1 KiB
Python
40 lines
1.1 KiB
Python
# Copyright 2019 the authors.
|
|
# This file is part of Hy, which is free software licensed under the Expat
|
|
# license. See the LICENSE.
|
|
from hy.errors import HySyntaxError
|
|
|
|
|
|
class LexException(HySyntaxError):
|
|
|
|
@classmethod
|
|
def from_lexer(cls, message, state, token):
|
|
lineno = None
|
|
colno = None
|
|
source = state.source
|
|
source_pos = token.getsourcepos()
|
|
|
|
if source_pos:
|
|
lineno = source_pos.lineno
|
|
colno = source_pos.colno
|
|
elif source:
|
|
# Use the end of the last line of source for `PrematureEndOfInput`.
|
|
# We get rid of empty lines and spaces so that the error matches
|
|
# with the last piece of visible code.
|
|
lines = source.rstrip().splitlines()
|
|
lineno = lineno or len(lines)
|
|
colno = colno or len(lines[lineno - 1])
|
|
else:
|
|
lineno = lineno or 1
|
|
colno = colno or 1
|
|
|
|
return cls(message,
|
|
None,
|
|
state.filename,
|
|
source,
|
|
lineno,
|
|
colno)
|
|
|
|
|
|
class PrematureEndOfInput(LexException):
|
|
pass
|