Skip to content

Commit 01f32ac

Browse files
committed
Convert DefId to use DefIndex, which is an index into a list of
paths, and construct paths for all definitions. Also, stop rewriting DefIds for closures, and instead just load the closure data from the original def-id, which may be in another crate.
1 parent a6fee06 commit 01f32ac

40 files changed

+1119
-777
lines changed

src/librustc/front/map/collector.rs

Lines changed: 110 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -14,52 +14,76 @@ use super::MapEntry::*;
1414
use rustc_front::hir::*;
1515
use rustc_front::util;
1616
use rustc_front::visit::{self, Visitor};
17+
use middle::def_id::{CRATE_DEF_INDEX, DefIndex};
1718
use std::iter::repeat;
1819
use syntax::ast::{NodeId, CRATE_NODE_ID, DUMMY_NODE_ID};
1920
use syntax::codemap::Span;
20-
use util::nodemap::NodeSet;
2121

2222
/// A Visitor that walks over an AST and collects Node's into an AST
2323
/// Map.
2424
pub struct NodeCollector<'ast> {
2525
pub map: Vec<MapEntry<'ast>>,
26-
pub definitions_map: NodeSet,
26+
pub definitions: Definitions,
2727
pub parent_node: NodeId,
2828
}
2929

3030
impl<'ast> NodeCollector<'ast> {
3131
pub fn root() -> NodeCollector<'ast> {
3232
let mut collector = NodeCollector {
3333
map: vec![],
34-
definitions_map: NodeSet(),
34+
definitions: Definitions::new(),
3535
parent_node: CRATE_NODE_ID,
3636
};
3737
collector.insert_entry(CRATE_NODE_ID, RootCrate);
38-
collector.create_def(CRATE_NODE_ID);
39-
collector.create_def(DUMMY_NODE_ID);
38+
39+
let result = collector.create_def_with_parent(None, CRATE_NODE_ID, DefPathData::CrateRoot);
40+
assert_eq!(result, CRATE_DEF_INDEX);
41+
42+
collector.create_def_with_parent(Some(CRATE_DEF_INDEX), DUMMY_NODE_ID, DefPathData::Misc);
43+
4044
collector
4145
}
4246

4347
pub fn extend(parent: &'ast InlinedParent,
4448
parent_node: NodeId,
49+
parent_def_path: DefPath,
4550
map: Vec<MapEntry<'ast>>,
46-
definitions_map: NodeSet)
51+
definitions: Definitions)
4752
-> NodeCollector<'ast> {
4853
let mut collector = NodeCollector {
4954
map: map,
50-
definitions_map: definitions_map,
51-
parent_node: parent_node
55+
parent_node: parent_node,
56+
definitions: definitions,
5257
};
58+
5359
collector.insert_entry(parent_node, RootInlinedParent(parent));
60+
collector.create_def(parent_node, DefPathData::InlinedRoot(parent_def_path));
5461

5562
collector
5663
}
5764

