#[cfg(feature = "fold")] use fold::{FoldWith, VisitWith}; pub use syntax_pos::{ hygiene, BytePos, ExpnInfo, FileName, Globals, Mark, MultiSpan, SourceFile, Span, SpanData, SyntaxContext, DUMMY_SP, GLOBALS, NO_EXPANSION, }; /// /// # Derive /// This trait can be derived with `#[derive(Spanned)]`. pub trait Spanned { /// Get span of `self`. fn span(&self) -> Span; } impl Spanned for Span { #[inline(always)] fn span(&self) -> Span { *self } } impl Spanned for BytePos { /// Creates a new single-byte span. #[inline(always)] fn span(&self) -> Span { Span::new(*self, *self, Default::default()) } } impl Spanned for Option where S: Spanned, { fn span(&self) -> Span { match *self { Some(ref s) => s.span(), None => DUMMY_SP, } } } impl Spanned for Box where S: ?Sized + Spanned, { fn span(&self) -> Span { ::span(&*self) } } impl<'a, S> Spanned for &'a S where S: ?Sized + Spanned, { fn span(&self) -> Span { ::span(&*self) } } impl Spanned for ::either::Either where A: Spanned, B: Spanned, { fn span(&self) -> Span { match *self { ::either::Either::Left(ref n) => n.span(), ::either::Either::Right(ref n) => n.span(), } } } #[cfg(feature = "fold")] impl FoldWith for Span { /// No op as span does not have any child. fn fold_children(self, _: &mut F) -> Span { self } } #[cfg(feature = "fold")] impl VisitWith for Span { /// No op as span does not have any child. fn visit_children(&self, _: &mut F) {} }