xref: /linux/rust/proc-macro2/wrapper.rs (revision 784faa8eca8270671e0ed6d9d21f04bbb80fc5f7)
1*a9acfcebSMiguel Ojeda // SPDX-License-Identifier: Apache-2.0 OR MIT
2*a9acfcebSMiguel Ojeda 
33a8b546aSMiguel Ojeda use crate::detection::inside_proc_macro;
43a8b546aSMiguel Ojeda use crate::fallback::{self, FromStr2 as _};
53a8b546aSMiguel Ojeda #[cfg(span_locations)]
63a8b546aSMiguel Ojeda use crate::location::LineColumn;
73a8b546aSMiguel Ojeda #[cfg(proc_macro_span)]
83a8b546aSMiguel Ojeda use crate::probe::proc_macro_span;
93a8b546aSMiguel Ojeda #[cfg(all(span_locations, proc_macro_span_file))]
103a8b546aSMiguel Ojeda use crate::probe::proc_macro_span_file;
113a8b546aSMiguel Ojeda #[cfg(all(span_locations, proc_macro_span_location))]
123a8b546aSMiguel Ojeda use crate::probe::proc_macro_span_location;
133a8b546aSMiguel Ojeda use crate::{Delimiter, Punct, Spacing, TokenTree};
143a8b546aSMiguel Ojeda use core::fmt::{self, Debug, Display};
153a8b546aSMiguel Ojeda #[cfg(span_locations)]
163a8b546aSMiguel Ojeda use core::ops::Range;
173a8b546aSMiguel Ojeda use core::ops::RangeBounds;
183a8b546aSMiguel Ojeda use std::ffi::CStr;
193a8b546aSMiguel Ojeda #[cfg(span_locations)]
203a8b546aSMiguel Ojeda use std::path::PathBuf;
213a8b546aSMiguel Ojeda 
223a8b546aSMiguel Ojeda #[derive(Clone)]
233a8b546aSMiguel Ojeda pub(crate) enum TokenStream {
243a8b546aSMiguel Ojeda     Compiler(DeferredTokenStream),
253a8b546aSMiguel Ojeda     Fallback(fallback::TokenStream),
263a8b546aSMiguel Ojeda }
273a8b546aSMiguel Ojeda 
283a8b546aSMiguel Ojeda // Work around https://github.com/rust-lang/rust/issues/65080.
293a8b546aSMiguel Ojeda // In `impl Extend<TokenTree> for TokenStream` which is used heavily by quote,
303a8b546aSMiguel Ojeda // we hold on to the appended tokens and do proc_macro::TokenStream::extend as
313a8b546aSMiguel Ojeda // late as possible to batch together consecutive uses of the Extend impl.
323a8b546aSMiguel Ojeda #[derive(Clone)]
333a8b546aSMiguel Ojeda pub(crate) struct DeferredTokenStream {
343a8b546aSMiguel Ojeda     stream: proc_macro::TokenStream,
353a8b546aSMiguel Ojeda     extra: Vec<proc_macro::TokenTree>,
363a8b546aSMiguel Ojeda }
373a8b546aSMiguel Ojeda 
383a8b546aSMiguel Ojeda pub(crate) enum LexError {
393a8b546aSMiguel Ojeda     Compiler(proc_macro::LexError),
403a8b546aSMiguel Ojeda     Fallback(fallback::LexError),
413a8b546aSMiguel Ojeda 
423a8b546aSMiguel Ojeda     // Rustc was supposed to return a LexError, but it panicked instead.
433a8b546aSMiguel Ojeda     // https://github.com/rust-lang/rust/issues/58736
443a8b546aSMiguel Ojeda     CompilerPanic,
453a8b546aSMiguel Ojeda }
463a8b546aSMiguel Ojeda 
473a8b546aSMiguel Ojeda #[cold]
mismatch(line: u32) -> !483a8b546aSMiguel Ojeda fn mismatch(line: u32) -> ! {
493a8b546aSMiguel Ojeda     #[cfg(procmacro2_backtrace)]
503a8b546aSMiguel Ojeda     {
513a8b546aSMiguel Ojeda         let backtrace = std::backtrace::Backtrace::force_capture();
523a8b546aSMiguel Ojeda         panic!("compiler/fallback mismatch L{}\n\n{}", line, backtrace)
533a8b546aSMiguel Ojeda     }
543a8b546aSMiguel Ojeda     #[cfg(not(procmacro2_backtrace))]
553a8b546aSMiguel Ojeda     {
563a8b546aSMiguel Ojeda         panic!("compiler/fallback mismatch L{}", line)
573a8b546aSMiguel Ojeda     }
583a8b546aSMiguel Ojeda }
593a8b546aSMiguel Ojeda 
603a8b546aSMiguel Ojeda impl DeferredTokenStream {
new(stream: proc_macro::TokenStream) -> Self613a8b546aSMiguel Ojeda     fn new(stream: proc_macro::TokenStream) -> Self {
623a8b546aSMiguel Ojeda         DeferredTokenStream {
633a8b546aSMiguel Ojeda             stream,
643a8b546aSMiguel Ojeda             extra: Vec::new(),
653a8b546aSMiguel Ojeda         }
663a8b546aSMiguel Ojeda     }
673a8b546aSMiguel Ojeda 
is_empty(&self) -> bool683a8b546aSMiguel Ojeda     fn is_empty(&self) -> bool {
693a8b546aSMiguel Ojeda         self.stream.is_empty() && self.extra.is_empty()
703a8b546aSMiguel Ojeda     }
713a8b546aSMiguel Ojeda 
evaluate_now(&mut self)723a8b546aSMiguel Ojeda     fn evaluate_now(&mut self) {
733a8b546aSMiguel Ojeda         // If-check provides a fast short circuit for the common case of `extra`
743a8b546aSMiguel Ojeda         // being empty, which saves a round trip over the proc macro bridge.
753a8b546aSMiguel Ojeda         // Improves macro expansion time in winrt by 6% in debug mode.
763a8b546aSMiguel Ojeda         if !self.extra.is_empty() {
773a8b546aSMiguel Ojeda             self.stream.extend(self.extra.drain(..));
783a8b546aSMiguel Ojeda         }
793a8b546aSMiguel Ojeda     }
803a8b546aSMiguel Ojeda 
into_token_stream(mut self) -> proc_macro::TokenStream813a8b546aSMiguel Ojeda     fn into_token_stream(mut self) -> proc_macro::TokenStream {
823a8b546aSMiguel Ojeda         self.evaluate_now();
833a8b546aSMiguel Ojeda         self.stream
843a8b546aSMiguel Ojeda     }
853a8b546aSMiguel Ojeda }
863a8b546aSMiguel Ojeda 
873a8b546aSMiguel Ojeda impl TokenStream {
new() -> Self883a8b546aSMiguel Ojeda     pub(crate) fn new() -> Self {
893a8b546aSMiguel Ojeda         if inside_proc_macro() {
903a8b546aSMiguel Ojeda             TokenStream::Compiler(DeferredTokenStream::new(proc_macro::TokenStream::new()))
913a8b546aSMiguel Ojeda         } else {
923a8b546aSMiguel Ojeda             TokenStream::Fallback(fallback::TokenStream::new())
933a8b546aSMiguel Ojeda         }
943a8b546aSMiguel Ojeda     }
953a8b546aSMiguel Ojeda 
from_str_checked(src: &str) -> Result<Self, LexError>963a8b546aSMiguel Ojeda     pub(crate) fn from_str_checked(src: &str) -> Result<Self, LexError> {
973a8b546aSMiguel Ojeda         if inside_proc_macro() {
983a8b546aSMiguel Ojeda             Ok(TokenStream::Compiler(DeferredTokenStream::new(
993a8b546aSMiguel Ojeda                 proc_macro::TokenStream::from_str_checked(src)?,
1003a8b546aSMiguel Ojeda             )))
1013a8b546aSMiguel Ojeda         } else {
1023a8b546aSMiguel Ojeda             Ok(TokenStream::Fallback(
1033a8b546aSMiguel Ojeda                 fallback::TokenStream::from_str_checked(src)?,
1043a8b546aSMiguel Ojeda             ))
1053a8b546aSMiguel Ojeda         }
1063a8b546aSMiguel Ojeda     }
1073a8b546aSMiguel Ojeda 
is_empty(&self) -> bool1083a8b546aSMiguel Ojeda     pub(crate) fn is_empty(&self) -> bool {
1093a8b546aSMiguel Ojeda         match self {
1103a8b546aSMiguel Ojeda             TokenStream::Compiler(tts) => tts.is_empty(),
1113a8b546aSMiguel Ojeda             TokenStream::Fallback(tts) => tts.is_empty(),
1123a8b546aSMiguel Ojeda         }
1133a8b546aSMiguel Ojeda     }
1143a8b546aSMiguel Ojeda 
unwrap_nightly(self) -> proc_macro::TokenStream1153a8b546aSMiguel Ojeda     fn unwrap_nightly(self) -> proc_macro::TokenStream {
1163a8b546aSMiguel Ojeda         match self {
1173a8b546aSMiguel Ojeda             TokenStream::Compiler(s) => s.into_token_stream(),
1183a8b546aSMiguel Ojeda             TokenStream::Fallback(_) => mismatch(line!()),
1193a8b546aSMiguel Ojeda         }
1203a8b546aSMiguel Ojeda     }
1213a8b546aSMiguel Ojeda 
unwrap_stable(self) -> fallback::TokenStream1223a8b546aSMiguel Ojeda     fn unwrap_stable(self) -> fallback::TokenStream {
1233a8b546aSMiguel Ojeda         match self {
1243a8b546aSMiguel Ojeda             TokenStream::Compiler(_) => mismatch(line!()),
1253a8b546aSMiguel Ojeda             TokenStream::Fallback(s) => s,
1263a8b546aSMiguel Ojeda         }
1273a8b546aSMiguel Ojeda     }
1283a8b546aSMiguel Ojeda }
1293a8b546aSMiguel Ojeda 
1303a8b546aSMiguel Ojeda impl Display for TokenStream {
fmt(&self, f: &mut fmt::Formatter) -> fmt::Result1313a8b546aSMiguel Ojeda     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
1323a8b546aSMiguel Ojeda         match self {
1333a8b546aSMiguel Ojeda             TokenStream::Compiler(tts) => Display::fmt(&tts.clone().into_token_stream(), f),
1343a8b546aSMiguel Ojeda             TokenStream::Fallback(tts) => Display::fmt(tts, f),
1353a8b546aSMiguel Ojeda         }
1363a8b546aSMiguel Ojeda     }
1373a8b546aSMiguel Ojeda }
1383a8b546aSMiguel Ojeda 
1393a8b546aSMiguel Ojeda impl From<proc_macro::TokenStream> for TokenStream {
from(inner: proc_macro::TokenStream) -> Self1403a8b546aSMiguel Ojeda     fn from(inner: proc_macro::TokenStream) -> Self {
1413a8b546aSMiguel Ojeda         TokenStream::Compiler(DeferredTokenStream::new(inner))
1423a8b546aSMiguel Ojeda     }
1433a8b546aSMiguel Ojeda }
1443a8b546aSMiguel Ojeda 
1453a8b546aSMiguel Ojeda impl From<TokenStream> for proc_macro::TokenStream {
from(inner: TokenStream) -> Self1463a8b546aSMiguel Ojeda     fn from(inner: TokenStream) -> Self {
1473a8b546aSMiguel Ojeda         match inner {
1483a8b546aSMiguel Ojeda             TokenStream::Compiler(inner) => inner.into_token_stream(),
1493a8b546aSMiguel Ojeda             TokenStream::Fallback(inner) => {
1503a8b546aSMiguel Ojeda                 proc_macro::TokenStream::from_str_unchecked(&inner.to_string())
1513a8b546aSMiguel Ojeda             }
1523a8b546aSMiguel Ojeda         }
1533a8b546aSMiguel Ojeda     }
1543a8b546aSMiguel Ojeda }
1553a8b546aSMiguel Ojeda 
1563a8b546aSMiguel Ojeda impl From<fallback::TokenStream> for TokenStream {
from(inner: fallback::TokenStream) -> Self1573a8b546aSMiguel Ojeda     fn from(inner: fallback::TokenStream) -> Self {
1583a8b546aSMiguel Ojeda         TokenStream::Fallback(inner)
1593a8b546aSMiguel Ojeda     }
1603a8b546aSMiguel Ojeda }
1613a8b546aSMiguel Ojeda 
1623a8b546aSMiguel Ojeda // Assumes inside_proc_macro().
into_compiler_token(token: TokenTree) -> proc_macro::TokenTree1633a8b546aSMiguel Ojeda fn into_compiler_token(token: TokenTree) -> proc_macro::TokenTree {
1643a8b546aSMiguel Ojeda     match token {
1653a8b546aSMiguel Ojeda         TokenTree::Group(tt) => proc_macro::TokenTree::Group(tt.inner.unwrap_nightly()),
1663a8b546aSMiguel Ojeda         TokenTree::Punct(tt) => {
1673a8b546aSMiguel Ojeda             let spacing = match tt.spacing() {
1683a8b546aSMiguel Ojeda                 Spacing::Joint => proc_macro::Spacing::Joint,
1693a8b546aSMiguel Ojeda                 Spacing::Alone => proc_macro::Spacing::Alone,
1703a8b546aSMiguel Ojeda             };
1713a8b546aSMiguel Ojeda             let mut punct = proc_macro::Punct::new(tt.as_char(), spacing);
1723a8b546aSMiguel Ojeda             punct.set_span(tt.span().inner.unwrap_nightly());
1733a8b546aSMiguel Ojeda             proc_macro::TokenTree::Punct(punct)
1743a8b546aSMiguel Ojeda         }
1753a8b546aSMiguel Ojeda         TokenTree::Ident(tt) => proc_macro::TokenTree::Ident(tt.inner.unwrap_nightly()),
1763a8b546aSMiguel Ojeda         TokenTree::Literal(tt) => proc_macro::TokenTree::Literal(tt.inner.unwrap_nightly()),
1773a8b546aSMiguel Ojeda     }
1783a8b546aSMiguel Ojeda }
1793a8b546aSMiguel Ojeda 
1803a8b546aSMiguel Ojeda impl From<TokenTree> for TokenStream {
from(token: TokenTree) -> Self1813a8b546aSMiguel Ojeda     fn from(token: TokenTree) -> Self {
1823a8b546aSMiguel Ojeda         if inside_proc_macro() {
1833a8b546aSMiguel Ojeda             TokenStream::Compiler(DeferredTokenStream::new(proc_macro::TokenStream::from(
1843a8b546aSMiguel Ojeda                 into_compiler_token(token),
1853a8b546aSMiguel Ojeda             )))
1863a8b546aSMiguel Ojeda         } else {
1873a8b546aSMiguel Ojeda             TokenStream::Fallback(fallback::TokenStream::from(token))
1883a8b546aSMiguel Ojeda         }
1893a8b546aSMiguel Ojeda     }
1903a8b546aSMiguel Ojeda }
1913a8b546aSMiguel Ojeda 
1923a8b546aSMiguel Ojeda impl FromIterator<TokenTree> for TokenStream {
from_iter<I: IntoIterator<Item = TokenTree>>(trees: I) -> Self1933a8b546aSMiguel Ojeda     fn from_iter<I: IntoIterator<Item = TokenTree>>(trees: I) -> Self {
1943a8b546aSMiguel Ojeda         if inside_proc_macro() {
1953a8b546aSMiguel Ojeda             TokenStream::Compiler(DeferredTokenStream::new(
1963a8b546aSMiguel Ojeda                 trees.into_iter().map(into_compiler_token).collect(),
1973a8b546aSMiguel Ojeda             ))
1983a8b546aSMiguel Ojeda         } else {
1993a8b546aSMiguel Ojeda             TokenStream::Fallback(trees.into_iter().collect())
2003a8b546aSMiguel Ojeda         }
2013a8b546aSMiguel Ojeda     }
2023a8b546aSMiguel Ojeda }
2033a8b546aSMiguel Ojeda 
2043a8b546aSMiguel Ojeda impl FromIterator<TokenStream> for TokenStream {
from_iter<I: IntoIterator<Item = TokenStream>>(streams: I) -> Self2053a8b546aSMiguel Ojeda     fn from_iter<I: IntoIterator<Item = TokenStream>>(streams: I) -> Self {
2063a8b546aSMiguel Ojeda         let mut streams = streams.into_iter();
2073a8b546aSMiguel Ojeda         match streams.next() {
2083a8b546aSMiguel Ojeda             Some(TokenStream::Compiler(mut first)) => {
2093a8b546aSMiguel Ojeda                 first.evaluate_now();
2103a8b546aSMiguel Ojeda                 first.stream.extend(streams.map(|s| match s {
2113a8b546aSMiguel Ojeda                     TokenStream::Compiler(s) => s.into_token_stream(),
2123a8b546aSMiguel Ojeda                     TokenStream::Fallback(_) => mismatch(line!()),
2133a8b546aSMiguel Ojeda                 }));
2143a8b546aSMiguel Ojeda                 TokenStream::Compiler(first)
2153a8b546aSMiguel Ojeda             }
2163a8b546aSMiguel Ojeda             Some(TokenStream::Fallback(mut first)) => {
2173a8b546aSMiguel Ojeda                 first.extend(streams.map(|s| match s {
2183a8b546aSMiguel Ojeda                     TokenStream::Fallback(s) => s,
2193a8b546aSMiguel Ojeda                     TokenStream::Compiler(_) => mismatch(line!()),
2203a8b546aSMiguel Ojeda                 }));
2213a8b546aSMiguel Ojeda                 TokenStream::Fallback(first)
2223a8b546aSMiguel Ojeda             }
2233a8b546aSMiguel Ojeda             None => TokenStream::new(),
2243a8b546aSMiguel Ojeda         }
2253a8b546aSMiguel Ojeda     }
2263a8b546aSMiguel Ojeda }
2273a8b546aSMiguel Ojeda 
2283a8b546aSMiguel Ojeda impl Extend<TokenTree> for TokenStream {
extend<I: IntoIterator<Item = TokenTree>>(&mut self, stream: I)2293a8b546aSMiguel Ojeda     fn extend<I: IntoIterator<Item = TokenTree>>(&mut self, stream: I) {
2303a8b546aSMiguel Ojeda         match self {
2313a8b546aSMiguel Ojeda             TokenStream::Compiler(tts) => {
2323a8b546aSMiguel Ojeda                 // Here is the reason for DeferredTokenStream.
2333a8b546aSMiguel Ojeda                 for token in stream {
2343a8b546aSMiguel Ojeda                     tts.extra.push(into_compiler_token(token));
2353a8b546aSMiguel Ojeda                 }
2363a8b546aSMiguel Ojeda             }
2373a8b546aSMiguel Ojeda             TokenStream::Fallback(tts) => tts.extend(stream),
2383a8b546aSMiguel Ojeda         }
2393a8b546aSMiguel Ojeda     }
2403a8b546aSMiguel Ojeda }
2413a8b546aSMiguel Ojeda 
2423a8b546aSMiguel Ojeda impl Extend<TokenStream> for TokenStream {
extend<I: IntoIterator<Item = TokenStream>>(&mut self, streams: I)2433a8b546aSMiguel Ojeda     fn extend<I: IntoIterator<Item = TokenStream>>(&mut self, streams: I) {
2443a8b546aSMiguel Ojeda         match self {
2453a8b546aSMiguel Ojeda             TokenStream::Compiler(tts) => {
2463a8b546aSMiguel Ojeda                 tts.evaluate_now();
2473a8b546aSMiguel Ojeda                 tts.stream
2483a8b546aSMiguel Ojeda                     .extend(streams.into_iter().map(TokenStream::unwrap_nightly));
2493a8b546aSMiguel Ojeda             }
2503a8b546aSMiguel Ojeda             TokenStream::Fallback(tts) => {
2513a8b546aSMiguel Ojeda                 tts.extend(streams.into_iter().map(TokenStream::unwrap_stable));
2523a8b546aSMiguel Ojeda             }
2533a8b546aSMiguel Ojeda         }
2543a8b546aSMiguel Ojeda     }
2553a8b546aSMiguel Ojeda }
2563a8b546aSMiguel Ojeda 
2573a8b546aSMiguel Ojeda impl Debug for TokenStream {
fmt(&self, f: &mut fmt::Formatter) -> fmt::Result2583a8b546aSMiguel Ojeda     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
2593a8b546aSMiguel Ojeda         match self {
2603a8b546aSMiguel Ojeda             TokenStream::Compiler(tts) => Debug::fmt(&tts.clone().into_token_stream(), f),
2613a8b546aSMiguel Ojeda             TokenStream::Fallback(tts) => Debug::fmt(tts, f),
2623a8b546aSMiguel Ojeda         }
2633a8b546aSMiguel Ojeda     }
2643a8b546aSMiguel Ojeda }
2653a8b546aSMiguel Ojeda 
2663a8b546aSMiguel Ojeda impl LexError {
span(&self) -> Span2673a8b546aSMiguel Ojeda     pub(crate) fn span(&self) -> Span {
2683a8b546aSMiguel Ojeda         match self {
2693a8b546aSMiguel Ojeda             LexError::Compiler(_) | LexError::CompilerPanic => Span::call_site(),
2703a8b546aSMiguel Ojeda             LexError::Fallback(e) => Span::Fallback(e.span()),
2713a8b546aSMiguel Ojeda         }
2723a8b546aSMiguel Ojeda     }
2733a8b546aSMiguel Ojeda }
2743a8b546aSMiguel Ojeda 
2753a8b546aSMiguel Ojeda impl From<proc_macro::LexError> for LexError {
from(e: proc_macro::LexError) -> Self2763a8b546aSMiguel Ojeda     fn from(e: proc_macro::LexError) -> Self {
2773a8b546aSMiguel Ojeda         LexError::Compiler(e)
2783a8b546aSMiguel Ojeda     }
2793a8b546aSMiguel Ojeda }
2803a8b546aSMiguel Ojeda 
2813a8b546aSMiguel Ojeda impl From<fallback::LexError> for LexError {
from(e: fallback::LexError) -> Self2823a8b546aSMiguel Ojeda     fn from(e: fallback::LexError) -> Self {
2833a8b546aSMiguel Ojeda         LexError::Fallback(e)
2843a8b546aSMiguel Ojeda     }
2853a8b546aSMiguel Ojeda }
2863a8b546aSMiguel Ojeda 
2873a8b546aSMiguel Ojeda impl Debug for LexError {
fmt(&self, f: &mut fmt::Formatter) -> fmt::Result2883a8b546aSMiguel Ojeda     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
2893a8b546aSMiguel Ojeda         match self {
2903a8b546aSMiguel Ojeda             LexError::Compiler(e) => Debug::fmt(e, f),
2913a8b546aSMiguel Ojeda             LexError::Fallback(e) => Debug::fmt(e, f),
2923a8b546aSMiguel Ojeda             LexError::CompilerPanic => {
2933a8b546aSMiguel Ojeda                 let fallback = fallback::LexError::call_site();
2943a8b546aSMiguel Ojeda                 Debug::fmt(&fallback, f)
2953a8b546aSMiguel Ojeda             }
2963a8b546aSMiguel Ojeda         }
2973a8b546aSMiguel Ojeda     }
2983a8b546aSMiguel Ojeda }
2993a8b546aSMiguel Ojeda 
3003a8b546aSMiguel Ojeda impl Display for LexError {
fmt(&self, f: &mut fmt::Formatter) -> fmt::Result3013a8b546aSMiguel Ojeda     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
3023a8b546aSMiguel Ojeda         match self {
3033a8b546aSMiguel Ojeda             LexError::Compiler(e) => Display::fmt(e, f),
3043a8b546aSMiguel Ojeda             LexError::Fallback(e) => Display::fmt(e, f),
3053a8b546aSMiguel Ojeda             LexError::CompilerPanic => {
3063a8b546aSMiguel Ojeda                 let fallback = fallback::LexError::call_site();
3073a8b546aSMiguel Ojeda                 Display::fmt(&fallback, f)
3083a8b546aSMiguel Ojeda             }
3093a8b546aSMiguel Ojeda         }
3103a8b546aSMiguel Ojeda     }
3113a8b546aSMiguel Ojeda }
3123a8b546aSMiguel Ojeda 
3133a8b546aSMiguel Ojeda #[derive(Clone)]
3143a8b546aSMiguel Ojeda pub(crate) enum TokenTreeIter {
3153a8b546aSMiguel Ojeda     Compiler(proc_macro::token_stream::IntoIter),
3163a8b546aSMiguel Ojeda     Fallback(fallback::TokenTreeIter),
3173a8b546aSMiguel Ojeda }
3183a8b546aSMiguel Ojeda 
3193a8b546aSMiguel Ojeda impl IntoIterator for TokenStream {
3203a8b546aSMiguel Ojeda     type Item = TokenTree;
3213a8b546aSMiguel Ojeda     type IntoIter = TokenTreeIter;
3223a8b546aSMiguel Ojeda 
into_iter(self) -> TokenTreeIter3233a8b546aSMiguel Ojeda     fn into_iter(self) -> TokenTreeIter {
3243a8b546aSMiguel Ojeda         match self {
3253a8b546aSMiguel Ojeda             TokenStream::Compiler(tts) => {
3263a8b546aSMiguel Ojeda                 TokenTreeIter::Compiler(tts.into_token_stream().into_iter())
3273a8b546aSMiguel Ojeda             }
3283a8b546aSMiguel Ojeda             TokenStream::Fallback(tts) => TokenTreeIter::Fallback(tts.into_iter()),
3293a8b546aSMiguel Ojeda         }
3303a8b546aSMiguel Ojeda     }
3313a8b546aSMiguel Ojeda }
3323a8b546aSMiguel Ojeda 
3333a8b546aSMiguel Ojeda impl Iterator for TokenTreeIter {
3343a8b546aSMiguel Ojeda     type Item = TokenTree;
3353a8b546aSMiguel Ojeda 
next(&mut self) -> Option<TokenTree>3363a8b546aSMiguel Ojeda     fn next(&mut self) -> Option<TokenTree> {
3373a8b546aSMiguel Ojeda         let token = match self {
3383a8b546aSMiguel Ojeda             TokenTreeIter::Compiler(iter) => iter.next()?,
3393a8b546aSMiguel Ojeda             TokenTreeIter::Fallback(iter) => return iter.next(),
3403a8b546aSMiguel Ojeda         };
3413a8b546aSMiguel Ojeda         Some(match token {
3423a8b546aSMiguel Ojeda             proc_macro::TokenTree::Group(tt) => {
3433a8b546aSMiguel Ojeda                 TokenTree::Group(crate::Group::_new(Group::Compiler(tt)))
3443a8b546aSMiguel Ojeda             }
3453a8b546aSMiguel Ojeda             proc_macro::TokenTree::Punct(tt) => {
3463a8b546aSMiguel Ojeda                 let spacing = match tt.spacing() {
3473a8b546aSMiguel Ojeda                     proc_macro::Spacing::Joint => Spacing::Joint,
3483a8b546aSMiguel Ojeda                     proc_macro::Spacing::Alone => Spacing::Alone,
3493a8b546aSMiguel Ojeda                 };
3503a8b546aSMiguel Ojeda                 let mut o = Punct::new(tt.as_char(), spacing);
3513a8b546aSMiguel Ojeda                 o.set_span(crate::Span::_new(Span::Compiler(tt.span())));
3523a8b546aSMiguel Ojeda                 TokenTree::Punct(o)
3533a8b546aSMiguel Ojeda             }
3543a8b546aSMiguel Ojeda             proc_macro::TokenTree::Ident(s) => {
3553a8b546aSMiguel Ojeda                 TokenTree::Ident(crate::Ident::_new(Ident::Compiler(s)))
3563a8b546aSMiguel Ojeda             }
3573a8b546aSMiguel Ojeda             proc_macro::TokenTree::Literal(l) => {
3583a8b546aSMiguel Ojeda                 TokenTree::Literal(crate::Literal::_new(Literal::Compiler(l)))
3593a8b546aSMiguel Ojeda             }
3603a8b546aSMiguel Ojeda         })
3613a8b546aSMiguel Ojeda     }
3623a8b546aSMiguel Ojeda 
size_hint(&self) -> (usize, Option<usize>)3633a8b546aSMiguel Ojeda     fn size_hint(&self) -> (usize, Option<usize>) {
3643a8b546aSMiguel Ojeda         match self {
3653a8b546aSMiguel Ojeda             TokenTreeIter::Compiler(tts) => tts.size_hint(),
3663a8b546aSMiguel Ojeda             TokenTreeIter::Fallback(tts) => tts.size_hint(),
3673a8b546aSMiguel Ojeda         }
3683a8b546aSMiguel Ojeda     }
3693a8b546aSMiguel Ojeda }
3703a8b546aSMiguel Ojeda 
3713a8b546aSMiguel Ojeda #[derive(Copy, Clone)]
3723a8b546aSMiguel Ojeda pub(crate) enum Span {
3733a8b546aSMiguel Ojeda     Compiler(proc_macro::Span),
3743a8b546aSMiguel Ojeda     Fallback(fallback::Span),
3753a8b546aSMiguel Ojeda }
3763a8b546aSMiguel Ojeda 
3773a8b546aSMiguel Ojeda impl Span {
call_site() -> Self3783a8b546aSMiguel Ojeda     pub(crate) fn call_site() -> Self {
3793a8b546aSMiguel Ojeda         if inside_proc_macro() {
3803a8b546aSMiguel Ojeda             Span::Compiler(proc_macro::Span::call_site())
3813a8b546aSMiguel Ojeda         } else {
3823a8b546aSMiguel Ojeda             Span::Fallback(fallback::Span::call_site())
3833a8b546aSMiguel Ojeda         }
3843a8b546aSMiguel Ojeda     }
3853a8b546aSMiguel Ojeda 
mixed_site() -> Self3863a8b546aSMiguel Ojeda     pub(crate) fn mixed_site() -> Self {
3873a8b546aSMiguel Ojeda         if inside_proc_macro() {
3883a8b546aSMiguel Ojeda             Span::Compiler(proc_macro::Span::mixed_site())
3893a8b546aSMiguel Ojeda         } else {
3903a8b546aSMiguel Ojeda             Span::Fallback(fallback::Span::mixed_site())
3913a8b546aSMiguel Ojeda         }
3923a8b546aSMiguel Ojeda     }
3933a8b546aSMiguel Ojeda 
3943a8b546aSMiguel Ojeda     #[cfg(super_unstable)]
def_site() -> Self3953a8b546aSMiguel Ojeda     pub(crate) fn def_site() -> Self {
3963a8b546aSMiguel Ojeda         if inside_proc_macro() {
3973a8b546aSMiguel Ojeda             Span::Compiler(proc_macro::Span::def_site())
3983a8b546aSMiguel Ojeda         } else {
3993a8b546aSMiguel Ojeda             Span::Fallback(fallback::Span::def_site())
4003a8b546aSMiguel Ojeda         }
4013a8b546aSMiguel Ojeda     }
4023a8b546aSMiguel Ojeda 
resolved_at(&self, other: Span) -> Span4033a8b546aSMiguel Ojeda     pub(crate) fn resolved_at(&self, other: Span) -> Span {
4043a8b546aSMiguel Ojeda         match (self, other) {
4053a8b546aSMiguel Ojeda             (Span::Compiler(a), Span::Compiler(b)) => Span::Compiler(a.resolved_at(b)),
4063a8b546aSMiguel Ojeda             (Span::Fallback(a), Span::Fallback(b)) => Span::Fallback(a.resolved_at(b)),
4073a8b546aSMiguel Ojeda             (Span::Compiler(_), Span::Fallback(_)) => mismatch(line!()),
4083a8b546aSMiguel Ojeda             (Span::Fallback(_), Span::Compiler(_)) => mismatch(line!()),
4093a8b546aSMiguel Ojeda         }
4103a8b546aSMiguel Ojeda     }
4113a8b546aSMiguel Ojeda 
located_at(&self, other: Span) -> Span4123a8b546aSMiguel Ojeda     pub(crate) fn located_at(&self, other: Span) -> Span {
4133a8b546aSMiguel Ojeda         match (self, other) {
4143a8b546aSMiguel Ojeda             (Span::Compiler(a), Span::Compiler(b)) => Span::Compiler(a.located_at(b)),
4153a8b546aSMiguel Ojeda             (Span::Fallback(a), Span::Fallback(b)) => Span::Fallback(a.located_at(b)),
4163a8b546aSMiguel Ojeda             (Span::Compiler(_), Span::Fallback(_)) => mismatch(line!()),
4173a8b546aSMiguel Ojeda             (Span::Fallback(_), Span::Compiler(_)) => mismatch(line!()),
4183a8b546aSMiguel Ojeda         }
4193a8b546aSMiguel Ojeda     }
4203a8b546aSMiguel Ojeda 
unwrap(self) -> proc_macro::Span4213a8b546aSMiguel Ojeda     pub(crate) fn unwrap(self) -> proc_macro::Span {
4223a8b546aSMiguel Ojeda         match self {
4233a8b546aSMiguel Ojeda             Span::Compiler(s) => s,
4243a8b546aSMiguel Ojeda             Span::Fallback(_) => panic!("proc_macro::Span is only available in procedural macros"),
4253a8b546aSMiguel Ojeda         }
4263a8b546aSMiguel Ojeda     }
4273a8b546aSMiguel Ojeda 
4283a8b546aSMiguel Ojeda     #[cfg(span_locations)]
byte_range(&self) -> Range<usize>4293a8b546aSMiguel Ojeda     pub(crate) fn byte_range(&self) -> Range<usize> {
4303a8b546aSMiguel Ojeda         match self {
4313a8b546aSMiguel Ojeda             #[cfg(proc_macro_span)]
4323a8b546aSMiguel Ojeda             Span::Compiler(s) => proc_macro_span::byte_range(s),
4333a8b546aSMiguel Ojeda             #[cfg(not(proc_macro_span))]
4343a8b546aSMiguel Ojeda             Span::Compiler(_) => 0..0,
4353a8b546aSMiguel Ojeda             Span::Fallback(s) => s.byte_range(),
4363a8b546aSMiguel Ojeda         }
4373a8b546aSMiguel Ojeda     }
4383a8b546aSMiguel Ojeda 
4393a8b546aSMiguel Ojeda     #[cfg(span_locations)]
start(&self) -> LineColumn4403a8b546aSMiguel Ojeda     pub(crate) fn start(&self) -> LineColumn {
4413a8b546aSMiguel Ojeda         match self {
4423a8b546aSMiguel Ojeda             #[cfg(proc_macro_span_location)]
4433a8b546aSMiguel Ojeda             Span::Compiler(s) => LineColumn {
4443a8b546aSMiguel Ojeda                 line: proc_macro_span_location::line(s),
4453a8b546aSMiguel Ojeda                 column: proc_macro_span_location::column(s).saturating_sub(1),
4463a8b546aSMiguel Ojeda             },
4473a8b546aSMiguel Ojeda             #[cfg(not(proc_macro_span_location))]
4483a8b546aSMiguel Ojeda             Span::Compiler(_) => LineColumn { line: 0, column: 0 },
4493a8b546aSMiguel Ojeda             Span::Fallback(s) => s.start(),
4503a8b546aSMiguel Ojeda         }
4513a8b546aSMiguel Ojeda     }
4523a8b546aSMiguel Ojeda 
4533a8b546aSMiguel Ojeda     #[cfg(span_locations)]
end(&self) -> LineColumn4543a8b546aSMiguel Ojeda     pub(crate) fn end(&self) -> LineColumn {
4553a8b546aSMiguel Ojeda         match self {
4563a8b546aSMiguel Ojeda             #[cfg(proc_macro_span_location)]
4573a8b546aSMiguel Ojeda             Span::Compiler(s) => {
4583a8b546aSMiguel Ojeda                 let end = proc_macro_span_location::end(s);
4593a8b546aSMiguel Ojeda                 LineColumn {
4603a8b546aSMiguel Ojeda                     line: proc_macro_span_location::line(&end),
4613a8b546aSMiguel Ojeda                     column: proc_macro_span_location::column(&end).saturating_sub(1),
4623a8b546aSMiguel Ojeda                 }
4633a8b546aSMiguel Ojeda             }
4643a8b546aSMiguel Ojeda             #[cfg(not(proc_macro_span_location))]
4653a8b546aSMiguel Ojeda             Span::Compiler(_) => LineColumn { line: 0, column: 0 },
4663a8b546aSMiguel Ojeda             Span::Fallback(s) => s.end(),
4673a8b546aSMiguel Ojeda         }
4683a8b546aSMiguel Ojeda     }
4693a8b546aSMiguel Ojeda 
4703a8b546aSMiguel Ojeda     #[cfg(span_locations)]
file(&self) -> String4713a8b546aSMiguel Ojeda     pub(crate) fn file(&self) -> String {
4723a8b546aSMiguel Ojeda         match self {
4733a8b546aSMiguel Ojeda             #[cfg(proc_macro_span_file)]
4743a8b546aSMiguel Ojeda             Span::Compiler(s) => proc_macro_span_file::file(s),
4753a8b546aSMiguel Ojeda             #[cfg(not(proc_macro_span_file))]
4763a8b546aSMiguel Ojeda             Span::Compiler(_) => "<token stream>".to_owned(),
4773a8b546aSMiguel Ojeda             Span::Fallback(s) => s.file(),
4783a8b546aSMiguel Ojeda         }
4793a8b546aSMiguel Ojeda     }
4803a8b546aSMiguel Ojeda 
4813a8b546aSMiguel Ojeda     #[cfg(span_locations)]
local_file(&self) -> Option<PathBuf>4823a8b546aSMiguel Ojeda     pub(crate) fn local_file(&self) -> Option<PathBuf> {
4833a8b546aSMiguel Ojeda         match self {
4843a8b546aSMiguel Ojeda             #[cfg(proc_macro_span_file)]
4853a8b546aSMiguel Ojeda             Span::Compiler(s) => proc_macro_span_file::local_file(s),
4863a8b546aSMiguel Ojeda             #[cfg(not(proc_macro_span_file))]
4873a8b546aSMiguel Ojeda             Span::Compiler(_) => None,
4883a8b546aSMiguel Ojeda             Span::Fallback(s) => s.local_file(),
4893a8b546aSMiguel Ojeda         }
4903a8b546aSMiguel Ojeda     }
4913a8b546aSMiguel Ojeda 
join(&self, other: Span) -> Option<Span>4923a8b546aSMiguel Ojeda     pub(crate) fn join(&self, other: Span) -> Option<Span> {
4933a8b546aSMiguel Ojeda         let ret = match (self, other) {
4943a8b546aSMiguel Ojeda             #[cfg(proc_macro_span)]
4953a8b546aSMiguel Ojeda             (Span::Compiler(a), Span::Compiler(b)) => Span::Compiler(proc_macro_span::join(a, b)?),
4963a8b546aSMiguel Ojeda             (Span::Fallback(a), Span::Fallback(b)) => Span::Fallback(a.join(b)?),
4973a8b546aSMiguel Ojeda             _ => return None,
4983a8b546aSMiguel Ojeda         };
4993a8b546aSMiguel Ojeda         Some(ret)
5003a8b546aSMiguel Ojeda     }
5013a8b546aSMiguel Ojeda 
5023a8b546aSMiguel Ojeda     #[cfg(super_unstable)]
eq(&self, other: &Span) -> bool5033a8b546aSMiguel Ojeda     pub(crate) fn eq(&self, other: &Span) -> bool {
5043a8b546aSMiguel Ojeda         match (self, other) {
5053a8b546aSMiguel Ojeda             (Span::Compiler(a), Span::Compiler(b)) => a.eq(b),
5063a8b546aSMiguel Ojeda             (Span::Fallback(a), Span::Fallback(b)) => a.eq(b),
5073a8b546aSMiguel Ojeda             _ => false,
5083a8b546aSMiguel Ojeda         }
5093a8b546aSMiguel Ojeda     }
5103a8b546aSMiguel Ojeda 
source_text(&self) -> Option<String>5113a8b546aSMiguel Ojeda     pub(crate) fn source_text(&self) -> Option<String> {
5123a8b546aSMiguel Ojeda         match self {
5133a8b546aSMiguel Ojeda             #[cfg(not(no_source_text))]
5143a8b546aSMiguel Ojeda             Span::Compiler(s) => s.source_text(),
5153a8b546aSMiguel Ojeda             #[cfg(no_source_text)]
5163a8b546aSMiguel Ojeda             Span::Compiler(_) => None,
5173a8b546aSMiguel Ojeda             Span::Fallback(s) => s.source_text(),
5183a8b546aSMiguel Ojeda         }
5193a8b546aSMiguel Ojeda     }
5203a8b546aSMiguel Ojeda 
unwrap_nightly(self) -> proc_macro::Span5213a8b546aSMiguel Ojeda     fn unwrap_nightly(self) -> proc_macro::Span {
5223a8b546aSMiguel Ojeda         match self {
5233a8b546aSMiguel Ojeda             Span::Compiler(s) => s,
5243a8b546aSMiguel Ojeda             Span::Fallback(_) => mismatch(line!()),
5253a8b546aSMiguel Ojeda         }
5263a8b546aSMiguel Ojeda     }
5273a8b546aSMiguel Ojeda }
5283a8b546aSMiguel Ojeda 
5293a8b546aSMiguel Ojeda impl From<proc_macro::Span> for crate::Span {
from(proc_span: proc_macro::Span) -> Self5303a8b546aSMiguel Ojeda     fn from(proc_span: proc_macro::Span) -> Self {
5313a8b546aSMiguel Ojeda         crate::Span::_new(Span::Compiler(proc_span))
5323a8b546aSMiguel Ojeda     }
5333a8b546aSMiguel Ojeda }
5343a8b546aSMiguel Ojeda 
5353a8b546aSMiguel Ojeda impl From<fallback::Span> for Span {
from(inner: fallback::Span) -> Self5363a8b546aSMiguel Ojeda     fn from(inner: fallback::Span) -> Self {
5373a8b546aSMiguel Ojeda         Span::Fallback(inner)
5383a8b546aSMiguel Ojeda     }
5393a8b546aSMiguel Ojeda }
5403a8b546aSMiguel Ojeda 
5413a8b546aSMiguel Ojeda impl Debug for Span {
fmt(&self, f: &mut fmt::Formatter) -> fmt::Result5423a8b546aSMiguel Ojeda     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
5433a8b546aSMiguel Ojeda         match self {
5443a8b546aSMiguel Ojeda             Span::Compiler(s) => Debug::fmt(s, f),
5453a8b546aSMiguel Ojeda             Span::Fallback(s) => Debug::fmt(s, f),
5463a8b546aSMiguel Ojeda         }
5473a8b546aSMiguel Ojeda     }
5483a8b546aSMiguel Ojeda }
5493a8b546aSMiguel Ojeda 
debug_span_field_if_nontrivial(debug: &mut fmt::DebugStruct, span: Span)5503a8b546aSMiguel Ojeda pub(crate) fn debug_span_field_if_nontrivial(debug: &mut fmt::DebugStruct, span: Span) {
5513a8b546aSMiguel Ojeda     match span {
5523a8b546aSMiguel Ojeda         Span::Compiler(s) => {
5533a8b546aSMiguel Ojeda             debug.field("span", &s);
5543a8b546aSMiguel Ojeda         }
5553a8b546aSMiguel Ojeda         Span::Fallback(s) => fallback::debug_span_field_if_nontrivial(debug, s),
5563a8b546aSMiguel Ojeda     }
5573a8b546aSMiguel Ojeda }
5583a8b546aSMiguel Ojeda 
5593a8b546aSMiguel Ojeda #[derive(Clone)]
5603a8b546aSMiguel Ojeda pub(crate) enum Group {
5613a8b546aSMiguel Ojeda     Compiler(proc_macro::Group),
5623a8b546aSMiguel Ojeda     Fallback(fallback::Group),
5633a8b546aSMiguel Ojeda }
5643a8b546aSMiguel Ojeda 
5653a8b546aSMiguel Ojeda impl Group {
new(delimiter: Delimiter, stream: TokenStream) -> Self5663a8b546aSMiguel Ojeda     pub(crate) fn new(delimiter: Delimiter, stream: TokenStream) -> Self {
5673a8b546aSMiguel Ojeda         match stream {
5683a8b546aSMiguel Ojeda             TokenStream::Compiler(tts) => {
5693a8b546aSMiguel Ojeda                 let delimiter = match delimiter {
5703a8b546aSMiguel Ojeda                     Delimiter::Parenthesis => proc_macro::Delimiter::Parenthesis,
5713a8b546aSMiguel Ojeda                     Delimiter::Bracket => proc_macro::Delimiter::Bracket,
5723a8b546aSMiguel Ojeda                     Delimiter::Brace => proc_macro::Delimiter::Brace,
5733a8b546aSMiguel Ojeda                     Delimiter::None => proc_macro::Delimiter::None,
5743a8b546aSMiguel Ojeda                 };
5753a8b546aSMiguel Ojeda                 Group::Compiler(proc_macro::Group::new(delimiter, tts.into_token_stream()))
5763a8b546aSMiguel Ojeda             }
5773a8b546aSMiguel Ojeda             TokenStream::Fallback(stream) => {
5783a8b546aSMiguel Ojeda                 Group::Fallback(fallback::Group::new(delimiter, stream))
5793a8b546aSMiguel Ojeda             }
5803a8b546aSMiguel Ojeda         }
5813a8b546aSMiguel Ojeda     }
5823a8b546aSMiguel Ojeda 
delimiter(&self) -> Delimiter5833a8b546aSMiguel Ojeda     pub(crate) fn delimiter(&self) -> Delimiter {
5843a8b546aSMiguel Ojeda         match self {
5853a8b546aSMiguel Ojeda             Group::Compiler(g) => match g.delimiter() {
5863a8b546aSMiguel Ojeda                 proc_macro::Delimiter::Parenthesis => Delimiter::Parenthesis,
5873a8b546aSMiguel Ojeda                 proc_macro::Delimiter::Bracket => Delimiter::Bracket,
5883a8b546aSMiguel Ojeda                 proc_macro::Delimiter::Brace => Delimiter::Brace,
5893a8b546aSMiguel Ojeda                 proc_macro::Delimiter::None => Delimiter::None,
5903a8b546aSMiguel Ojeda             },
5913a8b546aSMiguel Ojeda             Group::Fallback(g) => g.delimiter(),
5923a8b546aSMiguel Ojeda         }
5933a8b546aSMiguel Ojeda     }
5943a8b546aSMiguel Ojeda 
stream(&self) -> TokenStream5953a8b546aSMiguel Ojeda     pub(crate) fn stream(&self) -> TokenStream {
5963a8b546aSMiguel Ojeda         match self {
5973a8b546aSMiguel Ojeda             Group::Compiler(g) => TokenStream::Compiler(DeferredTokenStream::new(g.stream())),
5983a8b546aSMiguel Ojeda             Group::Fallback(g) => TokenStream::Fallback(g.stream()),
5993a8b546aSMiguel Ojeda         }
6003a8b546aSMiguel Ojeda     }
6013a8b546aSMiguel Ojeda 
span(&self) -> Span6023a8b546aSMiguel Ojeda     pub(crate) fn span(&self) -> Span {
6033a8b546aSMiguel Ojeda         match self {
6043a8b546aSMiguel Ojeda             Group::Compiler(g) => Span::Compiler(g.span()),
6053a8b546aSMiguel Ojeda             Group::Fallback(g) => Span::Fallback(g.span()),
6063a8b546aSMiguel Ojeda         }
6073a8b546aSMiguel Ojeda     }
6083a8b546aSMiguel Ojeda 
span_open(&self) -> Span6093a8b546aSMiguel Ojeda     pub(crate) fn span_open(&self) -> Span {
6103a8b546aSMiguel Ojeda         match self {
6113a8b546aSMiguel Ojeda             Group::Compiler(g) => Span::Compiler(g.span_open()),
6123a8b546aSMiguel Ojeda             Group::Fallback(g) => Span::Fallback(g.span_open()),
6133a8b546aSMiguel Ojeda         }
6143a8b546aSMiguel Ojeda     }
6153a8b546aSMiguel Ojeda 
span_close(&self) -> Span6163a8b546aSMiguel Ojeda     pub(crate) fn span_close(&self) -> Span {
6173a8b546aSMiguel Ojeda         match self {
6183a8b546aSMiguel Ojeda             Group::Compiler(g) => Span::Compiler(g.span_close()),
6193a8b546aSMiguel Ojeda             Group::Fallback(g) => Span::Fallback(g.span_close()),
6203a8b546aSMiguel Ojeda         }
6213a8b546aSMiguel Ojeda     }
6223a8b546aSMiguel Ojeda 
set_span(&mut self, span: Span)6233a8b546aSMiguel Ojeda     pub(crate) fn set_span(&mut self, span: Span) {
6243a8b546aSMiguel Ojeda         match (self, span) {
6253a8b546aSMiguel Ojeda             (Group::Compiler(g), Span::Compiler(s)) => g.set_span(s),
6263a8b546aSMiguel Ojeda             (Group::Fallback(g), Span::Fallback(s)) => g.set_span(s),
6273a8b546aSMiguel Ojeda             (Group::Compiler(_), Span::Fallback(_)) => mismatch(line!()),
6283a8b546aSMiguel Ojeda             (Group::Fallback(_), Span::Compiler(_)) => mismatch(line!()),
6293a8b546aSMiguel Ojeda         }
6303a8b546aSMiguel Ojeda     }
6313a8b546aSMiguel Ojeda 
unwrap_nightly(self) -> proc_macro::Group6323a8b546aSMiguel Ojeda     fn unwrap_nightly(self) -> proc_macro::Group {
6333a8b546aSMiguel Ojeda         match self {
6343a8b546aSMiguel Ojeda             Group::Compiler(g) => g,
6353a8b546aSMiguel Ojeda             Group::Fallback(_) => mismatch(line!()),
6363a8b546aSMiguel Ojeda         }
6373a8b546aSMiguel Ojeda     }
6383a8b546aSMiguel Ojeda }
6393a8b546aSMiguel Ojeda 
6403a8b546aSMiguel Ojeda impl From<fallback::Group> for Group {
from(g: fallback::Group) -> Self6413a8b546aSMiguel Ojeda     fn from(g: fallback::Group) -> Self {
6423a8b546aSMiguel Ojeda         Group::Fallback(g)
6433a8b546aSMiguel Ojeda     }
6443a8b546aSMiguel Ojeda }
6453a8b546aSMiguel Ojeda 
6463a8b546aSMiguel Ojeda impl Display for Group {
fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result6473a8b546aSMiguel Ojeda     fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
6483a8b546aSMiguel Ojeda         match self {
6493a8b546aSMiguel Ojeda             Group::Compiler(group) => Display::fmt(group, formatter),
6503a8b546aSMiguel Ojeda             Group::Fallback(group) => Display::fmt(group, formatter),
6513a8b546aSMiguel Ojeda         }
6523a8b546aSMiguel Ojeda     }
6533a8b546aSMiguel Ojeda }
6543a8b546aSMiguel Ojeda 
6553a8b546aSMiguel Ojeda impl Debug for Group {
fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result6563a8b546aSMiguel Ojeda     fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
6573a8b546aSMiguel Ojeda         match self {
6583a8b546aSMiguel Ojeda             Group::Compiler(group) => Debug::fmt(group, formatter),
6593a8b546aSMiguel Ojeda             Group::Fallback(group) => Debug::fmt(group, formatter),
6603a8b546aSMiguel Ojeda         }
6613a8b546aSMiguel Ojeda     }
6623a8b546aSMiguel Ojeda }
6633a8b546aSMiguel Ojeda 
6643a8b546aSMiguel Ojeda #[derive(Clone)]
6653a8b546aSMiguel Ojeda pub(crate) enum Ident {
6663a8b546aSMiguel Ojeda     Compiler(proc_macro::Ident),
6673a8b546aSMiguel Ojeda     Fallback(fallback::Ident),
6683a8b546aSMiguel Ojeda }
6693a8b546aSMiguel Ojeda 
6703a8b546aSMiguel Ojeda impl Ident {
6713a8b546aSMiguel Ojeda     #[track_caller]
new_checked(string: &str, span: Span) -> Self6723a8b546aSMiguel Ojeda     pub(crate) fn new_checked(string: &str, span: Span) -> Self {
6733a8b546aSMiguel Ojeda         match span {
6743a8b546aSMiguel Ojeda             Span::Compiler(s) => Ident::Compiler(proc_macro::Ident::new(string, s)),
6753a8b546aSMiguel Ojeda             Span::Fallback(s) => Ident::Fallback(fallback::Ident::new_checked(string, s)),
6763a8b546aSMiguel Ojeda         }
6773a8b546aSMiguel Ojeda     }
6783a8b546aSMiguel Ojeda 
6793a8b546aSMiguel Ojeda     #[track_caller]
new_raw_checked(string: &str, span: Span) -> Self6803a8b546aSMiguel Ojeda     pub(crate) fn new_raw_checked(string: &str, span: Span) -> Self {
6813a8b546aSMiguel Ojeda         match span {
6823a8b546aSMiguel Ojeda             Span::Compiler(s) => Ident::Compiler(proc_macro::Ident::new_raw(string, s)),
6833a8b546aSMiguel Ojeda             Span::Fallback(s) => Ident::Fallback(fallback::Ident::new_raw_checked(string, s)),
6843a8b546aSMiguel Ojeda         }
6853a8b546aSMiguel Ojeda     }
6863a8b546aSMiguel Ojeda 
span(&self) -> Span6873a8b546aSMiguel Ojeda     pub(crate) fn span(&self) -> Span {
6883a8b546aSMiguel Ojeda         match self {
6893a8b546aSMiguel Ojeda             Ident::Compiler(t) => Span::Compiler(t.span()),
6903a8b546aSMiguel Ojeda             Ident::Fallback(t) => Span::Fallback(t.span()),
6913a8b546aSMiguel Ojeda         }
6923a8b546aSMiguel Ojeda     }
6933a8b546aSMiguel Ojeda 
set_span(&mut self, span: Span)6943a8b546aSMiguel Ojeda     pub(crate) fn set_span(&mut self, span: Span) {
6953a8b546aSMiguel Ojeda         match (self, span) {
6963a8b546aSMiguel Ojeda             (Ident::Compiler(t), Span::Compiler(s)) => t.set_span(s),
6973a8b546aSMiguel Ojeda             (Ident::Fallback(t), Span::Fallback(s)) => t.set_span(s),
6983a8b546aSMiguel Ojeda             (Ident::Compiler(_), Span::Fallback(_)) => mismatch(line!()),
6993a8b546aSMiguel Ojeda             (Ident::Fallback(_), Span::Compiler(_)) => mismatch(line!()),
7003a8b546aSMiguel Ojeda         }
7013a8b546aSMiguel Ojeda     }
7023a8b546aSMiguel Ojeda 
unwrap_nightly(self) -> proc_macro::Ident7033a8b546aSMiguel Ojeda     fn unwrap_nightly(self) -> proc_macro::Ident {
7043a8b546aSMiguel Ojeda         match self {
7053a8b546aSMiguel Ojeda             Ident::Compiler(s) => s,
7063a8b546aSMiguel Ojeda             Ident::Fallback(_) => mismatch(line!()),
7073a8b546aSMiguel Ojeda         }
7083a8b546aSMiguel Ojeda     }
7093a8b546aSMiguel Ojeda }
7103a8b546aSMiguel Ojeda 
7113a8b546aSMiguel Ojeda impl From<fallback::Ident> for Ident {
from(inner: fallback::Ident) -> Self7123a8b546aSMiguel Ojeda     fn from(inner: fallback::Ident) -> Self {
7133a8b546aSMiguel Ojeda         Ident::Fallback(inner)
7143a8b546aSMiguel Ojeda     }
7153a8b546aSMiguel Ojeda }
7163a8b546aSMiguel Ojeda 
7173a8b546aSMiguel Ojeda impl PartialEq for Ident {
eq(&self, other: &Ident) -> bool7183a8b546aSMiguel Ojeda     fn eq(&self, other: &Ident) -> bool {
7193a8b546aSMiguel Ojeda         match (self, other) {
7203a8b546aSMiguel Ojeda             (Ident::Compiler(t), Ident::Compiler(o)) => t.to_string() == o.to_string(),
7213a8b546aSMiguel Ojeda             (Ident::Fallback(t), Ident::Fallback(o)) => t == o,
7223a8b546aSMiguel Ojeda             (Ident::Compiler(_), Ident::Fallback(_)) => mismatch(line!()),
7233a8b546aSMiguel Ojeda             (Ident::Fallback(_), Ident::Compiler(_)) => mismatch(line!()),
7243a8b546aSMiguel Ojeda         }
7253a8b546aSMiguel Ojeda     }
7263a8b546aSMiguel Ojeda }
7273a8b546aSMiguel Ojeda 
7283a8b546aSMiguel Ojeda impl<T> PartialEq<T> for Ident
7293a8b546aSMiguel Ojeda where
7303a8b546aSMiguel Ojeda     T: ?Sized + AsRef<str>,
7313a8b546aSMiguel Ojeda {
eq(&self, other: &T) -> bool7323a8b546aSMiguel Ojeda     fn eq(&self, other: &T) -> bool {
7333a8b546aSMiguel Ojeda         let other = other.as_ref();
7343a8b546aSMiguel Ojeda         match self {
7353a8b546aSMiguel Ojeda             Ident::Compiler(t) => t.to_string() == other,
7363a8b546aSMiguel Ojeda             Ident::Fallback(t) => t == other,
7373a8b546aSMiguel Ojeda         }
7383a8b546aSMiguel Ojeda     }
7393a8b546aSMiguel Ojeda }
7403a8b546aSMiguel Ojeda 
7413a8b546aSMiguel Ojeda impl Display for Ident {
fmt(&self, f: &mut fmt::Formatter) -> fmt::Result7423a8b546aSMiguel Ojeda     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
7433a8b546aSMiguel Ojeda         match self {
7443a8b546aSMiguel Ojeda             Ident::Compiler(t) => Display::fmt(t, f),
7453a8b546aSMiguel Ojeda             Ident::Fallback(t) => Display::fmt(t, f),
7463a8b546aSMiguel Ojeda         }
7473a8b546aSMiguel Ojeda     }
7483a8b546aSMiguel Ojeda }
7493a8b546aSMiguel Ojeda 
7503a8b546aSMiguel Ojeda impl Debug for Ident {
fmt(&self, f: &mut fmt::Formatter) -> fmt::Result7513a8b546aSMiguel Ojeda     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
7523a8b546aSMiguel Ojeda         match self {
7533a8b546aSMiguel Ojeda             Ident::Compiler(t) => Debug::fmt(t, f),
7543a8b546aSMiguel Ojeda             Ident::Fallback(t) => Debug::fmt(t, f),
7553a8b546aSMiguel Ojeda         }
7563a8b546aSMiguel Ojeda     }
7573a8b546aSMiguel Ojeda }
7583a8b546aSMiguel Ojeda 
7593a8b546aSMiguel Ojeda #[derive(Clone)]
7603a8b546aSMiguel Ojeda pub(crate) enum Literal {
7613a8b546aSMiguel Ojeda     Compiler(proc_macro::Literal),
7623a8b546aSMiguel Ojeda     Fallback(fallback::Literal),
7633a8b546aSMiguel Ojeda }
7643a8b546aSMiguel Ojeda 
7653a8b546aSMiguel Ojeda macro_rules! suffixed_numbers {
7663a8b546aSMiguel Ojeda     ($($name:ident => $kind:ident,)*) => ($(
7673a8b546aSMiguel Ojeda         pub(crate) fn $name(n: $kind) -> Literal {
7683a8b546aSMiguel Ojeda             if inside_proc_macro() {
7693a8b546aSMiguel Ojeda                 Literal::Compiler(proc_macro::Literal::$name(n))
7703a8b546aSMiguel Ojeda             } else {
7713a8b546aSMiguel Ojeda                 Literal::Fallback(fallback::Literal::$name(n))
7723a8b546aSMiguel Ojeda             }
7733a8b546aSMiguel Ojeda         }
7743a8b546aSMiguel Ojeda     )*)
7753a8b546aSMiguel Ojeda }
7763a8b546aSMiguel Ojeda 
7773a8b546aSMiguel Ojeda macro_rules! unsuffixed_integers {
7783a8b546aSMiguel Ojeda     ($($name:ident => $kind:ident,)*) => ($(
7793a8b546aSMiguel Ojeda         pub(crate) fn $name(n: $kind) -> Literal {
7803a8b546aSMiguel Ojeda             if inside_proc_macro() {
7813a8b546aSMiguel Ojeda                 Literal::Compiler(proc_macro::Literal::$name(n))
7823a8b546aSMiguel Ojeda             } else {
7833a8b546aSMiguel Ojeda                 Literal::Fallback(fallback::Literal::$name(n))
7843a8b546aSMiguel Ojeda             }
7853a8b546aSMiguel Ojeda         }
7863a8b546aSMiguel Ojeda     )*)
7873a8b546aSMiguel Ojeda }
7883a8b546aSMiguel Ojeda 
7893a8b546aSMiguel Ojeda impl Literal {
from_str_checked(repr: &str) -> Result<Self, LexError>7903a8b546aSMiguel Ojeda     pub(crate) fn from_str_checked(repr: &str) -> Result<Self, LexError> {
7913a8b546aSMiguel Ojeda         if inside_proc_macro() {
7923a8b546aSMiguel Ojeda             let literal = proc_macro::Literal::from_str_checked(repr)?;
7933a8b546aSMiguel Ojeda             Ok(Literal::Compiler(literal))
7943a8b546aSMiguel Ojeda         } else {
7953a8b546aSMiguel Ojeda             let literal = fallback::Literal::from_str_checked(repr)?;
7963a8b546aSMiguel Ojeda             Ok(Literal::Fallback(literal))
7973a8b546aSMiguel Ojeda         }
7983a8b546aSMiguel Ojeda     }
7993a8b546aSMiguel Ojeda 
from_str_unchecked(repr: &str) -> Self8003a8b546aSMiguel Ojeda     pub(crate) unsafe fn from_str_unchecked(repr: &str) -> Self {
8013a8b546aSMiguel Ojeda         if inside_proc_macro() {
8023a8b546aSMiguel Ojeda             Literal::Compiler(proc_macro::Literal::from_str_unchecked(repr))
8033a8b546aSMiguel Ojeda         } else {
8043a8b546aSMiguel Ojeda             Literal::Fallback(unsafe { fallback::Literal::from_str_unchecked(repr) })
8053a8b546aSMiguel Ojeda         }
8063a8b546aSMiguel Ojeda     }
8073a8b546aSMiguel Ojeda 
8083a8b546aSMiguel Ojeda     suffixed_numbers! {
8093a8b546aSMiguel Ojeda         u8_suffixed => u8,
8103a8b546aSMiguel Ojeda         u16_suffixed => u16,
8113a8b546aSMiguel Ojeda         u32_suffixed => u32,
8123a8b546aSMiguel Ojeda         u64_suffixed => u64,
8133a8b546aSMiguel Ojeda         u128_suffixed => u128,
8143a8b546aSMiguel Ojeda         usize_suffixed => usize,
8153a8b546aSMiguel Ojeda         i8_suffixed => i8,
8163a8b546aSMiguel Ojeda         i16_suffixed => i16,
8173a8b546aSMiguel Ojeda         i32_suffixed => i32,
8183a8b546aSMiguel Ojeda         i64_suffixed => i64,
8193a8b546aSMiguel Ojeda         i128_suffixed => i128,
8203a8b546aSMiguel Ojeda         isize_suffixed => isize,
8213a8b546aSMiguel Ojeda 
8223a8b546aSMiguel Ojeda         f32_suffixed => f32,
8233a8b546aSMiguel Ojeda         f64_suffixed => f64,
8243a8b546aSMiguel Ojeda     }
8253a8b546aSMiguel Ojeda 
8263a8b546aSMiguel Ojeda     unsuffixed_integers! {
8273a8b546aSMiguel Ojeda         u8_unsuffixed => u8,
8283a8b546aSMiguel Ojeda         u16_unsuffixed => u16,
8293a8b546aSMiguel Ojeda         u32_unsuffixed => u32,
8303a8b546aSMiguel Ojeda         u64_unsuffixed => u64,
8313a8b546aSMiguel Ojeda         u128_unsuffixed => u128,
8323a8b546aSMiguel Ojeda         usize_unsuffixed => usize,
8333a8b546aSMiguel Ojeda         i8_unsuffixed => i8,
8343a8b546aSMiguel Ojeda         i16_unsuffixed => i16,
8353a8b546aSMiguel Ojeda         i32_unsuffixed => i32,
8363a8b546aSMiguel Ojeda         i64_unsuffixed => i64,
8373a8b546aSMiguel Ojeda         i128_unsuffixed => i128,
8383a8b546aSMiguel Ojeda         isize_unsuffixed => isize,
8393a8b546aSMiguel Ojeda     }
8403a8b546aSMiguel Ojeda 
f32_unsuffixed(f: f32) -> Literal8413a8b546aSMiguel Ojeda     pub(crate) fn f32_unsuffixed(f: f32) -> Literal {
8423a8b546aSMiguel Ojeda         if inside_proc_macro() {
8433a8b546aSMiguel Ojeda             Literal::Compiler(proc_macro::Literal::f32_unsuffixed(f))
8443a8b546aSMiguel Ojeda         } else {
8453a8b546aSMiguel Ojeda             Literal::Fallback(fallback::Literal::f32_unsuffixed(f))
8463a8b546aSMiguel Ojeda         }
8473a8b546aSMiguel Ojeda     }
8483a8b546aSMiguel Ojeda 
f64_unsuffixed(f: f64) -> Literal8493a8b546aSMiguel Ojeda     pub(crate) fn f64_unsuffixed(f: f64) -> Literal {
8503a8b546aSMiguel Ojeda         if inside_proc_macro() {
8513a8b546aSMiguel Ojeda             Literal::Compiler(proc_macro::Literal::f64_unsuffixed(f))
8523a8b546aSMiguel Ojeda         } else {
8533a8b546aSMiguel Ojeda             Literal::Fallback(fallback::Literal::f64_unsuffixed(f))
8543a8b546aSMiguel Ojeda         }
8553a8b546aSMiguel Ojeda     }
8563a8b546aSMiguel Ojeda 
string(string: &str) -> Literal8573a8b546aSMiguel Ojeda     pub(crate) fn string(string: &str) -> Literal {
8583a8b546aSMiguel Ojeda         if inside_proc_macro() {
8593a8b546aSMiguel Ojeda             Literal::Compiler(proc_macro::Literal::string(string))
8603a8b546aSMiguel Ojeda         } else {
8613a8b546aSMiguel Ojeda             Literal::Fallback(fallback::Literal::string(string))
8623a8b546aSMiguel Ojeda         }
8633a8b546aSMiguel Ojeda     }
8643a8b546aSMiguel Ojeda 
character(ch: char) -> Literal8653a8b546aSMiguel Ojeda     pub(crate) fn character(ch: char) -> Literal {
8663a8b546aSMiguel Ojeda         if inside_proc_macro() {
8673a8b546aSMiguel Ojeda             Literal::Compiler(proc_macro::Literal::character(ch))
8683a8b546aSMiguel Ojeda         } else {
8693a8b546aSMiguel Ojeda             Literal::Fallback(fallback::Literal::character(ch))
8703a8b546aSMiguel Ojeda         }
8713a8b546aSMiguel Ojeda     }
8723a8b546aSMiguel Ojeda 
byte_character(byte: u8) -> Literal8733a8b546aSMiguel Ojeda     pub(crate) fn byte_character(byte: u8) -> Literal {
8743a8b546aSMiguel Ojeda         if inside_proc_macro() {
8753a8b546aSMiguel Ojeda             Literal::Compiler({
8763a8b546aSMiguel Ojeda                 #[cfg(not(no_literal_byte_character))]
8773a8b546aSMiguel Ojeda                 {
8783a8b546aSMiguel Ojeda                     proc_macro::Literal::byte_character(byte)
8793a8b546aSMiguel Ojeda                 }
8803a8b546aSMiguel Ojeda 
8813a8b546aSMiguel Ojeda                 #[cfg(no_literal_byte_character)]
8823a8b546aSMiguel Ojeda                 {
8833a8b546aSMiguel Ojeda                     let fallback = fallback::Literal::byte_character(byte);
8843a8b546aSMiguel Ojeda                     proc_macro::Literal::from_str_unchecked(&fallback.repr)
8853a8b546aSMiguel Ojeda                 }
8863a8b546aSMiguel Ojeda             })
8873a8b546aSMiguel Ojeda         } else {
8883a8b546aSMiguel Ojeda             Literal::Fallback(fallback::Literal::byte_character(byte))
8893a8b546aSMiguel Ojeda         }
8903a8b546aSMiguel Ojeda     }
8913a8b546aSMiguel Ojeda 
byte_string(bytes: &[u8]) -> Literal8923a8b546aSMiguel Ojeda     pub(crate) fn byte_string(bytes: &[u8]) -> Literal {
8933a8b546aSMiguel Ojeda         if inside_proc_macro() {
8943a8b546aSMiguel Ojeda             Literal::Compiler(proc_macro::Literal::byte_string(bytes))
8953a8b546aSMiguel Ojeda         } else {
8963a8b546aSMiguel Ojeda             Literal::Fallback(fallback::Literal::byte_string(bytes))
8973a8b546aSMiguel Ojeda         }
8983a8b546aSMiguel Ojeda     }
8993a8b546aSMiguel Ojeda 
c_string(string: &CStr) -> Literal9003a8b546aSMiguel Ojeda     pub(crate) fn c_string(string: &CStr) -> Literal {
9013a8b546aSMiguel Ojeda         if inside_proc_macro() {
9023a8b546aSMiguel Ojeda             Literal::Compiler({
9033a8b546aSMiguel Ojeda                 #[cfg(not(no_literal_c_string))]
9043a8b546aSMiguel Ojeda                 {
9053a8b546aSMiguel Ojeda                     proc_macro::Literal::c_string(string)
9063a8b546aSMiguel Ojeda                 }
9073a8b546aSMiguel Ojeda 
9083a8b546aSMiguel Ojeda                 #[cfg(no_literal_c_string)]
9093a8b546aSMiguel Ojeda                 {
9103a8b546aSMiguel Ojeda                     let fallback = fallback::Literal::c_string(string);
9113a8b546aSMiguel Ojeda                     proc_macro::Literal::from_str_unchecked(&fallback.repr)
9123a8b546aSMiguel Ojeda                 }
9133a8b546aSMiguel Ojeda             })
9143a8b546aSMiguel Ojeda         } else {
9153a8b546aSMiguel Ojeda             Literal::Fallback(fallback::Literal::c_string(string))
9163a8b546aSMiguel Ojeda         }
9173a8b546aSMiguel Ojeda     }
9183a8b546aSMiguel Ojeda 
span(&self) -> Span9193a8b546aSMiguel Ojeda     pub(crate) fn span(&self) -> Span {
9203a8b546aSMiguel Ojeda         match self {
9213a8b546aSMiguel Ojeda             Literal::Compiler(lit) => Span::Compiler(lit.span()),
9223a8b546aSMiguel Ojeda             Literal::Fallback(lit) => Span::Fallback(lit.span()),
9233a8b546aSMiguel Ojeda         }
9243a8b546aSMiguel Ojeda     }
9253a8b546aSMiguel Ojeda 
set_span(&mut self, span: Span)9263a8b546aSMiguel Ojeda     pub(crate) fn set_span(&mut self, span: Span) {
9273a8b546aSMiguel Ojeda         match (self, span) {
9283a8b546aSMiguel Ojeda             (Literal::Compiler(lit), Span::Compiler(s)) => lit.set_span(s),
9293a8b546aSMiguel Ojeda             (Literal::Fallback(lit), Span::Fallback(s)) => lit.set_span(s),
9303a8b546aSMiguel Ojeda             (Literal::Compiler(_), Span::Fallback(_)) => mismatch(line!()),
9313a8b546aSMiguel Ojeda             (Literal::Fallback(_), Span::Compiler(_)) => mismatch(line!()),
9323a8b546aSMiguel Ojeda         }
9333a8b546aSMiguel Ojeda     }
9343a8b546aSMiguel Ojeda 
subspan<R: RangeBounds<usize>>(&self, range: R) -> Option<Span>9353a8b546aSMiguel Ojeda     pub(crate) fn subspan<R: RangeBounds<usize>>(&self, range: R) -> Option<Span> {
9363a8b546aSMiguel Ojeda         match self {
9373a8b546aSMiguel Ojeda             #[cfg(proc_macro_span)]
9383a8b546aSMiguel Ojeda             Literal::Compiler(lit) => proc_macro_span::subspan(lit, range).map(Span::Compiler),
9393a8b546aSMiguel Ojeda             #[cfg(not(proc_macro_span))]
9403a8b546aSMiguel Ojeda             Literal::Compiler(_lit) => None,
9413a8b546aSMiguel Ojeda             Literal::Fallback(lit) => lit.subspan(range).map(Span::Fallback),
9423a8b546aSMiguel Ojeda         }
9433a8b546aSMiguel Ojeda     }
9443a8b546aSMiguel Ojeda 
unwrap_nightly(self) -> proc_macro::Literal9453a8b546aSMiguel Ojeda     fn unwrap_nightly(self) -> proc_macro::Literal {
9463a8b546aSMiguel Ojeda         match self {
9473a8b546aSMiguel Ojeda             Literal::Compiler(s) => s,
9483a8b546aSMiguel Ojeda             Literal::Fallback(_) => mismatch(line!()),
9493a8b546aSMiguel Ojeda         }
9503a8b546aSMiguel Ojeda     }
9513a8b546aSMiguel Ojeda }
9523a8b546aSMiguel Ojeda 
9533a8b546aSMiguel Ojeda impl From<fallback::Literal> for Literal {
from(s: fallback::Literal) -> Self9543a8b546aSMiguel Ojeda     fn from(s: fallback::Literal) -> Self {
9553a8b546aSMiguel Ojeda         Literal::Fallback(s)
9563a8b546aSMiguel Ojeda     }
9573a8b546aSMiguel Ojeda }
9583a8b546aSMiguel Ojeda 
9593a8b546aSMiguel Ojeda impl Display for Literal {
fmt(&self, f: &mut fmt::Formatter) -> fmt::Result9603a8b546aSMiguel Ojeda     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
9613a8b546aSMiguel Ojeda         match self {
9623a8b546aSMiguel Ojeda             Literal::Compiler(t) => Display::fmt(t, f),
9633a8b546aSMiguel Ojeda             Literal::Fallback(t) => Display::fmt(t, f),
9643a8b546aSMiguel Ojeda         }
9653a8b546aSMiguel Ojeda     }
9663a8b546aSMiguel Ojeda }
9673a8b546aSMiguel Ojeda 
9683a8b546aSMiguel Ojeda impl Debug for Literal {
fmt(&self, f: &mut fmt::Formatter) -> fmt::Result9693a8b546aSMiguel Ojeda     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
9703a8b546aSMiguel Ojeda         match self {
9713a8b546aSMiguel Ojeda             Literal::Compiler(t) => Debug::fmt(t, f),
9723a8b546aSMiguel Ojeda             Literal::Fallback(t) => Debug::fmt(t, f),
9733a8b546aSMiguel Ojeda         }
9743a8b546aSMiguel Ojeda     }
9753a8b546aSMiguel Ojeda }
9763a8b546aSMiguel Ojeda 
9773a8b546aSMiguel Ojeda #[cfg(span_locations)]
invalidate_current_thread_spans()9783a8b546aSMiguel Ojeda pub(crate) fn invalidate_current_thread_spans() {
9793a8b546aSMiguel Ojeda     if inside_proc_macro() {
9803a8b546aSMiguel Ojeda         panic!(
9813a8b546aSMiguel Ojeda             "proc_macro2::extra::invalidate_current_thread_spans is not available in procedural macros"
9823a8b546aSMiguel Ojeda         );
9833a8b546aSMiguel Ojeda     } else {
9843a8b546aSMiguel Ojeda         crate::fallback::invalidate_current_thread_spans();
9853a8b546aSMiguel Ojeda     }
9863a8b546aSMiguel Ojeda }
987