php_rs_parser/
diagnostics.rs1use 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}