diff options
Diffstat (limited to 'crates/ra_syntax/src/validation.rs')
-rw-r--r-- | crates/ra_syntax/src/validation.rs | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/crates/ra_syntax/src/validation.rs b/crates/ra_syntax/src/validation.rs new file mode 100644 index 000000000..03d98eff4 --- /dev/null +++ b/crates/ra_syntax/src/validation.rs | |||
@@ -0,0 +1,40 @@ | |||
1 | use crate::{ | ||
2 | ast::{self, AstNode}, | ||
3 | File, | ||
4 | string_lexing, | ||
5 | yellow::{ | ||
6 | SyntaxError, | ||
7 | }, | ||
8 | }; | ||
9 | |||
10 | pub(crate) fn validate(file: &File) -> Vec<SyntaxError> { | ||
11 | let mut errors = Vec::new(); | ||
12 | for d in file.root.borrowed().descendants() { | ||
13 | if let Some(c) = ast::Char::cast(d) { | ||
14 | let components = &mut string_lexing::parse_char_literal(c.text()); | ||
15 | let len = components.count(); | ||
16 | |||
17 | if !components.has_closing_quote { | ||
18 | errors.push(SyntaxError { | ||
19 | msg: "Unclosed char literal".to_string(), | ||
20 | offset: d.range().start(), | ||
21 | }); | ||
22 | } | ||
23 | |||
24 | if len == 0 { | ||
25 | errors.push(SyntaxError { | ||
26 | msg: "Empty char literal".to_string(), | ||
27 | offset: d.range().start(), | ||
28 | }); | ||
29 | } | ||
30 | |||
31 | if len > 1 { | ||
32 | errors.push(SyntaxError { | ||
33 | msg: "Character literal should be only one character long".to_string(), | ||
34 | offset: d.range().start(), | ||
35 | }); | ||
36 | } | ||
37 | } | ||
38 | } | ||
39 | errors | ||
40 | } | ||