Skip to main content

php_rs_parser/
diagnostics.rs

1use php_ast::Span;
2use php_lexer::TokenKind;
3use std::borrow::Cow;
4use thiserror::Error;
5
6#[derive(Debug, Clone, Error)]
7pub enum ParseError {
8    #[error("expected {expected}, found {found}")]
9    Expected {
10        expected: Cow<'static, str>,
11        found: TokenKind,
12        span: Span,
13    },
14
15    #[error("unexpected token {found}")]
16    Unexpected { found: TokenKind, span: Span },
17
18    #[error("expected expression")]
19    ExpectedExpression { span: Span },
20
21    #[error("expected statement")]
22    ExpectedStatement { span: Span },
23
24    #[error("expected opening PHP tag")]
25    ExpectedOpenTag { span: Span },
26
27    #[error("unterminated string literal")]
28    UnterminatedString { span: Span },
29
30    #[error("expected {expected} after {after}")]
31    ExpectedAfter {
32        expected: Cow<'static, str>,
33        after: Cow<'static, str>,
34        span: Span,
35    },
36
37    #[error("unclosed {delimiter} opened at {opened_at:?}")]
38    UnclosedDelimiter {
39        delimiter: Cow<'static, str>,
40        opened_at: Span,
41        span: Span,
42    },
43
44    #[error("{message}")]
45    Forbidden {
46        message: Cow<'static, str>,
47        span: Span,
48    },
49}
50
51impl ParseError {
52    pub fn span(&self) -> Span {
53        match self {
54            ParseError::Expected { span, .. }
55            | ParseError::Unexpected { span, .. }
56            | ParseError::ExpectedExpression { span }
57            | ParseError::ExpectedStatement { span }
58            | ParseError::ExpectedOpenTag { span }
59            | ParseError::UnterminatedString { span }
60            | ParseError::ExpectedAfter { span, .. }
61            | ParseError::UnclosedDelimiter { span, .. }
62            | ParseError::Forbidden { span, .. } => *span,
63        }
64    }
65}