From fb3504cfdfbfb0ecd5f08607afbb1372a354f275 Mon Sep 17 00:00:00 2001 From: David Tolnay Date: Mon, 30 Aug 2021 12:14:54 -0700 Subject: [PATCH] Use real Literal::from_str from libproc_macro --- build.rs | 4 ++++ src/wrapper.rs | 25 ++++++++++++++++--------- 2 files changed, 20 insertions(+), 9 deletions(-) diff --git a/build.rs b/build.rs index 815292ec..f32d5c8f 100644 --- a/build.rs +++ b/build.rs @@ -78,6 +78,10 @@ fn main() { println!("cargo:rustc-cfg=hygiene"); } + if version.minor >= 54 { + println!("cargo:rustc-cfg=literal_from_str"); + } + let target = env::var("TARGET").unwrap(); if !enable_use_proc_macro(&target) { return; diff --git a/src/wrapper.rs b/src/wrapper.rs index 2829dd79..dc938736 100644 --- a/src/wrapper.rs +++ b/src/wrapper.rs @@ -921,18 +921,25 @@ impl FromStr for Literal { fn from_str(repr: &str) -> Result { if inside_proc_macro() { - // TODO: use libproc_macro's FromStr impl once it is available in - // rustc. https://github.com/rust-lang/rust/pull/84717 - let tokens = proc_macro_parse(repr)?; - let mut iter = tokens.into_iter(); - if let (Some(proc_macro::TokenTree::Literal(literal)), None) = - (iter.next(), iter.next()) + #[cfg(literal_from_str)] { - if literal.to_string().len() == repr.len() { - return Ok(Literal::Compiler(literal)); + proc_macro::Literal::from_str(repr) + .map(Literal::Compiler) + .map_err(LexError::Compiler) + } + #[cfg(not(literal_from_str))] + { + let tokens = proc_macro_parse(repr)?; + let mut iter = tokens.into_iter(); + if let (Some(proc_macro::TokenTree::Literal(literal)), None) = + (iter.next(), iter.next()) + { + if literal.to_string().len() == repr.len() { + return Ok(Literal::Compiler(literal)); + } } + Err(LexError::call_site()) } - Err(LexError::call_site()) } else { let literal = fallback::Literal::from_str(repr)?; Ok(Literal::Fallback(literal))