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    #[error("'{feature}' requires PHP {required} or higher (targeting PHP {used})")]
51    VersionTooLow {
52        feature: Cow<'static, str>,
53        required: Cow<'static, str>,
54        used: Cow<'static, str>,
55        span: Span,
56    },
57}
58
59impl ParseError {
60    pub fn span(&self) -> Span {
61        match self {
62            ParseError::Expected { span, .. }
63            | ParseError::Unexpected { span, .. }
64            | ParseError::ExpectedExpression { span }
65            | ParseError::ExpectedStatement { span }
66            | ParseError::ExpectedOpenTag { span }
67            | ParseError::UnterminatedString { span }
68            | ParseError::ExpectedAfter { span, .. }
69            | ParseError::UnclosedDelimiter { span, .. }
70            | ParseError::Forbidden { span, .. }
71            | ParseError::VersionTooLow { span, .. } => *span,
72        }
73    }
74}