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

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

is_in_const_generic: booltrait_definition_only: bool

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>

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

xcrate_object_lifetime_defaults: DefIdMap<Vec<ObjectLifetimeDefault>>

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

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

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

Implementations

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

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

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

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.

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

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.

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]).

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

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

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

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

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

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

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

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

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

When invoking visit_all_item_likes(), you need to supply an item-like visitor. This method converts an “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

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

Performs the conversion.

Performs the conversion.

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