Skip to content

Commit ec0c150

Browse files
committed
groundwork: refactor the interface that resolve exposes to driver
1 parent 36a4eb9 commit ec0c150

File tree

2 files changed

+60
-88
lines changed

2 files changed

+60
-88
lines changed

src/librustc_driver/driver.rs

+30-43
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
// option. This file may not be copied, modified, or distributed
99
// except according to those terms.
1010

11-
use rustc::dep_graph::DepGraph;
1211
use rustc::hir;
1312
use rustc::hir::{map as hir_map, FreevarMap, TraitMap};
1413
use rustc::hir::def::DefMap;
@@ -27,7 +26,7 @@ use rustc::util::nodemap::NodeSet;
2726
use rustc_back::sha2::{Sha256, Digest};
2827
use rustc_borrowck as borrowck;
2928
use rustc_incremental;
30-
use rustc_resolve as resolve;
29+
use rustc_resolve::{MakeGlobMap, Resolver};
3130
use rustc_metadata::macro_import;
3231
use rustc_metadata::creader::read_local_crates;
3332
use rustc_metadata::cstore::CStore;
@@ -291,7 +290,7 @@ pub struct CompileController<'a> {
291290
pub after_analysis: PhaseController<'a>,
292291
pub after_llvm: PhaseController<'a>,
293292

294-
pub make_glob_map: resolve::MakeGlobMap,
293+
pub make_glob_map: MakeGlobMap,
295294
}
296295

297296
impl<'a> CompileController<'a> {
@@ -303,7 +302,7 @@ impl<'a> CompileController<'a> {
303302
after_hir_lowering: PhaseController::basic(),
304303
after_analysis: PhaseController::basic(),
305304
after_llvm: PhaseController::basic(),
306-
make_glob_map: resolve::MakeGlobMap::No,
305+
make_glob_map: MakeGlobMap::No,
307306
}
308307
}
309308
}
@@ -562,7 +561,7 @@ pub fn phase_2_configure_and_expand<'a>(sess: &Session,
562561
mut krate: ast::Crate,
563562
crate_name: &'a str,
564563
addl_plugins: Option<Vec<String>>,
565-
make_glob_map: resolve::MakeGlobMap)
564+
make_glob_map: MakeGlobMap)
566565
-> Result<ExpansionResult<'a>, usize> {
567566
let time_passes = sess.time_passes();
568567

@@ -728,7 +727,7 @@ pub fn phase_2_configure_and_expand<'a>(sess: &Session,
728727
krate = assign_node_ids(sess, krate);
729728

730729
// Collect defintions for def ids.
731-
let mut defs =
730+
let defs =
732731
time(sess.time_passes(), "collecting defs", || hir_map::collect_definitions(&krate));
733732

734733
time(sess.time_passes(),
@@ -743,8 +742,17 @@ pub fn phase_2_configure_and_expand<'a>(sess: &Session,
743742
"AST validation",
744743
|| ast_validation::check_crate(sess, &krate));
745744

746-
let (analysis, resolutions, hir_forest) =
747-
lower_and_resolve(sess, crate_name, &mut defs, &krate, &sess.dep_graph, make_glob_map);
745+
let resolver_arenas = Resolver::arenas();
746+
let mut resolver = Resolver::new(sess, defs, make_glob_map, &resolver_arenas);
747+
748+
time(sess.time_passes(), "name resolution", || {
749+
resolver.resolve_crate(&krate);
750+
});
751+
752+
// Lower ast -> hir.
753+
let hir_forest = time(sess.time_passes(), "lowering ast -> hir", || {
754+
hir_map::Forest::new(lower_crate(sess, &krate, &mut resolver), &sess.dep_graph)
755+
});
748756