58-
fn create_def(&mut self, node: NodeId) {
59-
let is_new = self.definitions_map.insert(node);
60-
assert!(is_new,
61-
"two entries for node id `{}` -- previous is `{:?}`",
62-
node, node);
65+
fn parent_def(&self) -> Option<DefIndex> {
66+
let mut parent_node = Some(self.parent_node);
67+
while let Some(p) = parent_node {
68+
if let Some(q) = self.definitions.opt_def_index(p) {
69+
return Some(q);
70+
}
71+
parent_node = self.map[p as usize].parent_node();
72+
}
73+
None
74+
}
75+
76+
fn create_def(&mut self, node_id: NodeId, data: DefPathData) -> DefIndex {
77+
let parent_def = self.parent_def();
78+
self.definitions.create_def_with_parent(parent_def, node_id, data)
79+
}
80+
81+
fn create_def_with_parent(&mut self,
82+
parent: Option<DefIndex>,
83+
node_id: NodeId,
84+
data: DefPathData)
85+
-> DefIndex {
86+
self.definitions.create_def_with_parent(parent, node_id, data)
6387
}
6488

6589
fn insert_entry(&mut self, id: NodeId, entry: MapEntry<'ast>) {
@@ -71,6 +95,11 @@ impl<'ast> NodeCollector<'ast> {
7195
self.map[id as usize] = entry;
7296
}
7397

98+
fn insert_def(&mut self, id: NodeId, node: Node<'ast>, data: DefPathData) -> DefIndex {
99+
self.insert(id, node);
100+
self.create_def(id, data)
101+
}
102+
74103
fn insert(&mut self, id: NodeId, node: Node<'ast>) {
75104
let entry = MapEntry::from_node(self.parent_node, node);
76105
self.insert_entry(id, entry);
@@ -85,47 +114,61 @@ impl<'ast> NodeCollector<'ast> {
85114

86115
impl<'ast> Visitor<'ast> for NodeCollector<'ast> {
87116
fn visit_item(&mut self, i: &'ast Item) {
88-
self.insert(i.id, NodeItem(i));
117+
// Pick the def data. This need not be unique, but the more
118+
// information we encapsulate into
119+
let def_data = match i.node {
120+
ItemDefaultImpl(..) | ItemImpl(..) => DefPathData::Impl,
121+
ItemEnum(..) | ItemStruct(..) | ItemTrait(..) => DefPathData::Type(i.name),
122+
ItemExternCrate(..) | ItemMod(..) => DefPathData::Mod(i.name),
123+
ItemStatic(..) | ItemConst(..) | ItemFn(..) => DefPathData::Value(i.name),
124+
_ => DefPathData::Misc,
125+
};
126+
127+
self.insert_def(i.id, NodeItem(i), def_data);
89128

90129
let parent_node = self.parent_node;
91130
self.parent_node = i.id;
92131

93-
self.create_def(i.id);
94-
95132
match i.node {
96-
ItemImpl(..) => { }
133+
ItemImpl(..) => {}
97134
ItemEnum(ref enum_definition, _) => {
98135
for v in &enum_definition.variants {
99-
self.insert(v.node.id, NodeVariant(&**v));
100-
self.create_def(v.node.id);
136+
let variant_def_index =
137+
self.insert_def(v.node.id,
138+
NodeVariant(&**v),
139+
DefPathData::EnumVariant(v.node.name));
101140

102141
match v.node.kind {
103142
TupleVariantKind(ref args) => {
104143
for arg in args {
105-
self.create_def(arg.id);
144+
self.create_def_with_parent(Some(variant_def_index),
145+
arg.id,
146+
DefPathData::PositionalField);
106147
}
107148
}
108149
StructVariantKind(ref def) => {
109150
for field in &def.fields {
110-
self.create_def(field.node.id);
151+
self.create_def_with_parent(
152+
Some(variant_def_index),
153+
field.node.id,
154+
DefPathData::Field(field.node.kind));
111155
}
112156
}
113157
}
114158
}
115159
}
116-
ItemForeignMod(..) => {}
160+
ItemForeignMod(..) => {
161+
}
117162
ItemStruct(ref struct_def, _) => {
118163
// If this is a tuple-like struct, register the constructor.
119-
match struct_def.ctor_id {
120-
Some(ctor_id) => {
121-
self.insert(ctor_id, NodeStructCtor(&**struct_def));
122-
self.create_def(ctor_id);
123-
}
124-
None => {}
164+
if let Some(ctor_id) = struct_def.ctor_id {
165+
self.insert_def(ctor_id,
166+
NodeStructCtor(&**struct_def),
167+
DefPathData::StructCtor);
125168
}
126169

127170
for field in &struct_def.fields {
128-
self.create_def(field.node.id);
171+
self.create_def(field.node.id, DefPathData::Field(field.node.kind));
129172
}
130173
}
131174
ItemTrait(_, _, ref bounds, _) => {
@@ -152,8 +195,9 @@ impl<'ast> Visitor<'ast> for NodeCollector<'ast> {
152195
}
153196

154197
fn visit_foreign_item(&mut self, foreign_item: &'ast ForeignItem) {
155-
self.insert(foreign_item.id, NodeForeignItem(foreign_item));
156-
self.create_def(foreign_item.id);
198+
self.insert_def(foreign_item.id,
199+
NodeForeignItem(foreign_item),
200+
DefPathData::Value(foreign_item.name));
157201

158202
let parent_node = self.parent_node;
159203
self.parent_node = foreign_item.id;
@@ -163,58 +207,71 @@ impl<'ast> Visitor<'ast> for NodeCollector<'ast> {
163207

164208
fn visit_generics(&mut self, generics: &'ast Generics) {
165209
for ty_param in generics.ty_params.iter() {
166-
self.create_def(ty_param.id);
167-
self.insert(ty_param.id, NodeTyParam(ty_param));
210+
self.insert_def(ty_param.id,
211+
NodeTyParam(ty_param),
212+
DefPathData::TypeParam(ty_param.name));
168213
}
169214

170215
visit::walk_generics(self, generics);
171216
}
172217

173218
fn visit_trait_item(&mut self, ti: &'ast TraitItem) {
219+
let def_data = match ti.node {
220+
MethodTraitItem(..) | ConstTraitItem(..) => DefPathData::Value(ti.name),
221+
TypeTraitItem(..) => DefPathData::Type(ti.name),
222+
};
223+
174224
self.insert(ti.id, NodeTraitItem(ti));
175-
self.create_def(ti.id);
225+
self.create_def(ti.id, def_data);
226+
227+
let parent_node = self.parent_node;
228+
self.parent_node = ti.id;
176229

177230
match ti.node {
178231
ConstTraitItem(_, Some(ref expr)) => {
179-
self.create_def(expr.id);
232+
self.create_def(expr.id, DefPathData::Initializer);
180233
}
181234
_ => { }
182235
}
183236

184-
let parent_node = self.parent_node;
185-
self.parent_node = ti.id;
186237
visit::walk_trait_item(self, ti);
238+
187239
self.parent_node = parent_node;
188240
}
189241

190242
fn visit_impl_item(&mut self, ii: &'ast ImplItem) {
191-
self.insert(ii.id, NodeImplItem(ii));
192-
self.create_def(ii.id);
243+
let def_data = match ii.node {
244+
MethodImplItem(..) | ConstImplItem(..) => DefPathData::Value(ii.name),
245+
TypeImplItem(..) => DefPathData::Type(ii.name),
246+
};
247+
248+
self.insert_def(ii.id, NodeImplItem(ii), def_data);
249+
250+
let parent_node = self.parent_node;
251+
self.parent_node = ii.id;
193252

194253
match ii.node {
195254
ConstImplItem(_, ref expr) => {
196-
self.create_def(expr.id);
255+
self.create_def(expr.id, DefPathData::Initializer);
197256
}
198257
_ => { }
199258
}
200259

201-
let parent_node = self.parent_node;
202-
self.parent_node = ii.id;
203260
visit::walk_impl_item(self, ii);
261+
204262
self.parent_node = parent_node;
205263
}
206264

207265
fn visit_pat(&mut self, pat: &'ast Pat) {
208266
let maybe_binding = match pat.node {
209-
PatIdent(..) => true,
210-
_ => false
267+
PatIdent(_, id, _) => Some(id.node),
268+
_ => None
211269
};
212270

213-
self.insert(pat.id,
214-
if maybe_binding {NodeLocal(pat)} else {NodePat(pat)});
215-
216-
if maybe_binding {
217-
self.create_def(pat.id);
271+
if let Some(id) = maybe_binding {
272+
self.insert_def(pat.id, NodeLocal(pat), DefPathData::Binding(id.name));
273+
} else {
274+
self.insert(pat.id, NodePat(pat));
218275
}
219276

220277
let parent_node = self.parent_node;
@@ -227,8 +284,8 @@ impl<'ast> Visitor<'ast> for NodeCollector<'ast> {
227284
self.insert(expr.id, NodeExpr(expr));
228285

229286
match expr.node {
230-
ExprClosure(..) => self.create_def(expr.id),
231-
_ => (),
287+
ExprClosure(..) => { self.create_def(expr.id, DefPathData::ClosureExpr); }
288+
_ => { }
232289
}
233290

234291
let parent_node = self.parent_node;
@@ -276,12 +333,12 @@ impl<'ast> Visitor<'ast> for NodeCollector<'ast> {
276333
}
277334

278335
fn visit_lifetime_def(&mut self, def: &'ast LifetimeDef) {
279-
self.create_def(def.lifetime.id);
336+
self.create_def(def.lifetime.id, DefPathData::LifetimeDef(def.lifetime.name));
280337
self.visit_lifetime(&def.lifetime);
281338
}
282339

283340
fn visit_macro_def(&mut self, macro_def: &'ast MacroDef) {
284-
self.create_def(macro_def.id);
341+
self.create_def(macro_def.id, DefPathData::MacroDef(macro_def.name));
285342
}
286343
}
287344

0 commit comments

Comments
 (0)