Accumulator

Struct Accumulator 

Source
pub struct Accumulator {
    def_span: Span,
    out_span: Option<Span>,
    text: String,
    errors: ErrorAccumulator,
}
Expand description

Accumulator for string concatenation ${concat }

Implements ExpansionOutput and SubstParseContext: i.e., it corresponds to the lexical context for a ${concat }, and collects the string to be output.

Fields§

§def_span: Span§out_span: Option<Span>§text: String§errors: ErrorAccumulator

Implementations§

Source§

impl Accumulator

Source

pub fn finish_literal(self) -> Result<LitStr>

Source

pub fn finish_onto<O>(self, np: &O::NotInPaste, out: &mut O)
where O: ExpansionOutput,

Source

fn append_display(&mut self, span: Span, plain: impl Display + Spanned)

Source

fn append_type_like(&mut self, tokens: TokenStream)

Convert a type to a “nice” string

syn::Type as ToTokens produces a lot of Spacing::Alone which results in a lot of excessive whitespace.

We use an algorithm which prints something reasonably pretty which we also think is probably parseable unless there None-delimited groups (which we make visible).

Note that our documentation doesn’t promise parseability, just readability.

This algorithm does obviously produce parseable output if the input is just a single identifier token.

§Rules
  • We never put spaces next to any of <>:
  • We don’t put a space after & or '
  • We don’t put a space before ,
  • We put spaces just inside { } iff nonempty
  • We don’t put spaces just inside ( ) or [ ] (or « »)
  • Otherwise, we put a space between each pair of TTs

Trait Implementations§

Source§

impl Debug for Accumulator

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Expand<Accumulator> for TemplateElement<Accumulator>

Source§

fn expand<'c>( &self, ctx: GeneralContext<'c>, out: &mut Accumulator, ) -> Result<()>

Source§

impl ExpansionOutput for Accumulator

Source§

fn append_identfrag_toks<I: IdentFrag>( &mut self, ident: &I, ) -> Result<(), I::BadIdent>

An identifier (or fragment of one) Read more
Source§

fn append_idpath<A, B, I>( &mut self, _te_span: Span, pre: A, ident: &I, post: B, _grouping: Grouping, ) -> Result<(), I::BadIdent>

Append a Rust path (scoped identifier, perhaps with generics) Read more
Source§

fn append_syn_litstr(&mut self, lit: &LitStr)

Source§

fn append_syn_type(&mut self, te_span: Span, v: Type, grouping: Grouping)

Source§

fn append_syn_type_inner( &mut self, _te_span: Span, ty: Type, _grouping: Grouping, )

Append a syn::Type, which has been grouping-normalised
Source§

fn dbg_expand<'c>( &mut self, kw_span: Span, ctx: GeneralContext<'c>, msg: &mut String, content: &Template<Accumulator>, ) -> Result

Implement the dbg keyword Read more
Source§

fn new_with_span(kw_span: Span) -> Self

Make a new empty expansion output, introduced at kw_span Read more
Source§

fn ignore_impl(self) -> Result<()>

Implement the core of the ignore keyword Read more
Source§

fn append_tokens_with( &mut self, (_not_in_paste, not_in_concat): &((), Void), _: impl FnOnce(&mut TokenAccumulator) -> Result<()>, ) -> Result<()>

Append using a function which generates tokens Read more
Source§

fn append_bool_only(&mut self, bool_only: &Self::BoolOnly) -> !

“Append” a substitution which can only be used within a boolean Read more
Source§

fn record_error(&mut self, err: Error)

Note that an error occurred Read more
Source§

fn write_error<S: Spanned, M: Display>(&mut self, span: &S, message: M)

Convenience method for noting an error with span and message
Source§

fn append_tokens( &mut self, allow_tokens: &(<Self as SubstParseContext>::NotInPaste, <Self as SubstParseContext>::NotInConcat), tokens: impl ToTokens, ) -> Result<()>

Convenience method for writing a ToTokens Read more
Source§

fn default_subst_meta_as(kw: Span) -> Result<SubstAs<Self>>

Source§

impl SubstParseContext for Accumulator

Source§

type NotInPaste = ()

Uninhabited iff this lexical context is within ${paste }
Source§

type NotInConcat = Void

Uninhabited iff this lexical context is within ${concat }
Source§

type NotInBool = ()

Uninhabited iff this lexical context is within a condition.
Source§

type BoolOnly = Void

Uninhabited unless this lexical context is within a condition.
Source§

type ConcatOnly = ()

Uninhabited unless this lexical context is within ${concat }
Source§

type DbgContent = Template<Accumulator>

Content of the dbg keyword Read more
Source§

type SpecialParseContext = ()

For communicating through parse_special Read more
Source§

fn not_in_paste(_: &impl Spanned) -> Result<()>

Source§

fn not_in_concat(span: &impl Spanned) -> Result<Void>

Source§

fn not_in_bool(_: &impl Spanned) -> Result<()>

Source§

fn concat_only(_: &impl Spanned) -> Result<()>

Source§

const IS_BOOL: bool = false

Whether this is a boolean context
Source§

fn bool_only(span: &impl Spanned) -> Result<Self::BoolOnly>

Source§

fn meta_recog_usage(m: &SubstMeta<Self>) -> UsageInfo<IsUsed>

When we find a fmeta etc. in this context, does it allow a value? Read more
Source§

fn parse_maybe_within_parens<T>( input: ParseStream<'_>, f: impl FnOnce(ParseStream<'_>) -> Result<T>, ) -> Result<T>

Parse using f, within parens in boolean context, not otherwise Read more
Source§

fn parse_maybe_comma(input: ParseStream<'_>) -> Result<()>

Parse maybe a comma (comma in boolean contegxt, not otherwise) Read more
Source§

fn missing_keyword_arguments(kw_span: Span) -> Result<Void>

Return an error suitable for reporting missing arguments Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.