Skip to main content

## CrateMetadata

# Struct CrateMetadata

Source

    pub(crate) struct CrateMetadata {Show 19 fields
        blob: MetadataBlob,
        root: CrateRoot,
        trait_impls: FxIndexMap<(u32, DefIndex), LazyArray<(DefIndex, Option<SimplifiedType>)>>,
        incoherent_impls: FxIndexMap<SimplifiedType, LazyArray<DefIndex>>,
        raw_proc_macros: Option<&'static [Client]>,
        source_map_import_info: Lock<Vec<Option<ImportedSourceFile>>>,
        def_path_hash_map: DefPathHashMapRef<'static>,
        expn_hash_map: OnceLock<UnhashMap<ExpnHash, ExpnIndex>>,
        alloc_decoding_state: AllocDecodingState,
        def_key_cache: Lock<FxHashMap<DefIndex, DefKey>>,
        cnum: CrateNum,
        cnum_map: IndexVec<CrateNum, CrateNum>,
        dep_kind: CrateDepKind,
        source: Arc<CrateSource>,
        private_dep: bool,
        host_hash: Option<Svh>,
        used: bool,
        hygiene_context: HygieneDecodeContext,
        extern_crate: Option<ExternCrate>,
    }

## Fields§

§`blob: MetadataBlob`

The primary crate data - binary metadata blob.

§`root: CrateRoot`

Data about the top-level items in a crate, as well as various crate-level metadata.

§`trait_impls: FxIndexMap<(u32, DefIndex), LazyArray<(DefIndex, Option<SimplifiedType>)>>`

Trait impl data. FIXME: Used only from queries and can use query cache, so pre-decoding can probably be avoided.

§`incoherent_impls: FxIndexMap<SimplifiedType, LazyArray<DefIndex>>`

Inherent impls which do not follow the normal coherence rules.

These can be introduced using either `#![rustc_coherence_is_core]` or `#[rustc_allow_incoherent_impl]`.

§`raw_proc_macros: Option<&'static [Client]>`

Proc macro function pointers for this crate, if it’s a proc macro crate.

§`source_map_import_info: Lock<Vec<Option<ImportedSourceFile>>>`

Source maps for code from the crate.

§`def_path_hash_map: DefPathHashMapRef<'static>`

For every definition in this crate, maps its `DefPathHash` to its `DefIndex`.

§`expn_hash_map: OnceLock<UnhashMap<ExpnHash, ExpnIndex>>`

Likewise for ExpnHash.

§`alloc_decoding_state: AllocDecodingState`

Used for decoding interpret::AllocIds in a cached & thread-safe manner.

§`def_key_cache: Lock<FxHashMap<DefIndex, DefKey>>`

Caches decoded `DefKey`s.

§`cnum: CrateNum`

ID of this crate, from the current compilation session’s point of view.

§`cnum_map: IndexVec<CrateNum, CrateNum>`

Maps crate IDs as they are were seen from this crate’s compilation sessions into IDs as they are seen from the current compilation session.

§`dep_kind: CrateDepKind`

How to link (or not link) this crate to the currently compiled crate.

§`source: Arc<CrateSource>`

Filesystem location of this crate.

§`private_dep: bool`

Whether or not this crate should be consider a private dependency. Used by the ‘exported_private_dependencies’ lint, and for determining whether to emit suggestions that reference this crate.

§`host_hash: Option<Svh>`

The hash for the host proc macro. Used to support `-Z dual-proc-macro`.

§`used: bool`

The crate was used non-speculatively.

§`hygiene_context: HygieneDecodeContext`

Additional data used for decoding `HygieneData` (e.g. `SyntaxContext` and `ExpnId`). Note that we store a `HygieneDecodeContext` for each `CrateMetadata`. This is because `SyntaxContext` ids are not globally unique, so we need to track which ids we’ve decoded on a per-crate basis.

§`extern_crate: Option<ExternCrate>`

Information about the `extern crate` item or path that caused this crate to be loaded. If this is `None`, then the crate was injected (e.g., by the allocator).

