librustc: Better errors for duplicate definitions.

This commit is contained in:
Luqman Aden 2013-06-10 18:00:57 -04:00
parent 5a3e1cdaec
commit a95232a59e
1 changed files with 16 additions and 22 deletions

View File

@ -294,18 +294,6 @@ pub enum DuplicateCheckingMode {
OverwriteDuplicates
}
// Returns the namespace associated with the given duplicate checking mode,
// or fails for OverwriteDuplicates. This is used for error messages.
pub fn namespace_for_duplicate_checking_mode(mode: DuplicateCheckingMode)
-> Namespace {
match mode {
ForbidDuplicateModules | ForbidDuplicateTypes |
ForbidDuplicateTypesAndValues => TypeNS,
ForbidDuplicateValues => ValueNS,
OverwriteDuplicates => fail!("OverwriteDuplicates has no namespace")
}
}
/// One local scope.
pub struct Rib {
bindings: @mut HashMap<ident,def_like>,
@ -1007,37 +995,43 @@ impl Resolver {
// nothing.
let mut is_duplicate = false;
match duplicate_checking_mode {
let ns = match duplicate_checking_mode {
ForbidDuplicateModules => {
is_duplicate =
child.get_module_if_available().is_some();
is_duplicate = child.get_module_if_available().is_some();
Some(TypeNS)
}
ForbidDuplicateTypes => {
match child.def_for_namespace(TypeNS) {
Some(def_mod(_)) | None => {}
Some(_) => is_duplicate = true
}
Some(TypeNS)
}
ForbidDuplicateValues => {
is_duplicate = child.defined_in_namespace(ValueNS);
Some(ValueNS)
}
ForbidDuplicateTypesAndValues => {
let mut n = None;
match child.def_for_namespace(TypeNS) {
Some(def_mod(_)) | None => {}
Some(_) => is_duplicate = true
Some(_) => {
n = Some(TypeNS);
is_duplicate = true;
}
};
if child.defined_in_namespace(ValueNS) {
is_duplicate = true;
n = Some(ValueNS);
}
n
}
OverwriteDuplicates => {}
}
if duplicate_checking_mode != OverwriteDuplicates &&
is_duplicate {
OverwriteDuplicates => None
};
if is_duplicate {
// Return an error here by looking up the namespace that
// had the duplicate.
let ns = namespace_for_duplicate_checking_mode(
duplicate_checking_mode);
let ns = ns.unwrap();
self.session.span_err(sp,
fmt!("duplicate definition of %s `%s`",
namespace_to_str(ns),