use std::{borrow::Cow, rc::Rc, sync::Arc}; pub use crate::syntax_pos::{ hygiene, BytePos, CharPos, FileName, Globals, Loc, LocWithOpt, Mark, MultiSpan, SourceFile, SourceFileAndBytePos, SourceFileAndLine, Span, SpanLinesError, 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<'a, T> Spanned for Cow<'a, T> where T: Spanned + Clone, { #[inline(always)] fn span(&self) -> 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 Rc where S: ?Sized + Spanned, { fn span(&self) -> Span { ::span(&*self) } } impl Spanned for Arc where S: ?Sized + Spanned, { fn span(&self) -> Span { ::span(&*self) } } 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(), } } }