diff options
| author | Graydon Hoare <graydon@mozilla.com> | 2012-09-21 18:10:45 -0700 |
|---|---|---|
| committer | Graydon Hoare <graydon@mozilla.com> | 2012-09-21 18:11:43 -0700 |
| commit | dffe188991325b4e803fdd0da7c1563ce0fa27f4 (patch) | |
| tree | e8f65929b804a38550dc9fdcf24021e6a7920304 /src/rustc/middle | |
| parent | 60443d48881bfbc7a305e807390e74b327f100b8 (diff) | |
Install new pub/priv/export rules as defaults, old rules accessible under #[legacy_exports];
Diffstat (limited to 'src/rustc/middle')
| -rw-r--r-- | src/rustc/middle/lang_items.rs | 1 | ||||
| -rw-r--r-- | src/rustc/middle/resolve.rs | 90 |
2 files changed, 70 insertions, 21 deletions
diff --git a/src/rustc/middle/lang_items.rs b/src/rustc/middle/lang_items.rs index e33ff5dcf50..87201f5a4da 100644 --- a/src/rustc/middle/lang_items.rs +++ b/src/rustc/middle/lang_items.rs @@ -50,6 +50,7 @@ struct LanguageItems { } mod LanguageItems { + #[legacy_exports]; fn make() -> LanguageItems { LanguageItems { const_trait: None, diff --git a/src/rustc/middle/resolve.rs b/src/rustc/middle/resolve.rs index 18bea6338a4..7158754429b 100644 --- a/src/rustc/middle/resolve.rs +++ b/src/rustc/middle/resolve.rs @@ -483,6 +483,13 @@ struct Module { exported_names: HashMap<Atom,node_id>, + // XXX: This is a transition measure to let us switch export-evaluation + // logic when compiling modules that have transitioned to listing their + // pub/priv qualifications on items, explicitly, rather than using the + // old export rule. + + legacy_exports: bool, + // The status of resolving each import in this module. import_resolutions: HashMap<Atom,@ImportResolution>, @@ -493,7 +500,9 @@ struct Module { mut resolved_import_count: uint, } -fn Module(parent_link: ParentLink, def_id: Option<def_id>) -> Module { +fn Module(parent_link: ParentLink, + def_id: Option<def_id>, + legacy_exports: bool) -> Module { Module { parent_link: parent_link, def_id: def_id, @@ -501,6 +510,7 @@ fn Module(parent_link: ParentLink, def_id: Option<def_id>) -> Module { imports: DVec(), anonymous_children: HashMap(), exported_names: atom_hashmap(), + legacy_exports: legacy_exports, import_resolutions: atom_hashmap(), glob_count: 0u, resolved_import_count: 0u @@ -577,10 +587,12 @@ struct NameBindings { impl NameBindings { /// Creates a new module in this set of name bindings. - fn define_module(parent_link: ParentLink, def_id: Option<def_id>, + fn define_module(parent_link: ParentLink, + def_id: Option<def_id>, + legacy_exports: bool, sp: span) { if self.module_def.is_none() { - let module_ = @Module(parent_link, def_id); + let module_ = @Module(parent_link, def_id, legacy_exports); self.module_def = ModuleDef(module_); self.module_span = Some(sp); } @@ -728,6 +740,18 @@ fn namespace_to_str(ns: Namespace) -> ~str { } } +fn has_legacy_export_attr(attrs: &[syntax::ast::attribute]) -> bool { + for attrs.each |attribute| { + match attribute.node.value.node { + syntax::ast::meta_word(w) if w == ~"legacy_exports" => { + return true; + } + _ => {} + } + } + return false; +} + fn Resolver(session: session, lang_items: LanguageItems, crate: @crate) -> Resolver { @@ -735,6 +759,7 @@ fn Resolver(session: session, lang_items: LanguageItems, (*graph_root).define_module(NoParentLink, Some({ crate: 0, node: 0 }), + has_legacy_export_attr(crate.node.attrs), crate.span); let current_module = (*graph_root).get_module(); @@ -885,10 +910,18 @@ impl Resolver { })); } - fn visibility_to_privacy(visibility: visibility) -> Privacy { - match visibility { - inherited | public => Public, - private => Private + fn visibility_to_privacy(visibility: visibility, + legacy_exports: bool) -> Privacy { + if legacy_exports { + match visibility { + inherited | public => Public, + private => Private + } + } else { + match visibility { + public => Public, + inherited | private => Private + } } } @@ -1009,16 +1042,20 @@ impl Resolver { let atom = item.ident; let sp = item.span; + let legacy = match parent { + ModuleReducedGraphParent(m) => m.legacy_exports + }; match item.node { item_mod(module_) => { + let legacy = has_legacy_export_attr(item.attrs); let (name_bindings, new_parent) = self.add_child(atom, parent, ~[ModuleNS], sp); let parent_link = self.get_parent_link(new_parent, atom); let def_id = { crate: 0, node: item.id }; (*name_bindings).define_module(parent_link, Some(def_id), - sp); + legacy, sp); let new_parent = ModuleReducedGraphParent((*name_bindings).get_module()); @@ -1026,6 +1063,7 @@ impl Resolver { visit_mod(module_, sp, item.id, new_parent, visitor); } item_foreign_mod(fm) => { + let legacy = has_legacy_export_attr(item.attrs); let new_parent = match fm.sort { named => { let (name_bindings, new_parent) = self.add_child(atom, @@ -1034,7 +1072,7 @@ impl Resolver { let parent_link = self.get_parent_link(new_parent, atom); let def_id = { crate: 0, node: item.id }; (*name_bindings).define_module(parent_link, Some(def_id), - sp); + legacy, sp); ModuleReducedGraphParent((*name_bindings).get_module()) } @@ -1052,7 +1090,7 @@ impl Resolver { ~[ValueNS], sp); (*name_bindings).define_value - (self.visibility_to_privacy(item.vis), + (self.visibility_to_privacy(item.vis, legacy), def_const(local_def(item.id)), sp); } @@ -1062,7 +1100,7 @@ impl Resolver { let def = def_fn(local_def(item.id), purity); (*name_bindings).define_value - (self.visibility_to_privacy(item.vis), def, sp); + (self.visibility_to_privacy(item.vis, legacy), def, sp); visit_item(item, new_parent, visitor); } @@ -1072,7 +1110,7 @@ impl Resolver { ~[TypeNS], sp); (*name_bindings).define_type - (self.visibility_to_privacy(item.vis), + (self.visibility_to_privacy(item.vis, legacy), def_ty(local_def(item.id)), sp); } @@ -1083,7 +1121,7 @@ impl Resolver { ~[TypeNS], sp); (*name_bindings).define_type - (self.visibility_to_privacy(item.vis), + (self.visibility_to_privacy(item.vis, legacy), def_ty(local_def(item.id)), sp); @@ -1104,7 +1142,7 @@ impl Resolver { self.add_child(atom, parent, ~[TypeNS], sp); (*name_bindings).define_type - (self.visibility_to_privacy(item.vis), + (self.visibility_to_privacy(item.vis, legacy), def_ty(local_def(item.id)), sp); new_parent @@ -1114,7 +1152,8 @@ impl Resolver { self.add_child(atom, parent, ~[ValueNS, TypeNS], sp); - let privacy = self.visibility_to_privacy(item.vis); + let privacy = self.visibility_to_privacy(item.vis, + legacy); (*name_bindings).define_type (privacy, def_ty(local_def(item.id)), sp); @@ -1171,7 +1210,7 @@ impl Resolver { self.trait_info.insert(def_id, method_names); (*name_bindings).define_type - (self.visibility_to_privacy(item.vis), + (self.visibility_to_privacy(item.vis, legacy), def_ty(def_id), sp); visit_item(item, new_parent, visitor); @@ -1190,10 +1229,14 @@ impl Resolver { parent: ReducedGraphParent, &&visitor: vt<ReducedGraphParent>) { + let legacy = match parent { + ModuleReducedGraphParent(m) => m.legacy_exports + }; + let atom = variant.node.name; let (child, _) = self.add_child(atom, parent, ~[ValueNS], variant.span); - let privacy = self.visibility_to_privacy(variant.node.vis); + let privacy = self.visibility_to_privacy(variant.node.vis, legacy); match variant.node.kind { tuple_variant_kind(_) => { @@ -1228,6 +1271,7 @@ impl Resolver { fn build_reduced_graph_for_view_item(view_item: @view_item, parent: ReducedGraphParent, &&_visitor: vt<ReducedGraphParent>) { + match view_item.node { view_item_import(view_paths) => { for view_paths.each |view_path| { @@ -1368,6 +1412,7 @@ impl Resolver { (*child_name_bindings).define_module(parent_link, Some(def_id), + false, view_item.span); self.build_reduced_graph_for_external_crate ((*child_name_bindings).get_module()); @@ -1424,7 +1469,7 @@ impl Resolver { let parent_module = self.get_module_from_parent(parent); let new_module = @Module(BlockParentLink(parent_module, block_id), - None); + None, false); parent_module.anonymous_children.insert(block_id, new_module); new_parent = ModuleReducedGraphParent(new_module); } else { @@ -1451,6 +1496,7 @@ impl Resolver { None => { child_name_bindings.define_module(parent_link, Some(def_id), + false, dummy_sp()); modules.insert(def_id, child_name_bindings.get_module()); @@ -1594,7 +1640,8 @@ impl Resolver { let parent_link = self.get_parent_link(new_parent, ident); (*child_name_bindings).define_module(parent_link, - None, dummy_sp()); + None, false, + dummy_sp()); } ModuleDef(_) => { /* Fall through. */ } } @@ -2554,8 +2601,9 @@ impl Resolver { } fn name_is_exported(module_: @Module, name: Atom) -> bool { - return module_.exported_names.size() == 0u || - module_.exported_names.contains_key(name); + return !module_.legacy_exports || + module_.exported_names.size() == 0u || + module_.exported_names.contains_key(name); } /** |
