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)]
12pub enum ParseError {
13 #[error("expected {expected}, found {found}")]
15 Expected {
16 expected: Cow<'static, str>,
17 found: TokenKind,
18 span: Span,
19 },
20
21 #[error("expected expression")]
23 ExpectedExpression { span: Span },
24
25 #[error("expected statement")]
27 ExpectedStatement { span: Span },
28
29 #[error("expected opening PHP tag")]
31 ExpectedOpenTag { span: Span },
32
33 #[error("unterminated string literal")]
35 UnterminatedString { span: Span },
36
37 #[error("expected {expected} after {after}")]
39 ExpectedAfter {
40 expected: Cow<'static, str>,
41 after: Cow<'static, str>,
42 span: Span,
43 },
44
45 #[error("unclosed {delimiter} opened at {opened_at:?}")]
47 UnclosedDelimiter {
48 delimiter: Cow<'static, str>,
49 opened_at: Span,
50 span: Span,
51 },
52
53 #[error("{message}")]
56 Forbidden {
57 message: Cow<'static, str>,
58 span: Span,
59 },
60
61 #[error("'{feature}' requires PHP {required} or higher (targeting PHP {used})")]
65 VersionTooLow {
66 feature: Cow<'static, str>,
67 required: Cow<'static, str>,
68 used: Cow<'static, str>,
69 span: Span,
70 },
71}
72
73impl ParseError {
74 pub fn span(&self) -> Span {
75 match self {
76 ParseError::Expected { span, .. }
77 | ParseError::ExpectedExpression { span }
78 | ParseError::ExpectedStatement { span }
79 | ParseError::ExpectedOpenTag { span }
80 | ParseError::UnterminatedString { span }
81 | ParseError::ExpectedAfter { span, .. }
82 | ParseError::UnclosedDelimiter { span, .. }
83 | ParseError::Forbidden { span, .. }
84 | ParseError::VersionTooLow { span, .. } => *span,
85 }
86 }
87}