## Implementations§

Source§

### impl CrateMetadata

Source

#### fn missing(&self, descr: &str, id: DefIndex) -> !

Source

#### fn raw_proc_macro( &self, tcx: TyCtxt<'_>, id: DefIndex, ) -> (ProcMacroClient, ProcMacroKind)

Source

#### fn opt_item_name(&self, item_index: DefIndex) -> Option<Symbol>

Source

#### fn item_name(&self, item_index: DefIndex) -> Symbol

Source

#### fn opt_item_ident(&self, tcx: TyCtxt<'_>, item_index: DefIndex) -> Option<Ident>

Source

#### fn item_ident(&self, tcx: TyCtxt<'_>, item_index: DefIndex) -> Ident

Source

#### pub(super) fn map_encoded_cnum_to_current(&self, cnum: CrateNum) -> CrateNum

Source

#### fn def_kind(&self, item_id: DefIndex) -> DefKind

Source

#### fn get_span(&self, tcx: TyCtxt<'_>, index: DefIndex) -> Span

Source

#### fn load_proc_macro<'tcx>( &self, tcx: TyCtxt<'tcx>, id: DefIndex, ) -> SyntaxExtension

Source

#### fn get_variant( &self, tcx: TyCtxt<'_>, kind: DefKind, index: DefIndex, parent_did: DefId, ) -> (VariantIdx, VariantDef)

Source

#### fn get_adt_def<'tcx>( &self, tcx: TyCtxt<'tcx>, item_id: DefIndex, ) -> AdtDef<'tcx>

Source

#### fn get_visibility(&self, tcx: TyCtxt<'_>, id: DefIndex) -> Visibility<DefId>

Source

#### fn get_safety(&self, id: DefIndex) -> Safety

Source

#### fn get_default_field(&self, tcx: TyCtxt<'_>, id: DefIndex) -> Option<DefId>

Source

#### fn get_expn_that_defined(&self, tcx: TyCtxt<'_>, id: DefIndex) -> ExpnId

Source

#### fn get_debugger_visualizers( &self, tcx: TyCtxt<'_>, ) -> Vec<DebuggerVisualizerFile>

Source

#### fn get_lib_features(&self, tcx: TyCtxt<'_>) -> LibFeatures

Iterates over all the stability attributes in the given crate.

Source

#### fn get_stability_implications<'tcx>( &self, tcx: TyCtxt<'tcx>, ) -> &'tcx [(Symbol, Symbol)]

Iterates over the stability implications in the given crate (when a `#[unstable]` attribute has an `implied_by` meta item, then the mapping from the implied feature to the actual feature is a stability implication).

Source

#### fn get_lang_items<'tcx>(&self, tcx: TyCtxt<'tcx>) -> &'tcx [(DefId, LangItem)]

Iterates over the lang items in the given crate.

Source

#### fn get_stripped_cfg_items<'tcx>( &self, tcx: TyCtxt<'tcx>, cnum: CrateNum, ) -> &'tcx [StrippedCfgItem]

Source

#### fn get_diagnostic_items(&self, tcx: TyCtxt<'_>) -> DiagnosticItems

Iterates over the diagnostic items in the given crate.

Source

#### fn get_mod_child(&self, tcx: TyCtxt<'_>, id: DefIndex) -> ModChild

Source

#### fn get_module_children( &self, tcx: TyCtxt<'_>, id: DefIndex, ) -> impl Iterator<Item = ModChild>

Iterates over all named children of the given module, including both proper items and reexports. Module here is understood in name resolution sense - it can be a `mod` item, or a crate root, or an enum, or a trait.

##### §Panics

May panic if the provided `id` does not refer to a module.

Source

#### fn get_ambig_module_children( &self, tcx: TyCtxt<'_>, id: DefIndex, ) -> impl Iterator<Item = AmbigModChild>

Source

#### fn is_item_mir_available(&self, id: DefIndex) -> bool

Source

#### fn get_fn_has_self_parameter(&self, tcx: TyCtxt<'_>, id: DefIndex) -> bool

