Skip to content

Commit 84c3f89

Browse files
committed
def_collector and crate reader operate on AST instead of HIR
And move extern crate reading earlier in the driver
1 parent 6af7aca commit 84c3f89

File tree

5 files changed

+113
-151
lines changed

5 files changed

+113
-151
lines changed

src/librustc/hir/map/def_collector.rs

Lines changed: 45 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,10 @@
1010

1111
use super::*;
1212

13-
use hir::*;
14-
use hir::intravisit::Visitor;
1513
use hir::def_id::{CRATE_DEF_INDEX, DefId, DefIndex};
16-
use syntax::ast::{NodeId, CRATE_NODE_ID, DUMMY_NODE_ID};
14+
15+
use syntax::ast::*;
16+
use syntax::visit;
1717

1818
/// Creates def ids for nodes in the HIR.
1919
pub struct DefCollector<'ast> {
@@ -80,31 +80,23 @@ impl<'ast> DefCollector<'ast> {
8080
}
8181
}
8282

83-
impl<'ast> Visitor<'ast> for DefCollector<'ast> {
84-
/// Because we want to track parent items and so forth, enable
85-
/// deep walking so that we walk nested items in the context of
86-
/// their outer items.
87-
fn visit_nested_item(&mut self, item: ItemId) {
88-
debug!("visit_nested_item: {:?}", item);
89-
self.visit_item(self.krate.item(item.id))
90-
}
91-
83+
impl<'ast> visit::Visitor<'ast> for DefCollector<'ast> {
9284
fn visit_item(&mut self, i: &'ast Item) {
9385
debug!("visit_item: {:?}", i);
9486

9587
// Pick the def data. This need not be unique, but the more
9688
// information we encapsulate into
9789
let def_data = match i.node {
98-
ItemDefaultImpl(..) | ItemImpl(..) =>
90+
ItemKind::DefaultImpl(..) | ItemKind::Impl(..) =>
9991
DefPathData::Impl,
100-
ItemEnum(..) | ItemStruct(..) | ItemTrait(..) |
101-
ItemExternCrate(..) | ItemMod(..) | ItemForeignMod(..) |
102-
ItemTy(..) =>
103-
DefPathData::TypeNs(i.name),
104-
ItemStatic(..) | ItemConst(..) | ItemFn(..) =>
105-
DefPathData::ValueNs(i.name),
106-
ItemUse(..) =>
107-
DefPathData::Misc,
92+
ItemKind::Enum(..) | ItemKind::Struct(..) | ItemKind::Trait(..) |
93+
ItemKind::ExternCrate(..) | ItemKind::Mod(..) | ItemKind::ForeignMod(..) |
94+
ItemKind::Ty(..) =>
95+
DefPathData::TypeNs(i.ident.name),
96+
ItemKind::Static(..) | ItemKind::Const(..) | ItemKind::Fn(..) =>
97+
DefPathData::ValueNs(i.ident.name),
98+
ItemKind::Mac(..) => DefPathData::MacroDef(i.ident.name),
99+
ItemKind::Use(..) => DefPathData::Misc,
108100
};
109101

110102
let def = self.create_def(i.id, def_data);
@@ -113,59 +105,63 @@ impl<'ast> Visitor<'ast> for DefCollector<'ast> {
113105
self.parent_def = Some(def);
114106

115107
match i.node {
116-
ItemEnum(ref enum_definition, _) => {
108+
ItemKind::Enum(ref enum_definition, _) => {
117109
for v in &enum_definition.variants {
118110
let variant_def_index =
119111
self.create_def(v.node.data.id(),
120-
DefPathData::EnumVariant(v.node.name));
112+
DefPathData::EnumVariant(v.node.name.name));
121113

122114
for field in v.node.data.fields() {
123-
self.create_def_with_parent(
124-
Some(variant_def_index),
125-
field.id,
126-
DefPathData::Field(field.name));
115+
if let Some(ident) = field.ident {
116+
self.create_def_with_parent(Some(variant_def_index),
117+
field.id,
118+
DefPathData::Field(ident.name));
119+
}
127120
}
128121
}
129122
}
130-
ItemStruct(ref struct_def, _) => {
123+
ItemKind::Struct(ref struct_def, _) => {
131124
// If this is a tuple-like struct, register the constructor.
132125
if !struct_def.is_struct() {
133126
self.create_def(struct_def.id(),
134127
DefPathData::StructCtor);
135128
}
136129

137130
for field in struct_def.fields() {
138-
self.create_def(field.id, DefPathData::Field(field.name));
131+
if let Some(ident) = field.ident {
132+
self.create_def(field.id, DefPathData::Field(ident.name));
133+
}
139134
}
140135
}
141136
_ => {}
142137
}
143-
intravisit::walk_item(self, i);
138+
visit::walk_item(self, i);
144139
self.parent_def = parent_def;
145140
}
146141

147142
fn visit_foreign_item(&mut self, foreign_item: &'ast ForeignItem) {
148-
let def = self.create_def(foreign_item.id, DefPathData::ValueNs(foreign_item.name));
143+
let def = self.create_def(foreign_item.id, DefPathData::ValueNs(foreign_item.ident.name));
149144

150145
let parent_def = self.parent_def;
151146
self.parent_def = Some(def);
152-
intravisit::walk_foreign_item(self, foreign_item);
147+
visit::walk_foreign_item(self, foreign_item);
153148
self.parent_def = parent_def;
154149
}
155150

156151
fn visit_generics(&mut self, generics: &'ast Generics) {
157152
for ty_param in generics.ty_params.iter() {
158153
self.create_def(ty_param.id,
159-
DefPathData::TypeParam(ty_param.name));
154+
DefPathData::TypeParam(ty_param.ident.name));
160155
}
161156

162-
intravisit::walk_generics(self, generics);
157+
visit::walk_generics(self, generics);
163158
}
164159

