Sha256: 3ccf5120593f35787442c0a37d243e802c5262e7f8b35aed503873008ec035c5
Contents?: true
Size: 1.09 KB
Versions: 30
Compression:
Stored size: 1.09 KB
Contents
use crate::ToTokens; use proc_macro2::extra::DelimSpan; use proc_macro2::{Span, TokenStream}; // Not public API other than via the syn crate. Use syn::spanned::Spanned. pub trait Spanned: private::Sealed { fn __span(&self) -> Span; } impl Spanned for Span { fn __span(&self) -> Span { *self } } impl Spanned for DelimSpan { fn __span(&self) -> Span { self.join() } } impl<T: ?Sized + ToTokens> Spanned for T { fn __span(&self) -> Span { join_spans(self.into_token_stream()) } } fn join_spans(tokens: TokenStream) -> Span { let mut iter = tokens.into_iter().map(|tt| tt.span()); let first = match iter.next() { Some(span) => span, None => return Span::call_site(), }; iter.fold(None, |_prev, next| Some(next)) .and_then(|last| first.join(last)) .unwrap_or(first) } mod private { use crate::ToTokens; use proc_macro2::extra::DelimSpan; use proc_macro2::Span; pub trait Sealed {} impl Sealed for Span {} impl Sealed for DelimSpan {} impl<T: ?Sized + ToTokens> Sealed for T {} }
Version data entries
30 entries across 30 versions & 1 rubygems