Skip to content

Commit eb65f15

Browse files
committed
ast: Stop using Mod in Crate
Crate root is sufficiently different from `mod` items, at least at syntactic level. Also remove customization point for "`mod` item or crate root" from AST visitors.
1 parent d1462d8 commit eb65f15

File tree

23 files changed

+114
-179
lines changed

23 files changed

+114
-179
lines changed

Diff for: compiler/rustc_ast/src/ast.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -486,8 +486,8 @@ pub struct WhereEqPredicate {
486486

487487
#[derive(Clone, Encodable, Decodable, Debug)]
488488
pub struct Crate {
489-
pub module: Mod,
490489
pub attrs: Vec<Attribute>,
490+
pub items: Vec<P<Item>>,
491491
pub span: Span,
492492
/// The order of items in the HIR is unrelated to the order of
493493
/// items in the AST. However, we generate proc macro harnesses

Diff for: compiler/rustc_ast/src/mut_visit.rs

+11-16
Original file line numberDiff line numberDiff line change
@@ -170,10 +170,6 @@ pub trait MutVisitor: Sized {
170170
noop_visit_ty_constraint(t, self);
171171
}
172172

173-
fn visit_mod(&mut self, m: &mut Mod) {
174-
noop_visit_mod(m, self);
175-
}
176-
177173
fn visit_foreign_mod(&mut self, nm: &mut ForeignMod) {
178174
noop_visit_foreign_mod(nm, self);
179175
}
@@ -917,7 +913,11 @@ pub fn noop_visit_item_kind<T: MutVisitor>(kind: &mut ItemKind, vis: &mut T) {
917913
vis.visit_generics(generics);
918914
visit_opt(body, |body| vis.visit_block(body));
919915
}
920-
ItemKind::Mod(m) => vis.visit_mod(m),
916+
ItemKind::Mod(m) => {
917+
let Mod { inner, unsafety: _, items, inline: _ } = m;
918+
vis.visit_span(inner);
919+
items.flat_map_in_place(|item| vis.flat_map_item(item));
920+
}
921921
ItemKind::ForeignMod(nm) => vis.visit_foreign_mod(nm),
922922
ItemKind::GlobalAsm(_ga) => {}
923923
ItemKind::TyAlias(box TyAliasKind(_, generics, bounds, ty)) => {
@@ -998,14 +998,10 @@ pub fn noop_visit_fn_header<T: MutVisitor>(header: &mut FnHeader, vis: &mut T) {
998998
vis.visit_asyncness(asyncness);
999999
}
10001000

1001-
pub fn noop_visit_mod<T: MutVisitor>(module: &mut Mod, vis: &mut T) {
1002-
let Mod { inner, unsafety: _, items, inline: _ } = module;
1003-
vis.visit_span(inner);
1004-
items.flat_map_in_place(|item| vis.flat_map_item(item));
1005-
}
1006-
1001+
// FIXME: Avoid visiting the crate as a `Mod` item, flat map only the inner items if possible,
1002+
// or make crate visiting first class if necessary.
10071003
pub fn noop_visit_crate<T: MutVisitor>(krate: &mut Crate, vis: &mut T) {
1008-
visit_clobber(krate, |Crate { module, attrs, span, proc_macros }| {
1004+
visit_clobber(krate, |Crate { attrs, items, span, proc_macros }| {
10091005
let item_vis =
10101006
Visibility { kind: VisibilityKind::Public, span: span.shrink_to_lo(), tokens: None };
10111007
let item = P(Item {
@@ -1014,19 +1010,18 @@ pub fn noop_visit_crate<T: MutVisitor>(krate: &mut Crate, vis: &mut T) {
10141010
id: DUMMY_NODE_ID,
10151011
vis: item_vis,
10161012
span,
1017-
kind: ItemKind::Mod(module),
1013+
kind: ItemKind::Mod(Mod { inner: span, unsafety: Unsafe::No, items, inline: true }),
10181014
tokens: None,
10191015
});
10201016
let items = vis.flat_map_item(item);
10211017

10221018
let len = items.len();
10231019
if len == 0 {
1024-
let module = Mod { inner: span, unsafety: Unsafe::No, items: vec![], inline: true };
1025-
Crate { module, attrs: vec![], span, proc_macros }
1020+
Crate { attrs: vec![], items: vec![], span, proc_macros }
10261021
} else if len == 1 {
10271022
let Item { attrs, span, kind, .. } = items.into_iter().next().unwrap().into_inner();
10281023
match kind {
1029-
ItemKind::Mod(module) => Crate { module, attrs, span, proc_macros },
1024+
ItemKind::Mod(module) => Crate { attrs, items: module.items, span, proc_macros },
10301025
_ => panic!("visitor converted a module to not a module"),
10311026
}
10321027
} else {

Diff for: compiler/rustc_ast/src/visit.rs

+3-10
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ impl<'a> FnKind<'a> {
7474
/// Each method of the `Visitor` trait is a hook to be potentially
7575
/// overridden. Each method's default implementation recursively visits
7676
/// the substructure of the input via the corresponding `walk` method;
77-
/// e.g., the `visit_mod` method by default calls `visit::walk_mod`.
77+
/// e.g., the `visit_item` method by default calls `visit::walk_item`.
7878
///
7979
/// If you want to ensure that your code handles every variant
8080
/// explicitly, you need to override each method. (And you also need
@@ -87,9 +87,6 @@ pub trait Visitor<'ast>: Sized {
8787
fn visit_ident(&mut self, ident: Ident) {
8888
walk_ident(self, ident);
8989
}
90-
fn visit_mod(&mut self, m: &'ast Mod, _s: Span, _attrs: &[Attribute], _n: NodeId) {
91-
walk_mod(self, m);
92-
}
9390
fn visit_foreign_item(&mut self, i: &'ast ForeignItem) {
9491
walk_foreign_item(self, i)
9592
}
@@ -238,14 +235,10 @@ pub fn walk_ident<'a, V: Visitor<'a>>(visitor: &mut V, ident: Ident) {
238235
}
239236

240237
pub fn walk_crate<'a, V: Visitor<'a>>(visitor: &mut V, krate: &'a Crate) {
241-
visitor.visit_mod(&krate.module, krate.span, &krate.attrs, CRATE_NODE_ID);
238+
walk_list!(visitor, visit_item, &krate.items);
242239
walk_list!(visitor, visit_attribute, &krate.attrs);
243240
}
244241

245-
pub fn walk_mod<'a, V: Visitor<'a>>(visitor: &mut V, module: &'a Mod) {
246-
walk_list!(visitor, visit_item, &module.items);
247-
}
248-
249242
pub fn walk_local<'a, V: Visitor<'a>>(visitor: &mut V, local: &'a Local) {
250243
for attr in local.attrs.iter() {
251244
visitor.visit_attribute(attr);
@@ -297,7 +290,7 @@ pub fn walk_item<'a, V: Visitor<'a>>(visitor: &mut V, item: &'a Item) {
297290
let kind = FnKind::Fn(FnCtxt::Free, item.ident, sig, &item.vis, body.as_deref());
298291
visitor.visit_fn(kind, item.span, item.id)
299292
}
300-
ItemKind::Mod(ref module) => visitor.visit_mod(module, item.span, &item.attrs, item.id),
293+
ItemKind::Mod(ref module) => walk_list!(visitor, visit_item, &module.items),
301294
ItemKind::ForeignMod(ref foreign_module) => {
302295
walk_list!(visitor, visit_foreign_item, &foreign_module.items);
303296
}

Diff for: compiler/rustc_ast_lowering/src/item.rs

+22-35
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,11 @@ use rustc_span::source_map::{respan, DesugaringKind};
1515
use rustc_span::symbol::{kw, sym, Ident};
1616
use rustc_span::Span;
1717
use rustc_target::spec::abi;
18-
1918
use smallvec::{smallvec, SmallVec};
20-
use std::collections::BTreeSet;
2119
use tracing::debug;
2220

21+
use std::mem;
22+
2323
pub(super) struct ItemLowerer<'a, 'lowering, 'hir> {
2424
pub(super) lctx: &'a mut LoweringContext<'lowering, 'hir>,
2525
}
@@ -34,25 +34,6 @@ impl ItemLowerer<'_, '_, '_> {
3434
}
3535

3636
impl<'a> Visitor<'a> for ItemLowerer<'a, '_, '_> {
37-
fn visit_mod(&mut self, m: &'a Mod, _s: Span, _attrs: &[Attribute], n: NodeId) {
38-
let def_id = self.lctx.lower_node_id(n).expect_owner();
39-
40-
self.lctx.modules.insert(
41-
def_id,
42-
hir::ModuleItems {
43-
items: BTreeSet::new(),
44-
trait_items: BTreeSet::new(),
45-
impl_items: BTreeSet::new(),
46-
foreign_items: BTreeSet::new(),
47-
},
48-
);
49-
50-
let old = self.lctx.current_module;
51-
self.lctx.current_module = def_id;
52-
visit::walk_mod(self, m);
53-
self.lctx.current_module = old;
54-
}
55-
5637
fn visit_item(&mut self, item: &'a Item) {
5738
let mut item_hir_id = None;
5839
self.lctx.with_hir_id_owner(item.id, |lctx| {
@@ -67,10 +48,18 @@ impl<'a> Visitor<'a> for ItemLowerer<'a, '_, '_> {
6748
if let Some(hir_id) = item_hir_id {
6849
self.lctx.with_parent_item_lifetime_defs(hir_id, |this| {
6950
let this = &mut ItemLowerer { lctx: this };
70-
if let ItemKind::Impl(box ImplKind { ref of_trait, .. }) = item.kind {
71-
this.with_trait_impl_ref(of_trait, |this| visit::walk_item(this, item));
72-
} else {
73-
visit::walk_item(this, item);
51+
match item.kind {
52+
ItemKind::Mod(..) => {
53+
let def_id = this.lctx.lower_node_id(item.id).expect_owner();
54+
let old_current_module =
55+
mem::replace(&mut this.lctx.current_module, def_id);
56+
visit::walk_item(this, item);
57+
this.lctx.current_module = old_current_module;
58+
}
59+
ItemKind::Impl(box ImplKind { ref of_trait, .. }) => {
60+
this.with_trait_impl_ref(of_trait, |this| visit::walk_item(this, item));
61+
}
62+
_ => visit::walk_item(this, item),
7463
}
7564
});
7665
}
@@ -94,13 +83,13 @@ impl<'a> Visitor<'a> for ItemLowerer<'a, '_, '_> {
9483
let hir_item = lctx.lower_trait_item(item);
9584
let id = hir_item.trait_item_id();
9685
lctx.trait_items.insert(id, hir_item);
97-
lctx.modules.get_mut(&lctx.current_module).unwrap().trait_items.insert(id);
86+
lctx.modules.entry(lctx.current_module).or_default().trait_items.insert(id);
9887
}
9988
AssocCtxt::Impl => {
10089
let hir_item = lctx.lower_impl_item(item);
10190
let id = hir_item.impl_item_id();
10291
lctx.impl_items.insert(id, hir_item);
103-
lctx.modules.get_mut(&lctx.current_module).unwrap().impl_items.insert(id);
92+
lctx.modules.entry(lctx.current_module).or_default().impl_items.insert(id);
10493
}
10594
});
10695

@@ -113,7 +102,7 @@ impl<'a> Visitor<'a> for ItemLowerer<'a, '_, '_> {
113102
let hir_item = lctx.lower_foreign_item(item);
114103
let id = hir_item.foreign_item_id();
115104
lctx.foreign_items.insert(id, hir_item);
116-
lctx.modules.get_mut(&lctx.current_module).unwrap().foreign_items.insert(id);
105+
lctx.modules.entry(lctx.current_module).or_default().foreign_items.insert(id);
117106
});
118107

119108
visit::walk_foreign_item(self, item);
@@ -157,7 +146,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
157146
&mut self,
158147
f: impl FnOnce(&mut LoweringContext<'_, '_>) -> T,
159148
) -> T {
160-
let old_in_scope_lifetimes = std::mem::replace(&mut self.in_scope_lifetimes, vec![]);
149+
let old_in_scope_lifetimes = mem::replace(&mut self.in_scope_lifetimes, vec![]);
161150

162151
// this vector is only used when walking over impl headers,
163152
// input types, and the like, and should not be non-empty in
@@ -172,12 +161,10 @@ impl<'hir> LoweringContext<'_, 'hir> {
172161
res
173162
}
174163

175-
pub(super) fn lower_mod(&mut self, m: &Mod) -> hir::Mod<'hir> {
164+
pub(super) fn lower_mod(&mut self, items: &[P<Item>], inner: Span) -> hir::Mod<'hir> {
176165
hir::Mod {
177-
inner: m.inner,
178-
item_ids: self
179-
.arena
180-
.alloc_from_iter(m.items.iter().flat_map(|x| self.lower_item_id(x))),
166+
inner,
167+
item_ids: self.arena.alloc_from_iter(items.iter().flat_map(|x| self.lower_item_id(x))),
181168
}
182169
}
183170

@@ -327,7 +314,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
327314
hir::ItemKind::Fn(sig, generics, body_id)
328315
})
329316
}
330-
ItemKind::Mod(ref m) => hir::ItemKind::Mod(self.lower_mod(m)),
317+
ItemKind::Mod(ref m) => hir::ItemKind::Mod(self.lower_mod(&m.items, m.inner)),
331318
ItemKind::ForeignMod(ref fm) => {
332319
if fm.abi.is_none() {
333320
self.maybe_lint_missing_abi(span, id, abi::Abi::C);

Diff for: compiler/rustc_ast_lowering/src/lib.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -560,7 +560,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
560560
visit::walk_crate(&mut MiscCollector { lctx: &mut self }, c);
561561
visit::walk_crate(&mut item::ItemLowerer { lctx: &mut self }, c);
562562

563-
let module = self.lower_mod(&c.module);
563+
let module = self.lower_mod(&c.items, c.span);
564564
let attrs = self.lower_attrs(&c.attrs);
565565
let body_ids = body_ids(&self.bodies);
566566
let proc_macros =
@@ -608,7 +608,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
608608
fn insert_item(&mut self, item: hir::Item<'hir>) -> hir::ItemId {
609609
let id = hir::ItemId { def_id: item.def_id };
610610
self.items.insert(id, item);
611-
self.modules.get_mut(&self.current_module).unwrap().items.insert(id);
611+
self.modules.entry(self.current_module).or_default().items.insert(id);
612612
id
613613
}
614614

Diff for: compiler/rustc_ast_passes/src/node_count.rs

-4
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,6 @@ impl<'ast> Visitor<'ast> for NodeCounter {
2020
self.count += 1;
2121
walk_ident(self, ident);
2222
}
23-
fn visit_mod(&mut self, m: &Mod, _s: Span, _a: &[Attribute], _n: NodeId) {
24-
self.count += 1;
25-
walk_mod(self, m)
26-
}
2723
fn visit_foreign_item(&mut self, i: &ForeignItem) {
2824
self.count += 1;
2925
walk_foreign_item(self, i)

Diff for: compiler/rustc_ast_pretty/src/pprust/state.rs

+8-9
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,10 @@ pub fn print_crate<'a>(
132132
}
133133
}
134134

135-
s.print_mod(&krate.module, &krate.attrs);
135+
s.print_inner_attributes(&krate.attrs);
136+
for item in &krate.items {
137+
s.print_item(item);
138+
}
136139
s.print_remaining_comments();
137140
s.ann.post(&mut s, AnnNode::Crate(krate));
138141
s.s.eof()
@@ -891,13 +894,6 @@ impl<'a> State<'a> {
891894
self.commasep_cmnt(b, exprs, |s, e| s.print_expr(e), |e| e.span)
892895
}
893896

894-
pub fn print_mod(&mut self, _mod: &ast::Mod, attrs: &[ast::Attribute]) {
895-
self.print_inner_attributes(attrs);
896-
for item in &_mod.items {
897-
self.print_item(item);
898-
}
899-
}
900-
901897
crate fn print_foreign_mod(&mut self, nmod: &ast::ForeignMod, attrs: &[ast::Attribute]) {
902898
self.print_inner_attributes(attrs);
903899
for item in &nmod.items {
@@ -1149,7 +1145,10 @@ impl<'a> State<'a> {
11491145
if _mod.inline || self.is_expanded {
11501146
self.nbsp();
11511147
self.bopen();
1152-
self.print_mod(_mod, &item.attrs);
1148+
self.print_inner_attributes(&item.attrs);
1149+
for item in &_mod.items {
1150+
self.print_item(item);
1151+
}
11531152
self.bclose(item.span);
11541153
} else {
11551154
self.s.word(";");

Diff for: compiler/rustc_builtin_macros/src/proc_macro_harness.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ pub fn inject(
9191
}
9292

9393
let decls = mk_decls(&mut krate, &mut cx, &macros);
94-
krate.module.items.push(decls);
94+
krate.items.push(decls);
9595

9696
krate
9797
}

Diff for: compiler/rustc_builtin_macros/src/standard_library_imports.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ pub fn inject(
4444
// .rev() to preserve ordering above in combination with insert(0, ...)
4545
for &name in names.iter().rev() {
4646
let ident = if rust_2018 { Ident::new(name, span) } else { Ident::new(name, call_site) };
47-
krate.module.items.insert(
47+
krate.items.insert(
4848
0,
4949
cx.item(
5050
span,
@@ -79,7 +79,7 @@ pub fn inject(
7979
})),
8080
);
8181

82-
krate.module.items.insert(0, use_item);
82+
krate.items.insert(0, use_item);
8383

8484
krate
8585
}

Diff for: compiler/rustc_builtin_macros/src/test_harness.rs

+7-3
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ impl<'a> MutVisitor for TestHarnessGenerator<'a> {
8989
noop_visit_crate(c, self);
9090

9191
// Create a main function to run our tests
92-
c.module.items.push(mk_main(&mut self.cx));
92+
c.items.push(mk_main(&mut self.cx));
9393
}
9494

9595
fn flat_map_item(&mut self, i: P<ast::Item>) -> SmallVec<[P<ast::Item>; 1]> {
@@ -103,9 +103,13 @@ impl<'a> MutVisitor for TestHarnessGenerator<'a> {
103103

104104
// We don't want to recurse into anything other than mods, since
105105
// mods or tests inside of functions will break things
106-
if let ast::ItemKind::Mod(mut module) = item.kind {
106+
if let ast::ItemKind::Mod(..) = item.kind {
107107
let tests = mem::take(&mut self.tests);
108-
noop_visit_mod(&mut module, self);
108+
noop_visit_item_kind(&mut item.kind, self);
109+
let module = match item.kind {
110+
ast::ItemKind::Mod(module) => module,
111+
_ => unreachable!(),
112+
};
109113
let mut tests = mem::replace(&mut self.tests, tests);
110114

111115
if !tests.is_empty() {

Diff for: compiler/rustc_expand/src/config.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -209,7 +209,7 @@ pub fn features(sess: &Session, mut krate: ast::Crate) -> (ast::Crate, Features)
209209
None => {
210210
// The entire crate is unconfigured.
211211
krate.attrs = Vec::new();
212-
krate.module.items = Vec::new();
212+
krate.items = Vec::new();
213213
Features::default()
214214
}
215215
Some(attrs) => {

0 commit comments

Comments
 (0)