Skip to content

Commit 953a6b3

Browse files
authored
Rollup merge of rust-lang#101496 - spastorino:lower_lifetime_binder_api_changes, r=oli-obk
Allow lower_lifetime_binder receive a closure ``@oli-obk`` requested this and other changes as a way of simplifying rust-lang#101345. This is just going to make the diff of rust-lang#101345 smaller. r? ``@oli-obk`` ``@cjgillot``
2 parents b5ffbd3 + 36fa12f commit 953a6b3

File tree

2 files changed

+65
-51
lines changed

2 files changed

+65
-51
lines changed

compiler/rustc_ast_lowering/src/expr.rs

+32-31
Original file line numberDiff line numberDiff line change
@@ -849,21 +849,22 @@ impl<'hir> LoweringContext<'_, 'hir> {
849849
(body_id, generator_option)
850850
});
851851

852-
let bound_generic_params = self.lower_lifetime_binder(closure_id, generic_params);
853-
// Lower outside new scope to preserve `is_in_loop_condition`.
854-
let fn_decl = self.lower_fn_decl(decl, None, FnDeclKind::Closure, None);
855-
856-
let c = self.arena.alloc(hir::Closure {
857-
binder: binder_clause,
858-
capture_clause,
859-
bound_generic_params,
860-
fn_decl,
861-
body: body_id,
862-
fn_decl_span: self.lower_span(fn_decl_span),
863-
movability: generator_option,
864-
});
852+
self.lower_lifetime_binder(closure_id, generic_params, |lctx, bound_generic_params| {
853+
// Lower outside new scope to preserve `is_in_loop_condition`.
854+
let fn_decl = lctx.lower_fn_decl(decl, None, FnDeclKind::Closure, None);
855+
856+
let c = lctx.arena.alloc(hir::Closure {
857+
binder: binder_clause,
858+
capture_clause,
859+
bound_generic_params,
860+
fn_decl,
861+
body: body_id,
862+
fn_decl_span: lctx.lower_span(fn_decl_span),
863+
movability: generator_option,
864+
});
865865

866-
hir::ExprKind::Closure(c)
866+
hir::ExprKind::Closure(c)
867+
})
867868
}
868869

869870
fn generator_movability_for_fn(
@@ -950,23 +951,23 @@ impl<'hir> LoweringContext<'_, 'hir> {
950951
body_id
951952
});
952953

953-
let bound_generic_params = self.lower_lifetime_binder(closure_id, generic_params);
954-
955-
// We need to lower the declaration outside the new scope, because we
956-
// have to conserve the state of being inside a loop condition for the
957-
// closure argument types.
958-
let fn_decl = self.lower_fn_decl(&outer_decl, None, FnDeclKind::Closure, None);
959-
960-
let c = self.arena.alloc(hir::Closure {
961-
binder: binder_clause,
962-
capture_clause,
963-
bound_generic_params,
964-
fn_decl,
965-
body,
966-
fn_decl_span: self.lower_span(fn_decl_span),
967-
movability: None,
968-
});
969-
hir::ExprKind::Closure(c)
954+
self.lower_lifetime_binder(closure_id, generic_params, |lctx, bound_generic_params| {
955+
// We need to lower the declaration outside the new scope, because we
956+
// have to conserve the state of being inside a loop condition for the
957+
// closure argument types.
958+
let fn_decl = lctx.lower_fn_decl(&outer_decl, None, FnDeclKind::Closure, None);
959+
960+
let c = lctx.arena.alloc(hir::Closure {
961+
binder: binder_clause,
962+
capture_clause,
963+
bound_generic_params,
964+
fn_decl,
965+
body,
966+
fn_decl_span: lctx.lower_span(fn_decl_span),
967+
movability: None,
968+
});
969+
hir::ExprKind::Closure(c)
970+
})
970971
}
971972

972973
/// Destructure the LHS of complex assignments.

compiler/rustc_ast_lowering/src/lib.rs

