Struct rustc_ap_rustc_span::hygiene::SyntaxContext [−][src]
pub struct SyntaxContext(_);
Expand description
A SyntaxContext represents a chain of pairs (ExpnId, Transparency) named “marks”.
Implementations
Pulls a single mark off of the syntax context. This effectively moves the context up one macro definition level. That is, if we have a nested macro definition as follows:
macro_rules! f { macro_rules! g { ... } }
and we have a SyntaxContext that is referring to something declared by an invocation of g (call it g1), calling remove_mark will result in the SyntaxContext for the invocation of f that created g1. Returns the mark that was removed.
Adjust this context for resolution in a scope created by the given expansion.
For example, consider the following three resolutions of f:
mod foo { pub fn f() {} } // `f`'s `SyntaxContext` is empty. m!(f); macro m($f:ident) { mod bar { pub fn f() {} // `f`'s `SyntaxContext` has a single `ExpnId` from `m`. pub fn $f() {} // `$f`'s `SyntaxContext` is empty. } foo::f(); // `f`'s `SyntaxContext` has a single `ExpnId` from `m` //^ Since `mod foo` is outside this expansion, `adjust` removes the mark from `f`, //| and it resolves to `::foo::f`. bar::f(); // `f`'s `SyntaxContext` has a single `ExpnId` from `m` //^ Since `mod bar` not outside this expansion, `adjust` does not change `f`, //| and it resolves to `::bar::f`. bar::$f(); // `f`'s `SyntaxContext` is empty. //^ Since `mod bar` is not outside this expansion, `adjust` does not change `$f`, //| and it resolves to `::bar::$f`. }
This returns the expansion whose definition scope we use to privacy check the resolution,
or None if we privacy check as usual (i.e., not w.r.t. a macro definition scope).
Like SyntaxContext::adjust, but also normalizes self to macros 2.0.
Adjust this context for resolution in a scope created by the given expansion
via a glob import with the given SyntaxContext.
For example:
m!(f); macro m($i:ident) { mod foo { pub fn f() {} // `f`'s `SyntaxContext` has a single `ExpnId` from `m`. pub fn $i() {} // `$i`'s `SyntaxContext` is empty. } n(f); macro n($j:ident) { use foo::*; f(); // `f`'s `SyntaxContext` has a mark from `m` and a mark from `n` //^ `glob_adjust` removes the mark from `n`, so this resolves to `foo::f`. $i(); // `$i`'s `SyntaxContext` has a mark from `n` //^ `glob_adjust` removes the mark from `n`, so this resolves to `foo::$i`. $j(); // `$j`'s `SyntaxContext` has a mark from `m` //^ This cannot be glob-adjusted, so this is a resolution error. } }
This returns None if the context cannot be glob-adjusted.
Otherwise, it returns the scope to use when privacy checking (see adjust for details).
Undo glob_adjust if possible:
if let Some(privacy_checking_scope) = self.reverse_glob_adjust(expansion, glob_ctxt) { assert!(self.glob_adjust(expansion, glob_ctxt) == Some(privacy_checking_scope)); }
ctxt.outer_expn_data() is equivalent to but faster than
ctxt.outer_expn().expn_data().
Trait Implementations
This method tests for self and other values to be equal, and is used
by ==. Read more
This method tests for !=.
This method returns an ordering between self and other values if one exists. Read more
This method tests less than (for self and other) and is used by the < operator. Read more
This method tests less than or equal to (for self and other) and is used by the <=
operator. Read more
This method tests greater than (for self and other) and is used by the > operator. Read more
Auto Trait Implementations
impl RefUnwindSafe for SyntaxContextimpl Send for SyntaxContextimpl Sync for SyntaxContextimpl Unpin for SyntaxContextimpl UnwindSafe for SyntaxContextBlanket Implementations
Mutably borrows from an owned value. Read more
Compare self to key and return true if they are equal.
Instruments this type with the provided Span, returning an
Instrumented wrapper. Read more
type Output = T
type Output = TShould always be Self
pub fn vzip(self) -> V