Warn for exports that refer to non-existent items

Closes #865
This commit is contained in:
Marijn Haverbeke 2011-08-29 23:20:28 +02:00
parent 4db388ea6c
commit b623ddfb7e

View file

@ -153,6 +153,7 @@ fn resolve_crate(sess: session, amap: &ast_map::map, crate: @ast::crate) ->
map_crate(e, crate); map_crate(e, crate);
resolve_imports(*e); resolve_imports(*e);
check_for_collisions(e, *crate); check_for_collisions(e, *crate);
check_bad_exports(e);
resolve_names(e, crate); resolve_names(e, crate);
ret {def_map: e.def_map, ext_map: e.ext_map}; 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); let info = e.mod_map.get(node_id);
if dr == outside && !ast_util::is_exported(id, option::get(info.m)) { 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 // if we're in a native mod, then dr==inside, so info.m is some _mod
ret none::<def>; // name is not visible ret none::<def>; // name is not visible
} }
alt info.index.find(id) { alt info.index.find(id) {
none. { } 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)); } 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: // Local Variables:
// mode: rust // mode: rust
// fill-column: 78; // fill-column: 78;