Source

#### fn get_associated_item_or_field_def_ids( &self, tcx: TyCtxt<'_>, id: DefIndex, ) -> impl Iterator<Item = DefId>

Source

#### fn get_associated_item(&self, tcx: TyCtxt<'_>, id: DefIndex) -> AssocItem

Source

#### fn get_ctor( &self, tcx: TyCtxt<'_>, node_id: DefIndex, ) -> Option<(CtorKind, DefId)>

Source

#### fn get_item_attrs( &self, tcx: TyCtxt<'_>, id: DefIndex, ) -> impl Iterator<Item = Attribute>

Source

#### fn get_inherent_implementations_for_type<'tcx>( &self, tcx: TyCtxt<'tcx>, id: DefIndex, ) -> &'tcx [DefId]

Source

#### fn get_traits(&self, tcx: TyCtxt<'_>) -> impl Iterator<Item = DefId>

Decodes all traits in the crate (for rustdoc and rustc diagnostics).

Source

#### fn get_trait_impls(&self, tcx: TyCtxt<'_>) -> impl Iterator<Item = DefId>

Decodes all trait impls in the crate (for rustdoc).

Source

#### fn get_incoherent_impls<'tcx>( &self, tcx: TyCtxt<'tcx>, simp: SimplifiedType, ) -> &'tcx [DefId]

Source

#### fn get_implementations_of_trait<'tcx>( &self, tcx: TyCtxt<'tcx>, trait_def_id: DefId, ) -> &'tcx [(DefId, Option<SimplifiedType>)]

Source

#### fn get_native_libraries( &self, tcx: TyCtxt<'_>, ) -> impl Iterator<Item = NativeLib>

Source

#### fn get_proc_macro_quoted_span(&self, tcx: TyCtxt<'_>, index: usize) -> Span

Source

#### fn get_foreign_modules( &self, tcx: TyCtxt<'_>, ) -> impl Iterator<Item = ForeignModule>

Source

#### fn get_dylib_dependency_formats<'tcx>( &self, tcx: TyCtxt<'tcx>, ) -> &'tcx [(CrateNum, LinkagePreference)]

Source

#### fn get_externally_implementable_items( &self, tcx: TyCtxt<'_>, ) -> impl Iterator<Item = (DefId, (EiiDecl, Vec<(DefId, EiiImpl)>))>

Source

#### fn get_missing_lang_items<'tcx>(&self, tcx: TyCtxt<'tcx>) -> &'tcx [LangItem]

Source

#### fn get_exportable_items(&self, tcx: TyCtxt<'_>) -> impl Iterator<Item = DefId>

Source

#### fn get_stable_order_of_exportable_impls( &self, tcx: TyCtxt<'_>, ) -> impl Iterator<Item = (DefId, usize)>

Source

#### fn exported_non_generic_symbols<'tcx>( &self, tcx: TyCtxt<'tcx>, ) -> &'tcx [(ExportedSymbol<'tcx>, SymbolExportInfo)]

Source

#### fn exported_generic_symbols<'tcx>( &self, tcx: TyCtxt<'tcx>, ) -> &'tcx [(ExportedSymbol<'tcx>, SymbolExportInfo)]

Source

#### fn get_macro(&self, tcx: TyCtxt<'_>, id: DefIndex) -> MacroDef

Source

#### fn def_key(&self, index: DefIndex) -> DefKey

Source

#### fn def_path(&self, id: DefIndex) -> DefPath

Source

#### fn def_path_hash(&self, index: DefIndex) -> DefPathHash

Source

#### fn def_path_hash_to_def_index(&self, hash: DefPathHash) -> Option<DefIndex>

Source

#### fn expn_hash_to_expn_id( &self, tcx: TyCtxt<'_>, index_guess: u32, hash: ExpnHash, ) -> ExpnId

Source

#### fn imported_source_file( &self, tcx: TyCtxt<'_>, source_file_index: u32, ) -> ImportedSourceFile

Imports the source_map from an external crate into the source_map of the crate currently being compiled (the “local crate”).

