typed-quote 0.1.1

A fully typed quote!() alternative for both proc-macro and proc-macro2
Documentation
/// A [`Span`](crate::Span) or [`NoSpan`].
///
/// _This trait is sealed and has **NO public api.**_
pub trait MaybeSpan: Copy + crate::sealed::MaybeSpan {
    #[doc(hidden)]
    #[cfg(feature = "proc-macro")]
    fn into_span_or_call_site(self) -> proc_macro::Span;
    #[doc(hidden)]
    #[cfg(feature = "proc-macro")]
    fn make_punct(self, punct: proc_macro::Punct) -> proc_macro::Punct;
    /// Only changes span of delimiter
    #[doc(hidden)]
    #[cfg(feature = "proc-macro")]
    fn make_group(self, g: proc_macro::Group) -> proc_macro::Group;
    #[doc(hidden)]
    #[cfg(feature = "proc-macro")]
    fn make_literal(self, literal: proc_macro::Literal) -> proc_macro::Literal;

    #[doc(hidden)]
    #[cfg(feature = "proc-macro2")]
    fn into_span2_or_call_site(self) -> proc_macro2::Span;
    #[doc(hidden)]
    #[cfg(feature = "proc-macro2")]
    fn make_punct2(self, punct: proc_macro2::Punct) -> proc_macro2::Punct;
    /// Only changes span of delimiter
    #[doc(hidden)]
    #[cfg(feature = "proc-macro2")]
    fn make_group2(self, g: proc_macro2::Group) -> proc_macro2::Group;
    #[doc(hidden)]
    #[cfg(feature = "proc-macro2")]
    fn make_literal2(self, literal: proc_macro2::Literal) -> proc_macro2::Literal;

    #[doc(hidden)]
    type Span: crate::Span;
    #[doc(hidden)]
    fn try_into_span(self) -> Option<Self::Span>;

    #[doc(hidden)]
    type WithDefaultSpan<S: crate::Span>: crate::Span;
    #[doc(hidden)]
    fn with_default_span<S: crate::Span>(self, span: S) -> Self::WithDefaultSpan<S>;

    #[doc(hidden)]
    type WithReplacedSpan<S: crate::Span>: crate::Span;
    #[doc(hidden)]
    fn with_replaced_span<S: crate::Span>(self, span: S) -> Self::WithReplacedSpan<S>;
}

#[cfg(feature = "proc-macro")]
impl<S: MaybeSpan> crate::into_st::IntoST<proc_macro::Punct> for (proc_macro::Punct, S) {
    fn into_st(self) -> proc_macro::Punct {
        self.1.make_punct(self.0)
    }
}

#[cfg(feature = "proc-macro2")]
impl<S: MaybeSpan> crate::into_st::IntoST<proc_macro2::Punct> for (proc_macro2::Punct, S) {
    fn into_st(self) -> proc_macro2::Punct {
        self.1.make_punct2(self.0)
    }
}

#[cfg(feature = "proc-macro")]
impl<S: MaybeSpan> crate::into_st::IntoST<proc_macro::Group> for (proc_macro::Group, S) {
    fn into_st(self) -> proc_macro::Group {
        self.1.make_group(self.0)
    }
}

#[cfg(feature = "proc-macro2")]
impl<S: MaybeSpan> crate::into_st::IntoST<proc_macro2::Group> for (proc_macro2::Group, S) {
    fn into_st(self) -> proc_macro2::Group {
        self.1.make_group2(self.0)
    }
}

#[cfg(feature = "proc-macro")]
impl<S: MaybeSpan> crate::into_st::IntoST<proc_macro::Literal> for (proc_macro::Literal, S) {
    fn into_st(self) -> proc_macro::Literal {
        self.1.make_literal(self.0)
    }
}

#[cfg(feature = "proc-macro2")]
impl<S: MaybeSpan> crate::into_st::IntoST<proc_macro2::Literal> for (proc_macro2::Literal, S) {
    fn into_st(self) -> proc_macro2::Literal {
        self.1.make_literal2(self.0)
    }
}

#[derive(Debug, Clone, Copy)]
pub struct NoSpan;

impl crate::sealed::MaybeSpan for NoSpan {}
impl MaybeSpan for NoSpan {
    #[cfg(feature = "proc-macro")]
    fn into_span_or_call_site(self) -> proc_macro::Span {
        proc_macro::Span::call_site()
    }
    #[cfg(feature = "proc-macro")]
    fn make_punct(self, punct: proc_macro::Punct) -> proc_macro::Punct {
        punct
    }
    #[cfg(feature = "proc-macro")]
    fn make_group(self, g: proc_macro::Group) -> proc_macro::Group {
        g
    }
    #[cfg(feature = "proc-macro")]
    fn make_literal(self, literal: proc_macro::Literal) -> proc_macro::Literal {
        literal
    }

    #[cfg(feature = "proc-macro2")]
    fn into_span2_or_call_site(self) -> proc_macro2::Span {
        proc_macro2::Span::call_site()
    }
    #[cfg(feature = "proc-macro2")]
    fn make_punct2(self, punct: proc_macro2::Punct) -> proc_macro2::Punct {
        punct
    }
    #[cfg(feature = "proc-macro2")]
    fn make_group2(self, g: proc_macro2::Group) -> proc_macro2::Group {
        g
    }
    #[cfg(feature = "proc-macro2")]
    fn make_literal2(self, literal: proc_macro2::Literal) -> proc_macro2::Literal {
        literal
    }

    type Span = crate::Never;
    fn try_into_span(self) -> Option<Self::Span> {
        None
    }

    type WithDefaultSpan<S: crate::Span> = S;

    fn with_default_span<S: crate::Span>(self, span: S) -> Self::WithDefaultSpan<S> {
        span
    }

    type WithReplacedSpan<S: crate::Span> = S;

    fn with_replaced_span<S: crate::Span>(self, span: S) -> Self::WithReplacedSpan<S> {
        span
    }
}