diff options
| author | Luqman Aden <me@luqman.ca> | 2013-06-10 18:00:57 -0400 |
|---|---|---|
| committer | Luqman Aden <me@luqman.ca> | 2013-06-10 18:00:57 -0400 |
| commit | a95232a59eb1c6607b121f7ba302c0d1e0bf321e (patch) | |
| tree | 0c586bf4ca6bfcf0013d342b254c7b80c5b9ba25 | |
| parent | 5a3e1cdaec91b6fc43d4a95670859b8b5637e397 (diff) | |
| download | rust-a95232a59eb1c6607b121f7ba302c0d1e0bf321e.tar.gz rust-a95232a59eb1c6607b121f7ba302c0d1e0bf321e.zip | |
librustc: Better errors for duplicate definitions.
| -rw-r--r-- | src/librustc/middle/resolve.rs | 38 |
1 files changed, 16 insertions, 22 deletions
diff --git a/src/librustc/middle/resolve.rs b/src/librustc/middle/resolve.rs index 23b410c3d49..ec616e98495 100644 --- a/src/librustc/middle/resolve.rs +++ b/src/librustc/middle/resolve.rs @@ -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), |