The import algorithm works analogous to how AST items are inlined from an external crate’s metadata: For every SourceFile in the external source_map an ‘inline’ copy is created in the local source_map. The correspondence relation between external and local SourceFiles is recorded in the `ImportedSourceFile` objects returned from this function. When an item from an external crate is later inlined into this crate, this correspondence information is used to translate the span information of the inlined item so that it refers the correct positions in the local source_map (see `<decoder::DecodeContext as SpecializedDecoder<Span>>`).

The import algorithm in the function below will reuse SourceFiles already existing in the local source_map. For example, even if the SourceFile of some source file of libstd gets imported many times, there will only ever be one SourceFile object for the corresponding file in the local source_map.

Note that imported SourceFiles do not actually contain the source code of the file they represent, just information about length, line breaks, and multibyte characters. This information is enough to generate valid debuginfo for items inlined from other crates.

Proc macro crates don’t currently export spans, so this function does not have to work for them.

Source

#### fn get_attr_flags(&self, index: DefIndex) -> AttrFlags

Source

#### fn get_intrinsic( &self, tcx: TyCtxt<'_>, index: DefIndex, ) -> Option<IntrinsicDef>

Source

#### fn get_doc_link_resolutions( &self, tcx: TyCtxt<'_>, index: DefIndex, ) -> DocLinkResMap

Source

#### fn get_doc_link_traits_in_scope( &self, tcx: TyCtxt<'_>, index: DefIndex, ) -> impl Iterator<Item = DefId>

Source§

### impl CrateMetadata

Source

#### pub(crate) fn new( tcx: TyCtxt<'_>, blob: MetadataBlob, root: CrateRoot, raw_proc_macros: Option<&'static [ProcMacroClient]>, cnum: CrateNum, cnum_map: IndexVec<CrateNum, CrateNum>, dep_kind: CrateDepKind, source: CrateSource, private_dep: bool, host_hash: Option<Svh>, ) -> CrateMetadata

Source

#### pub(crate) fn dependencies(&self) -> impl Iterator<Item = CrateNum>

Source

#### pub(crate) fn target_modifiers(&self) -> Vec<TargetModifier>

Source

#### pub(crate) fn enabled_denied_partial_mitigations( &self, ) -> Vec<DeniedPartialMitigation>

Source

#### pub(crate) fn update_extern_crate_diagnostics( &mut self, new_extern_crate: ExternCrate, ) -> bool

Keep `new_extern_crate` if it looks better in diagnostics

Source

#### pub(crate) fn source(&self) -> &CrateSource

Source

#### pub(crate) fn dep_kind(&self) -> CrateDepKind

Source

#### pub(crate) fn set_dep_kind(&mut self, dep_kind: CrateDepKind)

Source

#### pub(crate) fn update_and_private_dep(&mut self, private_dep: bool)

Source

#### pub(crate) fn used(&self) -> bool

Source

#### pub(crate) fn required_panic_strategy(&self) -> Option<PanicStrategy>

Source

#### pub(crate) fn needs_panic_runtime(&self) -> bool

Source

#### pub(crate) fn is_private_dep(&self) -> bool

Source

#### pub(crate) fn is_panic_runtime(&self) -> bool

Source

#### pub(crate) fn is_profiler_runtime(&self) -> bool

Source

#### pub(crate) fn is_compiler_builtins(&self) -> bool

Source

#### pub(crate) fn needs_allocator(&self) -> bool

Source

#### pub(crate) fn has_global_allocator(&self) -> bool

Source

#### pub(crate) fn has_alloc_error_handler(&self) -> bool

Source

#### pub(crate) fn has_default_lib_allocator(&self) -> bool

Source

#### pub(crate) fn is_proc_macro_crate(&self) -> bool

Source

#### pub(crate) fn proc_macros_for_crate( &self, tcx: TyCtxt<'_>, krate: CrateNum, ) -> impl Iterator<Item = DefId>

Source

#### pub(crate) fn name(&self) -> Symbol

Source

