Skip to content

Commit 5f9b921

Browse files
Revert "Lift #[macro_export] macros to top level in HIR"
This reverts commit d493c1b.
1 parent e26ce59 commit 5f9b921

File tree

3 files changed

+81
-162
lines changed

3 files changed

+81
-162
lines changed

compiler/rustc_ast_lowering/src/item.rs

Lines changed: 54 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ use rustc_data_structures::fx::FxHashSet;
1010
use rustc_errors::struct_span_err;
1111
use rustc_hir as hir;
1212
use rustc_hir::def::{DefKind, Res};
13-
use rustc_hir::def_id::{LocalDefId, CRATE_DEF_ID};
13+
use rustc_hir::def_id::LocalDefId;
1414
use rustc_span::source_map::{respan, DesugaringKind};
1515
use rustc_span::symbol::{kw, sym, Ident};
1616
use rustc_span::Span;
@@ -26,44 +26,44 @@ pub(super) struct ItemLowerer<'a, 'lowering, 'hir> {
2626
}
2727

2828
impl ItemLowerer<'_, '_, '_> {
29-
fn with_trait_impl_ref<T>(
30-
&mut self,
31-
impl_ref: &Option<TraitRef>,
32-
f: impl FnOnce(&mut Self) -> T,
33-
) -> T {
29+
fn with_trait_impl_ref(&mut self, impl_ref: &Option<TraitRef>, f: impl FnOnce(&mut Self)) {
3430
let old = self.lctx.is_in_trait_impl;
3531
self.lctx.is_in_trait_impl = impl_ref.is_some();
36-
let ret = f(self);
32+
f(self);
3733
self.lctx.is_in_trait_impl = old;
38-
ret
3934
}
4035
}
4136

