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 allow_internal_unsafe: bool,
    pub local_inner_macros: bool,
    pub 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 ExpnDatas to have different Fingerprints. Due to macro expansion, it’s possible to end up with two ExpnIds that have identical ExpnDatas. This violates the contract of HashStable

  • the two ExpnIds are not equal, but their Fingerprints are equal (since the numerical ExpnId value is not considered by the HashStable implementation).

The disambiguator field is set by update_disambiguator when two distinct ExpnIds 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

Constructs expansion data with default properties.

Trait Implementations

Returns a copy of the value. Read more
Performs copy-assignment from source. Read more
Formats the value using the given formatter. Read more
Feeds this value into the given Hasher. Read more
Feeds a slice of this type into the given Hasher. Read more
This method tests for self and other values to be equal, and is used by ==. Read more
This method tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason. Read more

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more
Immutably borrows from an owned value. Read more
Mutably borrows from an owned value. Read more

Returns the argument unchanged.

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

The resulting type after obtaining ownership.
Creates owned data from borrowed data, usually by cloning. Read more
Uses borrowed data to replace owned data, usually by cloning. Read more
The type returned in the event of a conversion error.
Performs the conversion.
The type returned in the event of a conversion error.
Performs the conversion.

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