1use sway_types::{ast::Delimiter, Ident, Span, Spanned};
2use thiserror::Error;
3
4#[derive(Error, Debug, Clone, PartialEq, Eq, PartialOrd, Hash)]
5#[error("{}", kind)]
6pub struct LexError {
7 pub span: Span,
8 pub kind: LexErrorKind,
9}
10
11#[derive(Error, Debug, Clone, PartialEq, Eq, PartialOrd, Hash)]
12pub enum LexErrorKind {
13 #[error("unclosed multiline comment")]
14 UnclosedMultilineComment { unclosed_indices: Vec<usize> },
15 #[error("unexpected close delimiter")]
16 UnexpectedCloseDelimiter {
17 position: usize,
18 close_delimiter: Delimiter,
19 },
20 #[error("mismatched delimiters")]
21 MismatchedDelimiters {
22 open_position: usize,
23 close_position: usize,
24 open_delimiter: Delimiter,
25 close_delimiter: Delimiter,
26 },
27 #[error("unclosed delimiter")]
28 UnclosedDelimiter {
29 open_position: usize,
30 open_delimiter: Delimiter,
31 },
32 #[error("unclosed string literal")]
33 UnclosedStringLiteral { position: usize },
34 #[error("unclosed char literal")]
35 UnclosedCharLiteral { position: usize },
36 #[error("expected close quote")]
37 ExpectedCloseQuote { position: usize },
38 #[error("incomplete hex int literal")]
39 IncompleteHexIntLiteral { position: usize },
40 #[error("incomplete binary int literal")]
41 IncompleteBinaryIntLiteral { position: usize },
42 #[error("incomplete octal int literal")]
43 IncompleteOctalIntLiteral { position: usize },
44 #[error("invalid int suffix: {}", suffix)]
45 InvalidIntSuffix { suffix: Ident },
46 #[error("invalid character")]
47 InvalidCharacter { position: usize, character: char },
48 #[error("invalid hex escape")]
49 InvalidHexEscape,
50 #[error("unicode escape missing brace")]
51 UnicodeEscapeMissingBrace { position: usize },
52 #[error("invalid unicode escape digit")]
53 InvalidUnicodeEscapeDigit { position: usize },
54 #[error("unicode escape out of range")]
55 UnicodeEscapeOutOfRange { position: usize },
56 #[error("unicode escape represents an invalid char value")]
57 UnicodeEscapeInvalidCharValue { span: Span },
58 #[error("unicode text direction codepoint in literal")]
59 UnicodeTextDirInLiteral { position: usize, character: char },
60 #[error("invalid escape code")]
61 InvalidEscapeCode { position: usize },
62}
63
64impl Spanned for LexError {
65 fn span(&self) -> Span {
66 self.span.clone()
67 }
68}
69
70impl LexError {
71 pub fn span_ref(&self) -> &Span {
72 &self.span
73 }
74}