diff --git a/compiler/rustc_ast_lowering/src/item.rs b/compiler/rustc_ast_lowering/src/item.rs index 014c240f11ee7..8daeef0cbd95f 100644 --- a/compiler/rustc_ast_lowering/src/item.rs +++ b/compiler/rustc_ast_lowering/src/item.rs @@ -26,44 +26,43 @@ pub(super) struct ItemLowerer<'a, 'lowering, 'hir> { } impl ItemLowerer<'_, '_, '_> { - fn with_trait_impl_ref(&mut self, impl_ref: &Option, f: impl FnOnce(&mut Self)) { + fn with_trait_impl_ref( + &mut self, + impl_ref: &Option, + f: impl FnOnce(&mut Self) -> T, + ) -> T { let old = self.lctx.is_in_trait_impl; self.lctx.is_in_trait_impl = impl_ref.is_some(); - f(self); + let ret = f(self); self.lctx.is_in_trait_impl = old; + ret } } impl<'a> Visitor<'a> for ItemLowerer<'a, '_, '_> { fn visit_item(&mut self, item: &'a Item) { - let mut item_hir_id = None; - self.lctx.with_hir_id_owner(item.id, |lctx| { + let hir_id = self.lctx.with_hir_id_owner(item.id, |lctx| { lctx.without_in_scope_lifetime_defs(|lctx| { - if let Some(hir_item) = lctx.lower_item(item) { - let id = lctx.insert_item(hir_item); - item_hir_id = Some(id); - } + let hir_item = lctx.lower_item(item); + lctx.insert_item(hir_item) }) }); - if let Some(hir_id) = item_hir_id { - self.lctx.with_parent_item_lifetime_defs(hir_id, |this| { - let this = &mut ItemLowerer { lctx: this }; - match item.kind { - ItemKind::Mod(..) => { - let def_id = this.lctx.lower_node_id(item.id).expect_owner(); - let old_current_module = - mem::replace(&mut this.lctx.current_module, def_id); - visit::walk_item(this, item); - this.lctx.current_module = old_current_module; - } - ItemKind::Impl(box ImplKind { ref of_trait, .. }) => { - this.with_trait_impl_ref(of_trait, |this| visit::walk_item(this, item)); - } - _ => visit::walk_item(this, item), + self.lctx.with_parent_item_lifetime_defs(hir_id, |this| { + let this = &mut ItemLowerer { lctx: this }; + match item.kind { + ItemKind::Mod(..) => { + let def_id = this.lctx.lower_node_id(item.id).expect_owner(); + let old_current_module = mem::replace(&mut this.lctx.current_module, def_id); + visit::walk_item(this, item); + this.lctx.current_module = old_current_module; } - }); - } + ItemKind::Impl(box ImplKind { ref of_trait, .. }) => { + this.with_trait_impl_ref(of_trait, |this| visit::walk_item(this, item)); + } + _ => visit::walk_item(this, item), + } + }); } fn visit_fn(&mut self, fk: FnKind<'a>, sp: Span, _: NodeId) { @@ -113,7 +112,7 @@ impl<'hir> LoweringContext<'_, 'hir> { fn with_parent_item_lifetime_defs( &mut self, parent_hir_id: hir::ItemId, - f: impl FnOnce(&mut LoweringContext<'_, '_>) -> T, + f: impl FnOnce(&mut Self) -> T, ) -> T { let old_len = self.in_scope_lifetimes.len(); @@ -137,10 +136,7 @@ impl<'hir> LoweringContext<'_, 'hir> { // Clears (and restores) the `in_scope_lifetimes` field. Used when // visiting nested items, which never inherit in-scope lifetimes // from their surrounding environment. - fn without_in_scope_lifetime_defs( - &mut self, - f: impl FnOnce(&mut LoweringContext<'_, '_>) -> T, - ) -> T { + fn without_in_scope_lifetime_defs(&mut self, f: impl FnOnce(&mut Self) -> T) -> T { let old_in_scope_lifetimes = mem::replace(&mut self.in_scope_lifetimes, vec![]); // this vector is only used when walking over impl headers, @@ -208,19 +204,19 @@ impl<'hir> LoweringContext<'_, 'hir> { } } - pub fn lower_item(&mut self, i: &Item) -> Option> { + pub fn lower_item(&mut self, i: &Item) -> hir::Item<'hir> { let mut ident = i.ident; let mut vis = self.lower_visibility(&i.vis, None); let hir_id = self.lower_node_id(i.id); let attrs = self.lower_attrs(hir_id, &i.attrs); let kind = self.lower_item_kind(i.span, i.id, hir_id, &mut ident, attrs, &mut vis, &i.kind); - Some(hir::Item { + hir::Item { def_id: hir_id.expect_owner(), ident: self.lower_ident(ident), kind, vis, span: self.lower_span(i.span), - }) + } } fn lower_item_kind(