Skip to content
/ rust Public
forked from rust-lang/rust

Commit 49d2d5a

Browse files
Extract unescape from rustc_lexer into its own crate
1 parent c03c38d commit 49d2d5a

File tree

14 files changed

+36
-12
lines changed

14 files changed

+36
-12
lines changed

Cargo.lock

+7
Original file line numberDiff line numberDiff line change
@@ -2151,6 +2151,10 @@ version = "0.7.4"
21512151
source = "registry+https://github.com/rust-lang/crates.io-index"
21522152
checksum = "4ee93343901ab17bd981295f2cf0026d4ad018c7c31ba84549a4ddbb47a45104"
21532153

2154+
[[package]]
2155+
name = "literal-escaper"
2156+
version = "0.0.1"
2157+
21542158
[[package]]
21552159
name = "lld-wrapper"
21562160
version = "0.1.0"
@@ -3366,6 +3370,7 @@ name = "rustc_ast"
33663370
version = "0.0.0"
33673371
dependencies = [
33683372
"bitflags",
3373+
"literal-escaper",
33693374
"memchr",
33703375
"rustc_ast_ir",
33713376
"rustc_data_structures",
@@ -4325,6 +4330,7 @@ name = "rustc_parse"
43254330
version = "0.0.0"
43264331
dependencies = [
43274332
"bitflags",
4333+
"literal-escaper",
43284334
"rustc_ast",
43294335
"rustc_ast_pretty",
43304336
"rustc_data_structures",
@@ -4347,6 +4353,7 @@ dependencies = [
43474353
name = "rustc_parse_format"
43484354
version = "0.0.0"
43494355
dependencies = [
4356+
"literal-escaper",
43504357
"rustc_index",
43514358
"rustc_lexer",
43524359
]

compiler/rustc_ast/Cargo.toml

+1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ edition = "2021"
66
[dependencies]
77
# tidy-alphabetical-start
88
bitflags = "2.4.1"
9+
literal-escaper = { path = "../../library/literal-escaper" }
910
memchr = "2.7.4"
1011
rustc_ast_ir = { path = "../rustc_ast_ir" }
1112
rustc_data_structures = { path = "../rustc_data_structures" }

compiler/rustc_ast/src/util/literal.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
33
use std::{ascii, fmt, str};
44

5-
use rustc_lexer::unescape::{
5+
use literal_escaper::{
66
MixedUnit, Mode, byte_from_char, unescape_byte, unescape_char, unescape_mixed, unescape_unicode,
77
};
88
use rustc_span::{Span, Symbol, kw, sym};

compiler/rustc_lexer/src/lib.rs

-1
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@
2727
// tidy-alphabetical-end
2828

2929
mod cursor;
30-
pub mod unescape;
3130

3231
#[cfg(test)]
3332
mod tests;

compiler/rustc_parse/Cargo.toml

+1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ edition = "2021"
66
[dependencies]
77
# tidy-alphabetical-start
88
bitflags = "2.4.1"
9+
literal-escaper = { path = "../../library/literal-escaper" }
910
rustc_ast = { path = "../rustc_ast" }
1011
rustc_ast_pretty = { path = "../rustc_ast_pretty" }
1112
rustc_data_structures = { path = "../rustc_data_structures" }

compiler/rustc_parse/src/lexer/mod.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
use std::ops::Range;
22

3+
use literal_escaper::{self, EscapeError, Mode};
34
use rustc_ast::ast::{self, AttrStyle};
45
use rustc_ast::token::{self, CommentKind, Delimiter, IdentIsRaw, Token, TokenKind};
56
use rustc_ast::tokenstream::TokenStream;
67
use rustc_ast::util::unicode::contains_text_flow_control_chars;
78
use rustc_errors::codes::*;
89
use rustc_errors::{Applicability, Diag, DiagCtxtHandle, StashKey};
9-
use rustc_lexer::unescape::{self, EscapeError, Mode};
1010
use rustc_lexer::{Base, Cursor, DocStyle, LiteralKind, RawStrError};
1111
use rustc_session::lint::BuiltinLintDiag;
1212
use rustc_session::lint::builtin::{
@@ -970,7 +970,7 @@ impl<'psess, 'src> Lexer<'psess, 'src> {
970970
postfix_len: u32,
971971
) -> (token::LitKind, Symbol) {
972972
self.cook_common(kind, mode, start, end, prefix_len, postfix_len, |src, mode, callback| {
973-
unescape::unescape_unicode(src, mode, &mut |span, result| {
973+
literal_escaper::unescape_unicode(src, mode, &mut |span, result| {
974974
callback(span, result.map(drop))
975975
})
976976
})
@@ -986,7 +986,7 @@ impl<'psess, 'src> Lexer<'psess, 'src> {
986986
postfix_len: u32,
987987
) -> (token::LitKind, Symbol) {
988988
self.cook_common(kind, mode, start, end, prefix_len, postfix_len, |src, mode, callback| {
989-
unescape::unescape_mixed(src, mode, &mut |span, result| {
989+
literal_escaper::unescape_mixed(src, mode, &mut |span, result| {
990990
callback(span, result.map(drop))
991991
})
992992
})

compiler/rustc_parse/src/lexer/unescape_error_reporting.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33
use std::iter::once;
44
use std::ops::Range;
55

6+
use literal_escaper::{EscapeError, Mode};
67
use rustc_errors::{Applicability, DiagCtxtHandle, ErrorGuaranteed};
7-
use rustc_lexer::unescape::{EscapeError, Mode};
88
use rustc_span::{BytePos, Span};
99
use tracing::debug;
1010

compiler/rustc_parse/src/parser/expr.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ use core::ops::{Bound, ControlFlow};
66
use ast::mut_visit::{self, MutVisitor};
77
use ast::token::IdentIsRaw;
88
use ast::{CoroutineKind, ForLoopKind, GenBlockKind, MatchKind, Pat, Path, PathSegment, Recovered};
9+
use literal_escaper::unescape_char;
910
use rustc_ast::ptr::P;
1011
use rustc_ast::token::{self, Delimiter, Token, TokenKind};
1112
use rustc_ast::tokenstream::TokenTree;
@@ -21,7 +22,6 @@ use rustc_ast::{
2122
use rustc_ast_pretty::pprust;
2223
use rustc_data_structures::stack::ensure_sufficient_stack;
2324
use rustc_errors::{Applicability, Diag, PResult, StashKey, Subdiagnostic};
24-
use rustc_lexer::unescape::unescape_char;
2525
use rustc_macros::Subdiagnostic;
2626
use rustc_session::errors::{ExprParenthesesNeeded, report_lit_error};
2727
use rustc_session::lint::BuiltinLintDiag;

compiler/rustc_parse_format/Cargo.toml

+1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ edition = "2021"
55

66
[dependencies]
77
# tidy-alphabetical-start
8+
literal-escaper = { path = "../../library/literal-escaper" }
89
rustc_index = { path = "../rustc_index", default-features = false }
910
rustc_lexer = { path = "../rustc_lexer" }
1011
# tidy-alphabetical-end

compiler/rustc_parse_format/src/lib.rs

+6-5
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
1919
pub use Alignment::*;
2020
pub use Count::*;
2121
pub use Position::*;
22-
use rustc_lexer::unescape;
2322

2423
// Note: copied from rustc_span
2524
/// Range inside of a `Span` used for diagnostics when we only have access to relative positions.
@@ -1095,12 +1094,14 @@ fn find_width_map_from_snippet(
10951094
fn unescape_string(string: &str) -> Option<String> {
10961095
let mut buf = String::new();
10971096
let mut ok = true;
1098-
unescape::unescape_unicode(string, unescape::Mode::Str, &mut |_, unescaped_char| {
1099-
match unescaped_char {
1097+
literal_escaper::unescape_unicode(
1098+
string,
1099+
literal_escaper::Mode::Str,
1100+
&mut |_, unescaped_char| match unescaped_char {
11001101
Ok(c) => buf.push(c),
11011102
Err(_) => ok = false,
1102-
}
1103-
});
1103+
},
1104+
);
11041105

11051106
ok.then_some(buf)
11061107
}

library/literal-escaper/Cargo.toml

+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
[package]
2+
name = "literal-escaper"
3+
version = "0.0.0"
4+
edition = "2021"
5+
6+
[dependencies]
7+
std = { version = '1.0.0', optional = true, package = 'rustc-std-workspace-std' }
8+
9+
[features]
10+
rustc-dep-of-std = ["dep:std"]

library/literal-escaper/README.md

+4
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
# literal-escaper
2+
3+
This crate provides code to unescape string literals. It is used by `rustc_lexer`
4+
and `proc-macro`.
File renamed without changes.

0 commit comments

Comments
 (0)