749757
// Discard MTWT tables that aren't required past lowering to HIR.
750758
if !keep_mtwt_tables(sess) {
@@ -753,9 +761,20 @@ pub fn phase_2_configure_and_expand<'a>(sess: &Session,
753761

754762
Ok(ExpansionResult {
755763
expanded_crate: krate,
756-
defs: defs,
757-
analysis: analysis,
758-
resolutions: resolutions,
764+
defs: resolver.definitions,
765+
analysis: ty::CrateAnalysis {
766+
export_map: resolver.export_map,
767+
access_levels: AccessLevels::default(),
768+
reachable: NodeSet(),
769+
name: crate_name,
770+
glob_map: if resolver.make_glob_map { Some(resolver.glob_map) } else { None },
771+
},
772+
resolutions: Resolutions {
773+
def_map: resolver.def_map,
774+
freevars: resolver.freevars,
775+
trait_map: resolver.trait_map,
776+
maybe_unused_trait_imports: resolver.maybe_unused_trait_imports,
777+
},
759778
hir_forest: hir_forest
760779
})
761780
}
@@ -807,38 +826,6 @@ pub fn assign_node_ids(sess: &Session, krate: ast::Crate) -> ast::Crate {
807826
krate
808827
}
809828

810-
pub fn lower_and_resolve<'a>(sess: &Session,
811-
id: &'a str,
812-
defs: &mut hir_map::Definitions,
813-
krate: &ast::Crate,
814-
dep_graph: &DepGraph,
815-
make_glob_map: resolve::MakeGlobMap)
816-
-> (ty::CrateAnalysis<'a>, Resolutions, hir_map::Forest) {
817-
resolve::with_resolver(sess, defs, make_glob_map, |mut resolver| {
818-
time(sess.time_passes(), "name resolution", || {
819-
resolve::resolve_crate(&mut resolver, krate);
820-
});
821-
822-
// Lower ast -> hir.
823-
let hir_forest = time(sess.time_passes(), "lowering ast -> hir", || {
824-
hir_map::Forest::new(lower_crate(sess, krate, &mut resolver), dep_graph)
825-
});
826-
827-
(ty::CrateAnalysis {
828-
export_map: resolver.export_map,
829-
access_levels: AccessLevels::default(),
830-
reachable: NodeSet(),
831-
name: &id,
832-
glob_map: if resolver.make_glob_map { Some(resolver.glob_map) } else { None },
833-
}, Resolutions {
834-
def_map: resolver.def_map,
835-
freevars: resolver.freevars,
836-
trait_map: resolver.trait_map,
837-
maybe_unused_trait_imports: resolver.maybe_unused_trait_imports,
838-
}, hir_forest)
839-
})
840-
}
841-
842829
/// Run the resolution, typechecking, region checking and other
843830
/// miscellaneous analysis passes on the crate. Return various
844831
/// structures carrying the results of the analysis.

src/librustc_resolve/lib.rs

+30-45
Original file line numberDiff line numberDiff line change
@@ -925,7 +925,7 @@ impl PrimitiveTypeTable {
925925
pub struct Resolver<'a> {
926926
session: &'a Session,
927927

928-
definitions: &'a mut Definitions,
928+
pub definitions: Definitions,
929929

930930
graph_root: Module<'a>,
931931

@@ -1001,7 +1001,7 @@ pub struct Resolver<'a> {
10011001
arenas: &'a ResolverArenas<'a>,
10021002
}
10031003

1004-
struct ResolverArenas<'a> {
1004+
pub struct ResolverArenas<'a> {
10051005
modules: arena::TypedArena<ModuleS<'a>>,
10061006
local_modules: RefCell<Vec<Module<'a>>>,
10071007
name_bindings: arena::TypedArena<NameBinding<'a>>,
@@ -1079,7 +1079,7 @@ impl<'a> hir::lowering::Resolver for Resolver<'a> {
10791079
}
10801080

10811081
fn definitions(&mut self) -> Option<&mut Definitions> {
1082-
Some(self.definitions)
1082+
Some(&mut self.definitions)
10831083
}
10841084
}
10851085

@@ -1100,11 +1100,11 @@ impl Named for hir::PathSegment {
11001100
}
11011101