#### pub(crate) fn hash(&self) -> Svh

Source

#### pub(crate) fn has_async_drops(&self) -> bool

Source

#### fn num_def_ids(&self) -> usize

Source

#### fn local_def_id(&self, index: DefIndex) -> DefId

Source

#### fn reverse_translate_def_id(&self, did: DefId) -> Option<DefId>

## Trait Implementations§

Source§

### impl<'a> MetaBlob<'a> for &'a CrateMetadata

Source§

#### fn blob(&self) -> &'a MetadataBlob

## Auto Trait Implementations§

§

### impl !Freeze for CrateMetadata

§

### impl !RefUnwindSafe for CrateMetadata

§

### impl !Send for CrateMetadata

§

### impl !Sync for CrateMetadata

§

### impl !UnwindSafe for CrateMetadata

§

### impl DynSend for CrateMetadata

§

### impl DynSync for CrateMetadata

§

### impl Unpin for CrateMetadata

§

### impl UnsafeUnpin for CrateMetadata

## Blanket Implementations§

Source§

### impl<T> Aligned for T

Source§

#### const ALIGN: Alignment

Alignment of `Self`.
Source§

### impl<T> Any for T
where T: 'static + ?Sized,

Source§

#### fn type_id(&self) -> TypeId

Gets the `TypeId` of `self`. Read more
Source§

### impl<T> Borrow<T> for T
where T: ?Sized,

Source§

#### fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

### impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

#### fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

### impl<T, R> CollectAndApply<T, R> for T

Source§

#### fn collect_and_apply<I, F>(iter: I, f: F) -> R
where I: Iterator<Item = T>, F: FnOnce(&[T]) -> R,

Equivalent to `f(&iter.collect::<Vec<_>>())`.

Source§

#### type Output = R

Source§

### impl<T> ErasedDestructor for T
where T: 'static,

Source§

### impl<T> From<T> for T

Source§

#### fn from(t: T) -> T

Returns the argument unchanged.

Source§

### impl<T> Instrument for T

Source§

#### fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided `Span`, returning an `Instrumented` wrapper. Read more
Source§

#### fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current `Span`, returning an `Instrumented` wrapper. Read more
Source§

### impl<T, U> Into<U> for T
where U: From<T>,

Source§

#### fn into(self) -> U

Calls `U::from(self)`.

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

Source§

### impl<T> IntoEither for T

Source§

#### fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts `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 more
Source§

#### fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts `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 more
Source§

### impl<K> IntoQueryKey<K> for K

Source§

#### fn into_query_key(self) -> K

Argument conversion from `Self` to `K`. This should always be a very cheap conversion, e.g. `LocalDefId::to_def_id`.
Source§

### impl<T> MaybeResult<T> for T

Source§

#### type Error = !

Source§

#### fn from(_: Result<T, <T as MaybeResult<T>>::Error>) -> T

Source§

#### fn to_result(self) -> Result<T, <T as MaybeResult<T>>::Error>

Source§

### impl<T> Pointable for T

Source§

#### const ALIGN: usize

The alignment of pointer.
Source§

#### type Init = T

The type for initializers.
Source§

#### unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

#### unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

#### unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

#### unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

### impl<T> Same for T

Source§

#### type Output = T

Should always be `Self`
Source§

### impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

#### type Error = Infallible

The type returned in the event of a conversion error.
Source§

#### fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

### impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

#### type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

#### fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

### impl<I, T, U> Upcast<I, U> for T
where U: UpcastFrom<I, T>,

Source§

#### fn upcast(self, interner: I) -> U

Source§

### impl<I, T> UpcastFrom<I, T> for T

Source§

#### fn upcast_from(from: T, _tcx: I) -> T

Source§

### impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

#### fn vzip(self) -> V

Source§

### impl<T> WithSubscriber for T

Source§

#### fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided `Subscriber` to this type, returning a `WithDispatch` wrapper. Read more
Source§

#### fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default `Subscriber` to this type, returning a `WithDispatch` wrapper. Read more

## 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: 3064 bytes