40 lines
1.1 KiB
Python
40 lines
1.1 KiB
Python
# Copyright 2020 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
|