Skip to content

Commit 533c04d

Browse files
authored
Auto merge of #36573 - jseyfried:groundwork, r=nrc
resolve: groundwork for building the module graph during expansion r? @nrc
2 parents 3a5d975 + 173d5b3 commit 533c04d

File tree

9 files changed

+172
-186
lines changed

9 files changed

+172
-186
lines changed

src/librustc/hir/map/def_collector.rs

+13-20
Original file line numberDiff line numberDiff line change
@@ -30,31 +30,20 @@ pub struct DefCollector<'ast> {
3030
}
3131

3232
impl<'ast> DefCollector<'ast> {
33-
pub fn root(definitions: &'ast mut Definitions) -> DefCollector<'ast> {
34-
let mut collector = DefCollector {
33+
pub fn new(definitions: &'ast mut Definitions) -> DefCollector<'ast> {
34+
DefCollector {
3535
hir_crate: None,
3636
definitions: definitions,
3737
parent_def: None,
38-
};
39-
let root = collector.create_def_with_parent(None, CRATE_NODE_ID, DefPathData::CrateRoot);
40-
assert_eq!(root, CRATE_DEF_INDEX);
41-
collector.parent_def = Some(root);
42-
43-
collector.create_def_with_parent(Some(CRATE_DEF_INDEX), DUMMY_NODE_ID, DefPathData::Misc);
44-
45-
collector
38+
}
4639
}
4740

4841
pub fn extend(parent_node: NodeId,
4942
parent_def_path: DefPath,
5043
parent_def_id: DefId,
5144
definitions: &'ast mut Definitions)
5245
-> DefCollector<'ast> {
53-
let mut collector = DefCollector {
54-
hir_crate: None,
55-
parent_def: None,
56-
definitions: definitions,
57-
};
46+
let mut collector = DefCollector::new(definitions);
5847

5948
assert_eq!(parent_def_path.krate, parent_def_id.krate);
6049
let root_path = Box::new(InlinedRootPath {
@@ -68,17 +57,21 @@ impl<'ast> DefCollector<'ast> {
6857
collector
6958
}
7059

60+
pub fn collect_root(&mut self) {
61+
let root = self.create_def_with_parent(None, CRATE_NODE_ID, DefPathData::CrateRoot);
62+
assert_eq!(root, CRATE_DEF_INDEX);
63+
self.parent_def = Some(root);
64+
65+
self.create_def_with_parent(Some(CRATE_DEF_INDEX), DUMMY_NODE_ID, DefPathData::Misc);
66+
}
67+
7168
pub fn walk_item(&mut self, ii: &'ast InlinedItem, krate: &'ast hir::Crate) {
7269
self.hir_crate = Some(krate);
7370
ii.visit(self);
7471
}
7572

76-
fn parent_def(&self) -> Option<DefIndex> {
77-
self.parent_def
78-
}
79-
8073
fn create_def(&mut self, node_id: NodeId, data: DefPathData) -> DefIndex {
81-
let parent_def = self.parent_def();
74+
let parent_def = self.parent_def;
8275
debug!("create_def(node_id={:?}, data={:?}, parent_def={:?})", node_id, data, parent_def);
8376
self.definitions.create_def_with_parent(parent_def, node_id, data)
8477
}

src/librustc/hir/map/definitions.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -225,7 +225,8 @@ impl Definitions {
225225
}
226226

227227
pub fn collect(&mut self, krate: &ast::Crate) {
228-
let mut def_collector = DefCollector::root(self);
228+
let mut def_collector = DefCollector::new(self);
229+
def_collector.collect_root();
229230
visit::walk_crate(&mut def_collector, krate);
230231
}
231232

src/librustc_driver/driver.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -643,7 +643,8 @@ pub fn phase_2_configure_and_expand<'a, F>(sess: &Session,
643643
macro_import::MacroLoader::new(sess, &cstore, crate_name, krate.config.clone());
644644

645645
let resolver_arenas = Resolver::arenas();
646-
let mut resolver = Resolver::new(sess, make_glob_map, &mut macro_loader, &resolver_arenas);
646+
let mut resolver =
647+
Resolver::new(sess, &krate, make_glob_map, &mut macro_loader, &resolver_arenas);
647648
syntax_ext::register_builtins(&mut resolver, sess.features.borrow().quote);
648649

649650
krate = time(time_passes, "expansion", || {

src/librustc_resolve/build_reduced_graph.rs

+54-51
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,9 @@
1414
//! any imports resolved.
1515
1616
use resolve_imports::ImportDirectiveSubclass::{self, GlobImport};
17-
use Module;
17+
use {Module, ModuleS, ModuleKind};
1818
use Namespace::{self, TypeNS, ValueNS};
1919
use {NameBinding, NameBindingKind, ToNameBinding};
20-
use ParentLink::{ModuleParentLink, BlockParentLink};
2120
use Resolver;
2221
use {resolve_error, resolve_struct_error, ResolutionError};
2322

@@ -34,7 +33,7 @@ use syntax::parse::token;
3433

3534
use syntax::ast::{Block, Crate};
3635
use syntax::ast::{ForeignItem, ForeignItemKind, Item, ItemKind};
37-
use syntax::ast::{Mutability, StmtKind, TraitItemKind};
36+
use syntax::ast::{Mutability, StmtKind, TraitItem, TraitItemKind};
3837
use syntax::ast::{Variant, ViewPathGlob, ViewPathList, ViewPathSimple};
3938
use syntax::parse::token::keywords;
4039
use syntax::visit::{self, Visitor};
@@ -56,8 +55,6 @@ impl<'a> ToNameBinding<'a> for (Def, Span, ty::Visibility) {
5655
impl<'b> Resolver<'b> {
5756
/// Constructs the reduced graph for the entire crate.
5857
pub fn build_reduced_graph(&mut self, krate: &Crate) {
59-
let no_implicit_prelude = attr::contains_name(&krate.attrs, "no_implicit_prelude");
60-
self.graph_root.no_implicit_prelude.set(no_implicit_prelude);
6158
visit::walk_crate(&mut BuildReducedGraphVisitor { resolver: self }, krate);
6259
}
6360

@@ -196,22 +193,25 @@ impl<'b> Resolver<'b> {
196193
krate: crate_id,
197194
index: CRATE_DEF_INDEX,
198195
};
199-
let parent_link = ModuleParentLink(parent, name);
200-
let def = Def::Mod(def_id);
201-
let module = self.new_extern_crate_module(parent_link, def, item.id);
196+
let module = self.arenas.alloc_module(ModuleS {
197+
extern_crate_id: Some(item.id),
198+
populated: Cell::new(false),
199+
..ModuleS::new(Some(parent), ModuleKind::Def(Def::Mod(def_id), name))
200+
});
202201
self.define(parent, name, TypeNS, (module, sp, vis));
203202

204203
self.populate_module_if_necessary(module);
205204
}
206205
}
207206

208207
ItemKind::Mod(..) => {
209-
let parent_link = ModuleParentLink(parent, name);
210208
let def = Def::Mod(self.definitions.local_def_id(item.id));
211-
let module = self.new_module(parent_link, Some(def), Some(item.id));
212-
module.no_implicit_prelude.set({
213-
parent.no_implicit_prelude.get() ||
209+
let module = self.arenas.alloc_module(ModuleS {
210+
no_implicit_prelude: parent.no_implicit_prelude || {
214211
attr::contains_name(&item.attrs, "no_implicit_prelude")
212+
},
213+
normal_ancestor_id: Some(item.id),
214+
..ModuleS::new(Some(parent), ModuleKind::Def(def, name))
215215
});
216216
self.define(parent, name, TypeNS, (module, sp, vis));
217217
self.module_map.insert(item.id, module);
@@ -244,9 +244,8 @@ impl<'b> Resolver<'b> {
244244
}
245245

246246
ItemKind::Enum(ref enum_definition, _) => {
247-
let parent_link = ModuleParentLink(parent, name);
248247
let def = Def::Enum(self.definitions.local_def_id(item.id));
249-
let module = self.new_module(parent_link, Some(def), parent.normal_ancestor_id);
248+
let module = self.new_module(parent, ModuleKind::Def(def, name), true);
250249
self.define(parent, name, TypeNS, (module, sp, vis));
251250

252251
for variant in &(*enum_definition).variants {
@@ -293,40 +292,17 @@ impl<'b> Resolver<'b> {
293292

294293
ItemKind::DefaultImpl(..) | ItemKind::Impl(..) => {}
295294

296-
ItemKind::Trait(.., ref items) => {
295+
ItemKind::Trait(..) => {
297296
let def_id = self.definitions.local_def_id(item.id);
298297

299298
// Add all the items within to a new module.
300-
let parent_link = ModuleParentLink(parent, name);
301-
let def = Def::Trait(def_id);
302-
let module_parent =
303-
self.new_module(parent_link, Some(def), parent.normal_ancestor_id);
304-
self.define(parent, name, TypeNS, (module_parent, sp, vis));
305-
306-
// Add the names of all the items to the trait info.
307-
for item in items {
308-
let item_def_id = self.definitions.local_def_id(item.id);
309-
let mut is_static_method = false;
310-
let (def, ns) = match item.node {
311-
TraitItemKind::Const(..) => (Def::AssociatedConst(item_def_id), ValueNS),
312-
TraitItemKind::Method(ref sig, _) => {
313-
is_static_method = !sig.decl.has_self();
314-
(Def::Method(item_def_id), ValueNS)
315-
}
316-
TraitItemKind::Type(..) => (Def::AssociatedTy(item_def_id), TypeNS),
317-
TraitItemKind::Macro(_) => panic!("unexpanded macro in resolve!"),
318-
};
319-
320-
self.define(module_parent, item.ident.name, ns, (def, item.span, vis));
321-
322-
self.trait_item_map.insert((item.ident.name, def_id), is_static_method);
323-
}
299+
let module =
300+
self.new_module(parent, ModuleKind::Def(Def::Trait(def_id), name), true);
301+
self.define(parent, name, TypeNS, (module, sp, vis));
302+
self.current_module = module;
324303
}
325304
ItemKind::Mac(_) => panic!("unexpanded macro in resolve!"),
326305
}
327-
328-
visit::walk_item(&mut BuildReducedGraphVisitor { resolver: self }, item);
329-
self.current_module = parent;
330306
}
331307

332308
// Constructs the reduced graph for one variant. Variants exist in the
@@ -375,14 +351,10 @@ impl<'b> Resolver<'b> {
375351
{}",
376352
block_id);
377353

378-
let parent_link = BlockParentLink(parent, block_id);
379-
let new_module = self.new_module(parent_link, None, parent.normal_ancestor_id);
354+
let new_module = self.new_module(parent, ModuleKind::Block(block_id), true);
380355
self.module_map.insert(block_id, new_module);
381356
self.current_module = new_module; // Descend into the block.
382357
}
383-
384-
visit::walk_block(&mut BuildReducedGraphVisitor { resolver: self }, block);
385-
self.current_module = parent;
386358
}
387359

388360
/// Builds the reduced graph for a single item in an external crate.
@@ -407,8 +379,7 @@ impl<'b> Resolver<'b> {
407379
Def::Mod(_) | Def::Enum(..) => {
408380
debug!("(building reduced graph for external crate) building module {} {:?}",
409381
name, vis);
410-
let parent_link = ModuleParentLink(parent, name);
411-
let module = self.new_module(parent_link, Some(def), None);
382+
let module = self.new_module(parent, ModuleKind::Def(def, name), false);
412383
let _ = self.try_define(parent, name, TypeNS, (module, DUMMY_SP, vis));
413384
}
414385
Def::Variant(variant_id) => {
@@ -451,8 +422,7 @@ impl<'b> Resolver<'b> {
451422
self.trait_item_map.insert((trait_item_name, def_id), false);
452423
}
453424

454-
let parent_link = ModuleParentLink(parent, name);
455-
let module = self.new_module(parent_link, Some(def), None);
425+
let module = self.new_module(parent, ModuleKind::Def(def, name), false);
456426
let _ = self.try_define(parent, name, TypeNS, (module, DUMMY_SP, vis));
457427
}
458428
Def::TyAlias(..) | Def::AssociatedTy(..) => {
@@ -512,14 +482,47 @@ struct BuildReducedGraphVisitor<'a, 'b: 'a> {
512482

513483
impl<'a, 'b> Visitor for BuildReducedGraphVisitor<'a, 'b> {
514484
fn visit_item(&mut self, item: &Item) {
485+
let parent = self.resolver.current_module;
515486
self.resolver.build_reduced_graph_for_item(item);
487+
visit::walk_item(self, item);
488+
self.resolver.current_module = parent;
516489
}
517490

518491
fn visit_foreign_item(&mut self, foreign_item: &ForeignItem) {
519492
self.resolver.build_reduced_graph_for_foreign_item(foreign_item);
520493
}
521494

522495
fn visit_block(&mut self, block: &Block) {
496+
let parent = self.resolver.current_module;
523497
self.resolver.build_reduced_graph_for_block(block);
498+
visit::walk_block(self, block);
499+
self.resolver.current_module = parent;
500+
}
501+
502+
fn visit_trait_item(&mut self, item: &TraitItem) {
503+
let parent = self.resolver.current_module;
504+
let def_id = parent.def_id().unwrap();
505+
506+
// Add the item to the trait info.
507+
let item_def_id = self.resolver.definitions.local_def_id(item.id);
508+
let mut is_static_method = false;
509+
let (def, ns) = match item.node {
510+
TraitItemKind::Const(..) => (Def::AssociatedConst(item_def_id), ValueNS),
511+
TraitItemKind::Method(ref sig, _) => {
512+
is_static_method = !sig.decl.has_self();
513+
(Def::Method(item_def_id), ValueNS)
514+
}
515+
TraitItemKind::Type(..) => (Def::AssociatedTy(item_def_id), TypeNS),
516+
TraitItemKind::Macro(_) => panic!("unexpanded macro in resolve!"),
517+
};
518+
519+
self.resolver.trait_item_map.insert((item.ident.name, def_id), is_static_method);
520+
521+
let vis = ty::Visibility::Public;
522+
self.resolver.define(parent, item.ident.name, ns, (def, item.span, vis));
523+
524+
self.resolver.current_module = parent.parent.unwrap(); // nearest normal ancestor
525+
visit::walk_trait_item(self, item);
526+
self.resolver.current_module = parent;
524527
}
525528
}

0 commit comments

Comments
 (0)