Skip to content

Commit 36fa12f

Browse files
committed
Allow lower_lifetime_binder receive a closure
1 parent 3c72788 commit 36fa12f

File tree

2 files changed

+65
-51
lines changed

2 files changed

+65
-51
lines changed

Diff for: compiler/rustc_ast_lowering/src/expr.rs

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

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

864-
hir::ExprKind::Closure(c)
864+
hir::ExprKind::Closure(c)
865+
})
865866
}
866867

867868
fn generator_movability_for_fn(
@@ -948,23 +949,23 @@ impl<'hir> LoweringContext<'_, 'hir> {
948949
body_id
949950
});
950951

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

970971
/// Destructure the LHS of complex assignments.

Diff for: compiler/rustc_ast_lowering/src/lib.rs

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

827-
generic_params
835+
in_binder(self, generic_params)
828836
}
829837

830838
fn with_dyn_type_scope<T>(&mut self, in_scope: bool, f: impl FnOnce(&mut Self) -> T) -> T {
@@ -1233,14 +1241,15 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
12331241
hir::TyKind::Rptr(lifetime, self.lower_mt(mt, itctx))
12341242
}
12351243
TyKind::BareFn(ref f) => {
1236-
let generic_params = self.lower_lifetime_binder(t.id, &f.generic_params);
1237-
hir::TyKind::BareFn(self.arena.alloc(hir::BareFnTy {
1238-
generic_params,
1239-
unsafety: self.lower_unsafety(f.unsafety),
1240-
abi: self.lower_extern(f.ext),
1241-
decl: self.lower_fn_decl(&f.decl, None, FnDeclKind::Pointer, None),
1242-
param_names: self.lower_fn_params_to_names(&f.decl),
1243-
}))
1244+
self.lower_lifetime_binder(t.id, &f.generic_params, |lctx, generic_params| {
1245+
hir::TyKind::BareFn(lctx.arena.alloc(hir::BareFnTy {
1246+
generic_params,
1247+
unsafety: lctx.lower_unsafety(f.unsafety),
1248+
abi: lctx.lower_extern(f.ext),
1249+
decl: lctx.lower_fn_decl(&f.decl, None, FnDeclKind::Pointer, None),
1250+
param_names: lctx.lower_fn_params_to_names(&f.decl),
1251+
}))
1252+
})
12441253
}
12451254
TyKind::Never => hir::TyKind::Never,
12461255
TyKind::Tup(ref tys) => hir::TyKind::Tup(
@@ -2133,10 +2142,14 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
21332142
p: &PolyTraitRef,
21342143
itctx: ImplTraitContext,
21352144
) -> hir::PolyTraitRef<'hir> {
2136-
let bound_generic_params =
2137-
self.lower_lifetime_binder(p.trait_ref.ref_id, &p.bound_generic_params);
2138-
let trait_ref = self.lower_trait_ref(&p.trait_ref, itctx);
2139-
hir::PolyTraitRef { bound_generic_params, trait_ref, span: self.lower_span(p.span) }
2145+
self.lower_lifetime_binder(
2146+
p.trait_ref.ref_id,
2147+
&p.bound_generic_params,
2148+
|lctx, bound_generic_params| {
2149+
let trait_ref = lctx.lower_trait_ref(&p.trait_ref, itctx);
2150+
hir::PolyTraitRef { bound_generic_params, trait_ref, span: lctx.lower_span(p.span) }
2151+
},
2152+
)
21402153
}
21412154

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

0 commit comments

Comments
 (0)