Struct rustc_resolve::late::lifetimes::LifetimeContext[−][src]

pub(crate) struct LifetimeContext<'a, 'tcx> {
    pub(crate) tcx: TyCtxt<'tcx>,
    map: &'a mut NamedRegionMap,
    scope: &'a Scope<'a>,
    is_in_fn_syntax: bool,
    is_in_const_generic: bool,
    trait_definition_only: bool,
    labels_in_fn: Vec<Ident>,
    xcrate_object_lifetime_defaults: DefIdMap<Vec<ObjectLifetimeDefault>>,
    lifetime_uses: &'a mut DefIdMap<LifetimeUseSet<'tcx>>,
    pub(crate) missing_named_lifetime_spots: Vec<MissingLifetimeSpot<'tcx>>,
}

Fields

tcx: TyCtxt<'tcx>map: &'a mut NamedRegionMapscope: &'a Scope<'a>is_in_fn_syntax: bool
Expand description

Used to disallow the use of in-band lifetimes in fn or Fn syntax.

is_in_const_generic: booltrait_definition_only: bool
Expand description

Indicates that we only care about the definition of a trait. This should be false if the Item we are resolving lifetimes for is not a trait or we eventually need lifetimes resolve for trait items.

labels_in_fn: Vec<Ident>
Expand description

List of labels in the function/method currently under analysis.

xcrate_object_lifetime_defaults: DefIdMap<Vec<ObjectLifetimeDefault>>
Expand description

Cache for cross-crate per-definition object lifetime defaults.

lifetime_uses: &'a mut DefIdMap<LifetimeUseSet<'tcx>>missing_named_lifetime_spots: Vec<MissingLifetimeSpot<'tcx>>
Expand description

When encountering an undefined named lifetime, we will suggest introducing it in these places.

Implementations

impl<'tcx> LifetimeContext<'_, 'tcx>[src]

pub(crate) fn report_missing_lifetime_specifiers(
    &self,
    spans: Vec<Span>,
    count: usize
) -> DiagnosticBuilder<'tcx>
[src]

pub(crate) fn emit_undeclared_lifetime_error(&self, lifetime_ref: &Lifetime)[src]

pub(crate) fn emit_non_static_lt_in_const_generic_error(
    &self,
    lifetime_ref: &Lifetime
)
[src]

pub(crate) fn is_trait_ref_fn_scope(
    &mut self,
    trait_ref: &'tcx PolyTraitRef<'tcx>
) -> bool
[src]

pub(crate) fn add_missing_lifetime_specifiers_label(
    &self,
    err: &mut DiagnosticBuilder<'_>,
    spans_with_counts: Vec<(Span, usize)>,
    lifetime_names: &FxHashSet<Symbol>,
    lifetime_spans: Vec<Span>,
    params: &[ElisionFailureInfo]
)
[src]

pub(crate) fn maybe_emit_forbidden_non_static_lifetime_error(
    &self,
    body_id: BodyId,
    lifetime_ref: &'tcx Lifetime
)
[src]

Non-static lifetimes are prohibited in anonymous constants under min_const_generics. This function will emit an error if const_generics is not enabled, the body identified by body_id is an anonymous constant and lifetime_ref is non-static.

impl<'a, 'tcx> LifetimeContext<'a, 'tcx>[src]

fn poly_trait_ref_binder_info(
    &mut self
) -> (Vec<BoundVariableKind>, BinderScopeType)
[src]

Returns the binders in scope and the type of Binder that should be created for a poly trait ref.

impl<'a, 'tcx> LifetimeContext<'a, 'tcx>[src]

fn hack<F>(&mut self, f: F) where
    F: for<'b> FnOnce(&mut LifetimeContext<'b, 'tcx>), 
[src]

