struct TranscrCtx<'psess, 'itp> {
psess: &'psess ParseSess,
interp: &'itp FxHashMap<MacroRulesNormalizedIdent, NamedMatch>,
marker: Marker,
stack: SmallVec<[Frame<'itp>; 1]>,
repeats: Vec<(usize, usize)>,
result: Vec<TokenTree>,
result_stack: Vec<Vec<TokenTree>>,
}
Expand description
Context needed to perform transcription of metavariable expressions.
Fields§
§psess: &'psess ParseSess
§interp: &'itp FxHashMap<MacroRulesNormalizedIdent, NamedMatch>
Map from metavars to matched tokens
marker: Marker
Allow marking spans.
stack: SmallVec<[Frame<'itp>; 1]>
The stack of things yet to be completely expanded.
We descend into the RHS (src
), expanding things as we go. This stack contains the things
we have yet to expand/are still expanding. We start the stack off with the whole RHS. The
choice of spacing values doesn’t matter.
repeats: Vec<(usize, usize)>
A stack of where we are in the repeat expansion.
As we descend in the RHS, we will need to be able to match nested sequences of matchers.
repeats
keeps track of where we are in matching at each level, with the last element
being the most deeply nested sequence. This is used as a stack.
result: Vec<TokenTree>
The resulting token stream from the TokenTree
we just finished processing.
At the end, this will contain the full result of transcription, but at arbitrary points
during transcribe
, result
will contain subsets of the final result.
Specifically, as we descend into each TokenTree, we will push the existing results onto the
result_stack
and clear results
. We will then produce the results of transcribing the
TokenTree into results
. Then, as we unwind back out of the TokenTree
, we will pop the
result_stack
and append results
too it to produce the new results
up to that point.
Thus, if we try to pop the result_stack
and it is empty, we have reached the top-level
again, and we are done transcribing.
result_stack: Vec<Vec<TokenTree>>
The in-progress result
lives at the top of this stack. Each entered TokenTree
adds a
new entry.
Implementations§
Source§impl<'psess> TranscrCtx<'psess, '_>
impl<'psess> TranscrCtx<'psess, '_>
Sourcefn visited_dspan(&mut self, dspan: DelimSpan) -> Span
fn visited_dspan(&mut self, dspan: DelimSpan) -> Span
Span marked with the correct expansion and transparency.
Auto Trait Implementations§
impl<'psess, 'itp> DynSend for TranscrCtx<'psess, 'itp>
impl<'psess, 'itp> DynSync for TranscrCtx<'psess, 'itp>
impl<'psess, 'itp> Freeze for TranscrCtx<'psess, 'itp>
impl<'psess, 'itp> !RefUnwindSafe for TranscrCtx<'psess, 'itp>
impl<'psess, 'itp> !Send for TranscrCtx<'psess, 'itp>
impl<'psess, 'itp> !Sync for TranscrCtx<'psess, 'itp>
impl<'psess, 'itp> Unpin for TranscrCtx<'psess, 'itp>
impl<'psess, 'itp> !UnwindSafe for TranscrCtx<'psess, 'itp>
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
Source§impl<T, R> CollectAndApply<T, R> for T
impl<T, R> CollectAndApply<T, R> for T
Source§impl<T> Filterable for T
impl<T> Filterable for T
Source§fn filterable(
self,
filter_name: &'static str,
) -> RequestFilterDataProvider<T, fn(DataRequest<'_>) -> bool>
fn filterable( self, filter_name: &'static str, ) -> RequestFilterDataProvider<T, fn(DataRequest<'_>) -> bool>
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
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>
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>
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 moreSource§impl<T> Pointable for T
impl<T> Pointable for T
Source§impl<I, T, U> Upcast<I, U> for Twhere
U: UpcastFrom<I, T>,
impl<I, T, U> Upcast<I, U> for Twhere
U: UpcastFrom<I, T>,
Source§impl<I, T> UpcastFrom<I, T> for T
impl<I, T> UpcastFrom<I, T> for T
fn upcast_from(from: T, _tcx: I) -> T
Source§impl<T> WithSubscriber for T
impl<T> WithSubscriber for T
Source§fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
Source§fn with_current_subscriber(self) -> WithDispatch<Self>
fn with_current_subscriber(self) -> WithDispatch<Self>
impl<T> ErasedDestructor for Twhere
T: 'static,
Layout§
Note: Most layout information is completely unstable and may even differ between compilations. The only exception is types with certain repr(...)
attributes. Please see the Rust Reference's “Type Layout” chapter for details on type layout guarantees.
Size: 192 bytes