mirror of
https://github.com/rust-lang/rust-analyzer.git
synced 2025-10-01 11:31:15 +00:00
Merge pull request #4590 from Julian-Wollersberger/update_unescape
Update to rustc_lexer version 660
This commit is contained in:
commit
ea3e84f21d
4
Cargo.lock
generated
4
Cargo.lock
generated
@ -1398,9 +1398,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "rustc-ap-rustc_lexer"
|
name = "rustc-ap-rustc_lexer"
|
||||||
version = "656.0.0"
|
version = "660.0.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "9cbba98ec46e96a4663197dfa8c0378752de2006e314e5400c0ca74929d6692f"
|
checksum = "30760dbcc7667c9e0da561e980e24867ca7f4526ce060a3d7e6d9dcfeaae88d1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"unicode-xid",
|
"unicode-xid",
|
||||||
]
|
]
|
||||||
|
@ -13,7 +13,7 @@ doctest = false
|
|||||||
[dependencies]
|
[dependencies]
|
||||||
itertools = "0.9.0"
|
itertools = "0.9.0"
|
||||||
rowan = "0.10.0"
|
rowan = "0.10.0"
|
||||||
rustc_lexer = { version = "656.0.0", package = "rustc-ap-rustc_lexer" }
|
rustc_lexer = { version = "660.0.0", package = "rustc-ap-rustc_lexer" }
|
||||||
rustc-hash = "1.1.0"
|
rustc-hash = "1.1.0"
|
||||||
arrayvec = "0.5.1"
|
arrayvec = "0.5.1"
|
||||||
once_cell = "1.3.1"
|
once_cell = "1.3.1"
|
||||||
|
@ -6,6 +6,7 @@ use crate::{
|
|||||||
ast::{AstToken, Comment, RawString, String, Whitespace},
|
ast::{AstToken, Comment, RawString, String, Whitespace},
|
||||||
TextRange, TextSize,
|
TextRange, TextSize,
|
||||||
};
|
};
|
||||||
|
use rustc_lexer::unescape::{unescape_literal, Mode};
|
||||||
|
|
||||||
impl Comment {
|
impl Comment {
|
||||||
pub fn kind(&self) -> CommentKind {
|
pub fn kind(&self) -> CommentKind {
|
||||||
@ -147,7 +148,7 @@ impl HasStringValue for String {
|
|||||||
|
|
||||||
let mut buf = std::string::String::with_capacity(text.len());
|
let mut buf = std::string::String::with_capacity(text.len());
|
||||||
let mut has_error = false;
|
let mut has_error = false;
|
||||||
rustc_lexer::unescape::unescape_str(text, &mut |_, unescaped_char| match unescaped_char {
|
unescape_literal(text, Mode::Str, &mut |_, unescaped_char| match unescaped_char {
|
||||||
Ok(c) => buf.push(c),
|
Ok(c) => buf.push(c),
|
||||||
Err(_) => has_error = true,
|
Err(_) => has_error = true,
|
||||||
});
|
});
|
||||||
@ -498,7 +499,7 @@ impl HasFormatSpecifier for String {
|
|||||||
let offset = self.text_range_between_quotes()?.start() - self.syntax().text_range().start();
|
let offset = self.text_range_between_quotes()?.start() - self.syntax().text_range().start();
|
||||||
|
|
||||||
let mut res = Vec::with_capacity(text.len());
|
let mut res = Vec::with_capacity(text.len());
|
||||||
rustc_lexer::unescape::unescape_str(text, &mut |range, unescaped_char| {
|
unescape_literal(text, Mode::Str, &mut |range, unescaped_char| {
|
||||||
res.push((
|
res.push((
|
||||||
TextRange::new(range.start.try_into().unwrap(), range.end.try_into().unwrap())
|
TextRange::new(range.start.try_into().unwrap(), range.end.try_into().unwrap())
|
||||||
+ offset,
|
+ offset,
|
||||||
|
@ -2,15 +2,15 @@
|
|||||||
|
|
||||||
mod block;
|
mod block;
|
||||||
|
|
||||||
use std::convert::TryFrom;
|
|
||||||
|
|
||||||
use rustc_lexer::unescape;
|
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
ast, match_ast, AstNode, SyntaxError,
|
ast, match_ast, AstNode, SyntaxError,
|
||||||
SyntaxKind::{BYTE, BYTE_STRING, CHAR, CONST_DEF, FN_DEF, INT_NUMBER, STRING, TYPE_ALIAS_DEF},
|
SyntaxKind::{BYTE, BYTE_STRING, CHAR, CONST_DEF, FN_DEF, INT_NUMBER, STRING, TYPE_ALIAS_DEF},
|
||||||
SyntaxNode, SyntaxToken, TextSize, T,
|
SyntaxNode, SyntaxToken, TextSize, T,
|
||||||
};
|
};
|
||||||
|
use rustc_lexer::unescape::{
|
||||||
|
self, unescape_byte, unescape_byte_literal, unescape_char, unescape_literal, Mode,
|
||||||
|
};
|
||||||
|
use std::convert::TryFrom;
|
||||||
|
|
||||||
fn rustc_unescape_error_to_string(err: unescape::EscapeError) -> &'static str {
|
fn rustc_unescape_error_to_string(err: unescape::EscapeError) -> &'static str {
|
||||||
use unescape::EscapeError as EE;
|
use unescape::EscapeError as EE;
|
||||||
@ -81,10 +81,8 @@ fn rustc_unescape_error_to_string(err: unescape::EscapeError) -> &'static str {
|
|||||||
|
|
||||||
pub(crate) fn validate(root: &SyntaxNode) -> Vec<SyntaxError> {
|
pub(crate) fn validate(root: &SyntaxNode) -> Vec<SyntaxError> {
|
||||||
// FIXME:
|
// FIXME:
|
||||||
// * Add validation of character literal containing only a single char
|
// * Add unescape validation of raw string literals and raw byte string literals
|
||||||
// * Add validation of `crate` keyword not appearing in the middle of the symbol path
|
|
||||||
// * Add validation of doc comments are being attached to nodes
|
// * Add validation of doc comments are being attached to nodes
|
||||||
// * Remove validation of unterminated literals (it is already implemented in `tokenize()`)
|
|
||||||
|
|
||||||
let mut errors = Vec::new();
|
let mut errors = Vec::new();
|
||||||
for node in root.descendants() {
|
for node in root.descendants() {
|
||||||
@ -121,18 +119,18 @@ fn validate_literal(literal: ast::Literal, acc: &mut Vec<SyntaxError>) {
|
|||||||
|
|
||||||
match token.kind() {
|
match token.kind() {
|
||||||
BYTE => {
|
BYTE => {
|
||||||
if let Some(Err(e)) = unquote(text, 2, '\'').map(unescape::unescape_byte) {
|
if let Some(Err(e)) = unquote(text, 2, '\'').map(unescape_byte) {
|
||||||
push_err(2, e);
|
push_err(2, e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
CHAR => {
|
CHAR => {
|
||||||
if let Some(Err(e)) = unquote(text, 1, '\'').map(unescape::unescape_char) {
|
if let Some(Err(e)) = unquote(text, 1, '\'').map(unescape_char) {
|
||||||
push_err(1, e);
|
push_err(1, e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
BYTE_STRING => {
|
BYTE_STRING => {
|
||||||
if let Some(without_quotes) = unquote(text, 2, '"') {
|
if let Some(without_quotes) = unquote(text, 2, '"') {
|
||||||
unescape::unescape_byte_str(without_quotes, &mut |range, char| {
|
unescape_byte_literal(without_quotes, Mode::ByteStr, &mut |range, char| {
|
||||||
if let Err(err) = char {
|
if let Err(err) = char {
|
||||||
push_err(2, (range.start, err));
|
push_err(2, (range.start, err));
|
||||||
}
|
}
|
||||||
@ -141,7 +139,7 @@ fn validate_literal(literal: ast::Literal, acc: &mut Vec<SyntaxError>) {
|
|||||||
}
|
}
|
||||||
STRING => {
|
STRING => {
|
||||||
if let Some(without_quotes) = unquote(text, 1, '"') {
|
if let Some(without_quotes) = unquote(text, 1, '"') {
|
||||||
unescape::unescape_str(without_quotes, &mut |range, char| {
|
unescape_literal(without_quotes, Mode::Str, &mut |range, char| {
|
||||||
if let Err(err) = char {
|
if let Err(err) = char {
|
||||||
push_err(1, (range.start, err));
|
push_err(1, (range.start, err));
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user