fn with<F>(&mut self, wrap_scope: Scope<'_>, f: F) where
    F: for<'b> FnOnce(&'_ Scope<'_>, &mut LifetimeContext<'b, 'tcx>), 
[src]

fn lifetime_deletion_span(
    &self,
    name: Ident,
    generics: &Generics<'_>
) -> Option<Span>
[src]

helper method to determine the span to remove when suggesting the deletion of a lifetime

fn suggest_eliding_single_use_lifetime(
    &self,
    err: &mut DiagnosticBuilder<'_>,
    def_id: DefId,
    lifetime: &Lifetime
)
[src]

fn check_uses_for_lifetimes_defined_by_scope(&mut self)[src]

fn visit_early_late<F>(
    &mut self,
    parent_id: Option<HirId>,
    hir_id: HirId,
    decl: &'tcx FnDecl<'tcx>,
    generics: &'tcx Generics<'tcx>,
    walk: F
) where
    F: for<'b, 'c> FnOnce(&'b mut LifetimeContext<'c, 'tcx>), 
[src]

Visits self by adding a scope and handling recursive walk over the contents with walk.

Handles visiting fns and methods. These are a bit complicated because we must distinguish early- vs late-bound lifetime parameters. We do this by checking which lifetimes appear within type bounds; those are early bound lifetimes, and the rest are late bound.

For example:

fn foo<’a,’b,’c,T:Trait<’b>>(…)

Here 'a and 'c are late bound but 'b is early bound. Note that early- and late-bound lifetimes may be interspersed together.

If early bound lifetimes are present, we separate them into their own list (and likewise for late bound). They will be numbered sequentially, starting from the lowest index that is already in scope (for a fn item, that will be 0, but for a method it might not be). Late bound lifetimes are resolved by name and associated with a binder ID (binder_id), so the ordering is not important there.

fn next_early_index_helper(&self, only_opaque_type_parent: bool) -> u32[src]

fn next_early_index(&self) -> u32[src]

Returns the next index one would use for an early-bound-region if extending the current scope.

fn next_early_index_for_opaque_type(&self) -> u32[src]

Returns the next index one would use for an impl Trait that is being converted into an opaque type alias impl Trait. This will be the next early index from the enclosing item, for the most part. See the opaque_type_parent field for more info.

fn resolve_lifetime_ref(&mut self, lifetime_ref: &'tcx Lifetime)[src]

fn visit_segment_args(
    &mut self,
    res: Res,
    depth: usize,
    generic_args: &'tcx GenericArgs<'tcx>
)
[src]

fn supertrait_hrtb_lifetimes(
    tcx: TyCtxt<'tcx>,
    def_id: DefId,
    assoc_name: Ident
) -> Option<Vec<BoundVariableKind>>
[src]

Returns all the late-bound vars that come into scope from supertrait HRTBs, based on the associated type name and starting trait. For example, imagine we have

trait Foo<'a, 'b> {
  type As;
}
trait Bar<'b>: for<'a> Foo<'a, 'b> {}
trait Bar: for<'b> Bar<'b> {}

In this case, if we wanted to the supertrait HRTB lifetimes for As on the starting trait Bar, we would return Some(['b, 'a]).

fn visit_fn_like_elision(
    &mut self,
    inputs: &'tcx [Ty<'tcx>],
    output: Option<&'tcx Ty<'tcx>>
)
[src]

fn resolve_elided_lifetimes(&mut self, lifetime_refs: &[&'tcx Lifetime])[src]

fn report_elision_failure(
    &mut self,
    db: &mut DiagnosticBuilder<'_>,
    params: &[ElisionFailureInfo]
) -> bool
[src]

fn resolve_object_lifetime_default(&mut self, lifetime_ref: &'tcx Lifetime)[src]

fn check_lifetime_params(
    &mut self,
    old_scope: &'_ Scope<'_>,
    params: &'tcx [GenericParam<'tcx>]
)
[src]

fn check_lifetime_param_for_shadowing(
    &self,
    old_scope: &'_ Scope<'_>,
    param: &'tcx GenericParam<'tcx>
)
[src]

fn track_lifetime_uses(&self) -> bool[src]

Returns true if, in the current scope, replacing '_ would be equivalent to a single-use lifetime.

fn insert_lifetime(&mut self, lifetime_ref: &'tcx Lifetime, def: Region)[src]

fn uninsert_lifetime_on_error(
    &mut self,
    lifetime_ref: &'tcx Lifetime,
    bad_def: Region
)
[src]

Sometimes we resolve a lifetime, but later find that it is an error (esp. around impl trait). In that case, we remove the entry into map.defs so as not to confuse later code.

Trait Implementations

impl<'a, 'tcx> Visitor<'tcx> for LifetimeContext<'a, 'tcx>[src]

type Map = Map<'tcx>

fn nested_visit_map(&mut self) -> NestedVisitorMap<Self::Map>[src]

The default versions of the visit_nested_XXX routines invoke this method to get a map to use. By selecting an enum variant, you control which kinds of nested HIR are visited; see NestedVisitorMap for details. By “nested HIR”, we are referring to bits of HIR that are not directly embedded within one another but rather indirectly, through a table in the crate. This is done to control dependencies during incremental compilation: the non-inline bits of HIR can be tracked and hashed separately. Read more

fn visit_nested_item(&mut self, _: ItemId)[src]

Invoked when a nested item is encountered. By default does nothing unless you override nested_visit_map to return other than None, in which case it will walk the item. You probably don’t want to override this method – instead, override nested_visit_map or use the “shallow” or “deep” visit patterns described on itemlikevisit::ItemLikeVisitor. The only reason to override this method is if you want a nested pattern but cannot supply a Map; see nested_visit_map for advice. Read more

fn visit_trait_item_ref(&mut self, ii: &'tcx TraitItemRef)[src]

fn visit_nested_body(&mut self, body: BodyId)[src]

Invoked to visit the body of a function, method or closure. Like visit_nested_item, does nothing by default unless you override nested_visit_map to return other than None, in which case it will walk the body. Read more

fn visit_fn(
    &mut self,
    fk: FnKind<'tcx>,
    fd: &'tcx FnDecl<'tcx>,
    b: BodyId,
    s: Span,
    hir_id: HirId
)
[src]

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

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

fn visit_foreign_item(&mut self, item: &'tcx ForeignItem<'tcx>)[src]

fn visit_ty(&mut self, ty: &'tcx Ty<'tcx>)[src]

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

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

fn visit_lifetime(&mut self, lifetime_ref: &'tcx Lifetime)[src]

fn visit_path(&mut self, path: &'tcx Path<'tcx>, _: HirId)[src]

fn visit_fn_decl(&mut self, fd: &'tcx FnDecl<'tcx>)[src]

fn visit_generics(&mut self, generics: &'tcx Generics<'tcx>)[src]

fn visit_param_bound(&mut self, bound: &'tcx GenericBound<'tcx>)[src]

fn visit_poly_trait_ref(
    &mut self,
    trait_ref: &'tcx PolyTraitRef<'tcx>,
    _modifier: TraitBoundModifier
)
[src]

fn visit_nested_trait_item(&mut self, id: TraitItemId)[src]

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

fn visit_nested_impl_item(&mut self, id: ImplItemId)[src]

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

fn visit_nested_foreign_item(&mut self, id: ForeignItemId)[src]

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

fn visit_param(&mut self, param: &'v Param<'v>)[src]

fn visit_body(&mut self, b: &'v Body<'v>)[src]

fn as_deep_visitor(&mut self) -> DeepVisitor<'_, Self>[src]

When invoking visit_all_item_likes(), you need to supply an item-like visitor. This method converts a “intra-visit” visitor into an item-like visitor that walks the entire tree. If you use this, you probably don’t want to process the contents of nested item-like things, since the outer loop will visit them as well. Read more

fn visit_id(&mut self, _hir_id: HirId)[src]

fn visit_name(&mut self, _span: Span, _name: Symbol)[src]

fn visit_ident(&mut self, ident: Ident)[src]

fn visit_mod(&mut self, m: &'v Mod<'v>, _s: Span, n: HirId)[src]

fn visit_local(&mut self, l: &'v Local<'v>)[src]

fn visit_block(&mut self, b: &'v Block<'v>)[src]

fn visit_stmt(&mut self, s: &'v Stmt<'v>)[src]

fn visit_arm(&mut self, a: &'v Arm<'v>)[src]

fn visit_pat(&mut self, p: &'v Pat<'v>)[src]

fn visit_anon_const(&mut self, c: &'v AnonConst)[src]

fn visit_expr(&mut self, ex: &'v Expr<'v>)[src]

fn visit_generic_param(&mut self, p: &'v GenericParam<'v>)[src]

fn visit_const_param_default(&mut self, _param: HirId, ct: &'v AnonConst)[src]

fn visit_where_predicate(&mut self, predicate: &'v WherePredicate<'v>)[src]

fn visit_use(&mut self, path: &'v Path<'v>, hir_id: HirId)[src]

fn visit_foreign_item_ref(&mut self, ii: &'v ForeignItemRef<'v>)[src]

fn visit_impl_item_ref(&mut self, ii: &'v ImplItemRef<'v>)[src]

fn visit_trait_ref(&mut self, t: &'v TraitRef<'v>)[src]

fn visit_variant_data(
    &mut self,
    s: &'v VariantData<'v>,
    Symbol,
    &'v Generics<'v>,
    _parent_id: HirId,
    Span
)
[src]

fn visit_field_def(&mut self, s: &'v FieldDef<'v>)[src]

fn visit_enum_def(
    &mut self,
    enum_definition: &'v EnumDef<'v>,
    generics: &'v Generics<'v>,
    item_id: HirId,
    Span
)
[src]

fn visit_variant(
    &mut self,
    v: &'v Variant<'v>,
    g: &'v Generics<'v>,
    item_id: HirId
)
[src]

fn visit_label(&mut self, label: &'v Label)[src]

fn visit_generic_arg(&mut self, generic_arg: &'v GenericArg<'v>)[src]

fn visit_qpath(&mut self, qpath: &'v QPath<'v>, id: HirId, span: Span)[src]

fn visit_path_segment(
    &mut self,
    path_span: Span,
    path_segment: &'v PathSegment<'v>
)
[src]

fn visit_generic_args(
    &mut self,
    path_span: Span,
    generic_args: &'v GenericArgs<'v>
)
[src]

fn visit_assoc_type_binding(&mut self, type_binding: &'v TypeBinding<'v>)[src]

fn visit_attribute(&mut self, _id: HirId, _attr: &'v Attribute)[src]

fn visit_macro_def(&mut self, macro_def: &'v MacroDef<'v>)[src]

fn visit_vis(&mut self, vis: &'v Spanned<VisibilityKind<'v>>)[src]

fn visit_associated_item_kind(&mut self, kind: &'v AssocItemKind)[src]

fn visit_defaultness(&mut self, defaultness: &'v Defaultness)[src]

Auto Trait Implementations

impl<'a, 'tcx> !RefUnwindSafe for LifetimeContext<'a, 'tcx>

impl<'a, 'tcx> !Send for LifetimeContext<'a, 'tcx>

impl<'a, 'tcx> !Sync for LifetimeContext<'a, 'tcx>

impl<'a, 'tcx> Unpin for LifetimeContext<'a, 'tcx> where
    'tcx: 'a, 

impl<'a, 'tcx> !UnwindSafe for LifetimeContext<'a, 'tcx>

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized, 
[src]

pub fn type_id(&self) -> TypeId[src]

Gets the TypeId of self. Read more

impl<T> Borrow<T> for T where
    T: ?Sized, 
[src]

pub fn borrow(&self) -> &T[src]

Immutably borrows from an owned value. Read more

impl<T> BorrowMut<T> for T where
    T: ?Sized, 
[src]

pub fn borrow_mut(&mut self) -> &mut T[src]

Mutably borrows from an owned value. Read more

impl<T> From<T> for T[src]

pub fn from(t: T) -> T[src]

Performs the conversion.

impl<T, U> Into<U> for T where
    U: From<T>, 
[src]

pub fn into(self) -> U[src]

Performs the conversion.

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

pub fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>[src]

Performs the conversion.

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

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

The type returned in the event of a conversion error.

pub fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>[src]

Performs the conversion.