php_rs_parser/
diagnostics.rs1use php_ast::Span;
2use php_lexer::TokenKind;
3use std::borrow::Cow;
4use thiserror::Error;
5
6pub(crate) const ERROR_PLACEHOLDER: &str = "<error>";
8
9#[derive(Debug, Clone, Error)]
15pub enum ParseError {
16 #[error("expected {expected}, found {found}")]
18 Expected {
19 expected: Cow<'static, str>,
20 found: TokenKind,
21 span: Span,
22 },
23
24 #[error("expected expression")]
26 ExpectedExpression { span: Span },
27
28 #[error("expected statement")]
30 ExpectedStatement { span: Span },
31
32 #[error("expected opening PHP tag")]
34 ExpectedOpenTag { span: Span },
35
36 #[error("unterminated string literal")]
38 UnterminatedString { span: Span },
39
40 #[error("expected {expected} after {after}")]
42 ExpectedAfter {
43 expected: Cow<'static, str>,
44 after: Cow<'static, str>,
45 span: Span,
46 },
47
48 #[error("unclosed {delimiter} opened at {opened_at:?}")]
50 UnclosedDelimiter {
51 delimiter: Cow<'static, str>,
52 opened_at: Span,
53 span: Span,
54 },
55
56 #[error("{message}")]
59 Forbidden {
60 message: Cow<'static, str>,
61 span: Span,
62 },
63
64 #[error("'{feature}' requires PHP {required} or higher (targeting PHP {used})")]
68 VersionTooLow {
69 feature: Cow<'static, str>,
70 required: Cow<'static, str>,
71 used: Cow<'static, str>,
72 span: Span,
73 },
74}
75
76impl ParseError {
77 pub fn span(&self) -> Span {
78 match self {
79 ParseError::Expected { span, .. }
80 | ParseError::ExpectedExpression { span }
81 | ParseError::ExpectedStatement { span }
82 | ParseError::ExpectedOpenTag { span }
83 | ParseError::UnterminatedString { span }
84 | ParseError::ExpectedAfter { span, .. }
85 | ParseError::UnclosedDelimiter { span, .. }
86 | ParseError::Forbidden { span, .. }
87 | ParseError::VersionTooLow { span, .. } => *span,
88 }
89 }
90}