Skip to content

Commit 7a0094d

Browse files
committed
---
yaml --- r: 7738 b: refs/heads/snap-stage3 c: ab0eed3 h: refs/heads/master v: v3
1 parent 6248639 commit 7a0094d

File tree

5 files changed

+179
-8
lines changed

5 files changed

+179
-8
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
---
22
refs/heads/master: 2898dcc5d97da9427ac367542382b6239d9c0bbf
33
refs/heads/snap-stage1: e33de59e47c5076a89eadeb38f4934f58a3618a6
4-
refs/heads/snap-stage3: c7d5e79fd88bbf4db9f8b23005d8bb3e00296d41
4+
refs/heads/snap-stage3: ab0eed34fd46bf7892a6668bfb137601d7d80c39
55
refs/heads/try: 2898dcc5d97da9427ac367542382b6239d9c0bbf
66
refs/tags/release-0.1: 1f5c5126e96c79d22cb7862f75304136e204f105
Lines changed: 176 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,176 @@
1+
#[doc = "Prunes branches of the tree that are not exported"];
2+
3+
import rustc::syntax::ast;
4+
import rustc::syntax::ast_util;
5+
import rustc::middle::ast_map;
6+
7+
export mk_pass;
8+
9+
fn mk_pass() -> pass {
10+
run
11+
}
12+
13+
fn run(srv: astsrv::srv, doc: doc::cratedoc) -> doc::cratedoc {
14+
let fold = fold::fold({
15+
fold_mod: fold_mod
16+
with *fold::default_seq_fold(srv)
17+
});
18+
fold.fold_crate(fold, doc)
19+
}
20+
21+
fn fold_mod(fold: fold::fold<astsrv::srv>, doc: doc::moddoc) -> doc::moddoc {
22+
let doc = fold::default_seq_fold_mod(fold, doc);
23+
~{
24+
mods: doc::modlist(exported_mods(fold.ctxt, doc)),
25+
fns: doc::fnlist(exported_fns(fold.ctxt, doc))
26+
with *doc
27+
}
28+
}
29+
30+
fn exported_mods(srv: astsrv::srv, doc: doc::moddoc) -> [doc::moddoc] {
31+
exported_things(
32+
srv, doc,
33+
exported_mods_from_crate,
34+
exported_mods_from_mod
35+
)
36+
}
37+
38+
fn exported_fns(srv: astsrv::srv, doc: doc::moddoc) -> [doc::fndoc] {
39+
exported_things(
40+
srv, doc,
41+
exported_fns_from_crate,
42+
exported_fns_from_mod
43+
)
44+
}
45+
46+
fn exported_things<T>(
47+
srv: astsrv::srv,
48+
doc: doc::moddoc,
49+
from_crate: fn(astsrv::srv, doc::moddoc) -> [T],
50+
from_mod: fn(astsrv::srv, doc::moddoc) -> [T]
51+
) -> [T] {
52+
if doc.id == ast::crate_node_id {
53+
from_crate(srv, doc)
54+
} else {
55+
from_mod(srv, doc)
56+
}
57+
}
58+
59+
fn exported_mods_from_crate(
60+
srv: astsrv::srv,
61+
doc: doc::moddoc
62+
) -> [doc::moddoc] {
63+
exported_mods_from(srv, doc, is_exported_from_crate)
64+
}
65+
66+
fn exported_mods_from_mod(
67+
srv: astsrv::srv,
68+
doc: doc::moddoc
69+
) -> [doc::moddoc] {
70+
exported_mods_from(srv, doc, bind is_exported_from_mod(_, doc.id, _))
71+
}
72+
73+
fn exported_fns_from_crate(
74+
srv: astsrv::srv,
75+
doc: doc::moddoc
76+
) -> [doc::fndoc] {
77+
exported_fns_from(srv, doc, is_exported_from_crate)
78+
}
79+
80+
fn exported_fns_from_mod(
81+
srv: astsrv::srv,
82+
doc: doc::moddoc
83+
) -> [doc::fndoc] {
84+
exported_fns_from(srv, doc, bind is_exported_from_mod(_, doc.id, _))
85+
}
86+
87+
fn exported_fns_from(
88+
srv: astsrv::srv,
89+
doc: doc::moddoc,
90+
is_exported: fn(astsrv::srv, str) -> bool
91+
) -> [doc::fndoc] {
92+
vec::filter_map(*doc.fns) { |doc|
93+
if is_exported(srv, doc.name) {
94+
some(doc)
95+
} else {
96+
none
97+
}
98+
}
99+
}
100+
101+
fn exported_mods_from(
102+
srv: astsrv::srv,
103+
doc: doc::moddoc,
104+
is_exported: fn(astsrv::srv, str) -> bool
105+
) -> [doc::moddoc] {
106+
vec::filter_map(*doc.mods) { |doc|
107+
if is_exported(srv, doc.name) {
108+
some(doc)
109+
} else {
110+
none
111+
}
112+
}
113+
}
114+
115+
fn is_exported_from_mod(
116+
srv: astsrv::srv,
117+
mod_id: doc::ast_id,
118+
item_name: str
119+
) -> bool {
120+
astsrv::exec(srv) {|ctxt|
121+
alt ctxt.map.get(mod_id) {
122+
ast_map::node_item(item) {
123+
alt item.node {
124+
ast::item_mod(m) {
125+
ast_util::is_exported(item_name, m)
126+
}
127+
}
128+
}
129+
}
130+
}
131+
}
132+
133+
fn is_exported_from_crate(
134+
srv: astsrv::srv,
135+
item_name: str
136+
) -> bool {
137+
astsrv::exec(srv) {|ctxt|
138+
ast_util::is_exported(item_name, ctxt.ast.node.module)
139+
}
140+
}
141+
142+
#[test]
143+
fn should_prune_unexported_fns() {
144+
let source = "mod b { export a; fn a() { } fn b() { } }";
145+
let srv = astsrv::mk_srv_from_str(source);
146+
let doc = extract::from_srv(srv, "");
147+
let doc = run(srv, doc);
148+
assert vec::len(*doc.topmod.mods[0].fns) == 1u;
149+
}
150+
151+
#[test]
152+
fn should_prune_unexported_modules() {
153+
let source = "mod a { export a; mod a { } mod b { } }";
154+
let srv = astsrv::mk_srv_from_str(source);
155+
let doc = extract::from_srv(srv, "");
156+
let doc = run(srv, doc);
157+
assert vec::len(*doc.topmod.mods[0].mods) == 1u;
158+
}
159+
160+
#[test]
161+
fn should_prune_unexported_fns_from_top_mod() {
162+
let source = "export a; fn a() { } fn b() { }";
163+
let srv = astsrv::mk_srv_from_str(source);
164+
let doc = extract::from_srv(srv, "");
165+
let doc = run(srv, doc);
166+
assert vec::len(*doc.topmod.fns) == 1u;
167+
}
168+
169+
#[test]
170+
fn should_prune_unexported_modules_from_top_mod() {
171+
let source = "export a; mod a { } mod b { }";
172+
let srv = astsrv::mk_srv_from_str(source);
173+
let doc = extract::from_srv(srv, "");
174+
let doc = run(srv, doc);
175+
assert vec::len(*doc.topmod.mods) == 1u;
176+
}

