diff options
| author | Graydon Hoare <graydon@mozilla.com> | 2012-09-24 17:29:20 -0700 |
|---|---|---|
| committer | Graydon Hoare <graydon@mozilla.com> | 2012-09-24 17:29:32 -0700 |
| commit | 546f3dbbf5832e83abcb6ceb6f6b78b61ede587b (patch) | |
| tree | 7265f9a88b9cf88ae7c4a8e91404a6d77f7d9f13 /src/rustc | |
| parent | 9c6ae658658a48c4686a0f09be5cf6a3f45e0fb5 (diff) | |
Build the export_map2 from visibility markers, unless #[legacy_exports];
Diffstat (limited to 'src/rustc')
| -rw-r--r-- | src/rustc/middle/resolve.rs | 71 |
1 files changed, 60 insertions, 11 deletions
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 |
