Skip to content

Commit ebaaafc

Browse files
committed
Peform def id assignment during expansion.
1 parent d0623cf commit ebaaafc

File tree

6 files changed

+106
-53
lines changed

6 files changed

+106
-53
lines changed

src/librustc/hir/map/def_collector.rs

Lines changed: 56 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -18,31 +18,33 @@ use middle::cstore::InlinedItem;
1818

1919
use syntax::ast::*;
2020
use syntax::visit;
21-
use syntax::parse::token;
21+
use syntax::parse::token::{self, keywords};
2222

2323
/// Creates def ids for nodes in the HIR.
24-
pub struct DefCollector<'ast> {
24+
pub struct DefCollector<'a> {
2525
// If we are walking HIR (c.f., AST), we need to keep a reference to the
2626
// crate.
27-
hir_crate: Option<&'ast hir::Crate>,
28-
definitions: &'ast mut Definitions,
27+
hir_crate: Option<&'a hir::Crate>,
28+
definitions: &'a mut Definitions,
2929
parent_def: Option<DefIndex>,
30+
pub visit_macro_invoc: Option<&'a mut FnMut(NodeId, DefIndex)>,
3031
}
3132

32-
impl<'ast> DefCollector<'ast> {
33-
pub fn new(definitions: &'ast mut Definitions) -> DefCollector<'ast> {
33+
impl<'a> DefCollector<'a> {
34+
pub fn new(definitions: &'a mut Definitions) -> Self {
3435
DefCollector {
3536
hir_crate: None,
3637
definitions: definitions,
3738
parent_def: None,
39+
visit_macro_invoc: None,
3840
}
3941
}
4042

4143
pub fn extend(parent_node: NodeId,
4244
parent_def_path: DefPath,
4345
parent_def_id: DefId,
44-
definitions: &'ast mut Definitions)
45-
-> DefCollector<'ast> {
46+
definitions: &'a mut Definitions)
47+
-> Self {
4648
let mut collector = DefCollector::new(definitions);
4749

4850
assert_eq!(parent_def_path.krate, parent_def_id.krate);
@@ -65,7 +67,7 @@ impl<'ast> DefCollector<'ast> {
6567
self.create_def_with_parent(Some(CRATE_DEF_INDEX), DUMMY_NODE_ID, DefPathData::Misc);
6668
}
6769

68-
pub fn walk_item(&mut self, ii: &'ast InlinedItem, krate: &'ast hir::Crate) {
70+
pub fn walk_item(&mut self, ii: &'a InlinedItem, krate: &'a hir::Crate) {
6971
self.hir_crate = Some(krate);
7072
ii.visit(self);
7173
}
@@ -84,7 +86,7 @@ impl<'ast> DefCollector<'ast> {
8486
self.definitions.create_def_with_parent(parent, node_id, data)
8587
}
8688

87-
fn with_parent<F: FnOnce(&mut Self)>(&mut self, parent_def: DefIndex, f: F) {
89+
pub fn with_parent<F: FnOnce(&mut Self)>(&mut self, parent_def: DefIndex, f: F) {
8890
let parent = self.parent_def;
8991
self.parent_def = Some(parent_def);
9092
f(self);
@@ -106,7 +108,7 @@ impl<'ast> DefCollector<'ast> {
106108
self.create_def(expr.id, DefPathData::Initializer);
107109
}
108110

109-
fn visit_hir_const_integer(&mut self, expr: &'ast hir::Expr) {
111+
fn visit_hir_const_integer(&mut self, expr: &hir::Expr) {
110112
// FIXME(eddyb) Closures should have separate
111113
// function definition IDs and expression IDs.
112114
if let hir::ExprClosure(..) = expr.node {
@@ -115,9 +117,15 @@ impl<'ast> DefCollector<'ast> {
115117

116118
self.create_def(expr.id, DefPathData::Initializer);
117119
}
120+
121+
fn visit_macro_invoc(&mut self, id: NodeId) {
122+
if let Some(ref mut visit) = self.visit_macro_invoc {
123+
visit(id, self.parent_def.unwrap());
124+
}
125+
}
118126
}
119127

120-
impl<'ast> visit::Visitor for DefCollector<'ast> {
128+
impl<'a> visit::Visitor for DefCollector<'a> {
121129
fn visit_item(&mut self, i: &Item) {
122130
debug!("visit_item: {:?}", i);
123131

@@ -129,10 +137,14 @@ impl<'ast> visit::Visitor for DefCollector<'ast> {
129137
ItemKind::Enum(..) | ItemKind::Struct(..) | ItemKind::Union(..) | ItemKind::Trait(..) |
130138
ItemKind::ExternCrate(..) | ItemKind::ForeignMod(..) | ItemKind::Ty(..) =>
131139
DefPathData::TypeNs(i.ident.name.as_str()),
140+
ItemKind::Mod(..) if i.ident == keywords::Invalid.ident() => {
141+
return visit::walk_item(self, i);
142+
}
132143
ItemKind::Mod(..) => DefPathData::Module(i.ident.name.as_str()),
133144
ItemKind::Static(..) | ItemKind::Const(..) | ItemKind::Fn(..) =>
134145
DefPathData::ValueNs(i.ident.name.as_str()),
135-
ItemKind::Mac(..) => DefPathData::MacroDef(i.ident.name.as_str()),
146+
ItemKind::Mac(..) if i.id == DUMMY_NODE_ID => return, // Scope placeholder
147+
ItemKind::Mac(..) => return self.visit_macro_invoc(i.id),
136148
ItemKind::Use(..) => DefPathData::Misc,
137149
};
138150
let def = self.create_def(i.id, def_data);
@@ -198,7 +210,7 @@ impl<'ast> visit::Visitor for DefCollector<'ast> {
198210
TraitItemKind::Method(..) | TraitItemKind::Const(..) =>
199211
DefPathData::ValueNs(ti.ident.name.as_str()),
200212
TraitItemKind::Type(..) => DefPathData::TypeNs(ti.ident.name.as_str()),
201-
TraitItemKind::Macro(..) => DefPathData::MacroDef(ti.ident.name.as_str()),
213+
TraitItemKind::Macro(..) => return self.visit_macro_invoc(ti.id),
202214
};
203215

204216
let def = self.create_def(ti.id, def_data);
@@ -216,7 +228,7 @@ impl<'ast> visit::Visitor for DefCollector<'ast> {
216228
ImplItemKind::Method(..) | ImplItemKind::Const(..) =>
217229
DefPathData::ValueNs(ii.ident.name.as_str()),
218230
ImplItemKind::Type(..) => DefPathData::TypeNs(ii.ident.name.as_str()),
219-
ImplItemKind::Macro(..) => DefPathData::MacroDef(ii.ident.name.as_str()),
231+
ImplItemKind::Macro(..) => return self.visit_macro_invoc(ii.id),
220232
};
221233

222234
let def = self.create_def(ii.id, def_data);
@@ -232,9 +244,13 @@ impl<'ast> visit::Visitor for DefCollector<'ast> {
232244
fn visit_pat(&mut self, pat: &Pat) {
233245
let parent_def = self.parent_def;
234246

235-
if let PatKind::Ident(_, id, _) = pat.node {
236-
let def = self.create_def(pat.id, DefPathData::Binding(id.node.name.as_str()));
237-
self.parent_def = Some(def);
247+
match pat.node {
248+
PatKind::Mac(..) => return self.visit_macro_invoc(pat.id),
249+
PatKind::Ident(_, id, _) => {
250+
let def = self.create_def(pat.id, DefPathData::Binding(id.node.name.as_str()));
251+
self.parent_def = Some(def);
252+
}
253+
_ => {}
238254
}
239255

240256
visit::walk_pat(self, pat);
@@ -244,25 +260,28 @@ impl<'ast> visit::Visitor for DefCollector<'ast> {
244260
fn visit_expr(&mut self, expr: &Expr) {
245261
let parent_def = self.parent_def;
246262

247-
if let ExprKind::Repeat(_, ref count) = expr.node {
248-
self.visit_ast_const_integer(count);
249-
}
250-
251-
if let ExprKind::Closure(..) = expr.node {
252-
let def = self.create_def(expr.id, DefPathData::ClosureExpr);
253-
self.parent_def = Some(def);
263+
match expr.node {
264+
ExprKind::Mac(..) => return self.visit_macro_invoc(expr.id),
265+
ExprKind::Repeat(_, ref count) => self.visit_ast_const_integer(count),
266+
ExprKind::Closure(..) => {
267+
let def = self.create_def(expr.id, DefPathData::ClosureExpr);
268+
self.parent_def = Some(def);
269+
}
270+
_ => {}
254271
}
255272

256273
visit::walk_expr(self, expr);
257274
self.parent_def = parent_def;
258275
}
259276

260277
fn visit_ty(&mut self, ty: &Ty) {
261-
if let TyKind::FixedLengthVec(_, ref length) = ty.node {
262-
self.visit_ast_const_integer(length);
263-
}
264-
if let TyKind::ImplTrait(..) = ty.node {
265-
self.create_def(ty.id, DefPathData::ImplTrait);
278+
match ty.node {
279+
TyKind::Mac(..) => return self.visit_macro_invoc(ty.id),
280+
TyKind::FixedLengthVec(_, ref length) => self.visit_ast_const_integer(length),
281+
TyKind::ImplTrait(..) => {
282+
self.create_def(ty.id, DefPathData::ImplTrait);
283+
}
284+
_ => {}
266285
}
267286
visit::walk_ty(self, ty);
268287
}
@@ -274,6 +293,13 @@ impl<'ast> visit::Visitor for DefCollector<'ast> {
274293
fn visit_macro_def(&mut self, macro_def: &MacroDef) {
275294
self.create_def(macro_def.id, DefPathData::MacroDef(macro_def.ident.name.as_str()));
276295
}
296+
297+
fn visit_stmt(&mut self, stmt: &Stmt) {
298+
match stmt.node {
299+
StmtKind::Mac(..) => self.visit_macro_invoc(stmt.id),
300+
_ => visit::walk_stmt(self, stmt),
301+
}
302+
}
277303
}
278304

279305
// We walk the HIR rather than the AST when reading items from metadata.

src/librustc/hir/map/definitions.rs

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,10 @@
99
// except according to those terms.
1010

1111
use hir::def_id::{CrateNum, DefId, DefIndex, LOCAL_CRATE};
12-
use hir::map::def_collector::DefCollector;
1312
use rustc_data_structures::fnv::FnvHashMap;
1413
use std::fmt::Write;
1514
use std::hash::{Hash, Hasher, SipHasher};
16-
use syntax::{ast, visit};
15+
use syntax::ast;
1716
use syntax::parse::token::{self, InternedString};
1817
use ty::TyCtxt;
1918
use util::nodemap::NodeMap;
@@ -224,12 +223,6 @@ impl Definitions {
224223
}
225224
}
226225

227-
pub fn collect(&mut self, krate: &ast::Crate) {
228-
let mut def_collector = DefCollector::new(self);
229-
def_collector.collect_root();
230-
visit::walk_crate(&mut def_collector, krate);
231-
}
232-
233226
/// Get the number of definitions.
234227
pub fn len(&self) -> usize {
235228
self.data.len()

src/librustc/hir/map/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
pub use self::Node::*;
1212
use self::MapEntry::*;
1313
use self::collector::NodeCollector;
14-
use self::def_collector::DefCollector;
14+
pub use self::def_collector::DefCollector;
1515
pub use self::definitions::{Definitions, DefKey, DefPath, DefPathData,
1616
DisambiguatedDefPathData, InlinedRootPath};
1717

src/librustc_driver/driver.rs

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -733,9 +733,6 @@ pub fn phase_2_configure_and_expand<'a, F>(sess: &Session,
733733
})
734734
})?;
735735

736-
// Collect defintions for def ids.
737-
time(sess.time_passes(), "collecting defs", || resolver.definitions.collect(&krate));
738-
739736
time(sess.time_passes(),
740737
"early lint checks",
741738
|| lint::check_ast_crate(sess, &krate));

src/librustc_resolve/lib.rs

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ use self::RibKind::*;
4242
use self::UseLexicalScopeFlag::*;
4343
use self::ModulePrefixResult::*;
4444

45-
use rustc::hir::map::Definitions;
45+
use rustc::hir::map::{Definitions, DefCollector};
4646
use rustc::hir::{self, PrimTy, TyBool, TyChar, TyFloat, TyInt, TyUint, TyStr};
4747
use rustc::middle::cstore::CrateLoader;
4848
use rustc::session::Session;
@@ -1188,13 +1188,16 @@ impl<'a> Resolver<'a> {
11881188
let mut module_map = NodeMap();
11891189
module_map.insert(CRATE_NODE_ID, graph_root);
11901190

1191+
let mut definitions = Definitions::new();
1192+
DefCollector::new(&mut definitions).collect_root();
1193+
11911194
let mut expansion_data = FnvHashMap();
1192-
expansion_data.insert(0, macros::ExpansionData::default()); // Crate root expansion
1195+
expansion_data.insert(0, macros::ExpansionData::root()); // Crate root expansion
11931196

11941197
Resolver {
11951198
session: session,
11961199

1197-
definitions: Definitions::new(),
1200+
definitions: definitions,
11981201
macros_at_scope: FnvHashMap(),
11991202

12001203
// The outermost module has def ID 0; this is not reflected in the
@@ -1264,6 +1267,13 @@ impl<'a> Resolver<'a> {
12641267

12651268
/// Entry point to crate resolution.
12661269
pub fn resolve_crate(&mut self, krate: &Crate) {
1270+
// Collect `DefId`s for exported macro defs.
1271+
for def in &krate.exported_macros {
1272+
DefCollector::new(&mut self.definitions).with_parent(CRATE_DEF_INDEX, |collector| {
1273+
collector.visit_macro_def(def)
1274+
})
1275+
}
1276+
12671277
self.current_module = self.graph_root;
12681278
visit::walk_crate(self, krate);
12691279

src/librustc_resolve/macros.rs

Lines changed: 35 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
// except according to those terms.
1010

1111
use Resolver;
12+
use rustc::hir::def_id::{CRATE_DEF_INDEX, DefIndex};
13+
use rustc::hir::map::DefCollector;
1214
use rustc::middle::cstore::LoadedMacro;
1315
use rustc::util::nodemap::FnvHashMap;
1416
use std::cell::RefCell;
@@ -27,9 +29,19 @@ use syntax::util::lev_distance::find_best_match_for_name;
2729
use syntax::visit::{self, Visitor};
2830
use syntax_pos::Span;
2931

30-
#[derive(Clone, Default)]
32+
#[derive(Clone)]
3133
pub struct ExpansionData {
3234
module: Rc<ModuleData>,
35+
def_index: DefIndex,
36+
}
37+
38+
impl ExpansionData {
39+
pub fn root() -> Self {
40+
ExpansionData {
41+
module: Default::default(),
42+
def_index: CRATE_DEF_INDEX,
43+
}
44+
}
3345
}
3446

3547
// FIXME(jseyfried): merge with `::ModuleS`.
@@ -46,10 +58,10 @@ impl<'a> base::Resolver for Resolver<'a> {
4658
}
4759

4860
fn visit_expansion(&mut self, mark: Mark, expansion: &Expansion) {
49-
expansion.visit_with(&mut ExpansionVisitor {
50-
current_module: self.expansion_data[&mark.as_u32()].module.clone(),
51-
resolver: self,
52-
});
61+
let module = self.expansion_data[&mark.as_u32()].module.clone();
62+
let mut visitor = ExpansionVisitor { current_module: module, resolver: self };
63+
visitor.collect_def_ids(mark, expansion);
64+
expansion.visit_with(&mut visitor);
5365
}
5466

5567
fn add_macro(&mut self, scope: Mark, mut def: ast::MacroDef) {
@@ -166,9 +178,8 @@ struct ExpansionVisitor<'b, 'a: 'b> {
166178

167179
impl<'a, 'b> ExpansionVisitor<'a, 'b> {
168180
fn visit_invoc(&mut self, id: ast::NodeId) {
169-
self.resolver.expansion_data.insert(id.as_u32(), ExpansionData {
170-
module: self.current_module.clone(),
171-
});
181+
self.resolver.expansion_data.get_mut(&id.as_u32()).unwrap().module =
182+
self.current_module.clone();
172183
}
173184

174185
// does this attribute list contain "macro_use"?
@@ -195,6 +206,22 @@ impl<'a, 'b> ExpansionVisitor<'a, 'b> {
195206

196207
false
197208
}
209+
210+
fn collect_def_ids(&mut self, mark: Mark, expansion: &Expansion) {
211+
let expansion_data = &mut self.resolver.expansion_data;
212+
let module = &self.current_module;
213+
let def_index = expansion_data[&mark.as_u32()].def_index;
214+
let visit_macro_invoc = &mut |id: ast::NodeId, def_index| {
215+
expansion_data.insert(id.as_u32(), ExpansionData {
216+
def_index: def_index,
217+
module: module.clone(),
218+
});
219+
};
220+
221+
let mut def_collector = DefCollector::new(&mut self.resolver.definitions);
222+
def_collector.visit_macro_invoc = Some(visit_macro_invoc);
223+
def_collector.with_parent(def_index, |def_collector| expansion.visit_with(def_collector));
224+
}
198225
}
199226

200227
macro_rules! method {

0 commit comments

Comments
 (0)