4237
impl<'a> Visitor<'a> for ItemLowerer<'a, '_, '_> {
4338
fn visit_item(&mut self, item: &'a Item) {
44-
let hir_item = self.lctx.with_hir_id_owner(item.id, |lctx| {
45-
lctx.without_in_scope_lifetime_defs(|lctx| lctx.lower_item(item))
46-
});
47-
let force_top_level = self.lctx.check_force_top_level(item);
48-
let hir_id = self.lctx.insert_item(hir_item, force_top_level);
49-
50-
let was_at_top_level = mem::replace(&mut self.lctx.is_at_top_level, false);
51-
self.lctx.with_parent_item_lifetime_defs(hir_id, |this| {
52-
let this = &mut ItemLowerer { lctx: this };
53-
match item.kind {
54-
ItemKind::Mod(..) => {
55-
let def_id = this.lctx.lower_node_id(item.id).expect_owner();
56-
let old_current_module = mem::replace(&mut this.lctx.current_module, def_id);
57-
visit::walk_item(this, item);
58-
this.lctx.current_module = old_current_module;
59-
}
60-
ItemKind::Impl(box ImplKind { ref of_trait, .. }) => {
61-
this.with_trait_impl_ref(of_trait, |this| visit::walk_item(this, item));
39+
let mut item_hir_id = None;
40+
self.lctx.with_hir_id_owner(item.id, |lctx| {
41+
lctx.without_in_scope_lifetime_defs(|lctx| {
42+
if let Some(hir_item) = lctx.lower_item(item) {
43+
let id = lctx.insert_item(hir_item);
44+
item_hir_id = Some(id);
6245
}
63-
_ => visit::walk_item(this, item),
64-
}
46+
})
6547
});
66-
self.lctx.is_at_top_level = was_at_top_level;
48+
49+
if let Some(hir_id) = item_hir_id {
50+
self.lctx.with_parent_item_lifetime_defs(hir_id, |this| {
51+
let this = &mut ItemLowerer { lctx: this };
52+
match item.kind {
53+
ItemKind::Mod(..) => {
54+
let def_id = this.lctx.lower_node_id(item.id).expect_owner();
55+
let old_current_module =
56+
mem::replace(&mut this.lctx.current_module, def_id);
57+
visit::walk_item(this, item);
58+
this.lctx.current_module = old_current_module;
59+
}
60+
ItemKind::Impl(box ImplKind { ref of_trait, .. }) => {
61+
this.with_trait_impl_ref(of_trait, |this| visit::walk_item(this, item));
62+
}
63+
_ => visit::walk_item(this, item),
64+
}
65+
});
66+
}
6767
}
6868

6969
fn visit_fn(&mut self, fk: FnKind<'a>, sp: Span, _: NodeId) {
@@ -113,7 +113,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
113113
fn with_parent_item_lifetime_defs<T>(
114114
&mut self,
115115
parent_hir_id: hir::ItemId,
116-
f: impl FnOnce(&mut Self) -> T,
116+
f: impl FnOnce(&mut LoweringContext<'_, '_>) -> T,
117117
) -> T {
118118
let old_len = self.in_scope_lifetimes.len();
119119

@@ -137,7 +137,10 @@ impl<'hir> LoweringContext<'_, 'hir> {
137137
// Clears (and restores) the `in_scope_lifetimes` field. Used when
138138
// visiting nested items, which never inherit in-scope lifetimes
139139
// from their surrounding environment.
140-
fn without_in_scope_lifetime_defs<T>(&mut self, f: impl FnOnce(&mut Self) -> T) -> T {
140+
fn without_in_scope_lifetime_defs<T>(
141+
&mut self,
142+
f: impl FnOnce(&mut LoweringContext<'_, '_>) -> T,
143+
) -> T {
141144
let old_in_scope_lifetimes = mem::replace(&mut self.in_scope_lifetimes, vec![]);
142145

143146
// this vector is only used when walking over impl headers,
@@ -154,23 +157,10 @@ impl<'hir> LoweringContext<'_, 'hir> {
154157
}
155158

156159
pub(super) fn lower_mod(&mut self, items: &[P<Item>], inner: Span) -> hir::Mod<'hir> {
157-
let mut items: Vec<_> = items
158-
.iter()
159-
.filter_map(|x| {
160-
if self.check_force_top_level(&x) { None } else { Some(self.lower_item_id(&x)) }
161-
})
162-
.flatten()
163-
.collect();
164-
165-
if self.current_hir_id_owner.0 == CRATE_DEF_ID {
166-
let top_level_items = self.top_level_items.clone();
167-
for item in top_level_items {
168-
let id = self.lower_item_id(&item)[0];
169-
items.push(id);
170-
}
160+
hir::Mod {
161+
inner,
162+
item_ids: self.arena.alloc_from_iter(items.iter().flat_map(|x| self.lower_item_id(x))),
171163
}
172-
173-
hir::Mod { inner, item_ids: self.arena.alloc_from_iter(items.into_iter()) }
174164
}
175165

176166
pub(super) fn lower_item_id(&mut self, i: &Item) -> SmallVec<[hir::ItemId; 1]> {
@@ -218,15 +208,13 @@ impl<'hir> LoweringContext<'_, 'hir> {
218208
}
219209
}
220210

221-
pub fn lower_item(&mut self, i: &Item) -> hir::Item<'hir> {
222-
let was_at_top_level = mem::replace(&mut self.is_at_top_level, false);
211+
pub fn lower_item(&mut self, i: &Item) -> Option<hir::Item<'hir>> {
223212
let mut ident = i.ident;
224213
let mut vis = self.lower_visibility(&i.vis, None);
225214
let hir_id = self.lower_node_id(i.id);
226215
let attrs = self.lower_attrs(hir_id, &i.attrs);
227216
let kind = self.lower_item_kind(i.span, i.id, hir_id, &mut ident, attrs, &mut vis, &i.kind);
228-
self.is_at_top_level = was_at_top_level;
229-
hir::Item { def_id: hir_id.expect_owner(), ident, kind, vis, span: i.span }
217+
Some(hir::Item { def_id: hir_id.expect_owner(), ident, kind, vis, span: i.span })
230218
}
231219

232220
fn lower_item_kind(
@@ -297,8 +285,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
297285
}
298286
ItemKind::Mod(_, ref mod_kind) => match mod_kind {
299287
ModKind::Loaded(items, _, inner_span) => {
300-
let module = self.lower_mod(items, *inner_span);
301-
hir::ItemKind::Mod(module)
288+
hir::ItemKind::Mod(self.lower_mod(items, *inner_span))
302289
}
303290
ModKind::Unloaded => panic!("`mod` items should have been loaded by now"),
304291
},
@@ -550,10 +537,13 @@ impl<'hir> LoweringContext<'_, 'hir> {
550537
this.attrs.insert(new_id, attrs);
551538
}
552539

553-
this.insert_item(
554-
hir::Item { def_id: new_id.expect_owner(), ident, kind, vis, span },
555-
false,
556-
);
540+
this.insert_item(hir::Item {
541+
def_id: new_id.expect_owner(),
542+
ident,
543+
kind,
544+
vis,
545+
span,
546+
});
557547
});
558548
}
559549

