diff options
author | Nilstrieb <48135649+Nilstrieb@users.noreply.github.com> | 2023-01-18 19:47:22 +0100 |
---|---|---|
committer | Nilstrieb <48135649+Nilstrieb@users.noreply.github.com> | 2023-01-18 20:33:17 +0100 |
commit | a8086cf9dfbe733f1172dfba816c8e65d3f35e76 (patch) | |
tree | 4c689d20a594cfe2be52a9060109f47d43bbada4 /compiler/rustc_parse_format | |
parent | 1f72129ffe5e8c495113f9a2d4e1730f7fad3209 (diff) | |
download | rust-a8086cf9dfbe733f1172dfba816c8e65d3f35e76.tar.gz |
Revert "Improve heuristics whether `format_args` string is a source literal"
This reverts commit e6c02aad9345925cfed74f86b414c4d0715d381b.
Keeps the code improvements from the PR and the test (as a known-bug).
Diffstat (limited to 'compiler/rustc_parse_format')
-rw-r--r-- | compiler/rustc_parse_format/src/lib.rs | 37 |
1 files changed, 2 insertions, 35 deletions
diff --git a/compiler/rustc_parse_format/src/lib.rs b/compiler/rustc_parse_format/src/lib.rs index 1eb227503f2..7b016cadac3 100644 --- a/compiler/rustc_parse_format/src/lib.rs +++ b/compiler/rustc_parse_format/src/lib.rs @@ -20,7 +20,6 @@ pub use Flag::*; pub use Piece::*; pub use Position::*; -use rustc_lexer::unescape; use std::iter; use std::str; use std::string; @@ -314,11 +313,12 @@ impl<'a> Parser<'a> { append_newline: bool, mode: ParseMode, ) -> Parser<'a> { - let input_string_kind = find_width_map_from_snippet(s, snippet, style); + let input_string_kind = find_width_map_from_snippet(snippet, style); let (width_map, is_literal) = match input_string_kind { InputStringKind::Literal { width_mappings } => (width_mappings, true), InputStringKind::NotALiteral => (Vec::new(), false), }; + Parser { mode, input: s, @@ -856,7 +856,6 @@ impl<'a> Parser<'a> { /// written code (code snippet) and the `InternedString` that gets processed in the `Parser` /// in order to properly synthesise the intra-string `Span`s for error diagnostics. fn find_width_map_from_snippet( - input: &str, snippet: Option<string::String>, str_style: Option<usize>, ) -> InputStringKind { @@ -869,27 +868,8 @@ fn find_width_map_from_snippet( return InputStringKind::Literal { width_mappings: Vec::new() }; } - // Strip quotes. let snippet = &snippet[1..snippet.len() - 1]; - // Macros like `println` add a newline at the end. That technically doens't make them "literals" anymore, but it's fine - // since we will never need to point our spans there, so we lie about it here by ignoring it. - // Since there might actually be newlines in the source code, we need to normalize away all trailing newlines. - // If we only trimmed it off the input, `format!("\n")` would cause a mismatch as here we they actually match up. - // Alternatively, we could just count the trailing newlines and only trim one from the input if they don't match up. - let input_no_nl = input.trim_end_matches('\n'); - let Ok(unescaped) = unescape_string(snippet) else { - return InputStringKind::NotALiteral; - }; - - let unescaped_no_nl = unescaped.trim_end_matches('\n'); - - if unescaped_no_nl != input_no_nl { - // The source string that we're pointing at isn't our input, so spans pointing at it will be incorrect. - // This can for example happen with proc macros that respan generated literals. - return InputStringKind::NotALiteral; - } - let mut s = snippet.char_indices(); let mut width_mappings = vec![]; while let Some((pos, c)) = s.next() { @@ -972,19 +952,6 @@ fn find_width_map_from_snippet( InputStringKind::Literal { width_mappings } } -fn unescape_string(string: &str) -> Result<string::String, unescape::EscapeError> { - let mut buf = string::String::new(); - let mut error = Ok(()); - unescape::unescape_literal(string, unescape::Mode::Str, &mut |_, unescaped_char| { - match unescaped_char { - Ok(c) => buf.push(c), - Err(err) => error = Err(err), - } - }); - - error.map(|_| buf) -} - // Assert a reasonable size for `Piece` #[cfg(all(target_arch = "x86_64", target_pointer_width = "64"))] rustc_data_structures::static_assert_size!(Piece<'_>, 16); |