Skip to content

Commit 6e7ec0c

Browse files
committed
Simplify collect_in_band_defs.
1 parent 0b6f079 commit 6e7ec0c

File tree

1 file changed

+35
-36
lines changed
  • compiler/rustc_ast_lowering/src

1 file changed

+35
-36
lines changed

compiler/rustc_ast_lowering/src/lib.rs

+35-36
Original file line numberDiff line numberDiff line change
@@ -646,31 +646,18 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
646646
/// parameter while `f` is running (and restored afterwards).
647647
fn collect_in_band_defs<T>(
648648
&mut self,
649-
parent_def_id: LocalDefId,
650-
anonymous_lifetime_mode: AnonymousLifetimeMode,
651-
f: impl FnOnce(&mut Self) -> (Vec<hir::GenericParam<'hir>>, T),
652-
) -> (Vec<hir::GenericParam<'hir>>, T) {
649+
f: impl FnOnce(&mut Self) -> T,
650+
) -> (Vec<(Span, ParamName)>, T) {
653651
assert!(!self.is_collecting_in_band_lifetimes);
654652
assert!(self.lifetimes_to_define.is_empty());
655-
let old_anonymous_lifetime_mode = self.anonymous_lifetime_mode;
656-
657-
self.anonymous_lifetime_mode = anonymous_lifetime_mode;
658653
self.is_collecting_in_band_lifetimes = true;
659654

660-
let (in_band_ty_params, res) = f(self);
655+
let res = f(self);
661656

662657
self.is_collecting_in_band_lifetimes = false;
663-
self.anonymous_lifetime_mode = old_anonymous_lifetime_mode;
664-
665-
let lifetimes_to_define = self.lifetimes_to_define.split_off(0);
666658

667-
let params = lifetimes_to_define
668-
.into_iter()
669-
.map(|(span, hir_name)| self.lifetime_to_generic_param(span, hir_name, parent_def_id))
670-
.chain(in_band_ty_params.into_iter())
671-
.collect();
672-
673-
(params, res)
659+
let lifetimes_to_define = std::mem::take(&mut self.lifetimes_to_define);
660+
(lifetimes_to_define, res)
674661
}
675662

676663
/// Converts a lifetime into a new generic parameter.
@@ -785,27 +772,39 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
785772
anonymous_lifetime_mode: AnonymousLifetimeMode,
786773
f: impl FnOnce(&mut Self, &mut Vec<hir::GenericParam<'hir>>) -> T,
787774
) -> (hir::Generics<'hir>, T) {
788-
let (in_band_defs, (mut lowered_generics, res)) =
789-
self.with_in_scope_lifetime_defs(&generics.params, |this| {
790-
this.collect_in_band_defs(parent_def_id, anonymous_lifetime_mode, |this| {
791-
let mut params = Vec::new();
792-
// Note: it is necessary to lower generics *before* calling `f`.
793-
// When lowering `async fn`, there's a final step when lowering
794-
// the return type that assumes that all in-scope lifetimes have
795-
// already been added to either `in_scope_lifetimes` or
796-
// `lifetimes_to_define`. If we swapped the order of these two,
797-
// in-band-lifetimes introduced by generics or where-clauses
798-
// wouldn't have been added yet.
799-
let generics = this.lower_generics_mut(
800-
generics,
801-
ImplTraitContext::Universal(&mut params, this.current_hir_id_owner),
802-
);
803-
let res = f(this, &mut params);
804-
(params, (generics, res))
775+
let (lifetimes_to_define, (mut lowered_generics, impl_trait_defs, res)) = self
776+
.collect_in_band_defs(|this| {
777+
this.with_anonymous_lifetime_mode(anonymous_lifetime_mode, |this| {
778+
this.with_in_scope_lifetime_defs(&generics.params, |this| {
779+
let mut impl_trait_defs = Vec::new();
780+
// Note: it is necessary to lower generics *before* calling `f`.
781+
// When lowering `async fn`, there's a final step when lowering
782+
// the return type that assumes that all in-scope lifetimes have
783+
// already been added to either `in_scope_lifetimes` or
784+
// `lifetimes_to_define`. If we swapped the order of these two,
785+
// in-band-lifetimes introduced by generics or where-clauses
786+
// wouldn't have been added yet.
787+
let generics = this.lower_generics_mut(
788+
generics,
789+
ImplTraitContext::Universal(
790+
&mut impl_trait_defs,
791+
this.current_hir_id_owner,
792+
),
793+
);
794+
let res = f(this, &mut impl_trait_defs);
795+
(generics, impl_trait_defs, res)
796+
})
805797
})
806798
});
807799

808-
lowered_generics.params.extend(in_band_defs);
800+
lowered_generics.params.extend(
801+
lifetimes_to_define
802+
.into_iter()
803+
.map(|(span, hir_name)| {
804+
self.lifetime_to_generic_param(span, hir_name, parent_def_id)
805+
})
806+
.chain(impl_trait_defs),
807+
);
809808

810809
let lowered_generics = lowered_generics.into_generics(self.arena);
811810
(lowered_generics, res)

0 commit comments

Comments
 (0)