From a06850c8aaa2d244e0ab314c436ecd9da44961a9 Mon Sep 17 00:00:00 2001 From: Brian Anderson Date: Thu, 26 Jan 2012 17:29:55 -0800 Subject: [PATCH] rustdoc: Prune unexported enums and variants --- src/rustdoc/prune_unexported_pass.rs | 93 +++++++++++++++++++++++++++- 1 file changed, 92 insertions(+), 1 deletion(-) diff --git a/src/rustdoc/prune_unexported_pass.rs b/src/rustdoc/prune_unexported_pass.rs index e766ab12671..c865d8bd06f 100644 --- a/src/rustdoc/prune_unexported_pass.rs +++ b/src/rustdoc/prune_unexported_pass.rs @@ -23,7 +23,8 @@ fn fold_mod(fold: fold::fold, doc: doc::moddoc) -> doc::moddoc { ~{ mods: doc::modlist(exported_mods(fold.ctxt, doc)), fns: doc::fnlist(exported_fns(fold.ctxt, doc)), - consts: doc::constlist(exported_consts(fold.ctxt, doc)) + consts: doc::constlist(exported_consts(fold.ctxt, doc)), + enums: doc::enumlist(exported_enums(fold.ctxt, doc)) with *doc } } @@ -52,6 +53,14 @@ fn exported_consts(srv: astsrv::srv, doc: doc::moddoc) -> [doc::constdoc] { ) } +fn exported_enums(srv: astsrv::srv, doc: doc::moddoc) -> [doc::enumdoc] { + exported_things( + srv, doc, + exported_enums_from_crate, + exported_enums_from_mod + ) +} + fn exported_things( srv: astsrv::srv, doc: doc::moddoc, @@ -107,6 +116,20 @@ fn exported_consts_from_mod( exported_consts_from(srv, doc, bind is_exported_from_mod(_, doc.id, _)) } +fn exported_enums_from_crate( + srv: astsrv::srv, + doc: doc::moddoc +) -> [doc::enumdoc] { + exported_enums_from(srv, doc, is_exported_from_crate) +} + +fn exported_enums_from_mod( + srv: astsrv::srv, + doc: doc::moddoc +) -> [doc::enumdoc] { + exported_enums_from(srv, doc, bind is_exported_from_mod(_, doc.id, _)) +} + fn exported_fns_from( srv: astsrv::srv, doc: doc::moddoc, @@ -149,6 +172,38 @@ fn exported_consts_from( } } +fn exported_enums_from( + srv: astsrv::srv, + doc: doc::moddoc, + is_exported: fn(astsrv::srv, str) -> bool +) -> [doc::enumdoc] { + vec::filter_map(*doc.enums) { |doc| + if is_exported(srv, doc.name) { + some(~{ + variants: exported_variants_from( + srv, doc, is_exported) + with *doc + }) + } else { + none + } + } +} + +fn exported_variants_from( + srv: astsrv::srv, + doc: doc::enumdoc, + is_exported: fn(astsrv::srv, str) -> bool +) -> [doc::variantdoc] { + vec::filter_map(doc.variants) { |doc| + if is_exported(srv, doc.name) { + some(doc) + } else { + none + } + } +} + fn is_exported_from_mod( srv: astsrv::srv, mod_id: doc::ast_id, @@ -231,3 +286,39 @@ fn should_prune_unexported_consts_from_top_mod() { let doc = run(srv, doc); assert vec::len(*doc.topmod.consts) == 1u; } + +#[test] +fn should_prune_unexported_enums_from_top_mod() { + let source = "export a; mod a { } enum b { c }"; + let srv = astsrv::mk_srv_from_str(source); + let doc = extract::from_srv(srv, ""); + let doc = run(srv, doc); + assert vec::len(*doc.topmod.enums) == 0u; +} + +#[test] +fn should_prune_unexported_enums() { + let source = "mod a { export a; mod a { } enum b { c } }"; + let srv = astsrv::mk_srv_from_str(source); + let doc = extract::from_srv(srv, ""); + let doc = run(srv, doc); + assert vec::len(*doc.topmod.mods[0].enums) == 0u; +} + +#[test] +fn should_prune_unexported_variants_from_top_mod() { + let source = "export b::{}; enum b { c }"; + let srv = astsrv::mk_srv_from_str(source); + let doc = extract::from_srv(srv, ""); + let doc = run(srv, doc); + assert vec::len(doc.topmod.enums[0].variants) == 0u; +} + +#[test] +fn should_prune_unexported_variants() { + let source = "mod a { export b::{}; enum b { c } }"; + let srv = astsrv::mk_srv_from_str(source); + let doc = extract::from_srv(srv, ""); + let doc = run(srv, doc); + assert vec::len(doc.topmod.mods[0].enums[0].variants) == 0u; +}