about summary refs log tree commit diff
diff options
context:
space:
mode:
authorBrian Anderson <banderson@mozilla.com>2011-08-16 20:24:02 -0700
committerBrian Anderson <banderson@mozilla.com>2011-08-17 11:05:04 -0700
commitbfbe8870d706af095bf61d759d6eacecac4d5745 (patch)
treeabc1ea7db70dff429ff9c5541381356ebd6318d8
parentcd54e7772040cd268f911e9dfd088ad5f659f552 (diff)
downloadrust-bfbe8870d706af095bf61d759d6eacecac4d5745.tar.gz
rust-bfbe8870d706af095bf61d759d6eacecac4d5745.zip
Refactor import lookup in middle:resolve
Issue #817
-rw-r--r--src/comp/middle/resolve.rs24
-rw-r--r--src/test/compile-fail/import-from-dup.rs14
2 files changed, 28 insertions, 10 deletions
diff --git a/src/comp/middle/resolve.rs b/src/comp/middle/resolve.rs
index b879b37f9e8..33575a073cd 100644
--- a/src/comp/middle/resolve.rs
+++ b/src/comp/middle/resolve.rs
@@ -92,7 +92,7 @@ fn new_ext_hash() -> ext_hash {
 
 tag mod_index_entry {
     mie_view_item(@ast::view_item);
-    mie_import_ident(node_id);
+    mie_import_ident(node_id, syntax::codemap::span);
     mie_item(@ast::item);
     mie_native_item(@ast::native_item);
     mie_tag_variant(/* tag item */@ast::item, /* variant index */uint);
@@ -949,9 +949,6 @@ fn found_view_item(e: &env, vi: @ast::view_item, ns: namespace) ->
         let cnum = cstore::get_use_stmt_cnum(e.cstore, id);
         ret some(ast::def_mod({crate: cnum, node: -1}));
       }
-      ast::view_item_import(_, _, id) {
-        ret lookup_import(e, local_def(id), ns);
-      }
       ast::view_item_import_glob(_, defid) {
         ret none::<def>; //will be handled in the fallback glob pass
 
@@ -1073,7 +1070,7 @@ fn lookup_in_mie(e: &env, mie: &mod_index_entry, ns: namespace) ->
    option::t<def> {
     alt mie {
       mie_view_item(view_item) { ret found_view_item(e, view_item, ns); }
-      mie_import_ident(id) { ret lookup_import(e, local_def(id), ns); }
+      mie_import_ident(id, _) { ret lookup_import(e, local_def(id), ns); }
       mie_item(item) { ret found_def_item(item, ns); }
       mie_tag_variant(item, variant_idx) {
         alt item.node {
@@ -1118,15 +1115,19 @@ fn index_mod(md: &ast::_mod) -> mod_index {
     let index = new_str_hash::<list<mod_index_entry>>();
     for it: @ast::view_item in md.view_items {
         alt it.node {
-          ast::view_item_import(ident, _, _) | ast::view_item_use(ident, _, _)
+          ast::view_item_use(ident, _, _)
           {
             add_to_index(index, ident, mie_view_item(it));
           }
 
+          ast::view_item_import(ident, _, id) {
+            add_to_index(index, ident, mie_import_ident(id, it.span));
+          }
+
           ast::view_item_import_from(_, idents, _) {
             for ident in idents {
                 add_to_index(index, ident.node.name,
-                             mie_import_ident(ident.node.id));
+                             mie_import_ident(ident.node.id, ident.span));
             }
           }
 
@@ -1160,14 +1161,16 @@ fn index_nmod(md: &ast::native_mod) -> mod_index {
     let index = new_str_hash::<list<mod_index_entry>>();
     for it: @ast::view_item in md.view_items {
         alt it.node {
-          ast::view_item_use(ident, _, _) | ast::view_item_import(ident, _, _)
-          {
+          ast::view_item_use(ident, _, _) {
             add_to_index(index, ident, mie_view_item(it));
           }
+          ast::view_item_import(ident, _, id) {
+            add_to_index(index, ident, mie_import_ident(id, it.span));
+          }
           ast::view_item_import_from(_, idents, _) {
             for ident in idents {
                 add_to_index(index, ident.node.name,
-                             mie_import_ident(ident.node.id));
+                             mie_import_ident(ident.node.id, ident.span));
             }
           }
           ast::view_item_import_glob(_, _) | ast::view_item_export(_, _) { }
@@ -1265,6 +1268,7 @@ fn check_mod_name(e: &env, name: &ident, entries: list<mod_index_entry>) {
 fn mie_span(mie: &mod_index_entry) -> span {
     ret alt mie {
           mie_view_item(item) { item.span }
+          mie_import_ident(_, span) { span }
           mie_item(item) { item.span }
           mie_tag_variant(item, _) { item.span }
           mie_native_item(item) { item.span }
diff --git a/src/test/compile-fail/import-from-dup.rs b/src/test/compile-fail/import-from-dup.rs
new file mode 100644
index 00000000000..729622c8b5a
--- /dev/null
+++ b/src/test/compile-fail/import-from-dup.rs
@@ -0,0 +1,14 @@
+// error-pattern:duplicate definition of f
+
+import m1::{f};
+import m2::{f};
+
+mod m1 {
+    fn f() {}
+}
+
+mod m2 {
+    fn f() {}
+}
+
+fn main() {}
\ No newline at end of file