165160
fn visit_trait_item(&mut self, ti: &'ast TraitItem) {
166161
let def_data = match ti.node {
167-
MethodTraitItem(..) | ConstTraitItem(..) => DefPathData::ValueNs(ti.name),
168-
TypeTraitItem(..) => DefPathData::TypeNs(ti.name),
162+
TraitItemKind::Method(..) | TraitItemKind::Const(..) =>
163+
DefPathData::ValueNs(ti.ident.name),
164+
TraitItemKind::Type(..) => DefPathData::TypeNs(ti.ident.name),
169165
};
170166

171167
let def = self.create_def(ti.id, def_data);
@@ -174,21 +170,23 @@ impl<'ast> Visitor<'ast> for DefCollector<'ast> {
174170
self.parent_def = Some(def);
175171

176172
match ti.node {
177-
ConstTraitItem(_, Some(ref expr)) => {
173+
TraitItemKind::Const(_, Some(ref expr)) => {
178174
self.create_def(expr.id, DefPathData::Initializer);
179175
}
180176
_ => { }
181177
}
182178

183-
intravisit::walk_trait_item(self, ti);
179+
visit::walk_trait_item(self, ti);
184180

185181
self.parent_def = parent_def;
186182
}
187183

188184
fn visit_impl_item(&mut self, ii: &'ast ImplItem) {
189185
let def_data = match ii.node {
190-
ImplItemKind::Method(..) | ImplItemKind::Const(..) => DefPathData::ValueNs(ii.name),
191-
ImplItemKind::Type(..) => DefPathData::TypeNs(ii.name),
186+
ImplItemKind::Method(..) | ImplItemKind::Const(..) =>
187+
DefPathData::ValueNs(ii.ident.name),
188+
ImplItemKind::Type(..) => DefPathData::TypeNs(ii.ident.name),
189+
ImplItemKind::Macro(..) => DefPathData::MacroDef(ii.ident.name),
192190
};
193191

194192
let def = self.create_def(ii.id, def_data);
@@ -203,7 +201,7 @@ impl<'ast> Visitor<'ast> for DefCollector<'ast> {
203201
_ => { }
204202
}
205203

206-
intravisit::walk_impl_item(self, ii);
204+
visit::walk_impl_item(self, ii);
207205

208206
self.parent_def = parent_def;
209207
}
@@ -220,35 +218,35 @@ impl<'ast> Visitor<'ast> for DefCollector<'ast> {
220218
self.parent_def = Some(def);
221219
}
222220

223-
intravisit::walk_pat(self, pat);
221+
visit::walk_pat(self, pat);
224222
self.parent_def = parent_def;
225223
}
226224

