sway_error/
lex_error.rs

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}