Skip to content

Commit 948cc66

Browse files
committed
rustc_resolve: move export recording into its own module.
1 parent 1614d92 commit 948cc66

File tree

2 files changed

+162
-122
lines changed

2 files changed

+162
-122
lines changed

src/librustc_resolve/lib.rs

Lines changed: 5 additions & 122 deletions
Original file line numberDiff line numberDiff line change
@@ -63,9 +63,9 @@ use syntax::ast::{DeclItem, DefId, Expr, ExprAgain, ExprBreak, ExprField};
6363
use syntax::ast::{ExprClosure, ExprForLoop, ExprLoop, ExprWhile, ExprMethodCall};
6464
use syntax::ast::{ExprPath, ExprStruct, FnDecl};
6565
use syntax::ast::{ForeignItem, ForeignItemFn, ForeignItemStatic, Generics};
66-
use syntax::ast::{Ident, ImplItem, Item, ItemEnum, ItemFn, ItemForeignMod};
67-
use syntax::ast::{ItemImpl, ItemMac, ItemMod, ItemStatic, ItemStruct};
68-
use syntax::ast::{ItemTrait, ItemTy, LOCAL_CRATE, Local, ItemConst};
66+
use syntax::ast::{Ident, ImplItem, Item, ItemConst, ItemEnum, ItemFn};
67+
use syntax::ast::{ItemForeignMod, ItemImpl, ItemMac, ItemMod, ItemStatic};
68+
use syntax::ast::{ItemStruct, ItemTrait, ItemTy, Local};
6969
use syntax::ast::{MethodImplItem, Mod, Name, NamedField, NodeId};
7070
use syntax::ast::{Pat, PatEnum, PatIdent, PatLit};
7171
use syntax::ast::{PatRange, PatStruct, Path, PathListIdent, PathListMod};
@@ -97,6 +97,7 @@ use std::rc::{Rc, Weak};
9797
use std::uint;
9898

9999
mod check_unused;
100+
mod record_exports;
100101

101102
#[deriving(Copy)]
102103
struct BindingInfo {
@@ -3708,124 +3709,6 @@ impl<'a> Resolver<'a> {
37083709
}
37093710
}
37103711

