pub struct ExpnData {
pub kind: ExpnKind,
pub parent: ExpnId,
pub call_site: Span,
disambiguator: u32,
pub def_site: Span,
pub allow_internal_unstable: Option<Lrc<[Symbol]>>,
pub edition: Edition,
pub macro_def_id: Option<DefId>,
pub parent_module: Option<DefId>,
pub(crate) allow_internal_unsafe: bool,
pub local_inner_macros: bool,
pub(crate) collapse_debuginfo: bool,
}
Expand description
A subset of properties from both macro definition and macro call available through global data. Avoid using this if you have access to the original definition or call structures.
Fields§
§kind: ExpnKind
The kind of this expansion - macro or compiler desugaring.
parent: ExpnId
The expansion that produced this expansion.
call_site: Span
The location of the actual macro invocation or syntax sugar , e.g.
let x = foo!();
or if let Some(y) = x {}
This may recursively refer to other macro invocations, e.g., if
foo!()
invoked bar!()
internally, and there was an
expression inside bar!
; the call_site of the expression in
the expansion would point to the bar!
invocation; that
call_site span would have its own ExpnData, with the call_site
pointing to the foo!
invocation.
disambiguator: u32
Used to force two ExpnData
s to have different Fingerprint
s.
Due to macro expansion, it’s possible to end up with two ExpnId
s
that have identical ExpnData
s. This violates the contract of HashStable
- the two
ExpnId
s are not equal, but theirFingerprint
s are equal (since the numericalExpnId
value is not considered by theHashStable
implementation).
The disambiguator
field is set by update_disambiguator
when two distinct
ExpnId
s would end up with the same Fingerprint
. Since ExpnData
includes
a krate
field, this value only needs to be unique within a single crate.
def_site: Span
The span of the macro definition (possibly dummy). This span serves only informational purpose and is not used for resolution.
allow_internal_unstable: Option<Lrc<[Symbol]>>
List of #[unstable]
/feature-gated features that the macro is allowed to use
internally without forcing the whole crate to opt-in
to them.
edition: Edition
Edition of the crate in which the macro is defined.
macro_def_id: Option<DefId>
The DefId
of the macro being invoked,
if this ExpnData
corresponds to a macro invocation
parent_module: Option<DefId>
The normal module (mod
) in which the expanded macro was defined.
allow_internal_unsafe: bool
Suppresses the unsafe_code
lint for code produced by this macro.
local_inner_macros: bool
Enables the macro helper hack (ident!(...)
-> $crate::ident!(...)
) for this macro.
collapse_debuginfo: bool
Should debuginfo for the macro be collapsed to the outermost expansion site (in other
words, was the macro definition annotated with #[collapse_debuginfo]
)?
Implementations§
source§impl ExpnData
impl ExpnData
pub fn new( kind: ExpnKind, parent: ExpnId, call_site: Span, def_site: Span, allow_internal_unstable: Option<Lrc<[Symbol]>>, edition: Edition, macro_def_id: Option<DefId>, parent_module: Option<DefId>, allow_internal_unsafe: bool, local_inner_macros: bool, collapse_debuginfo: bool, ) -> ExpnData
sourcepub fn default(
kind: ExpnKind,
call_site: Span,
edition: Edition,
macro_def_id: Option<DefId>,
parent_module: Option<DefId>,
) -> ExpnData
pub fn default( kind: ExpnKind, call_site: Span, edition: Edition, macro_def_id: Option<DefId>, parent_module: Option<DefId>, ) -> ExpnData
Constructs expansion data with default properties.
pub fn allow_unstable( kind: ExpnKind, call_site: Span, edition: Edition, allow_internal_unstable: Lrc<[Symbol]>, macro_def_id: Option<DefId>, parent_module: Option<DefId>, ) -> ExpnData
pub fn is_root(&self) -> bool
fn hash_expn(&self, ctx: &mut impl HashStableContext) -> Hash64
Trait Implementations§
source§impl<__D: SpanDecoder> Decodable<__D> for ExpnData
impl<__D: SpanDecoder> Decodable<__D> for ExpnData
source§impl<__E: SpanEncoder> Encodable<__E> for ExpnData
impl<__E: SpanEncoder> Encodable<__E> for ExpnData
source§impl<__CTX> HashStable<__CTX> for ExpnDatawhere
__CTX: HashStableContext,
impl<__CTX> HashStable<__CTX> for ExpnDatawhere
__CTX: HashStableContext,
fn hash_stable(&self, __hcx: &mut __CTX, __hasher: &mut StableHasher)
impl !Hash for ExpnData
impl !PartialEq for ExpnData
Auto Trait Implementations§
impl Freeze for ExpnData
impl RefUnwindSafe for ExpnData
impl !Send for ExpnData
impl !Sync for ExpnData
impl Unpin for ExpnData
impl UnwindSafe for ExpnData
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§unsafe fn clone_to_uninit(&self, dst: *mut T)
unsafe fn clone_to_uninit(&self, dst: *mut T)
clone_to_uninit
)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> 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<'a, T> Captures<'a> for Twhere
T: ?Sized,
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: 72 bytes