17ac06127Sopenharmony_ci//! Items which do not have a correspondence to any API in the proc_macro crate,
27ac06127Sopenharmony_ci//! but are necessary to include in proc-macro2.
37ac06127Sopenharmony_ci
47ac06127Sopenharmony_ciuse crate::fallback;
57ac06127Sopenharmony_ciuse crate::imp;
67ac06127Sopenharmony_ciuse crate::marker::Marker;
77ac06127Sopenharmony_ciuse crate::Span;
87ac06127Sopenharmony_ciuse core::fmt::{self, Debug};
97ac06127Sopenharmony_ci
107ac06127Sopenharmony_ci/// An object that holds a [`Group`]'s `span_open()` and `span_close()` together
117ac06127Sopenharmony_ci/// (in a more compact representation than holding those 2 spans individually.
127ac06127Sopenharmony_ci///
137ac06127Sopenharmony_ci/// [`Group`]: crate::Group
147ac06127Sopenharmony_ci#[derive(Copy, Clone)]
157ac06127Sopenharmony_cipub struct DelimSpan {
167ac06127Sopenharmony_ci    inner: DelimSpanEnum,
177ac06127Sopenharmony_ci    _marker: Marker,
187ac06127Sopenharmony_ci}
197ac06127Sopenharmony_ci
207ac06127Sopenharmony_ci#[derive(Copy, Clone)]
217ac06127Sopenharmony_cienum DelimSpanEnum {
227ac06127Sopenharmony_ci    #[cfg(wrap_proc_macro)]
237ac06127Sopenharmony_ci    Compiler {
247ac06127Sopenharmony_ci        join: proc_macro::Span,
257ac06127Sopenharmony_ci        open: proc_macro::Span,
267ac06127Sopenharmony_ci        close: proc_macro::Span,
277ac06127Sopenharmony_ci    },
287ac06127Sopenharmony_ci    Fallback(fallback::Span),
297ac06127Sopenharmony_ci}
307ac06127Sopenharmony_ci
317ac06127Sopenharmony_ciimpl DelimSpan {
327ac06127Sopenharmony_ci    pub(crate) fn new(group: &imp::Group) -> Self {
337ac06127Sopenharmony_ci        #[cfg(wrap_proc_macro)]
347ac06127Sopenharmony_ci        let inner = match group {
357ac06127Sopenharmony_ci            imp::Group::Compiler(group) => DelimSpanEnum::Compiler {
367ac06127Sopenharmony_ci                join: group.span(),
377ac06127Sopenharmony_ci                open: group.span_open(),
387ac06127Sopenharmony_ci                close: group.span_close(),
397ac06127Sopenharmony_ci            },
407ac06127Sopenharmony_ci            imp::Group::Fallback(group) => DelimSpanEnum::Fallback(group.span()),
417ac06127Sopenharmony_ci        };
427ac06127Sopenharmony_ci
437ac06127Sopenharmony_ci        #[cfg(not(wrap_proc_macro))]
447ac06127Sopenharmony_ci        let inner = DelimSpanEnum::Fallback(group.span());
457ac06127Sopenharmony_ci
467ac06127Sopenharmony_ci        DelimSpan {
477ac06127Sopenharmony_ci            inner,
487ac06127Sopenharmony_ci            _marker: Marker,
497ac06127Sopenharmony_ci        }
507ac06127Sopenharmony_ci    }
517ac06127Sopenharmony_ci
527ac06127Sopenharmony_ci    /// Returns a span covering the entire delimited group.
537ac06127Sopenharmony_ci    pub fn join(&self) -> Span {
547ac06127Sopenharmony_ci        match &self.inner {
557ac06127Sopenharmony_ci            #[cfg(wrap_proc_macro)]
567ac06127Sopenharmony_ci            DelimSpanEnum::Compiler { join, .. } => Span::_new(imp::Span::Compiler(*join)),
577ac06127Sopenharmony_ci            DelimSpanEnum::Fallback(span) => Span::_new_fallback(*span),
587ac06127Sopenharmony_ci        }
597ac06127Sopenharmony_ci    }
607ac06127Sopenharmony_ci
617ac06127Sopenharmony_ci    /// Returns a span for the opening punctuation of the group only.
627ac06127Sopenharmony_ci    pub fn open(&self) -> Span {
637ac06127Sopenharmony_ci        match &self.inner {
647ac06127Sopenharmony_ci            #[cfg(wrap_proc_macro)]
657ac06127Sopenharmony_ci            DelimSpanEnum::Compiler { open, .. } => Span::_new(imp::Span::Compiler(*open)),
667ac06127Sopenharmony_ci            DelimSpanEnum::Fallback(span) => Span::_new_fallback(span.first_byte()),
677ac06127Sopenharmony_ci        }
687ac06127Sopenharmony_ci    }
697ac06127Sopenharmony_ci
707ac06127Sopenharmony_ci    /// Returns a span for the closing punctuation of the group only.
717ac06127Sopenharmony_ci    pub fn close(&self) -> Span {
727ac06127Sopenharmony_ci        match &self.inner {
737ac06127Sopenharmony_ci            #[cfg(wrap_proc_macro)]
747ac06127Sopenharmony_ci            DelimSpanEnum::Compiler { close, .. } => Span::_new(imp::Span::Compiler(*close)),
757ac06127Sopenharmony_ci            DelimSpanEnum::Fallback(span) => Span::_new_fallback(span.last_byte()),
767ac06127Sopenharmony_ci        }
777ac06127Sopenharmony_ci    }
787ac06127Sopenharmony_ci}
797ac06127Sopenharmony_ci
807ac06127Sopenharmony_ciimpl Debug for DelimSpan {
817ac06127Sopenharmony_ci    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
827ac06127Sopenharmony_ci        Debug::fmt(&self.join(), f)
837ac06127Sopenharmony_ci    }
847ac06127Sopenharmony_ci}
85