aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_syntax/src/validation.rs
diff options
context:
space:
mode:
authorAdolfo OchagavĂ­a <[email protected]>2018-11-04 14:06:38 +0000
committerAdolfo OchagavĂ­a <[email protected]>2018-11-04 14:17:24 +0000
commit9b5bbab104d8ba445143f6f3a9e4149b40c29ae5 (patch)
treea1ef0fa5dbfd431e8a58afc6542c32c9ecefed04 /crates/ra_syntax/src/validation.rs
parent19c6cbd9540ef87850161cad7e108b380eceea24 (diff)
Add character literal parsing and validation
Diffstat (limited to 'crates/ra_syntax/src/validation.rs')
-rw-r--r--crates/ra_syntax/src/validation.rs40
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 @@
1use crate::{
2 ast::{self, AstNode},
3 File,
4 string_lexing,
5 yellow::{
6 SyntaxError,
7 },
8};
9
10pub(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}