Skip to content

Commit 9f17727

Browse files
committed
Simplify collect_in_band_defs.
1 parent 207c80f commit 9f17727

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
@@ -645,31 +645,18 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
645645
/// parameter while `f` is running (and restored afterwards).
646646
fn collect_in_band_defs<T>(
647647
&mut self,
648-
parent_def_id: LocalDefId,
649-
anonymous_lifetime_mode: AnonymousLifetimeMode,
650-
f: impl FnOnce(&mut Self) -> (Vec<hir::GenericParam<'hir>>, T),
651-
) -> (Vec<hir::GenericParam<'hir>>, T) {
648+
f: impl FnOnce(&mut Self) -> T,
649+
) -> (Vec<(Span, ParamName)>, T) {
652650
assert!(!self.is_collecting_in_band_lifetimes);
653651
assert!(self.lifetimes_to_define.is_empty());
654-
let old_anonymous_lifetime_mode = self.anonymous_lifetime_mode;
655-
656-
self.anonymous_lifetime_mode = anonymous_lifetime_mode;
657652
self.is_collecting_in_band_lifetimes = true;
658653

659-
let (in_band_ty_params, res) = f(self);
654+
let res = f(self);
660655

661656
self.is_collecting_in_band_lifetimes = false;
662-
self.anonymous_lifetime_mode = old_anonymous_lifetime_mode;
663-
664-
let lifetimes_to_define = self.lifetimes_to_define.split_off(0);
665657

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

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

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

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

0 commit comments

Comments
 (0)