Skip to main content

CrateResolver

Struct CrateResolver 

Source
pub(crate) struct CrateResolver<'genv, 'tcx> {
    genv: GlobalEnv<'genv, 'tcx>,
    specs: &'genv Specs,
    output: ResolverOutput,
    ribs: PerNS<Vec<Rib>>,
    crates: UnordMap<Symbol, DefId>,
    prelude: PerNS<Rib>,
    qualifiers: UnordMap<Symbol, FluxLocalDefId>,
    primop_props: UnordMap<Symbol, FluxDefId>,
    err: Option<ErrorGuaranteed>,
    current_module: OwnerId,
}

Fields§

§genv: GlobalEnv<'genv, 'tcx>§specs: &'genv Specs§output: ResolverOutput§ribs: PerNS<Vec<Rib>>§crates: UnordMap<Symbol, DefId>

A mapping from the names of all imported crates to their [DefId]

§prelude: PerNS<Rib>

Names available everywhere: Rust builtin types plus flux’s global funcs (theory funcs, cast) and primitive sorts.

§qualifiers: UnordMap<Symbol, FluxLocalDefId>§primop_props: UnordMap<Symbol, FluxDefId>§err: Option<ErrorGuaranteed>§current_module: OwnerId

The most recent module we have visited. Used to check for visibility of other items from this module.

Implementations§

Source§

impl<'genv, 'tcx> CrateResolver<'genv, 'tcx>

Source

