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: ErrorAccumulatorImplementations§
Source§impl Accumulator
impl Accumulator
pub fn finish_literal(self) -> Result<LitStr>
pub fn finish_onto<O>(self, np: &O::NotInPaste, out: &mut O)where
O: ExpansionOutput,
fn append_display(&mut self, span: Span, plain: impl Display + Spanned)
Sourcefn append_type_like(&mut self, tokens: TokenStream)
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
impl Debug for Accumulator
Source§impl Expand<Accumulator> for TemplateElement<Accumulator>
impl Expand<Accumulator> for TemplateElement<Accumulator>
fn expand<'c>( &self, ctx: GeneralContext<'c>, out: &mut Accumulator, ) -> Result<()>
Source§impl ExpansionOutput for Accumulator
impl ExpansionOutput for Accumulator
Source§fn append_identfrag_toks<I: IdentFrag>(
&mut self,
ident: &I,
) -> Result<(), I::BadIdent>
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>
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)
fn append_syn_litstr(&mut self, lit: &LitStr)
Append a
syn::LitStr Read moreSource§fn append_syn_type_inner(
&mut self,
_te_span: Span,
ty: Type,
_grouping: Grouping,
)
fn append_syn_type_inner( &mut self, _te_span: Span, ty: Type, _grouping: Grouping, )
Append a
syn::Type, which has been grouping-normalisedSource§fn dbg_expand<'c>(
&mut self,
kw_span: Span,
ctx: GeneralContext<'c>,
msg: &mut String,
content: &Template<Accumulator>,
) -> Result
fn dbg_expand<'c>( &mut self, kw_span: Span, ctx: GeneralContext<'c>, msg: &mut String, content: &Template<Accumulator>, ) -> Result
Implement the
dbg keyword Read moreSource§fn new_with_span(kw_span: Span) -> Self
fn new_with_span(kw_span: Span) -> Self
Make a new empty expansion output, introduced at
kw_span Read moreSource§fn append_tokens_with(
&mut self,
(_not_in_paste, not_in_concat): &((), Void),
_: impl FnOnce(&mut TokenAccumulator) -> Result<()>,
) -> Result<()>
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) -> !
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)
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)
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<()>
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 morefn default_subst_meta_as(kw: Span) -> Result<SubstAs<Self>>
Source§impl SubstParseContext for Accumulator
impl SubstParseContext for Accumulator
Source§type NotInPaste = ()
type NotInPaste = ()
Uninhabited iff this lexical context is within
${paste }Source§type NotInConcat = Void
type NotInConcat = Void
Uninhabited iff this lexical context is within
${concat }Source§type ConcatOnly = ()
type ConcatOnly = ()
Uninhabited unless this lexical context is within
${concat }Source§type DbgContent = Template<Accumulator>
type DbgContent = Template<Accumulator>
Content of the
dbg keyword Read moreSource§type SpecialParseContext = ()
type SpecialParseContext = ()
For communicating through
parse_special Read morefn not_in_paste(_: &impl Spanned) -> Result<()>
fn not_in_concat(span: &impl Spanned) -> Result<Void>
fn not_in_bool(_: &impl Spanned) -> Result<()>
fn concat_only(_: &impl Spanned) -> Result<()>
fn bool_only(span: &impl Spanned) -> Result<Self::BoolOnly>
Source§fn meta_recog_usage(m: &SubstMeta<Self>) -> UsageInfo<IsUsed>
fn meta_recog_usage(m: &SubstMeta<Self>) -> UsageInfo<IsUsed>
When we find a
fmeta etc. in this context, does it allow a value? Read moreSource§fn parse_maybe_within_parens<T>(
input: ParseStream<'_>,
f: impl FnOnce(ParseStream<'_>) -> Result<T>,
) -> Result<T>
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 moreSource§fn parse_maybe_comma(input: ParseStream<'_>) -> Result<()>
fn parse_maybe_comma(input: ParseStream<'_>) -> Result<()>
Parse maybe a comma (comma in boolean contegxt, not otherwise) Read more
Auto Trait Implementations§
impl Freeze for Accumulator
impl RefUnwindSafe for Accumulator
impl !Send for Accumulator
impl !Sync for Accumulator
impl Unpin for Accumulator
impl UnwindSafe for Accumulator
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
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 moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
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