diff options
| author | Paul Stansifer <paul.stansifer@gmail.com> | 2011-05-25 11:55:48 -0700 |
|---|---|---|
| committer | Graydon Hoare <graydon@mozilla.com> | 2011-05-27 02:42:33 +0000 |
| commit | 7fe3d821ac26615e1d5228864ece4d08531c2237 (patch) | |
| tree | ac2c2f3333dfef83de5f362e7c77c122cee0e59e /src/comp | |
| parent | 54ca8565c96601a0ffa99cdf8f7f3d1550f39180 (diff) | |
| download | rust-7fe3d821ac26615e1d5228864ece4d08531c2237.tar.gz rust-7fe3d821ac26615e1d5228864ece4d08531c2237.zip | |
Add a map from def_id s to items in resolve::env.
Use it to provide better error messages in the event of glob-importing the same name multiple times.
Diffstat (limited to 'src/comp')
| -rw-r--r-- | src/comp/middle/resolve.rs | 25 |
1 files changed, 24 insertions, 1 deletions
diff --git a/src/comp/middle/resolve.rs b/src/comp/middle/resolve.rs index f0ae03925aa..e14f1719e86 100644 --- a/src/comp/middle/resolve.rs +++ b/src/comp/middle/resolve.rs @@ -88,6 +88,7 @@ type def_map = hashmap[uint,def]; type env = rec(crate_map crate_map, def_map def_map, + hashmap[def_id,@ast::item] ast_map, hashmap[ast::def_num,import_state] imports, hashmap[ast::def_num,@indexed_mod] mod_map, hashmap[def_id,vec[ident]] ext_map, @@ -107,6 +108,7 @@ tag namespace { fn resolve_crate(session sess, @ast::crate crate) -> def_map { auto e = @rec(crate_map = new_uint_hash[ast::crate_num](), def_map = new_uint_hash[def](), + ast_map = new_def_hash[@ast::item](), imports = new_int_hash[import_state](), mod_map = new_int_hash[@indexed_mod](), ext_map = new_def_hash[vec[ident]](), @@ -157,14 +159,31 @@ fn map_crate(&@env e, &ast::crate c) { e.mod_map.insert(defid._1, @rec(m=some(md), index=index_mod(md), glob_imports=vec::empty[def]())); + e.ast_map.insert(defid, i); } case (ast::item_native_mod(_, ?nmd, ?defid)) { e.mod_map.insert(defid._1, @rec(m=none[ast::_mod], index=index_nmod(nmd), glob_imports=vec::empty[def]())); + e.ast_map.insert(defid, i); + } + case (ast::item_const(_, _, _, ?defid, _)) { + e.ast_map.insert(defid, i); + } + case (ast::item_fn(_, _, _, ?defid, _)) { + e.ast_map.insert(defid, i); + } + case (ast::item_ty(_, _, _, ?defid, _)) { + e.ast_map.insert(defid, i); + } + case (ast::item_tag(_, _, _, ?defid, _)) { + e.ast_map.insert(defid, i); + } + case (ast::item_obj(_, _, _, ?obj_def_ids, _)) { + e.ast_map.insert(obj_def_ids.ty, i); + e.ast_map.insert(obj_def_ids.ctor, i); } - case (_) {} } } @@ -899,6 +918,10 @@ fn lookup_glob_in_mod(&env e, @indexed_mod info, list[def] m, &span sp, } else if (vec::len(matches) == 1u){ ret some[def](matches.(0)); } else { + for (def match in matches) { + e.sess.span_note(e.ast_map.get(ast::def_id_of_def(match)).span, + "'" + id + "' is defined here."); + } e.sess.span_err(sp, "'" + id + "' is glob-imported from" + " multiple different modules."); fail; |
