pub struct SyntaxContext {
private_use_as_methods_instead: u32 is 0..=536870911,
}Expand description
A SyntaxContext represents a chain of pairs (ExpnId, Transparency) named “marks”.
See https://rustc-dev-guide.rust-lang.org/macro-expansion.html for more explanation.
Fields§
§private_use_as_methods_instead: u32 is 0..=536870911Implementations§
Source§impl SyntaxContext
impl SyntaxContext
Sourcepub const MAX_AS_U32: u32 = 0x1FFF_FFFF
pub const MAX_AS_U32: u32 = 0x1FFF_FFFF
Maximum value the index can take, as a u32.
Sourcepub const fn from_usize(value: usize) -> Self
pub const fn from_usize(value: usize) -> Self
Sourcepub const unsafe fn from_u32_unchecked(value: u32) -> Self
pub const unsafe fn from_u32_unchecked(value: u32) -> Self
Creates a new index from a given u32.
§Safety
The provided value must be less than or equal to the maximum value for the newtype. Providing a value outside this range is undefined due to layout restrictions.
Prefer using from_u32.
Source§impl SyntaxContext
impl SyntaxContext
pub const fn root() -> SyntaxContext
pub const fn is_root(self) -> bool
Sourcepub fn apply_mark(
self,
expn_id: ExpnId,
transparency: Transparency,
) -> SyntaxContext
pub fn apply_mark( self, expn_id: ExpnId, transparency: Transparency, ) -> SyntaxContext
Extend a syntax context with a given expansion and transparency.
Sourcepub fn remove_mark(&mut self) -> ExpnId
pub fn remove_mark(&mut self) -> ExpnId
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.
pub fn marks(self) -> Vec<(ExpnId, Transparency)>
Sourcepub fn adjust(&mut self, expn_id: ExpnId) -> Option<ExpnId>
pub fn adjust(&mut self, expn_id: ExpnId) -> Option<ExpnId>
Adjust this context for resolution in a scope created by the given expansion.
For example, consider the following three resolutions of f:
#![feature(decl_macro)]
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).
Sourcepub fn normalize_to_macros_2_0_and_adjust(
&mut self,
expn_id: ExpnId,
) -> Option<ExpnId>
pub fn normalize_to_macros_2_0_and_adjust( &mut self, expn_id: ExpnId, ) -> Option<ExpnId>
Like SyntaxContext::adjust, but also normalizes self to macros 2.0.
Sourcepub fn glob_adjust(
&mut self,
expn_id: ExpnId,
glob_span: Span,
) -> Option<Option<ExpnId>>
pub fn glob_adjust( &mut self, expn_id: ExpnId, glob_span: Span, ) -> Option<Option<ExpnId>>
Adjust this context for resolution in a scope created by the given expansion
via a glob import with the given SyntaxContext.
For example:
#![feature(decl_macro)]
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).
Sourcepub fn reverse_glob_adjust(
&mut self,
expn_id: ExpnId,
glob_span: Span,
) -> Option<Option<ExpnId>>
pub fn reverse_glob_adjust( &mut self, expn_id: ExpnId, glob_span: Span, ) -> Option<Option<ExpnId>>
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));
}pub fn hygienic_eq(self, other: SyntaxContext, expn_id: ExpnId) -> bool
pub fn normalize_to_macros_2_0(self) -> SyntaxContext
pub fn normalize_to_macro_rules(self) -> SyntaxContext
Sourcepub fn outer_expn(self) -> ExpnId
pub fn outer_expn(self) -> ExpnId
Sourcepub fn outer_expn_data(self) -> ExpnData
pub fn outer_expn_data(self) -> ExpnData
ctxt.outer_expn_data() is equivalent to but faster than
ctxt.outer_expn().expn_data().
pub(crate) fn dollar_crate_name(self) -> Symbol
pub fn edition(self) -> Edition
Sourcepub fn in_external_macro(self, sm: &SourceMap) -> bool
pub fn in_external_macro(self, sm: &SourceMap) -> bool
Returns whether this context originates in a foreign crate’s external macro.
This is used to test whether a lint should not even begin to figure out whether it should be reported on the current node.
Source§impl SyntaxContext
impl SyntaxContext
fn stable_hash_internal( self, data: Option<&HygieneData>, hcx: &mut impl StableHashCtxt, hasher: &mut StableHasher, )
Trait Implementations§
impl !Ord for SyntaxContext
impl !PartialOrd for SyntaxContext
Source§impl Add<usize> for SyntaxContext
impl Add<usize> for SyntaxContext
Source§impl AddAssign<usize> for SyntaxContext
impl AddAssign<usize> for SyntaxContext
Source§fn add_assign(&mut self, other: usize)
fn add_assign(&mut self, other: usize)
+= operation. Read moreSource§impl Clone for SyntaxContext
impl Clone for SyntaxContext
impl Copy for SyntaxContext
Source§impl Debug for SyntaxContext
impl Debug for SyntaxContext
Source§impl<D: SpanDecoder> Decodable<D> for SyntaxContext
impl<D: SpanDecoder> Decodable<D> for SyntaxContext
fn decode(s: &mut D) -> SyntaxContext
Source§impl Default for SyntaxContext
impl Default for SyntaxContext
Source§impl<E: SpanEncoder> Encodable<E> for SyntaxContext
impl<E: SpanEncoder> Encodable<E> for SyntaxContext
impl Eq for SyntaxContext
Source§impl From<SyntaxContext> for u32
impl From<SyntaxContext> for u32
Source§fn from(v: SyntaxContext) -> u32
fn from(v: SyntaxContext) -> u32
Source§impl From<SyntaxContext> for usize
impl From<SyntaxContext> for usize
Source§fn from(v: SyntaxContext) -> usize
fn from(v: SyntaxContext) -> usize
Source§impl From<u32> for SyntaxContext
impl From<u32> for SyntaxContext
Source§impl From<usize> for SyntaxContext
impl From<usize> for SyntaxContext
Source§impl Hash for SyntaxContext
impl Hash for SyntaxContext
Source§impl HygieneRemapper<SyntaxContext> for SyntaxContextRemapper<'_>
impl HygieneRemapper<SyntaxContext> for SyntaxContextRemapper<'_>
fn len(&self) -> usize
fn first_non_det_index_mut(&mut self) -> &mut Option<SyntaxContext>
fn first_non_det_index(&self) -> u32
fn stable_hash( &self, ctxt: SyntaxContext, hcx: &mut impl StableHashCtxt, hasher: &mut StableHasher, )
fn commit_end_of_determinism(&mut self)
fn remapping_results<TRemappedKey>( &self, hcx: &mut impl StableHashCtxt, ) -> HygieneRemappingResults<T, TRemappedKey>
Source§impl Idx for SyntaxContext
impl Idx for SyntaxContext
Source§impl PartialEq for SyntaxContext
impl PartialEq for SyntaxContext
Source§impl StableHash for SyntaxContext
impl StableHash for SyntaxContext
fn stable_hash<Hcx: StableHashCtxt>( &self, hcx: &mut Hcx, hasher: &mut StableHasher, )
impl StructuralPartialEq for SyntaxContext
Auto Trait Implementations§
impl DynSend for SyntaxContext
impl DynSync for SyntaxContext
impl Freeze for SyntaxContext
impl RefUnwindSafe for SyntaxContext
impl Send for SyntaxContext
impl Sync for SyntaxContext
impl Unpin for SyntaxContext
impl UnsafeUnpin for SyntaxContext
impl UnwindSafe for SyntaxContext
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> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key and return true if they are equal.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<I, T> IntoSliceIdx<I, [T]> for Iwhere
I: Idx,
impl<I, T> IntoSliceIdx<I, [T]> for Iwhere
I: Idx,
type Output = usize
fn into_slice_idx(self) -> <I as IntoSliceIdx<I, [T]>>::Output
Source§impl<T> Pointable for T
impl<T> Pointable for 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> ⓘ
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: 4 bytes