Skip to content

Commit 36c6c2c

Browse files
committed
Simplify collect_in_band_defs.
1 parent 887999d commit 36c6c2c

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

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

661-
let (in_band_ty_params, res) = f(self);
656+
let res = f(self);
662657

663658
self.is_collecting_in_band_lifetimes = false;
664-
self.anonymous_lifetime_mode = old_anonymous_lifetime_mode;
665-
666-
let lifetimes_to_define = self.lifetimes_to_define.split_off(0);
667659

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

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

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

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

0 commit comments

Comments
 (0)