diff options
| author | Marijn Haverbeke <marijnh@gmail.com> | 2011-08-29 23:20:28 +0200 |
|---|---|---|
| committer | Marijn Haverbeke <marijnh@gmail.com> | 2011-08-29 23:46:58 +0200 |
| commit | b623ddfb7e2fb4f90faad454a5c9e6cc072cd0fe (patch) | |
| tree | 0bc698d0e7c497a97e424438048f283d425ba22e /src/comp | |
| parent | 4db388ea6c3ae6049d0684a4d3b7d7d428b35b95 (diff) | |
| download | rust-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.rs | 37 |
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; |
