mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-30 18:53:39 +00:00
Add a separate AST mapping phase
This will replace the various node_id-to-node mappings done in several other passes. This commit already uses the new map in resolve, dropping the ast_map that was built there before.
This commit is contained in:
parent
77af54bf6f
commit
40db3aa6fb
@ -80,9 +80,11 @@ fn compile_input(session::session sess, eval::env env, str input,
|
||||
auto crate =
|
||||
time(time_passes, "parsing", bind parse_input(sess, p, input));
|
||||
if (sess.get_opts().output_type == link::output_type_none) { ret; }
|
||||
auto ast_map = time(time_passes, "ast indexing",
|
||||
bind middle::ast_map::map_crate(*crate));
|
||||
auto d =
|
||||
time(time_passes, "resolution",
|
||||
bind resolve::resolve_crate(sess, crate));
|
||||
bind resolve::resolve_crate(sess, ast_map, crate));
|
||||
auto ty_cx = ty::mk_ctxt(sess, d._0, d._1);
|
||||
time[()](time_passes, "typechecking",
|
||||
bind typeck::check_crate(ty_cx, crate));
|
||||
@ -107,7 +109,8 @@ fn pretty_print_input(session::session sess, eval::env env, str input,
|
||||
auto mode;
|
||||
alt (ppm) {
|
||||
case (ppm_typed) {
|
||||
auto d = resolve::resolve_crate(sess, crate);
|
||||
auto amap = middle::ast_map::map_crate(*crate);
|
||||
auto d = resolve::resolve_crate(sess, amap, crate);
|
||||
auto ty_cx = ty::mk_ctxt(sess, d._0, d._1);
|
||||
typeck::check_crate(ty_cx, crate);
|
||||
mode = ppaux::mo_typed(ty_cx);
|
||||
|
@ -116,7 +116,7 @@ type env =
|
||||
rec(crate_map crate_map,
|
||||
def_map def_map,
|
||||
constr_table fn_constrs,
|
||||
hashmap[ast::node_id, @ast::item] ast_map,
|
||||
ast_map::map ast_map,
|
||||
hashmap[ast::node_id, import_state] imports,
|
||||
hashmap[ast::node_id, @indexed_mod] mod_map,
|
||||
hashmap[def_id, vec[ident]] ext_map,
|
||||
@ -130,13 +130,13 @@ tag dir { inside; outside; }
|
||||
|
||||
tag namespace { ns_value; ns_type; ns_module; }
|
||||
|
||||
fn resolve_crate(session sess, @ast::crate crate) ->
|
||||
fn resolve_crate(session sess, &ast_map::map amap, @ast::crate crate) ->
|
||||
tup(def_map, constr_table) {
|
||||
auto e =
|
||||
@rec(crate_map=new_int_hash[ast::crate_num](),
|
||||
def_map=new_int_hash[def](),
|
||||
fn_constrs = new_int_hash[vec[ty::constr_def]](),
|
||||
ast_map=new_int_hash[@ast::item](),
|
||||
ast_map=amap,
|
||||
imports=new_int_hash[import_state](),
|
||||
mod_map=new_int_hash[@indexed_mod](),
|
||||
ext_map=new_def_hash[vec[ident]](),
|
||||
@ -187,7 +187,6 @@ fn map_crate(&@env e, &@ast::crate c) {
|
||||
index=index_mod(md),
|
||||
mutable glob_imports=vec::empty[def](),
|
||||
glob_imported_names=s));
|
||||
e.ast_map.insert(i.id, i);
|
||||
}
|
||||
case (ast::item_native_mod(?nmd)) {
|
||||
auto s = new_str_hash[import_state]();
|
||||
@ -196,13 +195,8 @@ fn map_crate(&@env e, &@ast::crate c) {
|
||||
index=index_nmod(nmd),
|
||||
mutable glob_imports=vec::empty[def](),
|
||||
glob_imported_names=s));
|
||||
e.ast_map.insert(i.id, i);
|
||||
}
|
||||
case (ast::item_obj(_, _, ?ctor_id)) {
|
||||
e.ast_map.insert(i.id, i);
|
||||
e.ast_map.insert(ctor_id, i);
|
||||
}
|
||||
case (_) { e.ast_map.insert(i.id, i); }
|
||||
case (_) { }
|
||||
}
|
||||
}
|
||||
// Next, assemble the links for globbed imports.
|
||||
@ -969,16 +963,12 @@ fn lookup_glob_in_mod(&env e, @indexed_mod info, &span sp, &ident id,
|
||||
ret some[def](matches.(0));
|
||||
} else {
|
||||
for (def match in matches) {
|
||||
alt (e.ast_map.find(ast::def_id_of_def(match)._1)) {
|
||||
case (some(?it)) {
|
||||
e.sess.span_note(it.span,
|
||||
"'" + id + "' is defined here.");
|
||||
}
|
||||
case (_) {
|
||||
e.sess.bug("Internal error: imports and matches " +
|
||||
"don't agree");
|
||||
}
|
||||
}
|
||||
auto span = alt (e.ast_map.get(ast::def_id_of_def(match)._1)){
|
||||
case (ast_map::node_item(?it)) { it.span }
|
||||
case (ast_map::node_obj_ctor(?it)) { it.span }
|
||||
case (ast_map::node_native_item(?it)) { it.span }
|
||||
};
|
||||
e.sess.span_note(span, "'" + id + "' is defined here.");
|
||||
}
|
||||
e.sess.span_fatal(sp,
|
||||
"'" + id + "' is glob-imported from" +
|
||||
|
@ -19,6 +19,7 @@ mod middle {
|
||||
mod walk;
|
||||
mod visit;
|
||||
mod metadata;
|
||||
mod ast_map;
|
||||
mod resolve;
|
||||
mod typeck;
|
||||
mod alias;
|
||||
|
Loading…
Reference in New Issue
Block a user