Struct rustc_resolve::Resolver

source ·
pub struct Resolver<'a> {
Show 80 fields pub(crate) session: &'a Session, pub(crate) definitions: Definitions, pub(crate) expn_that_defined: FxHashMap<LocalDefId, ExpnId>, pub(crate) source_span: IndexVec<LocalDefId, Span>, pub(crate) graph_root: &'a ModuleData<'a>, pub(crate) prelude: Option<&'a ModuleData<'a>>, pub(crate) extern_prelude: FxHashMap<Ident, ExternPreludeEntry<'a>>, pub(crate) has_self: FxHashSet<DefId>, pub(crate) field_names: FxHashMap<DefId, Vec<Spanned<Symbol>>>, pub(crate) determined_imports: Vec<&'a Import<'a>>, pub(crate) indeterminate_imports: Vec<&'a Import<'a>>, pub(crate) pat_span_map: NodeMap<Span>, pub(crate) partial_res_map: NodeMap<PartialRes>, pub(crate) import_res_map: NodeMap<PerNS<Option<Res<NodeId>>>>, pub(crate) label_res_map: NodeMap<NodeId>, pub(crate) lifetimes_res_map: NodeMap<LifetimeRes>, pub(crate) extra_lifetime_params_map: NodeMap<Vec<(Ident, NodeId, LifetimeRes)>>, pub(crate) extern_crate_map: FxHashMap<LocalDefId, CrateNum>, pub(crate) reexport_map: FxHashMap<LocalDefId, Vec<ModChild>>, pub(crate) trait_map: NodeMap<Vec<TraitCandidate>>, pub(crate) block_map: NodeMap<&'a ModuleData<'a>>, pub(crate) empty_module: &'a ModuleData<'a>, pub(crate) module_map: FxHashMap<DefId, &'a ModuleData<'a>>, pub(crate) binding_parent_modules: FxHashMap<Interned<'a, NameBinding<'a>>, &'a ModuleData<'a>>, pub(crate) underscore_disambiguator: u32, pub(crate) glob_map: FxHashMap<LocalDefId, FxHashSet<Symbol>>, pub(crate) visibilities: FxHashMap<LocalDefId, Visibility>, pub(crate) has_pub_restricted: bool, pub(crate) used_imports: FxHashSet<NodeId>, pub(crate) maybe_unused_trait_imports: FxIndexSet<LocalDefId>, pub(crate) maybe_unused_extern_crates: Vec<(LocalDefId, Span)>, pub(crate) privacy_errors: Vec<PrivacyError<'a>>, pub(crate) ambiguity_errors: Vec<AmbiguityError<'a>>, pub(crate) use_injections: Vec<UseError<'a>>, pub(crate) macro_expanded_macro_export_errors: BTreeSet<(Span, Span)>, pub(crate) arenas: &'a ResolverArenas<'a>, pub(crate) dummy_binding: &'a NameBinding<'a>, pub(crate) crate_loader: CrateLoader<'a>, pub(crate) macro_names: FxHashSet<Ident>, pub(crate) builtin_macros: FxHashMap<Symbol, BuiltinMacroState>, pub(crate) builtin_macro_kinds: FxHashMap<LocalDefId, MacroKind>, pub(crate) registered_tools: RegisteredTools, pub(crate) macro_use_prelude: FxHashMap<Symbol, &'a NameBinding<'a>>, pub(crate) macro_map: FxHashMap<DefId, MacroData>, pub(crate) dummy_ext_bang: Lrc<SyntaxExtension>, pub(crate) dummy_ext_derive: Lrc<SyntaxExtension>, pub(crate) non_macro_attr: Lrc<SyntaxExtension>, pub(crate) local_macro_def_scopes: FxHashMap<LocalDefId, &'a ModuleData<'a>>, pub(crate) ast_transform_scopes: FxHashMap<LocalExpnId, &'a ModuleData<'a>>, pub(crate) unused_macros: FxHashMap<LocalDefId, (NodeId, Ident)>, pub(crate) unused_macro_rules: FxHashMap<(LocalDefId, usize), (Ident, Span)>, pub(crate) proc_macro_stubs: FxHashSet<LocalDefId>, pub(crate) single_segment_macro_resolutions: Vec<(Ident, MacroKind, ParentScope<'a>, Option<&'a NameBinding<'a>>)>, pub(crate) multi_segment_macro_resolutions: Vec<(Vec<Segment>, Span, MacroKind, ParentScope<'a>, Option<Res<NodeId>>)>, pub(crate) builtin_attrs: Vec<(Ident, ParentScope<'a>)>, pub(crate) containers_deriving_copy: FxHashSet<LocalExpnId>, pub(crate) invocation_parent_scopes: FxHashMap<LocalExpnId, ParentScope<'a>>, pub(crate) output_macro_rules_scopes: FxHashMap<LocalExpnId, Interned<'a, Cell<MacroRulesScope<'a>>>>, pub(crate) macro_rules_scopes: FxHashMap<LocalDefId, Interned<'a, Cell<MacroRulesScope<'a>>>>, pub(crate) helper_attrs: FxHashMap<LocalExpnId, Vec<Ident>>, pub(crate) derive_data: FxHashMap<LocalExpnId, DeriveData>, pub(crate) name_already_seen: FxHashMap<Symbol, Span>, pub(crate) potentially_unused_imports: Vec<&'a Import<'a>>, pub(crate) struct_constructors: DefIdMap<(Res<NodeId>, Visibility<DefId>, Vec<Visibility<DefId>>)>, pub(crate) active_features: FxHashSet<Symbol>, pub(crate) lint_buffer: LintBuffer, pub(crate) next_node_id: NodeId, pub(crate) node_id_to_def_id: FxHashMap<NodeId, LocalDefId>, pub(crate) def_id_to_node_id: IndexVec<LocalDefId, NodeId>, pub(crate) placeholder_field_indices: FxHashMap<NodeId, usize>, pub(crate) invocation_parents: FxHashMap<LocalExpnId, (LocalDefId, ImplTraitContext)>, pub(crate) trait_impl_items: FxHashSet<LocalDefId>, pub(crate) legacy_const_generic_args: FxHashMap<DefId, Option<Vec<usize>>>, pub(crate) item_generics_num_lifetimes: FxHashMap<LocalDefId, usize>, pub(crate) main_def: Option<MainDefinition>, pub(crate) trait_impls: FxIndexMap<DefId, Vec<LocalDefId>>, pub(crate) proc_macros: Vec<NodeId>, pub(crate) confused_type_with_std_module: FxHashMap<Span, Span>, pub(crate) lifetime_elision_allowed: FxHashSet<NodeId>, pub(crate) effective_visibilities: EffectiveVisibilities,
}
Expand description

