php_rs_parser/
diagnostics.rs1use php_ast::Span;
2use php_lexer::TokenKind;
3use std::borrow::Cow;
4use thiserror::Error;
5
6#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
9pub enum Severity {
10 #[default]
11 Error,
12 Warning,
13}
14
15#[derive(Debug, Clone, Error)]
21pub enum ParseError {
22 #[error("expected {expected}, found {found}")]
24 Expected {
25 expected: Cow<'static, str>,
26 found: TokenKind,
27 span: Span,
28 },
29
30 #[error("expected expression")]
32 ExpectedExpression { span: Span },
33
34 #[error("expected statement")]
36 ExpectedStatement { span: Span },
37
38 #[error("expected opening PHP tag")]
40 ExpectedOpenTag { span: Span },
41
42 #[error("unterminated string literal")]
44 UnterminatedString { span: Span },
45
46 #[error("expected {expected} after {after}")]
48 ExpectedAfter {
49 expected: Cow<'static, str>,
50 after: Cow<'static, str>,
51 span: Span,
52 },
53
54 #[error("unclosed {delimiter} opened at {opened_at:?}")]
56 UnclosedDelimiter {
57 delimiter: Cow<'static, str>,
58 opened_at: Span,
59 span: Span,
60 },
61
62 #[error("{message}")]
65 Forbidden {
66 message: Cow<'static, str>,
67 span: Span,
68 },
69
70 #[error("{message}")]
73 ForbiddenWarning {
74 message: Cow<'static, str>,
75 span: Span,
76 },
77
78 #[error("'{feature}' requires PHP {required} or higher (targeting PHP {used})")]
82 VersionTooLow {
83 feature: Cow<'static, str>,
84 required: Cow<'static, str>,
85 used: Cow<'static, str>,
86 span: Span,
87 },
88}
89
90impl ParseError {
91 pub fn span(&self) -> Span {
92 match self {
93 ParseError::Expected { span, .. }
94 | ParseError::ExpectedExpression { span }
95 | ParseError::ExpectedStatement { span }
96 | ParseError::ExpectedOpenTag { span }
97 | ParseError::UnterminatedString { span }
98 | ParseError::ExpectedAfter { span, .. }
99 | ParseError::UnclosedDelimiter { span, .. }
100 | ParseError::Forbidden { span, .. }
101 | ParseError::ForbiddenWarning { span, .. }
102 | ParseError::VersionTooLow { span, .. } => *span,
103 }
104 }
105
106 pub fn severity(&self) -> Severity {
109 match self {
110 ParseError::ForbiddenWarning { .. } => Severity::Warning,
111 _ => Severity::Error,
112 }
113 }
114}