3711-
// Export recording
3712-
//
3713-
// This pass simply determines what all "export" keywords refer to and
3714-
// writes the results into the export map.
3715-
//
3716-
// FIXME #4953 This pass will be removed once exports change to per-item.
3717-
// Then this operation can simply be performed as part of item (or import)
3718-
// processing.
3719-
3720-
fn record_exports(&mut self) {
3721-
let root_module = self.graph_root.get_module();
3722-
self.record_exports_for_module_subtree(root_module);
3723-
}
3724-
3725-
fn record_exports_for_module_subtree(&mut self,
3726-
module_: Rc<Module>) {
3727-
// If this isn't a local krate, then bail out. We don't need to record
3728-
// exports for nonlocal crates.
3729-
3730-
match module_.def_id.get() {
3731-
Some(def_id) if def_id.krate == LOCAL_CRATE => {
3732-
// OK. Continue.
3733-
debug!("(recording exports for module subtree) recording \
3734-
exports for local module `{}`",
3735-
self.module_to_string(&*module_));
3736-
}
3737-
None => {
3738-
// Record exports for the root module.
3739-
debug!("(recording exports for module subtree) recording \
3740-
exports for root module `{}`",
3741-
self.module_to_string(&*module_));
3742-
}
3743-
Some(_) => {
3744-
// Bail out.
3745-
debug!("(recording exports for module subtree) not recording \
3746-
exports for `{}`",
3747-
self.module_to_string(&*module_));
3748-
return;
3749-
}
3750-
}
3751-
3752-
self.record_exports_for_module(&*module_);
3753-
self.populate_module_if_necessary(&module_);
3754-
3755-
for (_, child_name_bindings) in module_.children.borrow().iter() {
3756-
match child_name_bindings.get_module_if_available() {
3757-
None => {
3758-
// Nothing to do.
3759-
}
3760-
Some(child_module) => {
3761-
self.record_exports_for_module_subtree(child_module);
3762-
}
3763-
}
3764-
}
3765-
3766-
for (_, child_module) in module_.anonymous_children.borrow().iter() {
3767-
self.record_exports_for_module_subtree(child_module.clone());
3768-
}
3769-
}
3770-
3771-
fn record_exports_for_module(&mut self, module_: &Module) {
3772-
let mut exports = Vec::new();
3773-
3774-
self.add_exports_for_module(&mut exports, module_);
3775-
match module_.def_id.get() {
3776-
Some(def_id) => {
3777-
self.export_map.insert(def_id.node, exports);
3778-
debug!("(computing exports) writing exports for {} (some)",
3779-
def_id.node);
3780-
}
3781-
None => {}
3782-
}
3783-
}
3784-
3785-
fn add_exports_of_namebindings(&mut self,
3786-
exports: &mut Vec<Export>,
3787-
name: Name,
3788-
namebindings: &NameBindings,
3789-
ns: Namespace) {
3790-
match namebindings.def_for_namespace(ns) {
3791-
Some(d) => {
3792-
debug!("(computing exports) YES: export '{}' => {}",
3793-
name, d.def_id());
3794-
exports.push(Export {
3795-
name: name,
3796-
def_id: d.def_id()
3797-
});
3798-
}
3799-
d_opt => {
3800-
debug!("(computing exports) NO: {}", d_opt);
3801-
}
3802-
}
3803-
}
3804-
3805-
fn add_exports_for_module(&mut self,
3806-
exports: &mut Vec<Export>,
3807-
module_: &Module) {
3808-
for (name, importresolution) in module_.import_resolutions.borrow().iter() {
3809-
if !importresolution.is_public {
3810-
continue
3811-
}
3812-
let xs = [TypeNS, ValueNS];
3813-
for &ns in xs.iter() {
3814-
match importresolution.target_for_namespace(ns) {
3815-
Some(target) => {
3816-
debug!("(computing exports) maybe export '{}'",
3817-
token::get_name(*name));
3818-
self.add_exports_of_namebindings(exports,
3819-
*name,
3820-
&*target.bindings,
3821-
ns)
3822-
}
3823-
_ => ()
3824-
}
3825-
}
3826-
}
3827-
}
3828-
38293712
// AST resolution
38303713
//
38313714
// We maintain a list of value ribs and type ribs.
@@ -6137,7 +6020,7 @@ pub fn resolve_crate(session: &Session,
61376020
resolver.resolve_imports();
61386021
session.abort_if_errors();
61396022

6140-
resolver.record_exports();
6023+
record_exports::record(&mut resolver);
61416024
session.abort_if_errors();
61426025

61436026
resolver.resolve_crate(krate);
Lines changed: 157 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,157 @@
1+
// Copyright 2012-2014 The Rust Project Developers. See the COPYRIGHT
2+
// file at the top-level directory of this distribution and at
3+
// http://rust-lang.org/COPYRIGHT.
4+
//
5+
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6+
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7+
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8+
// option. This file may not be copied, modified, or distributed
9+
// except according to those terms.
10+
11+
12+
// Export recording
13+
//
14+
// This pass simply determines what all "export" keywords refer to and
15+
// writes the results into the export map.
16+
//
17+
// FIXME #4953 This pass will be removed once exports change to per-item.
18+
// Then this operation can simply be performed as part of item (or import)
19+
// processing.
20+
21+
use {Module, NameBindings, Resolver};
22+
use Namespace::{mod, TypeNS, ValueNS};
23+
24+
use rustc::middle::def::Export;
25+
use syntax::ast;
26+
use syntax::parse::token;
27+
28+
use std::rc::Rc;
29+
30+
struct ExportRecorder<'a, 'b:'a> {
31+
resolver: &'a mut Resolver<'b>
32+
}
33+
34+
// Deref and DerefMut impls allow treating ExportRecorder as Resolver.
35+
impl<'a, 'b> Deref<Resolver<'b>> for ExportRecorder<'a, 'b> {
36+
fn deref<'c>(&'c self) -> &'c Resolver<'b> {
37+
&*self.resolver
38+
}
39+
}
40+
41+
impl<'a, 'b> DerefMut<Resolver<'b>> for ExportRecorder<'a, 'b> {
42+
fn deref_mut<'c>(&'c mut self) -> &'c mut Resolver<'b> {
43+
&mut *self.resolver
44+
}
45+
}
46+
47+
impl<'a, 'b> ExportRecorder<'a, 'b> {
48+
fn record_exports_for_module_subtree(&mut self,
49+
module_: Rc<Module>) {
50+
// If this isn't a local krate, then bail out. We don't need to record
51+
// exports for nonlocal crates.
52+
53+
match module_.def_id.get() {
54+
Some(def_id) if def_id.krate == ast::LOCAL_CRATE => {
55+
// OK. Continue.
56+
debug!("(recording exports for module subtree) recording \
57+
exports for local module `{}`",
58+
self.module_to_string(&*module_));
59+
}
60+
None => {
61+
// Record exports for the root module.
62+
debug!("(recording exports for module subtree) recording \
63+
exports for root module `{}`",
64+
self.module_to_string(&*module_));
65+
}
66+
Some(_) => {
67+
// Bail out.
68+
debug!("(recording exports for module subtree) not recording \
69+
exports for `{}`",
70+
self.module_to_string(&*module_));
71+
return;
72+
}
73+
}
74+
75+
self.record_exports_for_module(&*module_);
76+
self.populate_module_if_necessary(&module_);
77+
78+
for (_, child_name_bindings) in module_.children.borrow().iter() {
79+
match child_name_bindings.get_module_if_available() {
80+
None => {
81+
// Nothing to do.
82+
}
83+
Some(child_module) => {
84+
self.record_exports_for_module_subtree(child_module);
85+
}
86+
}
87+
}
88+
89+
for (_, child_module) in module_.anonymous_children.borrow().iter() {
90+
self.record_exports_for_module_subtree(child_module.clone());
91+
}
92+
}
93+
94+
fn record_exports_for_module(&mut self, module_: &Module) {
95+
let mut exports = Vec::new();
96+
97+
self.add_exports_for_module(&mut exports, module_);
98+
match module_.def_id.get() {
99+
Some(def_id) => {
100+
self.export_map.insert(def_id.node, exports);
101+
debug!("(computing exports) writing exports for {} (some)",
102+
def_id.node);
103+
}
104+
None => {}
105+
}
106+
}
107+
108+
fn add_exports_of_namebindings(&mut self,
109+
exports: &mut Vec<Export>,
110+
name: ast::Name,
111+
namebindings: &NameBindings,
112+
ns: Namespace) {
113+
match namebindings.def_for_namespace(ns) {
114+
Some(d) => {
115+
debug!("(computing exports) YES: export '{}' => {}",
116+
name, d.def_id());
117+
exports.push(Export {
118+
name: name,
119+
def_id: d.def_id()
120+
});
121+
}
122+
d_opt => {
123+
debug!("(computing exports) NO: {}", d_opt);
124+
}
125+
}
126+
}
127+
128+
fn add_exports_for_module(&mut self,
129+
exports: &mut Vec<Export>,
130+
module_: &Module) {
131+
for (name, importresolution) in module_.import_resolutions.borrow().iter() {
132+
if !importresolution.is_public {
133+
continue
134+
}
135+
let xs = [TypeNS, ValueNS];
136+
for &ns in xs.iter() {
137+
match importresolution.target_for_namespace(ns) {
138+
Some(target) => {
139+
debug!("(computing exports) maybe export '{}'",
140+
token::get_name(*name));
141+
self.add_exports_of_namebindings(exports,
142+
*name,
143+
&*target.bindings,
144+
ns)
145+
}
146+
_ => ()
147+
}
148+
}
149+
}
150+
}
151+
}
152+
153+
pub fn record(resolver: &mut Resolver) {
154+
let mut recorder = ExportRecorder { resolver: resolver };
155+
let root_module = recorder.graph_root.get_module();
156+
recorder.record_exports_for_module_subtree(root_module);
157+
}

0 commit comments

Comments
 (0)