diff --git a/src/rustc/middle/resolve.rs b/src/rustc/middle/resolve.rs index 13095ed5ccd..f7c389e67ff 100644 --- a/src/rustc/middle/resolve.rs +++ b/src/rustc/middle/resolve.rs @@ -2868,6 +2868,64 @@ impl Resolver { fn record_exports_for_module(module_: @Module) { let mut exports2 = ~[]; + + if module_.legacy_exports { + self.add_exports_for_legacy_module(&mut exports2, module_); + } else { + self.add_exports_for_module(&mut exports2, module_); + } + match copy module_.def_id { + Some(def_id) => { + self.export_map2.insert(def_id.node, move exports2); + debug!("(computing exports) writing exports for %d (some)", + def_id.node); + } + None => {} + } + } + + + fn add_exports_of_namebindings(exports2: &mut ~[Export2], + atom: Atom, + namebindings: @NameBindings, + reexport: bool) { + for [ModuleNS, TypeNS, ValueNS].each |ns| { + match namebindings.def_for_namespace(*ns) { + Some(d) if d.privacy == Public => { + vec::push(*exports2, Export2 { + reexport: reexport, + name: self.session.str_of(atom), + def_id: def_id_of_def(d.def) + }); + } + _ => () + } + } + } + + fn add_exports_for_module(exports2: &mut ~[Export2], module_: @Module) { + + for module_.children.each_ref |atom, namebindings| { + self.add_exports_of_namebindings(exports2, *atom, + *namebindings, false) + } + + for module_.import_resolutions.each_ref |atom, importresolution| { + for [ModuleNS, TypeNS, ValueNS].each |ns| { + match importresolution.target_for_namespace(*ns) { + Some(target) => { + self.add_exports_of_namebindings(exports2, *atom, + target.bindings, + true) + } + _ => () + } + } + } + } + + fn add_exports_for_legacy_module(exports2: &mut ~[Export2], + module_: @Module) { for module_.exported_names.each |name, _exp_node_id| { for self.namespaces.each |namespace| { match self.resolve_definition_of_name_in_module(module_, @@ -2882,7 +2940,7 @@ impl Resolver { for %?", self.session.str_of(name), module_.def_id); - vec::push(exports2, Export2 { + vec::push(*exports2, Export2 { reexport: false, name: self.session.str_of(name), def_id: def_id_of_def(target_def) @@ -2893,7 +2951,7 @@ impl Resolver { %?", self.session.str_of(name), module_.def_id); - vec::push(exports2, Export2 { + vec::push(*exports2, Export2 { reexport: true, name: self.session.str_of(name), def_id: def_id_of_def(target_def) @@ -2902,15 +2960,6 @@ impl Resolver { } } } - - match copy module_.def_id { - Some(def_id) => { - self.export_map2.insert(def_id.node, move exports2); - debug!("(computing exports) writing exports for %d (some)", - def_id.node); - } - None => {} - } } // AST resolution diff --git a/src/test/auxiliary/cci_borrow_lib.rs b/src/test/auxiliary/cci_borrow_lib.rs index 80c1817746f..29113d906fb 100644 --- a/src/test/auxiliary/cci_borrow_lib.rs +++ b/src/test/auxiliary/cci_borrow_lib.rs @@ -1,3 +1,5 @@ +#[legacy_exports]; + fn foo(x: &uint) -> uint { *x } diff --git a/src/test/auxiliary/cci_capture_clause.rs b/src/test/auxiliary/cci_capture_clause.rs index 68d24ed28cb..2d7404aa1d2 100644 --- a/src/test/auxiliary/cci_capture_clause.rs +++ b/src/test/auxiliary/cci_capture_clause.rs @@ -1,3 +1,5 @@ +#[legacy_exports]; + export foo; use comm::*; diff --git a/src/test/auxiliary/cci_intrinsic.rs b/src/test/auxiliary/cci_intrinsic.rs index 767f5d4ad68..1cde1a049fe 100644 --- a/src/test/auxiliary/cci_intrinsic.rs +++ b/src/test/auxiliary/cci_intrinsic.rs @@ -1,3 +1,4 @@ +#[legacy_exports]; #[abi = "rust-intrinsic"] extern mod rusti { #[legacy_exports]; diff --git a/src/test/auxiliary/cci_iter_lib.rs b/src/test/auxiliary/cci_iter_lib.rs index 8d1c3e99a13..9471bf7be72 100644 --- a/src/test/auxiliary/cci_iter_lib.rs +++ b/src/test/auxiliary/cci_iter_lib.rs @@ -1,5 +1,6 @@ #[link(name="cci_iter_lib", vers="0.0")]; #[legacy_modes]; +#[legacy_exports]; #[inline] fn iter(v: ~[T], f: fn(T)) { diff --git a/src/test/auxiliary/cci_nested_lib.rs b/src/test/auxiliary/cci_nested_lib.rs index ed924f01d33..4d3c68e9163 100644 --- a/src/test/auxiliary/cci_nested_lib.rs +++ b/src/test/auxiliary/cci_nested_lib.rs @@ -1,4 +1,5 @@ #[legacy_modes]; +#[legacy_exports]; use dvec::DVec; diff --git a/src/test/auxiliary/cci_no_inline_lib.rs b/src/test/auxiliary/cci_no_inline_lib.rs index 2adad73dd72..f6dcf93d604 100644 --- a/src/test/auxiliary/cci_no_inline_lib.rs +++ b/src/test/auxiliary/cci_no_inline_lib.rs @@ -1,4 +1,5 @@ #[link(name="cci_no_inline_lib", vers="0.0")]; +#[legacy_exports]; // same as cci_iter_lib, more-or-less, but not marked inline fn iter(v: ~[uint], f: fn(uint)) { diff --git a/src/test/auxiliary/crateresolve1-1.rs b/src/test/auxiliary/crateresolve1-1.rs index a91eda15740..7c1dce38630 100644 --- a/src/test/auxiliary/crateresolve1-1.rs +++ b/src/test/auxiliary/crateresolve1-1.rs @@ -2,5 +2,6 @@ vers = "0.1")]; #[crate_type = "lib"]; +#[legacy_exports]; fn f() -> int { 10 } diff --git a/src/test/auxiliary/crateresolve1-2.rs b/src/test/auxiliary/crateresolve1-2.rs index 053745deff6..a4aee870bc0 100644 --- a/src/test/auxiliary/crateresolve1-2.rs +++ b/src/test/auxiliary/crateresolve1-2.rs @@ -2,5 +2,6 @@ vers = "0.2")]; #[crate_type = "lib"]; +#[legacy_exports]; fn f() -> int { 20 } diff --git a/src/test/auxiliary/crateresolve1-3.rs b/src/test/auxiliary/crateresolve1-3.rs index 78d2a64087c..b23ab162202 100644 --- a/src/test/auxiliary/crateresolve1-3.rs +++ b/src/test/auxiliary/crateresolve1-3.rs @@ -2,5 +2,6 @@ vers = "0.3")]; #[crate_type = "lib"]; +#[legacy_exports]; fn f() -> int { 30 } diff --git a/src/test/auxiliary/crateresolve2-1.rs b/src/test/auxiliary/crateresolve2-1.rs index 2dabc245509..3c1a5e5b4cd 100644 --- a/src/test/auxiliary/crateresolve2-1.rs +++ b/src/test/auxiliary/crateresolve2-1.rs @@ -2,5 +2,6 @@ vers = "0.1")]; #[crate_type = "lib"]; +#[legacy_exports]; fn f() -> int { 10 } diff --git a/src/test/auxiliary/crateresolve2-2.rs b/src/test/auxiliary/crateresolve2-2.rs index 83abb615522..f81746d5c0c 100644 --- a/src/test/auxiliary/crateresolve2-2.rs +++ b/src/test/auxiliary/crateresolve2-2.rs @@ -2,5 +2,6 @@ vers = "0.2")]; #[crate_type = "lib"]; +#[legacy_exports]; fn f() -> int { 20 } diff --git a/src/test/auxiliary/crateresolve2-3.rs b/src/test/auxiliary/crateresolve2-3.rs index 52c746f1391..eee52b73ecc 100644 --- a/src/test/auxiliary/crateresolve2-3.rs +++ b/src/test/auxiliary/crateresolve2-3.rs @@ -2,5 +2,6 @@ vers = "0.3")]; #[crate_type = "lib"]; +#[legacy_exports]; fn f() -> int { 30 } diff --git a/src/test/auxiliary/crateresolve3-1.rs b/src/test/auxiliary/crateresolve3-1.rs index a2315e4c749..41532a61652 100644 --- a/src/test/auxiliary/crateresolve3-1.rs +++ b/src/test/auxiliary/crateresolve3-1.rs @@ -2,5 +2,6 @@ vers = "0.1")]; #[crate_type = "lib"]; +#[legacy_exports]; fn f() -> int { 10 } diff --git a/src/test/auxiliary/crateresolve3-2.rs b/src/test/auxiliary/crateresolve3-2.rs index 2e3684c340f..83621ce64eb 100644 --- a/src/test/auxiliary/crateresolve3-2.rs +++ b/src/test/auxiliary/crateresolve3-2.rs @@ -2,5 +2,6 @@ vers = "0.2")]; #[crate_type = "lib"]; +#[legacy_exports]; fn g() -> int { 20 } diff --git a/src/test/auxiliary/crateresolve4a-1.rs b/src/test/auxiliary/crateresolve4a-1.rs index 3c41daa1e8b..31b314dfec2 100644 --- a/src/test/auxiliary/crateresolve4a-1.rs +++ b/src/test/auxiliary/crateresolve4a-1.rs @@ -1,4 +1,5 @@ #[link(name = "crateresolve4a", vers = "0.1")]; #[crate_type = "lib"]; +#[legacy_exports]; fn f() -> int { 10 } diff --git a/src/test/auxiliary/crateresolve4a-2.rs b/src/test/auxiliary/crateresolve4a-2.rs index cba82fd55b9..aa035757595 100644 --- a/src/test/auxiliary/crateresolve4a-2.rs +++ b/src/test/auxiliary/crateresolve4a-2.rs @@ -1,4 +1,5 @@ #[link(name = "crateresolve4a", vers= "0.2")]; #[crate_type = "lib"]; +#[legacy_exports]; fn g() -> int { 20 } diff --git a/src/test/auxiliary/crateresolve4b-1.rs b/src/test/auxiliary/crateresolve4b-1.rs index 8c71b5ad131..5f68504fa74 100644 --- a/src/test/auxiliary/crateresolve4b-1.rs +++ b/src/test/auxiliary/crateresolve4b-1.rs @@ -2,6 +2,7 @@ // aux-build:crateresolve4a-2.rs #[link(name = "crateresolve4b", vers = "0.1")]; #[crate_type = "lib"]; +#[legacy_exports]; extern mod crateresolve4a(vers="0.2"); diff --git a/src/test/auxiliary/crateresolve4b-2.rs b/src/test/auxiliary/crateresolve4b-2.rs index 3bb1bc23cc2..91ce7fbc10b 100644 --- a/src/test/auxiliary/crateresolve4b-2.rs +++ b/src/test/auxiliary/crateresolve4b-2.rs @@ -2,6 +2,7 @@ // aux-build:crateresolve4a-2.rs #[link(name = "crateresolve4b", vers = "0.2")]; #[crate_type = "lib"]; +#[legacy_exports]; extern mod crateresolve4a(vers="0.1"); diff --git a/src/test/auxiliary/crateresolve5-1.rs b/src/test/auxiliary/crateresolve5-1.rs index d1a31246f5b..874b26176d7 100644 --- a/src/test/auxiliary/crateresolve5-1.rs +++ b/src/test/auxiliary/crateresolve5-1.rs @@ -2,6 +2,7 @@ vers = "0.1")]; #[crate_type = "lib"]; +#[legacy_exports]; fn structural() -> { name: ~str, val: int } { { name: ~"crateresolve5", val: 10 } diff --git a/src/test/auxiliary/crateresolve5-2.rs b/src/test/auxiliary/crateresolve5-2.rs index df28b2c25b7..01d0e9d579c 100644 --- a/src/test/auxiliary/crateresolve5-2.rs +++ b/src/test/auxiliary/crateresolve5-2.rs @@ -2,6 +2,7 @@ vers = "0.2")]; #[crate_type = "lib"]; +#[legacy_exports]; fn structural() -> { name: ~str, val: int } { { name: ~"crateresolve5", val: 10 } diff --git a/src/test/auxiliary/crateresolve_calories-1.rs b/src/test/auxiliary/crateresolve_calories-1.rs index cffa730d260..de7b0ba97e2 100644 --- a/src/test/auxiliary/crateresolve_calories-1.rs +++ b/src/test/auxiliary/crateresolve_calories-1.rs @@ -3,5 +3,6 @@ calories = "100")]; #[crate_type = "lib"]; +#[legacy_exports]; fn f() -> int { 100 } diff --git a/src/test/auxiliary/crateresolve_calories-2.rs b/src/test/auxiliary/crateresolve_calories-2.rs index c1695228d31..b814b263b75 100644 --- a/src/test/auxiliary/crateresolve_calories-2.rs +++ b/src/test/auxiliary/crateresolve_calories-2.rs @@ -3,5 +3,6 @@ calories = "200")]; #[crate_type = "lib"]; +#[legacy_exports]; fn f() -> int { 200 } diff --git a/src/test/auxiliary/extern-crosscrate-source.rs b/src/test/auxiliary/extern-crosscrate-source.rs index 80bf51f31e1..bca18e8facc 100644 --- a/src/test/auxiliary/extern-crosscrate-source.rs +++ b/src/test/auxiliary/extern-crosscrate-source.rs @@ -2,6 +2,7 @@ vers = "0.1")]; #[crate_type = "lib"]; +#[legacy_exports]; extern mod rustrt { #[legacy_exports]; diff --git a/src/test/auxiliary/issue-2380.rs b/src/test/auxiliary/issue-2380.rs index eb38c48158c..04d6cd8e068 100644 --- a/src/test/auxiliary/issue-2380.rs +++ b/src/test/auxiliary/issue-2380.rs @@ -1,5 +1,6 @@ #[link(name = "a", vers = "0.0")]; #[crate_type = "lib"]; +#[legacy_exports]; trait i { } diff --git a/src/test/auxiliary/issue-2631-a.rs b/src/test/auxiliary/issue-2631-a.rs index d2d8d7a28bd..0ede9fb3f19 100644 --- a/src/test/auxiliary/issue-2631-a.rs +++ b/src/test/auxiliary/issue-2631-a.rs @@ -1,5 +1,6 @@ #[link(name = "req")]; #[crate_type = "lib"]; +#[legacy_exports]; extern mod std; diff --git a/src/test/auxiliary/issue_2723_a.rs b/src/test/auxiliary/issue_2723_a.rs index 51ec1cb4b9b..07071afa6f9 100644 --- a/src/test/auxiliary/issue_2723_a.rs +++ b/src/test/auxiliary/issue_2723_a.rs @@ -1,3 +1,4 @@ +#[legacy_exports]; unsafe fn f(xs: ~[int]) { xs.map(|_x| { unsafe fn q() { fail; } }); } \ No newline at end of file diff --git a/src/test/auxiliary/test_comm.rs b/src/test/auxiliary/test_comm.rs index 7e5474df906..b150b58c638 100644 --- a/src/test/auxiliary/test_comm.rs +++ b/src/test/auxiliary/test_comm.rs @@ -3,6 +3,7 @@ Could probably be more minimal. */ +#[legacy_exports]; use libc::size_t; diff --git a/src/test/run-pass/cci_borrow.rs b/src/test/run-pass/cci_borrow.rs index 0a9d91efb23..d8d644c954b 100644 --- a/src/test/run-pass/cci_borrow.rs +++ b/src/test/run-pass/cci_borrow.rs @@ -1,6 +1,8 @@ // xfail-fast - check-fast doesn't understand aux-build // aux-build:cci_borrow_lib.rs +#[legacy_exports]; + extern mod cci_borrow_lib; use cci_borrow_lib::foo; diff --git a/src/test/run-pass/cci_capture_clause.rs b/src/test/run-pass/cci_capture_clause.rs index daef6e1b2b6..de0802e89a2 100644 --- a/src/test/run-pass/cci_capture_clause.rs +++ b/src/test/run-pass/cci_capture_clause.rs @@ -4,6 +4,8 @@ // This test makes sure we can do cross-crate inlining on functions // that use capture clauses. +#[legacy_exports]; + extern mod cci_capture_clause; use comm::recv; diff --git a/src/test/run-pass/cci_nested_exe.rs b/src/test/run-pass/cci_nested_exe.rs index 11f0d3a5c94..86cc4508fd9 100644 --- a/src/test/run-pass/cci_nested_exe.rs +++ b/src/test/run-pass/cci_nested_exe.rs @@ -2,6 +2,7 @@ // aux-build:cci_nested_lib.rs #[legacy_modes]; +#[legacy_exports]; extern mod cci_nested_lib; use cci_nested_lib::*; diff --git a/src/test/run-pass/cci_no_inline_exe.rs b/src/test/run-pass/cci_no_inline_exe.rs index a4822f41ad4..9aa4dd4f9cc 100644 --- a/src/test/run-pass/cci_no_inline_exe.rs +++ b/src/test/run-pass/cci_no_inline_exe.rs @@ -1,6 +1,8 @@ // xfail-fast - check-fast doesn't understand aux-build // aux-build:cci_no_inline_lib.rs +#[legacy_exports]; + extern mod cci_no_inline_lib; use cci_no_inline_lib::iter; diff --git a/src/test/run-pass/crateresolve4.rs b/src/test/run-pass/crateresolve4.rs index 24764b4ba83..496c9214167 100644 --- a/src/test/run-pass/crateresolve4.rs +++ b/src/test/run-pass/crateresolve4.rs @@ -4,6 +4,8 @@ // aux-build:crateresolve4b-1.rs // aux-build:crateresolve4b-2.rs +#[legacy_exports]; + mod a { #[legacy_exports]; extern mod crateresolve4b(vers = "0.1");