Skip to content

Commit 477c3a8

Browse files
committed
Merge branch 'master' into tag-docs
2 parents c7d5e79 + ab0eed3 commit 477c3a8

File tree

3 files changed

+178
-0
lines changed

3 files changed

+178
-0
lines changed

src/rustdoc/prune_unexported_pass.rs

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+
}

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;

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(),

0 commit comments

Comments
 (0)