diff options
Diffstat (limited to 'crates/ra_syntax')
-rw-r--r-- | crates/ra_syntax/Cargo.toml | 2 | ||||
-rw-r--r-- | crates/ra_syntax/src/ast/generated/nodes.rs | 3 | ||||
-rw-r--r-- | crates/ra_syntax/src/ast/tokens.rs | 5 | ||||
-rw-r--r-- | crates/ra_syntax/src/validation.rs | 20 | ||||
-rw-r--r-- | crates/ra_syntax/test_data/parser/inline/ok/0082_ref_expr.rast | 172 | ||||
-rw-r--r-- | crates/ra_syntax/test_data/parser/inline/ok/0082_ref_expr.rs | 6 |
6 files changed, 150 insertions, 58 deletions
diff --git a/crates/ra_syntax/Cargo.toml b/crates/ra_syntax/Cargo.toml index c07ff488e..a8ff2e74f 100644 --- a/crates/ra_syntax/Cargo.toml +++ b/crates/ra_syntax/Cargo.toml | |||
@@ -13,7 +13,7 @@ doctest = false | |||
13 | [dependencies] | 13 | [dependencies] |
14 | itertools = "0.9.0" | 14 | itertools = "0.9.0" |
15 | rowan = "0.10.0" | 15 | rowan = "0.10.0" |
16 | rustc_lexer = { version = "656.0.0", package = "rustc-ap-rustc_lexer" } | 16 | rustc_lexer = { version = "661.0.0", package = "rustc-ap-rustc_lexer" } |
17 | rustc-hash = "1.1.0" | 17 | rustc-hash = "1.1.0" |
18 | arrayvec = "0.5.1" | 18 | arrayvec = "0.5.1" |
19 | once_cell = "1.3.1" | 19 | once_cell = "1.3.1" |
diff --git a/crates/ra_syntax/src/ast/generated/nodes.rs b/crates/ra_syntax/src/ast/generated/nodes.rs index cf6067e57..255402fbc 100644 --- a/crates/ra_syntax/src/ast/generated/nodes.rs +++ b/crates/ra_syntax/src/ast/generated/nodes.rs | |||
@@ -1235,6 +1235,8 @@ impl CastExpr { | |||
1235 | /// ``` | 1235 | /// ``` |
1236 | /// ❰ &foo ❱; | 1236 | /// ❰ &foo ❱; |
1237 | /// ❰ &mut bar ❱; | 1237 | /// ❰ &mut bar ❱; |
1238 | /// ❰ &raw const bar ❱; | ||
1239 | /// ❰ &raw mut bar ❱; | ||
1238 | /// ``` | 1240 | /// ``` |
1239 | /// | 1241 | /// |
1240 | /// [Reference](https://doc.rust-lang.org/reference/expressions/operator-expr.html#borrow-operators) | 1242 | /// [Reference](https://doc.rust-lang.org/reference/expressions/operator-expr.html#borrow-operators) |
@@ -1247,6 +1249,7 @@ impl RefExpr { | |||
1247 | pub fn amp_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![&]) } | 1249 | pub fn amp_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![&]) } |
1248 | pub fn raw_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![raw]) } | 1250 | pub fn raw_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![raw]) } |
1249 | pub fn mut_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![mut]) } | 1251 | pub fn mut_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![mut]) } |
1252 | pub fn const_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![const]) } | ||
1250 | pub fn expr(&self) -> Option<Expr> { support::child(&self.syntax) } | 1253 | pub fn expr(&self) -> Option<Expr> { support::child(&self.syntax) } |
1251 | } | 1254 | } |
1252 | /// Prefix operator call. This is either `!` or `*` or `-`. | 1255 | /// Prefix operator call. This is either `!` or `*` or `-`. |
diff --git a/crates/ra_syntax/src/ast/tokens.rs b/crates/ra_syntax/src/ast/tokens.rs index 74906d8a6..3cd6d99c3 100644 --- a/crates/ra_syntax/src/ast/tokens.rs +++ b/crates/ra_syntax/src/ast/tokens.rs | |||
@@ -6,6 +6,7 @@ use crate::{ | |||
6 | ast::{AstToken, Comment, RawString, String, Whitespace}, | 6 | ast::{AstToken, Comment, RawString, String, Whitespace}, |
7 | TextRange, TextSize, | 7 | TextRange, TextSize, |
8 | }; | 8 | }; |
9 | use rustc_lexer::unescape::{unescape_literal, Mode}; | ||
9 | 10 | ||
10 | impl Comment { | 11 | impl Comment { |
11 | pub fn kind(&self) -> CommentKind { | 12 | pub fn kind(&self) -> CommentKind { |
@@ -147,7 +148,7 @@ impl HasStringValue for String { | |||
147 | 148 | ||
148 | let mut buf = std::string::String::with_capacity(text.len()); | 149 | let mut buf = std::string::String::with_capacity(text.len()); |
149 | let mut has_error = false; | 150 | let mut has_error = false; |
150 | rustc_lexer::unescape::unescape_str(text, &mut |_, unescaped_char| match unescaped_char { | 151 | unescape_literal(text, Mode::Str, &mut |_, unescaped_char| match unescaped_char { |
151 | Ok(c) => buf.push(c), | 152 | Ok(c) => buf.push(c), |
152 | Err(_) => has_error = true, | 153 | Err(_) => has_error = true, |
153 | }); | 154 | }); |
@@ -498,7 +499,7 @@ impl HasFormatSpecifier for String { | |||
498 | let offset = self.text_range_between_quotes()?.start() - self.syntax().text_range().start(); | 499 | let offset = self.text_range_between_quotes()?.start() - self.syntax().text_range().start(); |
499 | 500 | ||
500 | let mut res = Vec::with_capacity(text.len()); | 501 | let mut res = Vec::with_capacity(text.len()); |
501 | rustc_lexer::unescape::unescape_str(text, &mut |range, unescaped_char| { | 502 | unescape_literal(text, Mode::Str, &mut |range, unescaped_char| { |
502 | res.push(( | 503 | res.push(( |
503 | TextRange::new(range.start.try_into().unwrap(), range.end.try_into().unwrap()) | 504 | TextRange::new(range.start.try_into().unwrap(), range.end.try_into().unwrap()) |
504 | + offset, | 505 | + offset, |
diff --git a/crates/ra_syntax/src/validation.rs b/crates/ra_syntax/src/validation.rs index d68cf0a82..fdec48fb0 100644 --- a/crates/ra_syntax/src/validation.rs +++ b/crates/ra_syntax/src/validation.rs | |||
@@ -2,15 +2,15 @@ | |||
2 | 2 | ||
3 | mod block; | 3 | mod block; |
4 | 4 | ||
5 | use std::convert::TryFrom; | ||
6 | |||
7 | use rustc_lexer::unescape; | ||
8 | |||
9 | use crate::{ | 5 | use crate::{ |
10 | ast, match_ast, AstNode, SyntaxError, | 6 | ast, match_ast, AstNode, SyntaxError, |
11 | SyntaxKind::{BYTE, BYTE_STRING, CHAR, CONST_DEF, FN_DEF, INT_NUMBER, STRING, TYPE_ALIAS_DEF}, | 7 | SyntaxKind::{BYTE, BYTE_STRING, CHAR, CONST_DEF, FN_DEF, INT_NUMBER, STRING, TYPE_ALIAS_DEF}, |
12 | SyntaxNode, SyntaxToken, TextSize, T, | 8 | SyntaxNode, SyntaxToken, TextSize, T, |
13 | }; | 9 | }; |
10 | use rustc_lexer::unescape::{ | ||
11 | self, unescape_byte, unescape_byte_literal, unescape_char, unescape_literal, Mode, | ||
12 | }; | ||
13 | use std::convert::TryFrom; | ||
14 | 14 | ||
15 | fn rustc_unescape_error_to_string(err: unescape::EscapeError) -> &'static str { | 15 | fn rustc_unescape_error_to_string(err: unescape::EscapeError) -> &'static str { |
16 | use unescape::EscapeError as EE; | 16 | use unescape::EscapeError as EE; |
@@ -81,10 +81,8 @@ fn rustc_unescape_error_to_string(err: unescape::EscapeError) -> &'static str { | |||
81 | 81 | ||
82 | pub(crate) fn validate(root: &SyntaxNode) -> Vec<SyntaxError> { | 82 | pub(crate) fn validate(root: &SyntaxNode) -> Vec<SyntaxError> { |
83 | // FIXME: | 83 | // FIXME: |
84 | // * Add validation of character literal containing only a single char | 84 | // * Add unescape validation of raw string literals and raw byte string literals |
85 | // * Add validation of `crate` keyword not appearing in the middle of the symbol path | ||
86 | // * Add validation of doc comments are being attached to nodes | 85 | // * Add validation of doc comments are being attached to nodes |
87 | // * Remove validation of unterminated literals (it is already implemented in `tokenize()`) | ||
88 | 86 | ||
89 | let mut errors = Vec::new(); | 87 | let mut errors = Vec::new(); |
90 | for node in root.descendants() { | 88 | for node in root.descendants() { |
@@ -121,18 +119,18 @@ fn validate_literal(literal: ast::Literal, acc: &mut Vec<SyntaxError>) { | |||
121 | 119 | ||
122 | match token.kind() { | 120 | match token.kind() { |
123 | BYTE => { | 121 | BYTE => { |
124 | if let Some(Err(e)) = unquote(text, 2, '\'').map(unescape::unescape_byte) { | 122 | if let Some(Err(e)) = unquote(text, 2, '\'').map(unescape_byte) { |
125 | push_err(2, e); | 123 | push_err(2, e); |
126 | } | 124 | } |
127 | } | 125 | } |
128 | CHAR => { | 126 | CHAR => { |
129 | if let Some(Err(e)) = unquote(text, 1, '\'').map(unescape::unescape_char) { | 127 | if let Some(Err(e)) = unquote(text, 1, '\'').map(unescape_char) { |
130 | push_err(1, e); | 128 | push_err(1, e); |
131 | } | 129 | } |
132 | } | 130 | } |
133 | BYTE_STRING => { | 131 | BYTE_STRING => { |
134 | if let Some(without_quotes) = unquote(text, 2, '"') { | 132 | if let Some(without_quotes) = unquote(text, 2, '"') { |
135 | unescape::unescape_byte_str(without_quotes, &mut |range, char| { | 133 | unescape_byte_literal(without_quotes, Mode::ByteStr, &mut |range, char| { |
136 | if let Err(err) = char { | 134 | if let Err(err) = char { |
137 | push_err(2, (range.start, err)); | 135 | push_err(2, (range.start, err)); |
138 | } | 136 | } |
@@ -141,7 +139,7 @@ fn validate_literal(literal: ast::Literal, acc: &mut Vec<SyntaxError>) { | |||
141 | } | 139 | } |
142 | STRING => { | 140 | STRING => { |
143 | if let Some(without_quotes) = unquote(text, 1, '"') { | 141 | if let Some(without_quotes) = unquote(text, 1, '"') { |
144 | unescape::unescape_str(without_quotes, &mut |range, char| { | 142 | unescape_literal(without_quotes, Mode::Str, &mut |range, char| { |
145 | if let Err(err) = char { | 143 | if let Err(err) = char { |
146 | push_err(1, (range.start, err)); | 144 | push_err(1, (range.start, err)); |
147 | } | 145 | } |
diff --git a/crates/ra_syntax/test_data/parser/inline/ok/0082_ref_expr.rast b/crates/ra_syntax/test_data/parser/inline/ok/0082_ref_expr.rast index 7fe96e17d..58bdf7e34 100644 --- a/crates/ra_syntax/test_data/parser/inline/ok/0082_ref_expr.rast +++ b/crates/ra_syntax/test_data/parser/inline/ok/0082_ref_expr.rast | |||
@@ -1,5 +1,5 @@ | |||
1 | SOURCE_FILE@0..52 | 1 | [email protected]00 |
2 | FN_DEF@0..51 | 2 | [email protected]99 |
3 | [email protected] "fn" | 3 | [email protected] "fn" |
4 | [email protected] " " | 4 | [email protected] " " |
5 | [email protected] | 5 | [email protected] |
@@ -8,47 +8,131 @@ [email protected] | |||
8 | [email protected] "(" | 8 | [email protected] "(" |
9 | [email protected] ")" | 9 | [email protected] ")" |
10 | [email protected] " " | 10 | [email protected] " " |
11 | BLOCK_EXPR@9..51 | 11 | [email protected]99 |
12 | [email protected] "{" | 12 | [email protected] "{" |
13 | [email protected] "\n " | 13 | [email protected] "\n " |
14 | [email protected] | 14 | [email protected] "// reference operator" |
15 | [email protected] "let" | 15 | [email protected] "\n " |
16 | [email protected] " " | 16 | [email protected] |
17 | [email protected] | 17 | [email protected] "let" |
18 | [email protected] "_" | 18 | [email protected] " " |
19 | [email protected] " " | 19 | [email protected] |
20 | [email protected] "=" | 20 | [email protected] "_" |
21 | [email protected] " " | 21 | [email protected] " " |
22 | [email protected] | 22 | [email protected] "=" |
23 | [email protected] "&" | 23 | [email protected] " " |
24 | [email protected] | 24 | [email protected] |
25 | [email protected] "1" | 25 | [email protected] "&" |
26 | [email protected] ";" | 26 | [email protected] |
27 | [email protected] "\n " | 27 | [email protected] "1" |
28 | [email protected] | 28 | [email protected] ";" |
29 | [email protected] "let" | 29 | [email protected] "\n " |
30 | [email protected] " " | 30 | [email protected] |
31 | [email protected] | 31 | [email protected] "let" |
32 | [email protected] "_" | 32 | [email protected] " " |
33 | [email protected] " " | 33 | [email protected] |
34 | [email protected] "=" | 34 | [email protected] "_" |
35 | [email protected] " " | 35 | [email protected] " " |
36 | [email protected] | 36 | [email protected] "=" |
37 | [email protected] "&" | 37 | [email protected] " " |
38 | [email protected] "mut" | 38 | [email protected] |
39 | [email protected] " " | 39 | [email protected] "&" |
40 | [email protected] | 40 | [email protected] "mut" |
41 | [email protected] "&" | 41 | [email protected] " " |
42 | [email protected] | 42 | [email protected] |
43 | [email protected] | 43 | [email protected] "&" |
44 | [email protected] | 44 | [email protected] |
45 | [email protected] | 45 | [email protected] |
46 | [email protected] | 46 | [email protected] |
47 | [email protected] "f" | 47 | [email protected] |
48 | [email protected] | 48 | [email protected] |
49 | [email protected] "(" | 49 | [email protected] "f" |
50 | [email protected] ")" | 50 | [email protected] |
51 | [email protected] ";" | 51 | [email protected] "(" |
52 | [email protected] "\n" | 52 | [email protected] ")" |
53 | [email protected] "}" | 53 | [email protected] ";" |
54 | [email protected] "\n" | 54 | [email protected] "\n " |
55 | [email protected] | ||
56 | [email protected] "let" | ||
57 | [email protected] " " | ||
58 | [email protected] | ||
59 | [email protected] "_" | ||
60 | [email protected] " " | ||
61 | [email protected] "=" | ||
62 | [email protected] " " | ||
63 | [email protected] | ||
64 | [email protected] "&" | ||
65 | [email protected] | ||
66 | [email protected] | ||
67 | [email protected] | ||
68 | [email protected] | ||
69 | [email protected] "raw" | ||
70 | [email protected] ";" | ||
71 | [email protected] "\n " | ||
72 | [email protected] | ||
73 | [email protected] "let" | ||
74 | [email protected] " " | ||
75 | [email protected] | ||
76 | [email protected] "_" | ||
77 | [email protected] " " | ||
78 | [email protected] "=" | ||
79 | [email protected] " " | ||
80 | [email protected] | ||
81 | [email protected] "&" | ||
82 | [email protected] | ||
83 | [email protected] | ||
84 | [email protected] | ||
85 | [email protected] | ||
86 | [email protected] | ||
87 | [email protected] "raw" | ||
88 | [email protected] "." | ||
89 | [email protected] | ||
90 | [email protected] "0" | ||
91 | [email protected] ";" | ||
92 | [email protected] "\n " | ||
93 | [email protected] "// raw reference oper ..." | ||
94 | [email protected] "\n " | ||
95 | [email protected] | ||
96 | [email protected] "let" | ||
97 | [email protected] " " | ||
98 | [email protected] | ||
99 | [email protected] "_" | ||
100 | [email protected] " " | ||
101 | [email protected] "=" | ||
102 | [email protected] " " | ||
103 | [email protected] | ||
104 | [email protected] "&" | ||
105 | [email protected] "raw" | ||
106 | [email protected] " " | ||
107 | [email protected] "mut" | ||
108 | [email protected] " " | ||
109 | [email protected] | ||
110 | [email protected] | ||
111 | [email protected] | ||
112 | [email protected] | ||
113 | [email protected] "foo" | ||
114 | [email protected] ";" | ||
115 | [email protected] "\n " | ||
116 | [email protected] | ||
117 | [email protected] "let" | ||
118 | [email protected] " " | ||
119 | [email protected] | ||
120 | [email protected] "_" | ||
121 | [email protected] " " | ||
122 | [email protected] "=" | ||
123 | [email protected] " " | ||
124 | [email protected] | ||
125 | [email protected] "&" | ||
126 | [email protected] "raw" | ||
127 | [email protected] " " | ||
128 | [email protected] "const" | ||
129 | [email protected] " " | ||
130 | [email protected] | ||
131 | [email protected] | ||
132 | [email protected] | ||
133 | [email protected] | ||
134 | [email protected] "foo" | ||
135 | [email protected] ";" | ||
136 | [email protected] "\n" | ||
137 | [email protected] "}" | ||
138 | [email protected] "\n" | ||
diff --git a/crates/ra_syntax/test_data/parser/inline/ok/0082_ref_expr.rs b/crates/ra_syntax/test_data/parser/inline/ok/0082_ref_expr.rs index 2dac6be95..c5262f446 100644 --- a/crates/ra_syntax/test_data/parser/inline/ok/0082_ref_expr.rs +++ b/crates/ra_syntax/test_data/parser/inline/ok/0082_ref_expr.rs | |||
@@ -1,4 +1,10 @@ | |||
1 | fn foo() { | 1 | fn foo() { |
2 | // reference operator | ||
2 | let _ = &1; | 3 | let _ = &1; |
3 | let _ = &mut &f(); | 4 | let _ = &mut &f(); |
5 | let _ = &raw; | ||
6 | let _ = &raw.0; | ||
7 | // raw reference operator | ||
8 | let _ = &raw mut foo; | ||
9 | let _ = &raw const foo; | ||
4 | } | 10 | } |