11021102
impl<'a> Resolver<'a> {
1103-
fn new(session: &'a Session,
1104-
definitions: &'a mut Definitions,
1105-
make_glob_map: MakeGlobMap,
1106-
arenas: &'a ResolverArenas<'a>)
1107-
-> Resolver<'a> {
1103+
pub fn new(session: &'a Session,
1104+
definitions: Definitions,
1105+
make_glob_map: MakeGlobMap,
1106+
arenas: &'a ResolverArenas<'a>)
1107+
-> Resolver<'a> {
11081108
let root_def_id = definitions.local_def_id(CRATE_NODE_ID);
11091109
let graph_root =
11101110
ModuleS::new(NoParentLink, Some(Def::Mod(root_def_id)), false, arenas);
@@ -1158,7 +1158,7 @@ impl<'a> Resolver<'a> {
11581158
}
11591159
}
11601160

1161-
fn arenas() -> ResolverArenas<'a> {
1161+
pub fn arenas() -> ResolverArenas<'a> {
11621162
ResolverArenas {
11631163
modules: arena::TypedArena::new(),
11641164
local_modules: RefCell::new(Vec::new()),
@@ -1168,6 +1168,27 @@ impl<'a> Resolver<'a> {
11681168
}
11691169
}
11701170

1171+
/// Entry point to crate resolution.
1172+
pub fn resolve_crate(&mut self, krate: &Crate) {
1173+
// Currently, we ignore the name resolution data structures for
1174+
// the purposes of dependency tracking. Instead we will run name
1175+
// resolution and include its output in the hash of each item,
1176+
// much like we do for macro expansion. In other words, the hash
1177+
// reflects not just its contents but the results of name
1178+
// resolution on those contents. Hopefully we'll push this back at
1179+
// some point.
1180+
let _ignore = self.session.dep_graph.in_ignore();
1181+
1182+
self.build_reduced_graph(krate);
1183+
resolve_imports::resolve_imports(self);
1184+
1185+
self.current_module = self.graph_root;
1186+
visit::walk_crate(self, krate);
1187+
1188+
check_unused::check_crate(self, krate);
1189+
self.report_privacy_errors();
1190+
}
1191+
11711192
fn new_module(&self, parent_link: ParentLink<'a>, def: Option<Def>, external: bool)
11721193
-> Module<'a> {
11731194
self.arenas.alloc_module(ModuleS::new(parent_link, def, external, self.arenas))
@@ -1568,12 +1589,6 @@ impl<'a> Resolver<'a> {
15681589
None
15691590
}
15701591

1571-
fn resolve_crate(&mut self, krate: &Crate) {
1572-
debug!("(resolving crate) starting");
1573-
self.current_module = self.graph_root;
1574-
visit::walk_crate(self, krate);
1575-
}
1576-
15771592
fn resolve_item(&mut self, item: &Item) {
15781593
let name = item.ident.name;
15791594

@@ -3455,34 +3470,4 @@ pub enum MakeGlobMap {
34553470
No,
34563471
}
34573472

3458-
/// Entry point to crate resolution.
3459-
pub fn resolve_crate<'a, 'b>(resolver: &'b mut Resolver<'a>, krate: &'b Crate) {
3460-
// Currently, we ignore the name resolution data structures for
3461-
// the purposes of dependency tracking. Instead we will run name
3462-
// resolution and include its output in the hash of each item,
3463-
// much like we do for macro expansion. In other words, the hash
3464-
// reflects not just its contents but the results of name
3465-
// resolution on those contents. Hopefully we'll push this back at
3466-
// some point.
3467-
let _ignore = resolver.session.dep_graph.in_ignore();
3468-
3469-
resolver.build_reduced_graph(krate);
3470-
resolve_imports::resolve_imports(resolver);
3471-
resolver.resolve_crate(krate);
3472-
3473-
check_unused::check_crate(resolver, krate);
3474-
resolver.report_privacy_errors();
3475-
}
3476-
3477-
pub fn with_resolver<'a, T, F>(session: &'a Session,
3478-
definitions: &'a mut Definitions,
3479-
make_glob_map: MakeGlobMap,
3480-
f: F) -> T
3481-
where F: for<'b> FnOnce(Resolver<'b>) -> T,
3482-
{
3483-
let arenas = Resolver::arenas();
3484-
let resolver = Resolver::new(session, definitions, make_glob_map, &arenas);
3485-
f(resolver)
3486-
}
3487-
34883473
__build_diagnostic_array! { librustc_resolve, DIAGNOSTICS }

0 commit comments

Comments
 (0)