about summary refs log tree commit diff
diff options
context:
space:
mode:
authorBrian Anderson <banderson@mozilla.com>2012-02-23 21:06:12 -0800
committerBrian Anderson <banderson@mozilla.com>2012-02-23 21:52:41 -0800
commit9982a2a8416cb263f875e5cec7a5c5b6e2b7b1fe (patch)
tree7fdbe4c99c1dcac99a88d13426e65e0cb95d5184
parentcb7022cfc20b89947ff3fa96d4617f9fe64d2f3e (diff)
downloadrust-9982a2a8416cb263f875e5cec7a5c5b6e2b7b1fe.tar.gz
rust-9982a2a8416cb263f875e5cec7a5c5b6e2b7b1fe.zip
rustc: Don't add duplicate entries to exp_map
-rw-r--r--src/comp/middle/resolve.rs8
-rw-r--r--src/rustdoc/reexport_pass.rs13
2 files changed, 19 insertions, 2 deletions
diff --git a/src/comp/middle/resolve.rs b/src/comp/middle/resolve.rs
index a35de9997f9..0a070f75b20 100644
--- a/src/comp/middle/resolve.rs
+++ b/src/comp/middle/resolve.rs
@@ -2021,7 +2021,13 @@ fn check_exports(e: @env) {
         alt def {
           some(def) {
             alt e.exp_map.find(path) {
-              some(v) { *v += [def]; }
+              some(v) {
+                // If there are multiple reexports of the same def
+                // using the same path, then we only need one copy
+                if !vec::contains(*v, def) {
+                    *v += [def];
+                }
+              }
               none { e.exp_map.insert(path, @mutable [def]); }
             }
           }
diff --git a/src/rustdoc/reexport_pass.rs b/src/rustdoc/reexport_pass.rs
index 0e9c251991b..b397767b03b 100644
--- a/src/rustdoc/reexport_pass.rs
+++ b/src/rustdoc/reexport_pass.rs
@@ -144,7 +144,6 @@ fn build_reexport_path_map(srv: astsrv::srv, -def_map: def_map) -> path_map {
             let name = option::get(vec::last(path));
 
             let reexportdocs = [];
-
             for def in *defs {
                 let def_id = ast_util::def_id_of_def(def);
                 alt def_map.find(def_id) {
@@ -337,6 +336,18 @@ fn should_reexport_in_topmod() {
     assert doc.topmod.enums()[0].name() == "option";
 }
 
+#[test]
+fn should_not_reexport_multiple_times() {
+    let source = "import option = option::t; \
+                  export option; \
+                  export option; \
+                  mod option { \
+                  enum t { none, some } \
+                  }";
+    let doc = test::mk_doc(source);
+    assert vec::len(doc.topmod.enums()) == 1u;
+}
+
 #[cfg(test)]
 mod test {
     fn mk_doc(source: str) -> doc::cratedoc {