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: MarkerAllow 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