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