+33-20
Original file line numberDiff line numberDiff line change
@@ -810,23 +810,31 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
810810
/// name resolver owing to lifetime elision; this also populates the resolver's node-id->def-id
811811
/// map, so that later calls to `opt_node_id_to_def_id` that refer to these extra lifetime
812812
/// parameters will be successful.
813-
#[instrument(level = "debug", skip(self))]
813+
#[instrument(level = "debug", skip(self, in_binder))]
814814
#[inline]
815-
fn lower_lifetime_binder(
815+
fn lower_lifetime_binder<R>(
816816
&mut self,
817817
binder: NodeId,
818818
generic_params: &[GenericParam],
819-
) -> &'hir [hir::GenericParam<'hir>] {
820-
let mut generic_params: Vec<_> = self.lower_generic_params_mut(generic_params).collect();
819+
in_binder: impl FnOnce(&mut Self, &'hir [hir::GenericParam<'hir>]) -> R,
820+
) -> R {
821821
let extra_lifetimes = self.resolver.take_extra_lifetime_params(binder);
822822
debug!(?extra_lifetimes);
823-
generic_params.extend(extra_lifetimes.into_iter().filter_map(|(ident, node_id, res)| {
824-
self.lifetime_res_to_generic_param(ident, node_id, res)
825-
}));
823+
let extra_lifetimes: Vec<_> = extra_lifetimes
824+
.into_iter()
825+
.filter_map(|(ident, node_id, res)| {
826+
self.lifetime_res_to_generic_param(ident, node_id, res)
827+
})
828+
.collect();
829+
830+
let generic_params: Vec<_> = self
831+
.lower_generic_params_mut(generic_params)
832+
.chain(extra_lifetimes.into_iter())
833+
.collect();
826834
let generic_params = self.arena.alloc_from_iter(generic_params);
827835
debug!(?generic_params);
828836

829-
generic_params
837+
in_binder(self, generic_params)
830838
}
831839

832840
fn with_dyn_type_scope<T>(&mut self, in_scope: bool, f: impl FnOnce(&mut Self) -> T) -> T {
@@ -1236,14 +1244,15 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
12361244
hir::TyKind::Rptr(lifetime, self.lower_mt(mt, itctx))
12371245
}
12381246
TyKind::BareFn(ref f) => {
1239-
let generic_params = self.lower_lifetime_binder(t.id, &f.generic_params);
1240-
hir::TyKind::BareFn(self.arena.alloc(hir::BareFnTy {
1241-
generic_params,
1242-
unsafety: self.lower_unsafety(f.unsafety),
1243-
abi: self.lower_extern(f.ext),
1244-
decl: self.lower_fn_decl(&f.decl, None, FnDeclKind::Pointer, None),
1245-
param_names: self.lower_fn_params_to_names(&f.decl),
1246-
}))
1247+
self.lower_lifetime_binder(t.id, &f.generic_params, |lctx, generic_params| {
1248+
hir::TyKind::BareFn(lctx.arena.alloc(hir::BareFnTy {
1249+
generic_params,
1250+
unsafety: lctx.lower_unsafety(f.unsafety),
1251+
abi: lctx.lower_extern(f.ext),
1252+
decl: lctx.lower_fn_decl(&f.decl, None, FnDeclKind::Pointer, None),
1253+
param_names: lctx.lower_fn_params_to_names(&f.decl),
1254+
}))
1255+
})
12471256
}
12481257
TyKind::Never => hir::TyKind::Never,
12491258
TyKind::Tup(ref tys) => hir::TyKind::Tup(
@@ -2140,10 +2149,14 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
21402149
p: &PolyTraitRef,
21412150
itctx: &mut ImplTraitContext,
21422151
) -> hir::PolyTraitRef<'hir> {
2143-
let bound_generic_params =
2144-
self.lower_lifetime_binder(p.trait_ref.ref_id, &p.bound_generic_params);
2145-
let trait_ref = self.lower_trait_ref(&p.trait_ref, itctx);
2146-
hir::PolyTraitRef { bound_generic_params, trait_ref, span: self.lower_span(p.span) }
2152+
self.lower_lifetime_binder(
2153+
p.trait_ref.ref_id,
2154+
&p.bound_generic_params,
2155+
|lctx, bound_generic_params| {
2156+
let trait_ref = lctx.lower_trait_ref(&p.trait_ref, itctx);
2157+
hir::PolyTraitRef { bound_generic_params, trait_ref, span: lctx.lower_span(p.span) }
2158+
},
2159+
)
21472160
}
21482161

21492162
fn lower_mt(&mut self, mt: &MutTy, itctx: &mut ImplTraitContext) -> hir::MutTy<'hir> {

0 commit comments

Comments
 (0)