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

pub(crate) struct LifetimeContext<'a, 'tcx> {
    pub(crate) tcx: TyCtxt<'tcx>,
    map: &'a mut NamedRegionMap,
    scope: &'a Scope<'a>,
    trait_ref_hack: bool,
    is_in_fn_syntax: bool,
    is_in_const_generic: 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>trait_ref_hack: bool

This is slightly complicated. Our representation for poly-trait-refs contains a single binder and thus we only allow a single level of quantification. However, the syntax of Rust permits quantification in two places, e.g., T: for <'a> Foo<'a> and for <'a, 'b> &'b T: Foo<'a>. In order to get the De Bruijn indices correct when representing these constraints, we should only introduce one scope. However, we want to support both locations for the quantifier and during lifetime resolution we want precise information (so we can't desugar in an earlier phase).

So, if we encounter a quantifier at the outer scope, we set trait_ref_hack to true (and introduce a scope), and then if we encounter a quantifier at the inner scope, we error. If trait_ref_hack is false, then we introduce the scope at the inner quantifier.

is_in_fn_syntax: bool

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

is_in_const_generic: boollabels_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

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

pub(crate) fn report_missing_lifetime_specifiers(
    &self,
    span: 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<'_>,
    span: Span,
    count: 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 so this function will emit an error if min_const_generics is enabled, the body identified by body_id is an anonymous constant and lifetime_ref is non-static.

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

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

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

pub(in late::lifetimes) 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

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

pub(in late::lifetimes) fn check_uses_for_lifetimes_defined_by_scope(
    &mut self
)
[src]

pub(in late::lifetimes) fn visit_early_late<F>(
    &mut self,
    parent_id: Option<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.

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

pub(in late::lifetimes) fn next_early_index(
    &self
) -> u32
[src]

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

pub(in late::lifetimes) 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.

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

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

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

pub(in late::lifetimes) fn resolve_elided_lifetimes(
    &mut self,
    lifetime_refs: Vec<&'tcx Lifetime>
)
[src]

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

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

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

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

pub(in late::lifetimes) fn track_lifetime_uses(
    &self
) -> bool
[src]

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

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

pub(in late::lifetimes) 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>

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]

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

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

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

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

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.

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.