The main resolver class.

This is the visitor that walks the whole crate.

Fields§

§session: &'a Session§definitions: Definitions§expn_that_defined: FxHashMap<LocalDefId, ExpnId>

Item with a given LocalDefId was defined during macro expansion with ID ExpnId.

§source_span: IndexVec<LocalDefId, Span>

Reference span for definitions.

§graph_root: &'a ModuleData<'a>§prelude: Option<&'a ModuleData<'a>>§extern_prelude: FxHashMap<Ident, ExternPreludeEntry<'a>>§has_self: FxHashSet<DefId>

N.B., this is used only for better diagnostics, not name resolution itself.

§field_names: FxHashMap<DefId, Vec<Spanned<Symbol>>>

Names of fields of an item DefId accessible with dot syntax. Used for hints during error reporting.

§determined_imports: Vec<&'a Import<'a>>

All imports known to succeed or fail.

§indeterminate_imports: Vec<&'a Import<'a>>

All non-determined imports.

§pat_span_map: NodeMap<Span>§partial_res_map: NodeMap<PartialRes>

Resolutions for nodes that have a single resolution.

§import_res_map: NodeMap<PerNS<Option<Res<NodeId>>>>

Resolutions for import nodes, which have multiple resolutions in different namespaces.

§label_res_map: NodeMap<NodeId>

Resolutions for labels (node IDs of their corresponding blocks or loops).

§lifetimes_res_map: NodeMap<LifetimeRes>

Resolutions for lifetimes.

