From 29e8c968ca8a78beb369c25146637f1adc754132 Mon Sep 17 00:00:00 2001 From: David Tolnay Date: Fri, 6 May 2022 18:25:36 -0700 Subject: [PATCH] Make token processing independent of how libproc_macro renders None groups --- src/lib.rs | 31 ++++++++++++++++--------------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 5f4da61..37eff7d 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -322,31 +322,32 @@ fn try_expand(input: TokenStream, mode: Macro) -> Result { } fn lit_indoc(token: TokenTree, mode: Macro) -> Result { - let repr = token.to_string(); - let mut repr = repr.trim(); + let span = token.span(); + let mut single_token = Some(token); - // https://github.com/rust-lang/rust/pull/96682 - let invisible_delimiter_prefix = "/*«*/"; - let invisible_delimiter_suffix = "/*»*/"; - if repr.starts_with(invisible_delimiter_prefix) && repr.ends_with(invisible_delimiter_suffix) { - repr = repr - [invisible_delimiter_prefix.len()..repr.len() - invisible_delimiter_suffix.len()] - .trim(); + while let Some(TokenTree::Group(group)) = single_token { + single_token = if group.delimiter() == Delimiter::None { + let mut token_iter = group.stream().into_iter(); + token_iter.next().xor(token_iter.next()) + } else { + None + }; } + let single_token = + single_token.ok_or_else(|| Error::new(span, "argument must be a single string literal"))?; + + let repr = single_token.to_string(); let is_string = repr.starts_with('"') || repr.starts_with('r'); let is_byte_string = repr.starts_with("b\"") || repr.starts_with("br"); if !is_string && !is_byte_string { - return Err(Error::new( - token.span(), - "argument must be a single string literal", - )); + return Err(Error::new(span, "argument must be a single string literal")); } if is_byte_string && mode != Macro::Indoc { return Err(Error::new( - token.span(), + span, "byte strings are not supported in formatting macros", )); } @@ -367,7 +368,7 @@ fn lit_indoc(token: TokenTree, mode: Macro) -> Result { .unwrap() { TokenTree::Literal(mut lit) => { - lit.set_span(token.span()); + lit.set_span(span); Ok(lit) } _ => unreachable!(),