Enum rustc_resolve::late::lifetimes::Scope [−][src]
enum Scope<'a> {
Binder {
lifetimes: FxHashMap<ParamName, Region>,
next_early_index: u32,
track_lifetime_uses: bool,
opaque_type_parent: bool,
scope_type: BinderScopeType,
hir_id: HirId,
s: &'a Scope<'a>,
},
Body {
id: BodyId,
s: &'a Scope<'a>,
},
Elision {
elide: Elide,
s: &'a Scope<'a>,
},
ObjectLifetimeDefault {
lifetime: Option<Region>,
s: &'a Scope<'a>,
},
Supertrait {
lifetimes: Vec<BoundVariableKind>,
s: &'a Scope<'a>,
},
TraitRefBoundary {
s: &'a Scope<'a>,
},
Root,
}Variants
Expand description
Declares lifetimes, and each can be early-bound or late-bound.
The DebruijnIndex of late-bound lifetimes starts at 1 and
it should be shifted by the number of Binders in between the
declaration Binder and the location it’s referenced from.
Show fields
Fields of Binder
lifetimes: FxHashMap<ParamName, Region>next_early_index: u32Expand description
if we extend this scope with another scope, what is the next index we should use for an early-bound region?
track_lifetime_uses: boolExpand description
Flag is set to true if, in this binder, '_ would be
equivalent to a “single-use region”. This is true on
impls, but not other kinds of items.
opaque_type_parent: boolExpand description
Whether or not this binder would serve as the parent binder for opaque types introduced within. For example:
fn foo<'a>() -> impl for<'b> Trait<Item = impl Trait2<'a>>
Here, the opaque types we create for the impl Trait
and impl Trait2 references will both have the foo item
as their parent. When we get to impl Trait2, we find
that it is nested within the for<> binder – this flag
allows us to skip that when looking for the parent binder
of the resulting opaque type.
scope_type: BinderScopeTypehir_id: HirIdExpand description
The late bound vars for a given item are stored by HirId to be
queried later. However, if we enter an elision scope, we have to
later append the elided bound vars to the list and need to know what
to append to.
s: &'a Scope<'a>Expand description
Lifetimes introduced by a fn are scoped to the call-site for that fn,
if this is a fn body, otherwise the original definitions are used.
Unspecified lifetimes are inferred, unless an elision scope is nested,
e.g., (&T, fn(&T) -> &T); becomes (&'_ T, for<'a> fn(&'a T) -> &'a T).
Expand description
A scope which either determines unspecified lifetimes or errors
on them (e.g., due to ambiguity). For more details, see Elide.
Expand description
Use a specific lifetime (if Some) or leave it unset (to be
inferred in a function body or potentially error outside one),
for the default choice of lifetime in a trait object type.
Expand description
When we have nested trait refs, we concanetate late bound vars for inner trait refs from outer ones. But we also need to include any HRTB lifetimes encountered when identifying the trait that an associated type is declared on.
Show fields
Fields of Supertrait
lifetimes: Vec<BoundVariableKind>s: &'a Scope<'a>Show fields
Fields of TraitRefBoundary
s: &'a Scope<'a>