§extra_lifetime_params_map: NodeMap<Vec<(Ident, NodeId, LifetimeRes)>>

Lifetime parameters that lowering will have to introduce.

§extern_crate_map: FxHashMap<LocalDefId, CrateNum>

CrateNum resolutions of extern crate items.

§reexport_map: FxHashMap<LocalDefId, Vec<ModChild>>§trait_map: NodeMap<Vec<TraitCandidate>>§block_map: NodeMap<&'a ModuleData<'a>>

A map from nodes to anonymous modules. Anonymous modules are pseudo-modules that are implicitly created around items contained within blocks.

For example, if we have this:

fn f() { fn g() { … } }

There will be an anonymous module created around g with the ID of the entry block for f.

§empty_module: &'a ModuleData<'a>

A fake module that contains no definition and no prelude. Used so that some AST passes can generate identifiers that only resolve to local or language items.

§module_map: FxHashMap<DefId, &'a ModuleData<'a>>§binding_parent_modules: FxHashMap<Interned<'a, NameBinding<'a>>, &'a ModuleData<'a>>§underscore_disambiguator: u32§glob_map: FxHashMap<LocalDefId, FxHashSet<Symbol>>

Maps glob imports to the names of items actually imported.

§visibilities: FxHashMap<LocalDefId, Visibility>

Visibilities in “lowered” form, for all entities that have them.

§has_pub_restricted: bool§used_imports: FxHashSet<NodeId>§maybe_unused_trait_imports: FxIndexSet<LocalDefId>§maybe_unused_extern_crates: Vec<(LocalDefId, Span)>§privacy_errors: Vec<PrivacyError<'a>>

Privacy errors are delayed until the end in order to deduplicate them.

§ambiguity_errors: Vec<AmbiguityError<'a>>

Ambiguity errors are delayed for deduplication.

§use_injections: Vec<UseError<'a>>

use injections are delayed for better placement and deduplication.

§macro_expanded_macro_export_errors: BTreeSet<(Span, Span)>

Crate-local macro expanded macro_export referred to by a module-relative path.

§arenas: &'a ResolverArenas<'a>§dummy_binding: &'a NameBinding<'a>§crate_loader: CrateLoader<'a>§macro_names: FxHashSet<Ident>§builtin_macros: FxHashMap<Symbol, BuiltinMacroState>§builtin_macro_kinds: FxHashMap<LocalDefId, MacroKind>

A small map keeping true kinds of built-in macros that appear to be fn-like on the surface (macro items in libcore), but are actually attributes or derives.