227225
fn visit_expr(&mut self, expr: &'ast Expr) {
228226
let parent_def = self.parent_def;
229227

230-
if let ExprClosure(..) = expr.node {
228+
if let ExprKind::Closure(..) = expr.node {
231229
let def = self.create_def(expr.id, DefPathData::ClosureExpr);
232230
self.parent_def = Some(def);
233231
}
234232

235-
intravisit::walk_expr(self, expr);
233+
visit::walk_expr(self, expr);
236234
self.parent_def = parent_def;
237235
}
238236

239237
fn visit_stmt(&mut self, stmt: &'ast Stmt) {
240-
intravisit::walk_stmt(self, stmt);
238+
visit::walk_stmt(self, stmt);
241239
}
242240

243241
fn visit_block(&mut self, block: &'ast Block) {
244-
intravisit::walk_block(self, block);
242+
visit::walk_block(self, block);
245243
}
246244

247245
fn visit_lifetime_def(&mut self, def: &'ast LifetimeDef) {
248246
self.create_def(def.lifetime.id, DefPathData::LifetimeDef(def.lifetime.name));
249247
}
250248

251249
fn visit_macro_def(&mut self, macro_def: &'ast MacroDef) {
252-
self.create_def(macro_def.id, DefPathData::MacroDef(macro_def.name));
250+
self.create_def(macro_def.id, DefPathData::MacroDef(macro_def.ident.name));
253251
}
254252
}

src/librustc/hir/map/mod.rs

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,10 @@ use middle::cstore::InlinedItem as II;
2222
use hir::def_id::{CRATE_DEF_INDEX, DefId};
2323

2424
use syntax::abi::Abi;
25-
use syntax::ast::{self, Name, NodeId, DUMMY_NODE_ID};
25+
use syntax::ast::{self, Name, NodeId, DUMMY_NODE_ID, };
2626
use syntax::attr::ThinAttributesExt;
2727
use syntax::codemap::{Span, Spanned};
28+
use syntax::visit;
2829

2930
use hir::*;
3031
use hir::fold::Folder;
@@ -782,10 +783,10 @@ impl<F: FoldOps> Folder for IdAndSpanUpdater<F> {
782783
}
783784
}
784785

785-
pub fn collect_definitions<'ast>(forest: &'ast mut Forest) -> Definitions {
786-
let mut def_collector = DefCollector::root(&forest.krate);
787-
intravisit::walk_crate(&mut def_collector, &forest.krate);
788-
def_collector.definitions
786+
pub fn collect_definitions<'ast>(krate: &'ast ast::Crate) -> Definitions {
787+
let mut def_collector = DefCollector::root(krate);
788+
visit::walk_crate(&mut def_collector, krate);
789+
def_collector.definitions
789790
}
790791

791792
pub fn map_crate<'ast>(forest: &'ast mut Forest, definitions: Definitions) -> Map<'ast> {
@@ -842,14 +843,15 @@ pub fn map_decoded_item<'ast, F: FoldOps>(map: &Map<'ast>,
842843
let ii = map.forest.inlined_items.alloc(ii);
843844
let ii_parent_id = fld.new_id(DUMMY_NODE_ID);
844845

845-
let defs = mem::replace(&mut *map.definitions.borrow_mut(), Definitions::new());
846-
let mut def_collector = DefCollector::extend(map.krate(),
847-
ii_parent_id,
848-
parent_def_path.clone(),
849-
parent_def_id,
850-
defs);
851-
ii.visit(&mut def_collector);
852-
*map.definitions.borrow_mut() = def_collector.definitions;
846+
// TODO need to save defs in metadata :-(
847+
// let defs = mem::replace(&mut *map.definitions.borrow_mut(), Definitions::new());
848+
// let mut def_collector = DefCollector::extend(map.krate(),
849+
// ii_parent_id,
850+
// parent_def_path.clone(),
851+
// parent_def_id,
852+
// defs);
853+
// ii.visit(&mut def_collector);
854+
// *map.definitions.borrow_mut() = def_collector.definitions;
853855

