about summary refs log tree commit diff
path: root/src/comp
diff options
context:
space:
mode:
authorMarijn Haverbeke <marijnh@gmail.com>2011-08-29 23:20:28 +0200
committerMarijn Haverbeke <marijnh@gmail.com>2011-08-29 23:46:58 +0200
commitb623ddfb7e2fb4f90faad454a5c9e6cc072cd0fe (patch)
tree0bc698d0e7c497a97e424438048f283d425ba22e /src/comp
parent4db388ea6c3ae6049d0684a4d3b7d7d428b35b95 (diff)
downloadrust-b623ddfb7e2fb4f90faad454a5c9e6cc072cd0fe.tar.gz
rust-b623ddfb7e2fb4f90faad454a5c9e6cc072cd0fe.zip
Warn for exports that refer to non-existent items
Closes #865
Diffstat (limited to 'src/comp')
-rw-r--r--src/comp/middle/resolve.rs37
1 files changed, 35 insertions, 2 deletions
diff --git a/src/comp/middle/resolve.rs b/src/comp/middle/resolve.rs
index 5de1fa7baff..c23d1f375d8 100644
--- a/src/comp/middle/resolve.rs
+++ b/src/comp/middle/resolve.rs
@@ -153,6 +153,7 @@ fn resolve_crate(sess: session, amap: &ast_map::map, crate: @ast::crate) ->
     map_crate(e, crate);
     resolve_imports(*e);
     check_for_collisions(e, *crate);
+    check_bad_exports(e);
     resolve_names(e, crate);
     ret {def_map: e.def_map, ext_map: e.ext_map};
 }
@@ -960,9 +961,7 @@ fn lookup_in_local_mod(e: &env, node_id: node_id, sp: &span, id: &ident,
     let info = e.mod_map.get(node_id);
     if dr == outside && !ast_util::is_exported(id, option::get(info.m)) {
         // if we're in a native mod, then dr==inside, so info.m is some _mod
-
         ret none::<def>; // name is not visible
-
     }
     alt info.index.find(id) {
       none. { }
@@ -1430,6 +1429,40 @@ fn ensure_unique<T>(e: &env, sp: &span, elts: &[T], id: fn(&T) -> ident,
     for elt: T in elts { add_name(ch, sp, id(elt)); }
 }
 
+fn check_bad_exports(e: &@env) {
+    fn lookup_glob_any(e: &env, info: &@indexed_mod, sp: &span,
+                       ident: &ident) -> bool {
+        ret !option::is_none(lookup_glob_in_mod(e, info, sp, ident,
+                                                ns_module, inside)) ||
+            !option::is_none(lookup_glob_in_mod(e, info, sp, ident,
+                                                ns_value, inside)) ||
+            !option::is_none(lookup_glob_in_mod(e, info, sp, ident,
+                                                ns_type, inside));
+    }
+
+    for each @{val, _} in e.mod_map.items() {
+        alt val.m {
+          some(m) {
+            for vi in m.view_items {
+                alt vi.node {
+                  ast::view_item_export(idents, _) {
+                    for ident in idents {
+                        if !val.index.contains_key(ident) &&
+                           !lookup_glob_any(*e, val, vi.span, ident) {
+                            e.sess.span_warn(vi.span, ~"exported item " +
+                                             ident + ~" is not defined");
+                        }
+                    }
+                  }
+                  _ {}
+                }
+            }
+          }
+          none. {}
+        }
+    }
+}
+
 // Local Variables:
 // mode: rust
 // fill-column: 78;