§registered_tools: RegisteredTools§macro_use_prelude: FxHashMap<Symbol, &'a NameBinding<'a>>§macro_map: FxHashMap<DefId, MacroData>§dummy_ext_bang: Lrc<SyntaxExtension>§dummy_ext_derive: Lrc<SyntaxExtension>§non_macro_attr: Lrc<SyntaxExtension>§local_macro_def_scopes: FxHashMap<LocalDefId, &'a ModuleData<'a>>§ast_transform_scopes: FxHashMap<LocalExpnId, &'a ModuleData<'a>>§unused_macros: FxHashMap<LocalDefId, (NodeId, Ident)>§unused_macro_rules: FxHashMap<(LocalDefId, usize), (Ident, Span)>§proc_macro_stubs: FxHashSet<LocalDefId>§single_segment_macro_resolutions: Vec<(Ident, MacroKind, ParentScope<'a>, Option<&'a NameBinding<'a>>)>

Traces collected during macro resolution and validated when it’s complete.

§multi_segment_macro_resolutions: Vec<(Vec<Segment>, Span, MacroKind, ParentScope<'a>, Option<Res<NodeId>>)>§builtin_attrs: Vec<(Ident, ParentScope<'a>)>§containers_deriving_copy: FxHashSet<LocalExpnId>

derive(Copy) marks items they are applied to so they are treated specially later. Derive macros cannot modify the item themselves and have to store the markers in the global context, so they attach the markers to derive container IDs using this resolver table.

§invocation_parent_scopes: FxHashMap<LocalExpnId, ParentScope<'a>>

Parent scopes in which the macros were invoked. FIXME: derives are missing in these parent scopes and need to be taken from elsewhere.

§output_macro_rules_scopes: FxHashMap<LocalExpnId, Interned<'a, Cell<MacroRulesScope<'a>>>>

macro_rules scopes produced by expanding the macro invocations, include all the macro_rules items and other invocations generated by them.

§macro_rules_scopes: FxHashMap<LocalDefId, Interned<'a, Cell<MacroRulesScope<'a>>>>

macro_rules scopes produced by macro_rules item definitions.

§helper_attrs: FxHashMap<LocalExpnId, Vec<Ident>>

Helper attributes that are in scope for the given expansion.

§derive_data: FxHashMap<LocalExpnId, DeriveData>

Ready or in-progress results of resolving paths inside the #[derive(...)] attribute with the given ExpnId.

§name_already_seen: FxHashMap<Symbol, Span>

Avoid duplicated errors for “name already defined”.

§potentially_unused_imports: Vec<&'a Import<'a>>§struct_constructors: DefIdMap<(Res<NodeId>, Visibility<DefId>, Vec<Visibility<DefId>>)>

Table for mapping struct IDs into struct constructor IDs, it’s not used during normal resolution, only for better error reporting. Also includes of list of each fields visibility

§active_features: FxHashSet<Symbol>

Features enabled for this crate.

§lint_buffer: LintBuffer§next_node_id: NodeId§node_id_to_def_id: FxHashMap<NodeId, LocalDefId>§def_id_to_node_id: IndexVec<LocalDefId, NodeId>§placeholder_field_indices: FxHashMap<NodeId, usize>

Indices of unnamed struct or variant fields with unresolved attributes.

§invocation_parents: FxHashMap<LocalExpnId, (LocalDefId, ImplTraitContext)>

When collecting definitions from an AST fragment produced by a macro invocation ExpnId we know what parent node that fragment should be attached to thanks to this table, and how the impl Trait fragments were introduced.

§trait_impl_items: FxHashSet<LocalDefId>

Some way to know that we are in a trait impl in visit_assoc_item. FIXME: Replace with a more general AST map (together with some other fields).

§legacy_const_generic_args: FxHashMap<DefId, Option<Vec<usize>>>§item_generics_num_lifetimes: FxHashMap<LocalDefId, usize>

Amount of lifetime parameters for each item in the crate.

§main_def: Option<MainDefinition>§trait_impls: FxIndexMap<DefId, Vec<LocalDefId>>§proc_macros: Vec<NodeId>

A list of proc macro LocalDefIds, written out in the order in which they are declared in the static array generated by proc_macro_harness.

§confused_type_with_std_module: FxHashMap<Span, Span>§lifetime_elision_allowed: FxHashSet<NodeId>

Whether lifetime elision was successful.

§effective_visibilities: EffectiveVisibilities

Implementations§

Defines name in namespace ns of module parent to be def if it is not yet defined; otherwise, reports an error.

Walks up the tree of definitions starting at def_id, stopping at the first encountered module. Parent block modules for arbitrary def-ids are not recorded for the local crate, and are not preserved in metadata for foreign crates, so block modules are never returned by this function.

For the local crate ignoring block modules may be incorrect, so use this method with care.

For foreign crates block modules can be ignored without introducing observable differences, moreover they has to be ignored right now because they are not kept in metadata. Foreign parent modules are used for resolving names used by foreign macros with def-site hygiene, therefore block module ignorability relies on macros with def-site hygiene and block module parents being unreachable from other crates. Reachable macros with block module parents exist due to #[macro_export] macro_rules!, but they cannot use def-site hygiene, so the assumption holds (https://github.com/rust-lang/rust/pull/77984#issuecomment-712445508).

If def_id refers to a module (in resolver’s sense, i.e. a module item, crate root, enum, or trait), then this function returns that module’s resolver representation, otherwise it returns None.

This function adds a suggestion to change the binding name of a new import that conflicts with an existing import.

help: you can use `as` to change the binding name of the import
   |
LL | use foo::bar as other_bar;
   |     ^^^^^^^^^^^^^^^^^^^^^

This function adds a suggestion to remove an unnecessary binding from an import that is nested. In the following example, this function will be invoked to remove the a binding in the second use statement:

use issue_52891::a;
use issue_52891::{d, a, e};

The following suggestion will be added:

use issue_52891::{d, a, e};
                     ^-- help: remove unnecessary import

If the nested use contains only one import then the suggestion will remove the entire line.

It is expected that the provided import is nested - this isn’t checked by the function. If this invariant is not upheld, this function’s behaviour will be unexpected as characters expected by span manipulations won’t be present.

Combines an error with provided span and emits it.

This takes the error provided, combines it with the span and any additional spans inside the error and emits it.

Lookup typo candidate in scope for a macro or import.

When name resolution fails, this method can be used to look up candidate entities with the expected name. It allows filtering them using the supplied predicate (which should be used to only accept the types of definitions expected, e.g., traits). The lookup spans across all crates.

N.B., the method does not look into imports, but this is not a problem, since we report the definitions (thus, the de-aliased imports).

If the binding refers to a tuple struct constructor with fields, returns the span of its fields.

A generic scope visitor. Visits scopes in order to resolve some identifier in them or perform other actions. If the callback returns Some result, we stop visiting scopes and return it.

This resolves the identifier ident in the namespace ns in the current lexical scope. More specifically, we proceed up the hierarchy of scopes and return the binding for ident in the first scope that defines it (or None if no scopes define it).

A block’s items are above its local variables in the scope hierarchy, regardless of where the items are defined in the block. For example,

fn f() {
   g(); // Since there are no local variables in scope yet, this resolves to the item.
   let g = || {};
   fn g() {}
   g(); // This resolves to the local variable `g` since it shadows the item.
}

Invariant: This must only be called during main resolution, not during import resolution.

Resolve an identifier in lexical scope. This is a variation of fn resolve_ident_in_lexical_scope that can be run during expansion and import resolution (perhaps they can be merged in the future). The function is used for resolving initial segments of macro paths (e.g., foo in foo::bar!(); or foo!();`) and also for import paths on 2018 edition.

Attempts to resolve ident in namespaces ns of module. Invariant: if finalize is Some, expansion and import resolution must be complete.

Validate a local resolution (from ribs).

Given a binding and an import that resolves to it, return the corresponding binding defined by the import.

Define the name or return the existing binding if there is a collision.

Resolve macro path with error reporting and recovery. Uses dummy syntax extensions for unresolved macros or macros with unexpected resolutions for better error recovery.

Compile the macro into a SyntaxExtension and its rule spans.

Possibly replace its expander to a pre-defined one for built-in macros.

Adds a definition with a parent definition.

Runs the function on each namespace.

Entry point to crate resolution.

Rustdoc uses this to resolve doc link paths in a recoverable way. PathResult<'a> isn’t something that can be returned because it can’t be made to live that long, and also it’s a private type. Fortunately rustdoc doesn’t need to know the error, just that an error occurred.

For rustdoc. For local modules returns only reexports, for external modules returns all children.

For rustdoc.

For rustdoc.

Retrieves the span of the given DefId if DefId is in the local crate.

Retrieves the name of the given DefId.

Checks if an expression refers to a function marked with #[rustc_legacy_const_generics] and returns the argument index list from the attribute.

Trait Implementations§

Converts this type into a mutable reference of the (usually inferred) input type.
Converts this type into a mutable reference of the (usually inferred) input type.
Does #[derive(...)] attribute with the given ExpnId have built-in Copy inside it?
Resolve paths inside the #[derive(...)] attribute with the given ExpnId.
Take resolutions for paths inside the #[derive(...)] attribute with the given ExpnId back from resolver. Read more
Path resolution logic for #[cfg_accessible(path)].
Decodes the proc-macro quoted span in the specified crate, with the specified id. No caching is performed. Read more
The order of items in the HIR is unrelated to the order of items in the AST. However, we generate proc macro harnesses based on the AST order, and later refer to these harnesses from the HIR. This field keeps track of the order in which we generated proc macros harnesses, so that we can map HIR proc macros items back to their harness items. Read more
Tools registered with #![register_tool] and used by tool attributes and lints.

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 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: 2384 bytes