Skip to content

Commit 9e57988

Browse files
Extract unescape from rustc_lexer into its own crate
1 parent ccc9ba5 commit 9e57988

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
@@ -2125,6 +2125,10 @@ version = "0.7.4"
21252125
source = "registry+https://github.com/rust-lang/crates.io-index"
21262126
checksum = "4ee93343901ab17bd981295f2cf0026d4ad018c7c31ba84549a4ddbb47a45104"
21272127

2128+
[[package]]
2129+
name = "literal-escaper"
2130+
version = "0.0.1"
2131+
21282132
[[package]]
21292133
name = "lld-wrapper"
21302134
version = "0.1.0"
@@ -3316,6 +3320,7 @@ name = "rustc_ast"
33163320
version = "0.0.0"
33173321
dependencies = [
33183322
"bitflags",
3323+
"literal-escaper",
33193324
"memchr",
33203325
"rustc_ast_ir",
33213326
"rustc_data_structures",
@@ -4269,6 +4274,7 @@ name = "rustc_parse"
42694274
version = "0.0.0"
42704275
dependencies = [
42714276
"bitflags",
4277+
"literal-escaper",
42724278
"rustc_ast",
42734279
"rustc_ast_pretty",
42744280
"rustc_data_structures",
@@ -4291,6 +4297,7 @@ dependencies = [
42914297
name = "rustc_parse_format"
42924298
version = "0.0.0"
42934299
dependencies = [
4300+
"literal-escaper",
42944301
"rustc_index",
42954302
"rustc_lexer",
42964303
]

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.
@@ -1079,12 +1078,14 @@ fn find_width_map_from_snippet(
10791078
fn unescape_string(string: &str) -> Option<String> {
10801079
let mut buf = String::new();
10811080
let mut ok = true;
1082-
unescape::unescape_unicode(string, unescape::Mode::Str, &mut |_, unescaped_char| {
1083-
match unescaped_char {
1081+
literal_escaper::unescape_unicode(
1082+
string,
1083+
literal_escaper::Mode::Str,
1084+
&mut |_, unescaped_char| match unescaped_char {
10841085
Ok(c) => buf.push(c),
10851086
Err(_) => ok = false,
1086-
}
1087-
});
1087+
},
1088+
);
10881089

10891090
ok.then_some(buf)
10901091
}

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`.

0 commit comments

Comments
 (0)