Skip to content

Commit a06850c

Browse files
committed
rustdoc: Prune unexported enums and variants
1 parent 28fbb19 commit a06850c

File tree

1 file changed

+92
-1
lines changed

1 file changed

+92
-1
lines changed

src/rustdoc/prune_unexported_pass.rs

Lines changed: 92 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,8 @@ fn fold_mod(fold: fold::fold<astsrv::srv>, doc: doc::moddoc) -> doc::moddoc {
2323
~{
2424
mods: doc::modlist(exported_mods(fold.ctxt, doc)),
2525
fns: doc::fnlist(exported_fns(fold.ctxt, doc)),
26-
consts: doc::constlist(exported_consts(fold.ctxt, doc))
26+
consts: doc::constlist(exported_consts(fold.ctxt, doc)),
27+
enums: doc::enumlist(exported_enums(fold.ctxt, doc))
2728
with *doc
2829
}
2930
}
@@ -52,6 +53,14 @@ fn exported_consts(srv: astsrv::srv, doc: doc::moddoc) -> [doc::constdoc] {
5253
)
5354
}
5455

56+
fn exported_enums(srv: astsrv::srv, doc: doc::moddoc) -> [doc::enumdoc] {
57+
exported_things(
58+
srv, doc,
59+
exported_enums_from_crate,
60+
exported_enums_from_mod
61+
)
62+
}
63+
5564
fn exported_things<T>(
5665
srv: astsrv::srv,
5766
doc: doc::moddoc,
@@ -107,6 +116,20 @@ fn exported_consts_from_mod(
107116
exported_consts_from(srv, doc, bind is_exported_from_mod(_, doc.id, _))
108117
}
109118

119+
fn exported_enums_from_crate(
120+
srv: astsrv::srv,
121+
doc: doc::moddoc
122+
) -> [doc::enumdoc] {
123+
exported_enums_from(srv, doc, is_exported_from_crate)
124+
}
125+
126+
fn exported_enums_from_mod(
127+
srv: astsrv::srv,
128+
doc: doc::moddoc
129+
) -> [doc::enumdoc] {
130+
exported_enums_from(srv, doc, bind is_exported_from_mod(_, doc.id, _))
131+
}
132+
110133
fn exported_fns_from(
111134
srv: astsrv::srv,
112135
doc: doc::moddoc,
@@ -149,6 +172,38 @@ fn exported_consts_from(
149172
}
150173
}
151174

175+
fn exported_enums_from(
176+
srv: astsrv::srv,
177+
doc: doc::moddoc,
178+
is_exported: fn(astsrv::srv, str) -> bool
179+
) -> [doc::enumdoc] {
180+
vec::filter_map(*doc.enums) { |doc|
181+
if is_exported(srv, doc.name) {
182+
some(~{
183+
variants: exported_variants_from(
184+
srv, doc, is_exported)
185+
with *doc
186+
})
187+
} else {
188+
none
189+
}
190+
}
191+
}
192+
193+
fn exported_variants_from(
194+
srv: astsrv::srv,
195+
doc: doc::enumdoc,
196+
is_exported: fn(astsrv::srv, str) -> bool
197+
) -> [doc::variantdoc] {
198+
vec::filter_map(doc.variants) { |doc|
199+
if is_exported(srv, doc.name) {
200+
some(doc)
201+
} else {
202+
none
203+
}
204+
}
205+
}
206+
152207
fn is_exported_from_mod(
153208
srv: astsrv::srv,
154209
mod_id: doc::ast_id,
@@ -231,3 +286,39 @@ fn should_prune_unexported_consts_from_top_mod() {
231286
let doc = run(srv, doc);
232287
assert vec::len(*doc.topmod.consts) == 1u;
233288
}
289+
290+
#[test]
291+
fn should_prune_unexported_enums_from_top_mod() {
292+
let source = "export a; mod a { } enum b { c }";
293+
let srv = astsrv::mk_srv_from_str(source);
294+
let doc = extract::from_srv(srv, "");
295+
let doc = run(srv, doc);
296+
assert vec::len(*doc.topmod.enums) == 0u;
297+
}
298+
299+
#[test]
300+
fn should_prune_unexported_enums() {
301+
let source = "mod a { export a; mod a { } enum b { c } }";
302+
let srv = astsrv::mk_srv_from_str(source);
303+
let doc = extract::from_srv(srv, "");
304+
let doc = run(srv, doc);
305+
assert vec::len(*doc.topmod.mods[0].enums) == 0u;
306+
}
307+
308+
#[test]
309+
fn should_prune_unexported_variants_from_top_mod() {
310+
let source = "export b::{}; enum b { c }";
311+
let srv = astsrv::mk_srv_from_str(source);
312+
let doc = extract::from_srv(srv, "");
313+
let doc = run(srv, doc);
314+
assert vec::len(doc.topmod.enums[0].variants) == 0u;
315+
}
316+
317+
#[test]
318+
fn should_prune_unexported_variants() {
319+
let source = "mod a { export b::{}; enum b { c } }";
320+
let srv = astsrv::mk_srv_from_str(source);
321+
let doc = extract::from_srv(srv, "");
322+
let doc = run(srv, doc);
323+
assert vec::len(doc.topmod.mods[0].enums[0].variants) == 0u;
324+
}

0 commit comments

Comments
 (0)