branches/snap-stage3/src/rustdoc/rustdoc.rc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,4 +22,5 @@ mod path_pass;
2222
mod attr_pass;
2323
mod tystr_pass;
2424
mod prune_undoc_pass;
25+
mod prune_unexported_pass;
2526
mod astsrv;

branches/snap-stage3/src/rustdoc/rustdoc.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,7 @@ fn run(source_file: str) {
9292
let srv = astsrv::mk_srv_from_file(source_file);
9393
let doc = extract::from_srv(srv, default_name);
9494
run_passes(srv, doc, [
95+
prune_unexported_pass::mk_pass(),
9596
tystr_pass::mk_pass(),
9697
path_pass::mk_pass(),
9798
attr_pass::mk_pass(),

branches/snap-stage3/src/snapshots.txt

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,3 @@
1-
S 2012-01-23 6db688e
2-
winnt-i386 e2e854ea3b53c39c348ecff56c46ec2e742930ef
3-
linux-i386 ec28f47ea12512c79d110209d7278cbdb9db826c
4-
macos-i386 e2fae898344cbbfd52a8cdd21063b8aadc9ca12e
5-
linux-x86_64 b8492ad26d3ad9fbf91e7e1983bec484f76aeb49
6-
macos-x86_64 8a8ecedc8ab6e02881395394a8ca6cb3aca3dece
7-
81
S 2012-01-21 ec82735
92
winnt-i386 b77e911a0651199b2459fc429c3ab05d623cd1e1
103
linux-i386 177e2a4d6996f704af9e5676352278d52cfe0d18

0 commit comments

Comments
 (0)