@@ -621,16 +611,13 @@ impl<'hir> LoweringContext<'_, 'hir> {
621611
this.attrs.insert(new_hir_id, attrs);
622612
}
623613

624-
this.insert_item(
625-
hir::Item {
626-
def_id: new_hir_id.expect_owner(),
627-
ident,
628-
kind,
629-
vis,
630-
span: use_tree.span,
631-
},
632-
false,
633-
);
614+
this.insert_item(hir::Item {
615+
def_id: new_hir_id.expect_owner(),
616+
ident,
617+
kind,
618+
vis,
619+
span: use_tree.span,
620+
});
634621
});
635622
}
636623

compiler/rustc_ast_lowering/src/lib.rs

Lines changed: 5 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,6 @@
3636
#![recursion_limit = "256"]
3737

3838
use rustc_ast::node_id::NodeMap;
39-
use rustc_ast::ptr::P;
4039
use rustc_ast::token::{self, Token};
4140
use rustc_ast::tokenstream::{CanSynthesizeMissingTokens, TokenStream, TokenTree};
4241
use rustc_ast::visit::{self, AssocCtxt, Visitor};
@@ -121,11 +120,8 @@ struct LoweringContext<'a, 'hir: 'a> {
121120
/// outside of an `async fn`.
122121
current_item: Option<Span>,
123122

124-
top_level_items: Vec<Item>,
125-
126123
catch_scopes: Vec<NodeId>,
127124
loop_scopes: Vec<NodeId>,
128-
is_at_top_level: bool,
129125
is_in_loop_condition: bool,
130126
is_in_trait_impl: bool,
131127
is_in_dyn_type: bool,
@@ -335,7 +331,6 @@ pub fn lower_crate<'a, 'hir>(
335331
attrs: BTreeMap::default(),
336332
catch_scopes: Vec::new(),
337333
loop_scopes: Vec::new(),
338-
is_at_top_level: true,
339334
is_in_loop_condition: false,
340335
is_in_trait_impl: false,
341336
is_in_dyn_type: false,
@@ -348,7 +343,6 @@ pub fn lower_crate<'a, 'hir>(
348343
generator_kind: None,
349344
task_context: None,
350345
current_item: None,
351-
top_level_items: Vec::new(),
352346
lifetimes_to_define: Vec::new(),
353347
is_collecting_in_band_lifetimes: false,
354348
in_scope_lifetimes: Vec::new(),
@@ -473,22 +467,13 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
473467
.count();
474468
self.lctx.type_def_lifetime_params.insert(def_id.to_def_id(), count);
475469
}
476-
ItemKind::MacroDef(..) => {
477-
if self.lctx.check_force_top_level(item) {
478-
self.lctx.top_level_items.push(item.clone());
479-
}
480-
}
481470
ItemKind::Use(ref use_tree) => {
482471
self.allocate_use_tree_hir_id_counters(use_tree);
483472
}
484473
_ => {}
485474
}
486475

487-
let was_at_top_level = mem::replace(&mut self.lctx.is_at_top_level, false);
488-
489476
visit::walk_item(self, item);
490-
491-
self.lctx.is_at_top_level = was_at_top_level;
492477
}
493478

