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: OwnerIdThe 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>
impl<'genv, 'tcx> CrateResolver<'genv, 'tcx>
pub fn new(genv: GlobalEnv<'genv, 'tcx>, specs: &'genv Specs) -> Self
Sourcefn define_flux_global_items(&mut self)
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).
fn define_module_flux_items(&mut self, parent: OwnerId)
fn define_items(&mut self, item_ids: impl IntoIterator<Item = &'tcx ItemId>)
fn define_foreign_items(&mut self, items: &[ForeignItemId])
Sourcefn define_res_in(
&mut self,
res: Res<NodeId>,
ns: Namespace,
source: BindingSource,
)
fn define_res_in( &mut self, res: Res<NodeId>, ns: Namespace, source: BindingSource, )
Define the name in source in the innermost rib of ns.
Sourcefn define_in_prelude(&mut self, ident: Ident, res: Res<NodeId>, ns: Namespace)
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.
fn push_rib(&mut self, ns: Namespace, kind: RibKind)
fn pop_rib(&mut self, ns: Namespace)
fn define_generics(&mut self, def_id: MaybeExternId<OwnerId>)
fn resolve_flux_items(&mut self, parent: OwnerId)
fn resolve_item( &mut self, item: &Item, item_id: MaybeExternId<OwnerId>, ) -> Result<(), ErrorGuaranteed>
fn resolve_trait_item( &mut self, item: &TraitItemFn, item_id: MaybeExternId<OwnerId>, ) -> Result<(), ErrorGuaranteed>
fn resolve_impl_item( &mut self, item: &ImplItemFn, item_id: MaybeExternId<OwnerId>, ) -> Result<(), ErrorGuaranteed>
fn resolve_path_with_ribs<S: Segment>( &mut self, segments: &[S], ns: Namespace, ) -> Result<PartialRes<NodeId>, ResolveError>
fn resolve_flux_use_tree( &mut self, use_tree: &UseTree, ) -> Vec<(Ident, Res<NodeId>, Namespace)>
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)>
fn resolve_ident_with_ribs( &self, ident: Ident, ns: Namespace, ) -> Result<Res<NodeId>, ResolveError>
fn glob_imports( &mut self, path: &UsePath<'_>, ) -> impl Iterator<Item = &'tcx ModChild> + use<'tcx>
fn resolve_ident_in_module( &self, module: Module, ident: Ident, ns: Namespace, ) -> Result<Res<NodeId>, ResolveError>
Sourcefn ambiguous_module_child(
&self,
module_id: DefId,
ident: Ident,
ns: Namespace,
) -> Option<Ambiguity>
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.
Sourcefn glob_span(&self, child: &ModChild) -> Span
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.
pub fn into_output(self) -> Result<ResolverOutput, ErrorGuaranteed>
fn emit_unresolved_import( &mut self, ident: Ident, module_id: Option<DefId>, resolved_prefix: &[Ident], )
fn emit_ambiguity_err(&mut self, ambiguity: Ambiguity)
fn emit_not_a_module(&mut self, ident: Ident, resolved_prefix: &[Ident])
fn emit(&mut self, err: impl Diagnostic<'genv>)
Trait Implementations§
Source§impl<'tcx> Visitor<'tcx> for CrateResolver<'_, 'tcx>
impl<'tcx> Visitor<'tcx> for CrateResolver<'_, 'tcx>
Source§type NestedFilter = All
type NestedFilter = All
Source§fn maybe_tcx(&mut self) -> Self::MaybeTyCtxt
fn maybe_tcx(&mut self) -> Self::MaybeTyCtxt
type NestedFilter is set to visit nested items, this method
must also be overridden to provide a map to retrieve nested items.fn visit_mod(&mut self, module: &'tcx Mod<'tcx>, _s: Span, hir_id: HirId)
fn visit_block(&mut self, block: &'tcx Block<'tcx>)
Source§fn visit_item(&mut self, item: &'tcx Item<'tcx>)
fn visit_item(&mut self, item: &'tcx Item<'tcx>)
visit_nested_item for details.fn visit_impl_item(&mut self, impl_item: &'tcx ImplItem<'tcx>)
fn visit_trait_item(&mut self, trait_item: &'tcx TraitItem<'tcx>)
type MaybeTyCtxt = <Self::NestedFilter as NestedFilter<'v>>::MaybeTyCtxt
§fn visit_nested_item(&mut self, id: ItemId) -> Self::Result
fn visit_nested_item(&mut self, id: ItemId) -> Self::Result
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
fn visit_nested_trait_item(&mut self, id: TraitItemId) -> Self::Result
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
fn visit_nested_impl_item(&mut self, id: ImplItemId) -> Self::Result
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
fn visit_nested_foreign_item(&mut self, id: ForeignItemId) -> Self::Result
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
fn visit_nested_body(&mut self, id: BodyId) -> Self::Result
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
fn visit_ty(&mut self, t: &'v Ty<'v, AmbigArg>) -> Self::Result
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
fn visit_const_arg(&mut self, c: &'v ConstArg<'v, AmbigArg>) -> Self::Result
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> 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
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§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 more