Skip to content

Commit e58963d

Browse files
committed
groundwork: create the Resolver earlier in phase 2
1 parent ec0c150 commit e58963d

File tree

5 files changed

+24
-29
lines changed

5 files changed

+24
-29
lines changed

src/librustc/hir/map/def_collector.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -25,15 +25,15 @@ pub struct DefCollector<'ast> {
2525
// If we are walking HIR (c.f., AST), we need to keep a reference to the
2626
// crate.
2727
hir_crate: Option<&'ast hir::Crate>,
28-
pub definitions: Definitions,
28+
definitions: &'ast mut Definitions,
2929
parent_def: Option<DefIndex>,
3030
}
3131

3232
impl<'ast> DefCollector<'ast> {
33-
pub fn root() -> DefCollector<'ast> {
33+
pub fn root(definitions: &'ast mut Definitions) -> DefCollector<'ast> {
3434
let mut collector = DefCollector {
3535
hir_crate: None,
36-
definitions: Definitions::new(),
36+
definitions: definitions,
3737
parent_def: None,
3838
};
3939
let root = collector.create_def_with_parent(None, CRATE_NODE_ID, DefPathData::CrateRoot);
@@ -48,7 +48,7 @@ impl<'ast> DefCollector<'ast> {
4848
pub fn extend(parent_node: NodeId,
4949
parent_def_path: DefPath,
5050
parent_def_id: DefId,
51-
definitions: Definitions)
51+
definitions: &'ast mut Definitions)
5252
-> DefCollector<'ast> {
5353
let mut collector = DefCollector {
5454
hir_crate: None,

src/librustc/hir/map/definitions.rs

+7-1
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,9 @@
1010

1111
use middle::cstore::LOCAL_CRATE;
1212
use hir::def_id::{DefId, DefIndex};
13+
use hir::map::def_collector::DefCollector;
1314
use rustc_data_structures::fnv::FnvHashMap;
14-
use syntax::ast;
15+
use syntax::{ast, visit};
1516
use syntax::parse::token::InternedString;
1617
use util::nodemap::NodeMap;
1718

@@ -189,6 +190,11 @@ impl Definitions {
189190
}
190191
}
191192

193+
pub fn collect(&mut self, krate: &ast::Crate) {
194+
let mut def_collector = DefCollector::root(self);
195+
visit::walk_crate(&mut def_collector, krate);
196+
}
197+
192198
/// Get the number of definitions.
193199
pub fn len(&self) -> usize {
194200
self.data.len()

src/librustc/hir/map/mod.rs

+1-9
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ use hir::def_id::{CRATE_DEF_INDEX, DefId, DefIndex};
2424
use syntax::abi::Abi;
2525
use syntax::ast::{self, Name, NodeId, DUMMY_NODE_ID, };
2626
use syntax::codemap::Spanned;
27-
use syntax::visit;
2827
use syntax_pos::Span;
2928

3029
use hir::*;
@@ -780,12 +779,6 @@ impl<F: FoldOps> Folder for IdAndSpanUpdater<F> {
780779
}
781780
}
782781

783-
pub fn collect_definitions<'ast>(krate: &'ast ast::Crate) -> Definitions {
784-
let mut def_collector = DefCollector::root();
785-
visit::walk_crate(&mut def_collector, krate);
786-
def_collector.definitions
787-
}
788-
789782
pub fn map_crate<'ast>(forest: &'ast mut Forest,
790783
definitions: Definitions)
791784
-> Map<'ast> {
@@ -842,13 +835,12 @@ pub fn map_decoded_item<'ast, F: FoldOps>(map: &Map<'ast>,
842835
let ii = map.forest.inlined_items.alloc(ii);
843836
let ii_parent_id = fld.new_id(DUMMY_NODE_ID);
844837

845-
let defs = mem::replace(&mut *map.definitions.borrow_mut(), Definitions::new());
838+
let defs = &mut *map.definitions.borrow_mut();
846839
let mut def_collector = DefCollector::extend(ii_parent_id,
847840
parent_def_path.clone(),
848841
parent_def_id,
849842
defs);
850843
def_collector.walk_item(ii, map.krate());
851-
*map.definitions.borrow_mut() = def_collector.definitions;
852844

853845
let mut collector = NodeCollector::extend(map.krate(),
854846
ii,

src/librustc_driver/driver.rs

+8-8
Original file line numberDiff line numberDiff line change
@@ -726,13 +726,16 @@ pub fn phase_2_configure_and_expand<'a>(sess: &Session,
726726

727727
krate = assign_node_ids(sess, krate);
728728

729+
let resolver_arenas = Resolver::arenas();
730+
let mut resolver = Resolver::new(sess, make_glob_map, &resolver_arenas);
731+
729732
// Collect defintions for def ids.
730-
let defs =
731-
time(sess.time_passes(), "collecting defs", || hir_map::collect_definitions(&krate));
733+
time(sess.time_passes(), "collecting defs", || resolver.definitions.collect(&krate));
732734

733-
time(sess.time_passes(),
734-
"external crate/lib resolution",
735-
|| read_local_crates(sess, &cstore, &defs, &krate, crate_name, &sess.dep_graph));
735+
time(sess.time_passes(), "external crate/lib resolution", || {
736+
let defs = &resolver.definitions;
737+
read_local_crates(sess, &cstore, defs, &krate, crate_name, &sess.dep_graph)
738+
});
736739

737740
time(sess.time_passes(),
738741
"early lint checks",
@@ -742,9 +745,6 @@ pub fn phase_2_configure_and_expand<'a>(sess: &Session,
742745
"AST validation",
743746
|| ast_validation::check_crate(sess, &krate));
744747

745-
let resolver_arenas = Resolver::arenas();
746-
let mut resolver = Resolver::new(sess, defs, make_glob_map, &resolver_arenas);
747-
748748
time(sess.time_passes(), "name resolution", || {
749749
resolver.resolve_crate(&krate);
750750
});

src/librustc_resolve/lib.rs

+4-7
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ use rustc::hir::{self, PrimTy, TyBool, TyChar, TyFloat, TyInt, TyUint, TyStr};
4747
use rustc::session::Session;
4848
use rustc::lint;
4949
use rustc::hir::def::*;
50-
use rustc::hir::def_id::DefId;
50+
use rustc::hir::def_id::{CRATE_DEF_INDEX, DefId};
5151
use rustc::ty;
5252
use rustc::ty::subst::{ParamSpace, FnSpace, TypeSpace};
5353
use rustc::hir::{Freevar, FreevarMap, TraitCandidate, TraitMap, GlobMap};
@@ -1100,12 +1100,9 @@ impl Named for hir::PathSegment {
11001100
}
11011101

11021102
impl<'a> Resolver<'a> {
1103-
pub fn new(session: &'a Session,
1104-
definitions: Definitions,
1105-
make_glob_map: MakeGlobMap,
1106-
arenas: &'a ResolverArenas<'a>)
1103+
pub fn new(session: &'a Session, make_glob_map: MakeGlobMap, arenas: &'a ResolverArenas<'a>)
11071104
-> Resolver<'a> {
1108-
let root_def_id = definitions.local_def_id(CRATE_NODE_ID);
1105+
let root_def_id = DefId::local(CRATE_DEF_INDEX);
11091106
let graph_root =
11101107
ModuleS::new(NoParentLink, Some(Def::Mod(root_def_id)), false, arenas);
11111108
let graph_root = arenas.alloc_module(graph_root);
@@ -1115,7 +1112,7 @@ impl<'a> Resolver<'a> {
11151112
Resolver {
11161113
session: session,
11171114

1118-
definitions: definitions,
1115+
definitions: Definitions::new(),
11191116

11201117
// The outermost module has def ID 0; this is not reflected in the
11211118
// AST.

0 commit comments

Comments
 (0)