494479
fn visit_assoc_item(&mut self, item: &'tcx AssocItem, ctxt: AssocCtxt) {
@@ -525,10 +510,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
525510
visit::walk_crate(&mut MiscCollector { lctx: &mut self }, c);
526511
visit::walk_crate(&mut item::ItemLowerer { lctx: &mut self }, c);
527512

528-
let mut items: Vec<_> = self.top_level_items.drain(..).map(|item| P(item)).collect();
529-
items.extend(c.items.clone());
530-
531-
let module = self.arena.alloc(self.lower_mod(items.as_slice(), c.span));
513+
let module = self.arena.alloc(self.lower_mod(&c.items, c.span));
532514
self.lower_attrs(hir::CRATE_HIR_ID, &c.attrs);
533515
self.owners.ensure_contains_elem(CRATE_DEF_ID, || None);
534516
self.owners[CRATE_DEF_ID] = Some(hir::OwnerNode::Crate(module));
@@ -579,13 +561,12 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
579561
self.arena.alloc(krate)
580562
}
581563

582-
fn insert_item(&mut self, item: hir::Item<'hir>, force_top_level: bool) -> hir::ItemId {
564+
fn insert_item(&mut self, item: hir::Item<'hir>) -> hir::ItemId {
583565
let id = item.item_id();
584566
let item = self.arena.alloc(item);
585-
let module = if force_top_level { CRATE_DEF_ID } else { self.current_module };
586567
self.owners.ensure_contains_elem(id.def_id, || None);
587568
self.owners[id.def_id] = Some(hir::OwnerNode::Item(item));
588-
self.modules.entry(module).or_default().items.insert(id);
569+
self.modules.entry(self.current_module).or_default().items.insert(id);
589570
id
590571
}
591572

@@ -616,19 +597,6 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
616597
id
617598
}
618599

619-
/// This checks if an item is a `#[macro_use]` macro, and thus always
620-
/// defined at the top level. As a special case, if the macro is already
621-
/// at the top level, it remains at its current level.
622-
fn check_force_top_level(&self, item: &Item) -> bool {
623-
if self.is_at_top_level {
624-
false
625-
} else if let ItemKind::MacroDef(MacroDef { macro_rules, .. }) = item.kind {
626-
macro_rules && self.sess.contains_name(&item.attrs, sym::macro_export)
627-
} else {
628-
false
629-
}
630-
}
631-
632600
fn allocate_hir_id_counter(&mut self, owner: NodeId) -> hir::HirId {
633601
// Set up the counter if needed.
634602
self.item_local_id_counters.entry(owner).or_insert(0);
@@ -1625,7 +1593,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
16251593
// Insert the item into the global item list. This usually happens
16261594
// automatically for all AST items. But this opaque type item
16271595
// does not actually exist in the AST.
1628-
self.insert_item(opaque_ty_item, false);
1596+
self.insert_item(opaque_ty_item);
16291597
}
16301598

16311599
fn lifetimes_from_impl_trait_bounds(
@@ -2414,22 +2382,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
24142382
[stmts @ .., Stmt { kind: StmtKind::Expr(e), .. }] => (stmts, Some(&*e)),
24152383
stmts => (stmts, None),
24162384
};
2417-
let stmts: Vec<_> = stmts
2418-
.iter()
2419-
.filter_map(|stmt| {
2420-
if let StmtKind::Item(ref item) = stmt.kind {
2421-
if self.check_force_top_level(item) {
2422-
None
2423-
} else {
2424-
Some(self.lower_stmt(stmt))
2425-
}
2426-
} else {
2427-
Some(self.lower_stmt(stmt))
2428-
}
2429-
})
2430-
.flatten()
2431-
.collect();
2432-
let stmts = self.arena.alloc_from_iter(stmts.into_iter());
2385+
let stmts = self.arena.alloc_from_iter(stmts.iter().flat_map(|stmt| self.lower_stmt(stmt)));
24332386
let expr = expr.map(|e| self.lower_expr(e));
24342387
let rules = self.lower_block_check_mode(&b.rules);
24352388
let hir_id = self.lower_node_id(b.id);

0 commit comments

Comments
 (0)