| //! Items which do not have a correspondence to any API in the proc_macro crate, |
| //! but are necessary to include in proc-macro2. |
| |
| use crate::fallback; |
| use crate::imp; |
| use crate::marker::Marker; |
| use crate::Span; |
| use core::fmt::{self, Debug}; |
| |
| /// An object that holds a [`Group`]'s `span_open()` and `span_close()` together |
| /// (in a more compact representation than holding those 2 spans individually. |
| /// |
| /// [`Group`]: crate::Group |
| #[derive(Copy, Clone)] |
| pub struct DelimSpan { |
| inner: DelimSpanEnum, |
| _marker: Marker, |
| } |
| |
| #[derive(Copy, Clone)] |
| enum DelimSpanEnum { |
| #[cfg(wrap_proc_macro)] |
| Compiler { |
| join: proc_macro::Span, |
| open: proc_macro::Span, |
| close: proc_macro::Span, |
| }, |
| Fallback(fallback::Span), |
| } |
| |
| impl DelimSpan { |
| pub(crate) fn new(group: &imp::Group) -> Self { |
| #[cfg(wrap_proc_macro)] |
| let inner = match group { |
| imp::Group::Compiler(group) => DelimSpanEnum::Compiler { |
| join: group.span(), |
| open: group.span_open(), |
| close: group.span_close(), |
| }, |
| imp::Group::Fallback(group) => DelimSpanEnum::Fallback(group.span()), |
| }; |
| |
| #[cfg(not(wrap_proc_macro))] |
| let inner = DelimSpanEnum::Fallback(group.span()); |
| |
| DelimSpan { |
| inner, |
| _marker: Marker, |
| } |
| } |
| |
| /// Returns a span covering the entire delimited group. |
| pub fn join(&self) -> Span { |
| match &self.inner { |
| #[cfg(wrap_proc_macro)] |
| DelimSpanEnum::Compiler { join, .. } => Span::_new(imp::Span::Compiler(*join)), |
| DelimSpanEnum::Fallback(span) => Span::_new_fallback(*span), |
| } |
| } |
| |
| /// Returns a span for the opening punctuation of the group only. |
| pub fn open(&self) -> Span { |
| match &self.inner { |
| #[cfg(wrap_proc_macro)] |
| DelimSpanEnum::Compiler { open, .. } => Span::_new(imp::Span::Compiler(*open)), |
| DelimSpanEnum::Fallback(span) => Span::_new_fallback(span.first_byte()), |
| } |
| } |
| |
| /// Returns a span for the closing punctuation of the group only. |
| pub fn close(&self) -> Span { |
| match &self.inner { |
| #[cfg(wrap_proc_macro)] |
| DelimSpanEnum::Compiler { close, .. } => Span::_new(imp::Span::Compiler(*close)), |
| DelimSpanEnum::Fallback(span) => Span::_new_fallback(span.last_byte()), |
| } |
| } |
| } |
| |
| impl Debug for DelimSpan { |
| fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { |
| Debug::fmt(&self.join(), f) |
| } |
| } |