pub fn new(genv: GlobalEnv<'genv, 'tcx>, specs: &'genv Specs) -> Self

Source

fn define_flux_global_items(&mut self)

Qualifiers and primop-props are global, so their names are checked for duplicates across the whole crate (unlike other flux items, which are scoped per-module via Self::define_res_in).

Source

fn define_module_flux_items(&mut self, parent: OwnerId)

Source

fn define_items(&mut self, item_ids: impl IntoIterator<Item = &'tcx ItemId>)

Source

fn define_foreign_items(&mut self, items: &[ForeignItemId])

Source

fn define_res_in( &mut self, res: Res<NodeId>, ns: Namespace, source: BindingSource, )

Define the name in source in the innermost rib of ns.

Source

fn define_in_prelude(&mut self, ident: Ident, res: Res<NodeId>, ns: Namespace)

Define ident in the prelude of ns. The prelude is only ever populated from the single #[prelude_import] glob, so unlike Self::define_res_in it keeps plain last-one-wins semantics: there is no second glob to be ambiguous with.

Source

fn push_rib(&mut self, ns: Namespace, kind: RibKind)

Source

fn pop_rib(&mut self, ns: Namespace)

Source

fn define_generics(&mut self, def_id: MaybeExternId<OwnerId>)

Source

fn resolve_flux_items(&mut self, parent: OwnerId)

Source

fn resolve_item( &mut self, item: &Item, item_id: MaybeExternId<OwnerId>, ) -> Result<(), ErrorGuaranteed>

Source

fn resolve_trait_item( &mut self, item: &TraitItemFn, item_id: MaybeExternId<OwnerId>, ) -> Result<(), ErrorGuaranteed>

Source

fn resolve_impl_item( &mut self, item: &ImplItemFn, item_id: MaybeExternId<OwnerId>, ) -> Result<(), ErrorGuaranteed>

Source

fn resolve_path_with_ribs<S: Segment>( &mut self, segments: &[S], ns: Namespace, ) -> Result<PartialRes<NodeId>, ResolveError>

Source

fn resolve_flux_use_tree( &mut self, use_tree: &UseTree, ) -> Vec<(Ident, Res<NodeId>, Namespace)>

Source

fn resolve_flux_use_tree_rec( &mut self, use_tree: &UseTree, resolved_module_id: Option<DefId>, resolved_prefix: &mut Vec<Ident>, ) -> Vec<(Ident, Res<NodeId>, Namespace)>

Source

fn resolve_ident_with_ribs( &self, ident: Ident, ns: Namespace, ) -> Result<Res<NodeId>, ResolveError>

Source

fn glob_imports( &mut self, path: &UsePath<'_>, ) -> impl Iterator<Item = &'tcx ModChild> + use<'tcx>

Source

fn resolve_ident_in_module( &self, module: Module, ident: Ident, ns: Namespace, ) -> Result<Res<NodeId>, ResolveError>

Source

fn ambiguous_module_child( &self, module_id: DefId, ident: Ident, ns: Namespace, ) -> Option<Ambiguity>

The ambiguity for ident in module_id, if the module’s own glob re-exports bind the name to two different items (mod m { pub use a::*; pub use b::*; }). rustc keeps such bindings out of module_children — they go into a separate ambig_module_children map — so they need their own lookup.

Only local modules are covered. The data for a foreign module is reachable only through an untracked CStore accessor, and rustc doesn’t report E0659 across a crate boundary anyway: it resolves to the first candidate and fires the ambiguous_glob_imports future-incompatibility lint instead (see rust-lang/rust#114095). We report those as unresolved.

Source

fn glob_span(&self, child: &ModChild) -> Span

Where a module child was brought into its module: the use ...::*; statement it was re-exported by, or the item’s own definition. Mirrors rustc’s child_span.

Source

pub fn into_output(self) -> Result<ResolverOutput, ErrorGuaranteed>

Source

fn emit_unresolved_import( &mut self, ident: Ident, module_id: Option<DefId>, resolved_prefix: &[Ident], )

Source

fn emit_ambiguity_err(&mut self, ambiguity: Ambiguity)

Source

fn emit_not_a_module(&mut self, ident: Ident, resolved_prefix: &[Ident])

Source

fn emit(&mut self, err: impl Diagnostic<'genv>)

Trait Implementations§

Source§

impl<'tcx> Visitor<'tcx> for CrateResolver<'_, 'tcx>

Source§

type NestedFilter = All

Override this type to control which nested HIR are visited; see [NestedFilter] for details. If you override this type, you must also override maybe_tcx. Read more
Source§

fn maybe_tcx(&mut self) -> Self::MaybeTyCtxt

If type NestedFilter is set to visit nested items, this method must also be overridden to provide a map to retrieve nested items.
Source§

fn visit_mod(&mut self, module: &'tcx Mod<'tcx>, _s: Span, hir_id: HirId)

Source§

fn visit_block(&mut self, block: &'tcx Block<'tcx>)

Source§

fn visit_item(&mut self, item: &'tcx Item<'tcx>)

Visits the top-level item and (optionally) nested items / impl items. See visit_nested_item for details.
Source§

fn visit_impl_item(&mut self, impl_item: &'tcx ImplItem<'tcx>)

Source§

fn visit_trait_item(&mut self, trait_item: &'tcx TraitItem<'tcx>)

§

type MaybeTyCtxt = <Self::NestedFilter as NestedFilter<'v>>::MaybeTyCtxt

§

type Result = ()

The result type of the visit_* methods. Can be either (), or ControlFlow<T>.
§

fn visit_nested_item(&mut self, id: ItemId) -> Self::Result

Invoked when a nested item is encountered. By default, when Self::NestedFilter is nested_filter::None, this method does nothing. You probably don’t want to override this method – instead, override [Self::NestedFilter] or use the “shallow” or “deep” visit patterns described at [rustc_hir::intravisit]. The only reason to override this method is if you want a nested pattern but cannot supply a TyCtxt; see maybe_tcx for advice.
§

fn visit_nested_trait_item(&mut self, id: TraitItemId) -> Self::Result

Like visit_nested_item(), but for trait items. See visit_nested_item() for advice on when to override this method.
§

fn visit_nested_impl_item(&mut self, id: ImplItemId) -> Self::Result

Like visit_nested_item(), but for impl items. See visit_nested_item() for advice on when to override this method.
§

fn visit_nested_foreign_item(&mut self, id: ForeignItemId) -> Self::Result

Like visit_nested_item(), but for foreign items. See visit_nested_item() for advice on when to override this method.
§

fn visit_nested_body(&mut self, id: BodyId) -> Self::Result

Invoked to visit the body of a function, method or closure. Like visit_nested_item, does nothing by default unless you override Self::NestedFilter.
§

fn visit_param(&mut self, param: &'v Param<'v>) -> Self::Result

§

fn visit_body(&mut self, b: &Body<'v>) -> Self::Result

§

fn visit_id(&mut self, _hir_id: HirId) -> Self::Result

§

fn visit_name(&mut self, _name: Symbol) -> Self::Result

§

fn visit_ident(&mut self, ident: Ident) -> Self::Result

§

fn visit_foreign_item(&mut self, i: &'v ForeignItem<'v>) -> Self::Result

§

fn visit_local(&mut self, l: &'v LetStmt<'v>) -> Self::Result

§

fn visit_stmt(&mut self, s: &'v Stmt<'v>) -> Self::Result

§

fn visit_arm(&mut self, a: &'v Arm<'v>) -> Self::Result

§

fn visit_pat(&mut self, p: &'v Pat<'v>) -> Self::Result

§

fn visit_pat_field(&mut self, f: &'v PatField<'v>) -> Self::Result

§

fn visit_pat_expr(&mut self, expr: &'v PatExpr<'v>) -> Self::Result

§

fn visit_lit( &mut self, _hir_id: HirId, _lit: Spanned<LitKind>, _negated: bool, ) -> Self::Result

§

fn visit_anon_const(&mut self, c: &'v AnonConst) -> Self::Result

§

fn visit_inline_const(&mut self, c: &'v ConstBlock) -> Self::Result

§

fn visit_generic_arg(&mut self, generic_arg: &'v GenericArg<'v>) -> Self::Result

§

fn visit_ty(&mut self, t: &'v Ty<'v, AmbigArg>) -> Self::Result

All types are treated as ambiguous types for the purposes of hir visiting in order to ensure that visitors can handle infer vars without it being too error-prone. Read more
§

fn visit_const_item_rhs(&mut self, c: ConstItemRhs<'v>) -> Self::Result

§

fn visit_const_arg(&mut self, c: &'v ConstArg<'v, AmbigArg>) -> Self::Result

All consts are treated as ambiguous consts for the purposes of hir visiting in order to ensure that visitors can handle infer vars without it being too error-prone. Read more
§

fn visit_infer( &mut self, inf_id: HirId, inf_span: Span, kind: InferKind<'v>, ) -> Self::Result

§

fn visit_lifetime(&mut self, lifetime: &'v Lifetime) -> Self::Result

§

fn visit_expr(&mut self, ex: &'v Expr<'v>) -> Self::Result

§

fn visit_expr_field(&mut self, field: &'v ExprField<'v>) -> Self::Result

§

fn visit_const_arg_expr_field( &mut self, field: &'v ConstArgExprField<'v>, ) -> Self::Result

§

fn visit_pattern_type_pattern(&mut self, p: &'v TyPat<'v>) -> Self::Result

§

fn visit_generic_param(&mut self, p: &'v GenericParam<'v>) -> Self::Result

§

fn visit_const_param_default( &mut self, _param: HirId, ct: &'v ConstArg<'v>, ) -> Self::Result

§

fn visit_generics(&mut self, g: &'v Generics<'v>) -> Self::Result

§

fn visit_where_predicate( &mut self, predicate: &'v WherePredicate<'v>, ) -> Self::Result

§

fn visit_fn_ret_ty(&mut self, ret_ty: &'v FnRetTy<'v>) -> Self::Result

§

fn visit_fn_decl(&mut self, fd: &'v FnDecl<'v>) -> Self::Result

§

fn visit_fn( &mut self, fk: FnKind<'v>, fd: &'v FnDecl<'v>, b: BodyId, _: Span, id: LocalDefId, ) -> Self::Result

§

fn visit_use( &mut self, path: &'v Path<'v, PerNS<Option<Res>>>, hir_id: HirId, ) -> Self::Result

§

fn visit_trait_item_ref(&mut self, ii: &'v TraitItemId) -> Self::Result

§

fn visit_foreign_item_ref(&mut self, ii: &'v ForeignItemId) -> Self::Result

§

fn visit_impl_item_ref(&mut self, ii: &'v ImplItemId) -> Self::Result

§

fn visit_trait_ref(&mut self, t: &'v TraitRef<'v>) -> Self::Result

§

fn visit_param_bound(&mut self, bounds: &'v GenericBound<'v>) -> Self::Result

§

fn visit_precise_capturing_arg( &mut self, arg: &'v PreciseCapturingArgKind<&'v Lifetime, PreciseCapturingNonLifetimeArg>, ) -> Self::Result

§

fn visit_poly_trait_ref(&mut self, t: &'v PolyTraitRef<'v>) -> Self::Result

§

fn visit_opaque_ty(&mut self, opaque: &'v OpaqueTy<'v>) -> Self::Result

§

fn visit_variant_data(&mut self, s: &'v VariantData<'v>) -> Self::Result

§

fn visit_field_def(&mut self, s: &'v FieldDef<'v>) -> Self::Result

§

fn visit_enum_def(&mut self, enum_definition: &'v EnumDef<'v>) -> Self::Result

§

fn visit_variant(&mut self, v: &'v Variant<'v>) -> Self::Result

§

fn visit_label(&mut self, label: &'v Label) -> Self::Result

§

fn visit_qpath( &mut self, qpath: &'v QPath<'v>, id: HirId, _span: Span, ) -> Self::Result

§

fn visit_path(&mut self, path: &Path<'v>, _id: HirId) -> Self::Result

§

fn visit_path_segment( &mut self, path_segment: &'v PathSegment<'v>, ) -> Self::Result

§

fn visit_generic_args( &mut self, generic_args: &'v GenericArgs<'v>, ) -> Self::Result

§

fn visit_assoc_item_constraint( &mut self, constraint: &'v AssocItemConstraint<'v>, ) -> Self::Result

§

fn visit_attribute(&mut self, _attr: &'v Attribute) -> Self::Result

§

fn visit_defaultness(&mut self, defaultness: &'v Defaultness) -> Self::Result

§

fn visit_inline_asm( &mut self, asm: &'v InlineAsm<'v>, id: HirId, ) -> Self::Result

Auto Trait Implementations§

§

impl<'genv, 'tcx> Freeze for CrateResolver<'genv, 'tcx>

§

impl<'genv, 'tcx> !RefUnwindSafe for CrateResolver<'genv, 'tcx>

§

impl<'genv, 'tcx> !Send for CrateResolver<'genv, 'tcx>

§

impl<'genv, 'tcx> !Sync for CrateResolver<'genv, 'tcx>

§

impl<'genv, 'tcx> Unpin for CrateResolver<'genv, 'tcx>

§

impl<'genv, 'tcx> !UnwindSafe for CrateResolver<'genv, 'tcx>

Blanket Implementations§

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> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T> Instrument for T

§

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

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

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<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.
§

impl<T> WithSubscriber for T

§

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
§

fn with_current_subscriber(self) -> WithDispatch<Self>

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