[−][src]Struct rustc_resolve::late::lifetimes::LifetimeContext
Fields
tcx: TyCtxt<'tcx>map: &'a mut NamedRegionMapscope: &'a Scope<'a>trait_ref_hack: boolThis 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: boolUsed 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]
&self,
span: Span,
count: usize
) -> DiagnosticBuilder<'tcx>
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]
&self,
lifetime_ref: &Lifetime
)
pub(crate) fn is_trait_ref_fn_scope(
&mut self,
trait_ref: &'tcx PolyTraitRef<'tcx>
) -> bool[src]
&mut self,
trait_ref: &'tcx PolyTraitRef<'tcx>
) -> bool
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]
&self,
err: &mut DiagnosticBuilder<'_>,
span: Span,
count: usize,
lifetime_names: &FxHashSet<Symbol>,
lifetime_spans: Vec<Span>,
params: &[ElisionFailureInfo]
)
pub(crate) fn maybe_emit_forbidden_non_static_lifetime_error(
&self,
body_id: BodyId,
lifetime_ref: &'tcx Lifetime
)[src]
&self,
body_id: BodyId,
lifetime_ref: &'tcx Lifetime
)
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]
&mut self,
f: F
) where
F: for<'b> FnOnce(&mut LifetimeContext<'b, 'tcx>),
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]
&mut self,
wrap_scope: Scope<'_>,
f: F
) where
F: for<'b> FnOnce(&'_ Scope<'_>, &mut LifetimeContext<'b, 'tcx>),
pub(in late::lifetimes) fn lifetime_deletion_span(
&self,
name: Ident,
generics: &Generics<'_>
) -> Option<Span>[src]
&self,
name: Ident,
generics: &Generics<'_>
) -> Option<Span>
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]
&self,
err: &mut DiagnosticBuilder<'_>,
def_id: DefId,
lifetime: &Lifetime
)
pub(in late::lifetimes) fn check_uses_for_lifetimes_defined_by_scope(
&mut self
)[src]
&mut self
)
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]
&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>),
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]
&self,
only_opaque_type_parent: bool
) -> u32
pub(in late::lifetimes) fn next_early_index(
&self
) -> u32[src]
&self
) -> u32
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]
&self
) -> u32
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]
&mut self,
lifetime_ref: &'tcx Lifetime
)
pub(in late::lifetimes) fn visit_segment_args(
&mut self,
res: Res,
depth: usize,
generic_args: &'tcx GenericArgs<'tcx>
)[src]
&mut self,
res: Res,
depth: usize,
generic_args: &'tcx GenericArgs<'tcx>
)
pub(in late::lifetimes) fn visit_fn_like_elision(
&mut self,
inputs: &'tcx [Ty<'tcx>],
output: Option<&'tcx Ty<'tcx>>
)[src]
&mut self,
inputs: &'tcx [Ty<'tcx>],
output: Option<&'tcx Ty<'tcx>>
)
pub(in late::lifetimes) fn resolve_elided_lifetimes(
&mut self,
lifetime_refs: Vec<&'tcx Lifetime>
)[src]
&mut self,
lifetime_refs: Vec<&'tcx Lifetime>
)
pub(in late::lifetimes) fn report_elision_failure(
&mut self,
db: &mut DiagnosticBuilder<'_>,
params: &[ElisionFailureInfo]
) -> bool[src]
&mut self,
db: &mut DiagnosticBuilder<'_>,
params: &[ElisionFailureInfo]
) -> bool
pub(in late::lifetimes) fn resolve_object_lifetime_default(
&mut self,
lifetime_ref: &'tcx Lifetime
)[src]
&mut self,
lifetime_ref: &'tcx Lifetime
)
pub(in late::lifetimes) fn check_lifetime_params(
&mut self,
old_scope: &'_ Scope<'_>,
params: &'tcx [GenericParam<'tcx>]
)[src]
&mut self,
old_scope: &'_ Scope<'_>,
params: &'tcx [GenericParam<'tcx>]
)
pub(in late::lifetimes) fn check_lifetime_param_for_shadowing(
&self,
old_scope: &'_ Scope<'_>,
param: &'tcx GenericParam<'tcx>
)[src]
&self,
old_scope: &'_ Scope<'_>,
param: &'tcx GenericParam<'tcx>
)
pub(in late::lifetimes) fn track_lifetime_uses(
&self
) -> bool[src]
&self
) -> bool
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]
&mut self,
lifetime_ref: &'tcx Lifetime,
def: Region
)
pub(in late::lifetimes) fn uninsert_lifetime_on_error(
&mut self,
lifetime_ref: &'tcx Lifetime,
bad_def: Region
)[src]
&mut self,
lifetime_ref: &'tcx Lifetime,
bad_def: Region
)
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>
pub fn nested_visit_map(&mut self) -> NestedVisitorMap<Self::Map>[src]
pub fn visit_nested_item(&mut self, _: ItemId)[src]
pub fn visit_nested_body(&mut self, body: BodyId)[src]
pub fn visit_item(&mut self, item: &'tcx Item<'tcx>)[src]
pub fn visit_foreign_item(&mut self, item: &'tcx ForeignItem<'tcx>)[src]
pub fn visit_ty(&mut self, ty: &'tcx Ty<'tcx>)[src]
pub fn visit_trait_item(&mut self, trait_item: &'tcx TraitItem<'tcx>)[src]
pub fn visit_impl_item(&mut self, impl_item: &'tcx ImplItem<'tcx>)[src]
pub fn visit_lifetime(&mut self, lifetime_ref: &'tcx Lifetime)[src]
pub fn visit_path(&mut self, path: &'tcx Path<'tcx>, _: HirId)[src]
pub fn visit_fn_decl(&mut self, fd: &'tcx FnDecl<'tcx>)[src]
pub fn visit_generics(&mut self, generics: &'tcx Generics<'tcx>)[src]
pub fn visit_param_bound(&mut self, bound: &'tcx GenericBound<'tcx>)[src]
pub fn visit_poly_trait_ref(
&mut self,
trait_ref: &'tcx PolyTraitRef<'tcx>,
_modifier: TraitBoundModifier
)[src]
&mut self,
trait_ref: &'tcx PolyTraitRef<'tcx>,
_modifier: TraitBoundModifier
)
pub fn visit_nested_trait_item(&mut self, id: TraitItemId)[src]
pub fn visit_nested_impl_item(&mut self, id: ImplItemId)[src]
pub fn visit_param(&mut self, param: &'v Param<'v>)[src]
pub fn visit_body(&mut self, b: &'v Body<'v>)[src]
pub fn as_deep_visitor(&mut self) -> DeepVisitor<'_, Self>[src]
pub fn visit_id(&mut self, _hir_id: HirId)[src]
pub fn visit_name(&mut self, _span: Span, _name: Symbol)[src]
pub fn visit_ident(&mut self, ident: Ident)[src]
pub fn visit_mod(&mut self, m: &'v Mod<'v>, _s: Span, n: HirId)[src]
pub fn visit_local(&mut self, l: &'v Local<'v>)[src]
pub fn visit_block(&mut self, b: &'v Block<'v>)[src]
pub fn visit_stmt(&mut self, s: &'v Stmt<'v>)[src]
pub fn visit_arm(&mut self, a: &'v Arm<'v>)[src]
pub fn visit_pat(&mut self, p: &'v Pat<'v>)[src]
pub fn visit_anon_const(&mut self, c: &'v AnonConst)[src]
pub fn visit_expr(&mut self, ex: &'v Expr<'v>)[src]
pub fn visit_generic_param(&mut self, p: &'v GenericParam<'v>)[src]
pub fn visit_where_predicate(&mut self, predicate: &'v WherePredicate<'v>)[src]
pub fn visit_fn(
&mut self,
fk: FnKind<'v>,
fd: &'v FnDecl<'v>,
b: BodyId,
s: Span,
id: HirId
)[src]
&mut self,
fk: FnKind<'v>,
fd: &'v FnDecl<'v>,
b: BodyId,
s: Span,
id: HirId
)
pub fn visit_use(&mut self, path: &'v Path<'v>, hir_id: HirId)[src]
pub fn visit_trait_item_ref(&mut self, ii: &'v TraitItemRef)[src]
pub fn visit_impl_item_ref(&mut self, ii: &'v ImplItemRef<'v>)[src]
pub fn visit_trait_ref(&mut self, t: &'v TraitRef<'v>)[src]
pub fn visit_variant_data(
&mut self,
s: &'v VariantData<'v>,
Symbol,
&'v Generics<'v>,
_parent_id: HirId,
Span
)[src]
&mut self,
s: &'v VariantData<'v>,
Symbol,
&'v Generics<'v>,
_parent_id: HirId,
Span
)
pub fn visit_struct_field(&mut self, s: &'v StructField<'v>)[src]
pub fn visit_enum_def(
&mut self,
enum_definition: &'v EnumDef<'v>,
generics: &'v Generics<'v>,
item_id: HirId,
Span
)[src]
&mut self,
enum_definition: &'v EnumDef<'v>,
generics: &'v Generics<'v>,
item_id: HirId,
Span
)
pub fn visit_variant(
&mut self,
v: &'v Variant<'v>,
g: &'v Generics<'v>,
item_id: HirId
)[src]
&mut self,
v: &'v Variant<'v>,
g: &'v Generics<'v>,
item_id: HirId
)
pub fn visit_label(&mut self, label: &'v Label)[src]
pub fn visit_generic_arg(&mut self, generic_arg: &'v GenericArg<'v>)[src]
pub fn visit_qpath(&mut self, qpath: &'v QPath<'v>, id: HirId, span: Span)[src]
pub fn visit_path_segment(
&mut self,
path_span: Span,
path_segment: &'v PathSegment<'v>
)[src]
&mut self,
path_span: Span,
path_segment: &'v PathSegment<'v>
)
pub fn visit_generic_args(
&mut self,
path_span: Span,
generic_args: &'v GenericArgs<'v>
)[src]
&mut self,
path_span: Span,
generic_args: &'v GenericArgs<'v>
)
pub fn visit_assoc_type_binding(&mut self, type_binding: &'v TypeBinding<'v>)[src]
pub fn visit_attribute(&mut self, _attr: &'v Attribute)[src]
pub fn visit_macro_def(&mut self, macro_def: &'v MacroDef<'v>)[src]
pub fn visit_vis(&mut self, vis: &'v Spanned<VisibilityKind<'v>>)[src]
pub fn visit_associated_item_kind(&mut self, kind: &'v AssocItemKind)[src]
pub 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,
'tcx: 'a,
impl<'a, 'tcx> !UnwindSafe for LifetimeContext<'a, 'tcx>
Blanket Implementations
impl<T> Any for T where
T: 'static + ?Sized, [src]
T: 'static + ?Sized,
impl<T> Borrow<T> for T where
T: ?Sized, [src]
T: ?Sized,
impl<T> BorrowMut<T> for T where
T: ?Sized, [src]
T: ?Sized,
pub fn borrow_mut(&mut self) -> &mut T[src]
impl<T> From<T> for T[src]
impl<T, U> Into<U> for T where
U: From<T>, [src]
U: From<T>,
impl<T, U> TryFrom<U> for T where
U: Into<T>, [src]
U: Into<T>,
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]
impl<T, U> TryInto<U> for T where
U: TryFrom<T>, [src]
U: TryFrom<T>,