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/tokens.rs | 5 | ||||
| -rw-r--r-- | crates/ra_syntax/src/validation.rs | 20 |
3 files changed, 13 insertions, 14 deletions
diff --git a/crates/ra_syntax/Cargo.toml b/crates/ra_syntax/Cargo.toml index c07ff488e..a9a5cc7bc 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 = "660.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/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 | } |