854856
let mut collector = NodeCollector::extend(map.krate(),
855857
ii,

src/librustc_driver/driver.rs

Lines changed: 25 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -122,32 +122,22 @@ pub fn compile_input(sess: &Session,
122122
let expanded_crate = assign_node_ids(sess, expanded_crate);
123123
let dep_graph = DepGraph::new(sess.opts.build_dep_graph);
124124

125-
// TODO
126-
// time(sess.time_passes(),
127-
// "external crate/lib resolution",
128-
// || LocalCrateReader::new(sess, &cstore, &defs, &id).read_crates());
129-
130-
// TODO
131-
panic!();
132-
133-
// TODO CrateMap result
134-
// let resolve::CrateMap {
135-
// def_map,
136-
// freevars,
137-
// export_map,
138-
// trait_map,
139-
// glob_map,
140-
// } = time(sess.time_passes(),
141-
// "name resolution",
142-
// || resolve::resolve_crate(sess, &hir_map, control.make_glob_map));
125+
// Collect defintions for def ids.
126+
let defs = time(sess.time_passes(),
127+
"collecting defs",
128+
|| hir_map::collect_definitions(&expanded_crate));
129+
130+
time(sess.time_passes(),
131+
"external crate/lib resolution",
132+
|| LocalCrateReader::new(sess, &cstore, &defs, &expanded_crate, &id)
133+
.read_crates(&dep_graph));
143134

144135
// Lower ast -> hir.
145136
let lcx = LoweringContext::new(sess, Some(&expanded_crate));
146-
let dep_graph = DepGraph::new(sess.opts.build_dep_graph());
147-
let mut hir_forest = time(sess.time_passes(),
148-
"lowering ast -> hir",
149-
|| hir_map::Forest::new(lower_crate(&lcx, &expanded_crate),
150-
dep_graph));
137+
let hir_forest = &mut time(sess.time_passes(),
138+
"lowering ast -> hir",
139+
|| hir_map::Forest::new(lower_crate(&lcx, &expanded_crate),
140+
dep_graph));
151141

152142
// Discard MTWT tables that aren't required past lowering to HIR.
153143
if !sess.opts.debugging_opts.keep_mtwt_tables &&
@@ -156,10 +146,6 @@ pub fn compile_input(sess: &Session,
156146
}
157147

158148
let arenas = ty::CtxtArenas::new();
159-
// Collect defintions for def ids.
160-
let defs = time(sess.time_passes(),
161-
"collecting defs",
162-
move || hir_map::collect_defs(hir_forest));
163149

164150
// Construct the HIR map
165151
let hir_map = time(sess.time_passes(),
@@ -201,10 +187,10 @@ pub fn compile_input(sess: &Session,
201187
};
202188

203189
phase_3_run_analysis_passes(sess,
204-
&cstore,
205190
hir_map,
206191
&arenas,
207192
&id,
193+
control.make_glob_map,
208194
|tcx, mir_map, analysis, result| {
209195
{
210196
// Eventually, we will want to track plugins.
@@ -759,10 +745,10 @@ pub fn assign_node_ids(sess: &Session, krate: ast::Crate) -> ast::Crate {
759745
/// miscellaneous analysis passes on the crate. Return various
760746
/// structures carrying the results of the analysis.
761747
pub fn phase_3_run_analysis_passes<'tcx, F, R>(sess: &'tcx Session,
762-
cstore: &CStore,
763748
hir_map: hir_map::Map<'tcx>,
764749
arenas: &'tcx ty::CtxtArenas<'tcx>,
765750
name: &str,
751+
make_glob_map: resolve::MakeGlobMap,
766752
f: F)
767753
-> Result<R, usize>
768754
where F: FnOnce(&TyCtxt<'tcx>, Option<MirMap<'tcx>>, ty::CrateAnalysis, CompileResult) -> R
@@ -787,6 +773,16 @@ pub fn phase_3_run_analysis_passes<'tcx, F, R>(sess: &'tcx Session,
787773
})
788774
})?;
789775

776+
let resolve::CrateMap {
777+
def_map,
778+
freevars,
779+
export_map,
780+
trait_map,
781+
glob_map,
782+
} = time(sess.time_passes(),
783+
"name resolution",
784+
|| resolve::resolve_crate(sess, &hir_map, make_glob_map));
785+
790786
let mut analysis = ty::CrateAnalysis {
791787
export_map: export_map,
792788
access_levels: AccessLevels::default(),

0 commit comments

Comments
 (0)