From f8c93bdbe1fa9e6131a8a552753c0c476c5f922b Mon Sep 17 00:00:00 2001 From: Brian Anderson Date: Sun, 29 Jan 2012 13:08:18 -0800 Subject: [PATCH] rustdoc: Move mod docs into the item tag --- src/rustdoc/attr_pass.rs | 2 +- src/rustdoc/desc_to_brief_pass.rs | 4 +-- src/rustdoc/doc.rs | 15 +++++--- src/rustdoc/extract.rs | 33 +++++++---------- src/rustdoc/fold.rs | 30 +++++----------- src/rustdoc/markdown_pass.rs | 5 +-- src/rustdoc/path_pass.rs | 4 +-- src/rustdoc/prune_undoc_pass.rs | 32 +++++++---------- src/rustdoc/prune_unexported_pass.rs | 54 +++++----------------------- src/rustdoc/rustdoc.rs | 6 ++-- src/rustdoc/trim_pass.rs | 4 +-- 11 files changed, 63 insertions(+), 126 deletions(-) diff --git a/src/rustdoc/attr_pass.rs b/src/rustdoc/attr_pass.rs index 58127ba1a3d..f9293ed6fae 100644 --- a/src/rustdoc/attr_pass.rs +++ b/src/rustdoc/attr_pass.rs @@ -105,7 +105,7 @@ fn fold_mod_should_extract_mod_attributes() { let srv = astsrv::mk_srv_from_str(source); let doc = extract::from_srv(srv, ""); let fold = fold::default_seq_fold(srv); - let doc = fold_mod(fold, doc.topmod.mods[0]); + let doc = fold_mod(fold, doc.topmod.mods()[0]); assert doc.desc == some("test"); } diff --git a/src/rustdoc/desc_to_brief_pass.rs b/src/rustdoc/desc_to_brief_pass.rs index 5a98dbb8d9f..fb2f1134ae9 100644 --- a/src/rustdoc/desc_to_brief_pass.rs +++ b/src/rustdoc/desc_to_brief_pass.rs @@ -90,8 +90,8 @@ fn should_promote_mod_desc() { let doc = extract::from_srv(srv, ""); let doc = attr_pass::mk_pass()(srv, doc); let doc = run(srv, doc); - assert doc.topmod.mods[0].brief == some("desc"); - assert doc.topmod.mods[0].desc == none; + assert doc.topmod.mods()[0].brief == some("desc"); + assert doc.topmod.mods()[0].desc == none; } #[test] diff --git a/src/rustdoc/doc.rs b/src/rustdoc/doc.rs index e9877ed954e..e7b1d16244a 100644 --- a/src/rustdoc/doc.rs +++ b/src/rustdoc/doc.rs @@ -20,8 +20,7 @@ type moddoc = ~{ path: [str], brief: option, desc: option, - items: [itemtag], - mods: modlist + items: [itemtag] }; type constdoc = ~{ @@ -77,11 +76,17 @@ type resdoc = ~{ sig: option }; -// Just to break the structural recursive types -enum modlist = [moddoc]; - impl util for moddoc { + fn mods() -> [moddoc] { + vec::filter_map(self.items) {|itemtag| + alt itemtag { + modtag(moddoc) { some(moddoc) } + _ { none } + } + } + } + fn fns() -> [fndoc] { vec::filter_map(self.items) {|itemtag| alt itemtag { diff --git a/src/rustdoc/extract.rs b/src/rustdoc/extract.rs index fd44ee698a7..bfef0bf0b2e 100644 --- a/src/rustdoc/extract.rs +++ b/src/rustdoc/extract.rs @@ -45,6 +45,11 @@ fn moddoc_from_mod( desc: none, items: vec::filter_map(module.items) {|item| alt item.node { + ast::item_mod(m) { + some(doc::modtag( + moddoc_from_mod(m, item.ident, item.id) + )) + } ast::item_fn(decl, _, _) { some(doc::fntag( fndoc_from_fn(decl, item.ident, item.id) @@ -69,18 +74,7 @@ fn moddoc_from_mod( none } } - }, - mods: doc::modlist( - vec::filter_map(module.items) {|item| - alt item.node { - ast::item_mod(m) { - some(moddoc_from_mod(m, item.ident, item.id)) - } - _ { - none - } - } - }) + } } } @@ -233,8 +227,7 @@ mod tests { let source = ""; // empty crate let ast = parse::from_str(source); let doc = extract(ast, ""); - // FIXME #1535: These are boxed to prevent a crash - assert ~doc.topmod.mods == ~doc::modlist([]); + assert vec::is_empty(doc.topmod.mods()); assert vec::is_empty(doc.topmod.fns()); } @@ -243,9 +236,9 @@ mod tests { let source = "mod a { mod b { } mod c { } }"; let ast = parse::from_str(source); let doc = extract(ast, ""); - assert doc.topmod.mods[0].name == "a"; - assert doc.topmod.mods[0].mods[0].name == "b"; - assert doc.topmod.mods[0].mods[1].name == "c"; + assert doc.topmod.mods()[0].name == "a"; + assert doc.topmod.mods()[0].mods()[0].name == "b"; + assert doc.topmod.mods()[0].mods()[1].name == "c"; } #[test] @@ -253,7 +246,7 @@ mod tests { let source = "mod a { mod b { mod c { } } }"; let ast = parse::from_str(source); let doc = extract(ast, ""); - assert doc.topmod.mods[0].mods[0].mods[0].name == "c"; + assert doc.topmod.mods()[0].mods()[0].mods()[0].name == "c"; } #[test] @@ -261,7 +254,7 @@ mod tests { let source = "mod a { }"; let ast = parse::from_str(source); let doc = extract(ast, ""); - assert doc.topmod.mods[0].id != 0; + assert doc.topmod.mods()[0].id != 0; } #[test] @@ -272,7 +265,7 @@ mod tests { let ast = parse::from_str(source); let doc = extract(ast, ""); assert doc.topmod.fns()[0].name == "a"; - assert doc.topmod.mods[0].fns()[0].name == "c"; + assert doc.topmod.mods()[0].fns()[0].name == "c"; } #[test] diff --git a/src/rustdoc/fold.rs b/src/rustdoc/fold.rs index 5ae471e6715..49cc5476609 100644 --- a/src/rustdoc/fold.rs +++ b/src/rustdoc/fold.rs @@ -2,7 +2,7 @@ import std; export fold; -export fold_crate, fold_mod, fold_fn, fold_modlist; +export fold_crate, fold_mod, fold_fn; export default_seq_fold; export default_seq_fold_crate; export default_seq_fold_mod; @@ -19,7 +19,6 @@ type fold_fn = fn~(fold: fold, doc: doc::fndoc) -> doc::fndoc; type fold_const = fn~(fold: fold, doc: doc::constdoc) -> doc::constdoc; type fold_enum = fn~(fold: fold, doc: doc::enumdoc) -> doc::enumdoc; type fold_res = fn~(fold: fold, doc: doc::resdoc) -> doc::resdoc; -type fold_modlist = fn~(fold: fold, list: doc::modlist) -> doc::modlist; type t = { ctxt: T, @@ -28,8 +27,7 @@ type t = { fold_fn: fold_fn, fold_const: fold_const, fold_enum: fold_enum, - fold_res: fold_res, - fold_modlist: fold_modlist + fold_res: fold_res }; @@ -42,8 +40,7 @@ fn mk_fold( fold_fn: fold_fn, fold_const: fold_const, fold_enum: fold_enum, - fold_res: fold_res, - fold_modlist: fold_modlist + fold_res: fold_res ) -> fold { fold({ ctxt: ctxt, @@ -52,8 +49,7 @@ fn mk_fold( fold_fn: fold_fn, fold_const: fold_const, fold_enum: fold_enum, - fold_res: fold_res, - fold_modlist: fold_modlist + fold_res: fold_res }) } @@ -65,8 +61,7 @@ fn default_seq_fold(ctxt: T) -> fold { {|f, d| default_seq_fold_fn(f, d)}, {|f, d| default_seq_fold_const(f, d)}, {|f, d| default_seq_fold_enum(f, d)}, - {|f, d| default_seq_fold_res(f, d)}, - {|f, d| default_seq_fold_modlist(f, d)} + {|f, d| default_seq_fold_res(f, d)} ) } @@ -86,6 +81,9 @@ fn default_seq_fold_mod( ~{ items: vec::map(doc.items) {|itemtag| alt itemtag { + doc::modtag(moddoc) { + doc::modtag(fold.fold_mod(fold, moddoc)) + } doc::fntag(fndoc) { doc::fntag(fold.fold_fn(fold, fndoc)) } @@ -99,8 +97,7 @@ fn default_seq_fold_mod( doc::restag(fold.fold_res(fold, resdoc)) } } - }, - mods: fold.fold_modlist(fold, doc.mods) + } with *doc } } @@ -133,15 +130,6 @@ fn default_seq_fold_res( doc } -fn default_seq_fold_modlist( - fold: fold, - list: doc::modlist -) -> doc::modlist { - doc::modlist(vec::map(*list) {|doc| - fold.fold_mod(fold, doc) - }) -} - #[test] fn default_fold_should_produce_same_doc() { let source = "mod a { fn b() { } mod c { fn d() { } } }"; diff --git a/src/rustdoc/markdown_pass.rs b/src/rustdoc/markdown_pass.rs index e6560d8d7af..8c53ad75a1b 100644 --- a/src/rustdoc/markdown_pass.rs +++ b/src/rustdoc/markdown_pass.rs @@ -81,12 +81,9 @@ fn write_mod_contents( write_brief(ctxt, doc.brief); write_desc(ctxt, doc.desc); - for moddoc in *doc.mods { - write_mod(ctxt, moddoc); - } - for itemtag in doc.items { alt itemtag { + doc::modtag(moddoc) { write_mod(ctxt, moddoc) } doc::fntag(fndoc) { write_fn(ctxt, fndoc) } doc::consttag(constdoc) { write_const(ctxt, constdoc) } doc::enumtag(enumdoc) { write_enum(ctxt, enumdoc) } diff --git a/src/rustdoc/path_pass.rs b/src/rustdoc/path_pass.rs index 9bcdde561c4..729b572a139 100644 --- a/src/rustdoc/path_pass.rs +++ b/src/rustdoc/path_pass.rs @@ -44,6 +44,6 @@ fn should_record_mod_paths() { let srv = astsrv::mk_srv_from_str(source); let doc = extract::from_srv(srv, ""); let doc = run(srv, doc); - assert doc.topmod.mods[0].mods[0].mods[0].path == ["a", "b"]; - assert doc.topmod.mods[0].mods[1].mods[0].path == ["a", "d"]; + assert doc.topmod.mods()[0].mods()[0].mods()[0].path == ["a", "b"]; + assert doc.topmod.mods()[0].mods()[1].mods()[0].path == ["a", "d"]; } \ No newline at end of file diff --git a/src/rustdoc/prune_undoc_pass.rs b/src/rustdoc/prune_undoc_pass.rs index d207d0fba23..a5ffd4408a9 100644 --- a/src/rustdoc/prune_undoc_pass.rs +++ b/src/rustdoc/prune_undoc_pass.rs @@ -22,8 +22,7 @@ fn run( fold_fn: fold_fn, fold_const: fold_const, fold_enum: fold_enum, - fold_res: fold_res, - fold_modlist: fold_modlist + fold_res: fold_res with *fold::default_seq_fold(ctxt) }); fold.fold_crate(fold, doc) @@ -36,6 +35,14 @@ fn fold_mod( let doc = ~{ items: vec::filter_map(doc.items) {|itemtag| alt itemtag { + doc::modtag(moddoc) { + let doc = fold.fold_mod(fold, moddoc); + if fold.ctxt.have_docs { + some(doc::modtag(doc)) + } else { + none + } + } doc::fntag(fndoc) { let doc = fold.fold_fn(fold, fndoc); if fold.ctxt.have_docs { @@ -76,7 +83,6 @@ fn fold_mod( fold.ctxt.have_docs = doc.brief != none || doc.desc != none - || vec::is_not_empty(*doc.mods) || vec::is_not_empty(doc.items); ret doc; } @@ -156,27 +162,13 @@ fn should_not_elide_fns_with_documented_failure_conditions() { assert vec::is_not_empty(doc.topmod.fns()); } -fn fold_modlist( - fold: fold::fold, - list: doc::modlist -) -> doc::modlist { - doc::modlist(vec::filter_map(*list) {|doc| - let doc = fold.fold_mod(fold, doc); - if fold.ctxt.have_docs { - some(doc) - } else { - none - } - }) -} - #[test] fn should_elide_undocumented_mods() { let source = "mod a { }"; let srv = astsrv::mk_srv_from_str(source); let doc = extract::from_srv(srv, ""); let doc = run(srv, doc); - assert vec::is_empty(*doc.topmod.mods); + assert vec::is_empty(doc.topmod.mods()); } #[test] @@ -186,7 +178,7 @@ fn should_not_elide_undocument_mods_with_documented_mods() { let doc = extract::from_srv(srv, ""); let doc = attr_pass::mk_pass()(srv, doc); let doc = run(srv, doc); - assert vec::is_not_empty(*doc.topmod.mods); + assert vec::is_not_empty(doc.topmod.mods()); } #[test] @@ -196,7 +188,7 @@ fn should_not_elide_undocument_mods_with_documented_fns() { let doc = extract::from_srv(srv, ""); let doc = attr_pass::mk_pass()(srv, doc); let doc = run(srv, doc); - assert vec::is_not_empty(*doc.topmod.mods); + assert vec::is_not_empty(doc.topmod.mods()); } #[test] diff --git a/src/rustdoc/prune_unexported_pass.rs b/src/rustdoc/prune_unexported_pass.rs index 0de67e2254a..5d88cfb5eae 100644 --- a/src/rustdoc/prune_unexported_pass.rs +++ b/src/rustdoc/prune_unexported_pass.rs @@ -21,8 +21,7 @@ fn run(srv: astsrv::srv, doc: doc::cratedoc) -> doc::cratedoc { fn fold_mod(fold: fold::fold, doc: doc::moddoc) -> doc::moddoc { let doc = fold::default_seq_fold_mod(fold, doc); ~{ - items: exported_items(fold.ctxt, doc), - mods: doc::modlist(exported_mods(fold.ctxt, doc)) + items: exported_items(fold.ctxt, doc) with *doc } } @@ -35,14 +34,6 @@ fn exported_items(srv: astsrv::srv, doc: doc::moddoc) -> [doc::itemtag] { ) } -fn exported_mods(srv: astsrv::srv, doc: doc::moddoc) -> [doc::moddoc] { - exported_things( - srv, doc, - exported_mods_from_crate, - exported_mods_from_mod - ) -} - fn exported_things( srv: astsrv::srv, doc: doc::moddoc, @@ -70,20 +61,6 @@ fn exported_items_from_mod( exported_items_from(srv, doc, bind is_exported_from_mod(_, doc.id, _)) } -fn exported_mods_from_crate( - srv: astsrv::srv, - doc: doc::moddoc -) -> [doc::moddoc] { - exported_mods_from(srv, doc, is_exported_from_crate) -} - -fn exported_mods_from_mod( - srv: astsrv::srv, - doc: doc::moddoc -) -> [doc::moddoc] { - exported_mods_from(srv, doc, bind is_exported_from_mod(_, doc.id, _)) -} - fn exported_items_from( srv: astsrv::srv, doc: doc::moddoc, @@ -91,6 +68,7 @@ fn exported_items_from( ) -> [doc::itemtag] { vec::filter_map(doc.items) { |itemtag| let name = alt itemtag { + doc::modtag(~{name, _}) { name } doc::fntag(~{name, _}) { name } doc::consttag(~{name, _}) { name } doc::enumtag(~{name, _}) { name } @@ -114,20 +92,6 @@ fn exported_items_from( } } -fn exported_mods_from( - srv: astsrv::srv, - doc: doc::moddoc, - is_exported: fn(astsrv::srv, str) -> bool -) -> [doc::moddoc] { - vec::filter_map(*doc.mods) { |doc| - if is_exported(srv, doc.name) { - some(doc) - } else { - none - } - } -} - fn exported_variants_from( srv: astsrv::srv, doc: doc::enumdoc, @@ -175,7 +139,7 @@ fn should_prune_unexported_fns() { 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].fns()) == 1u; + assert vec::len(doc.topmod.mods()[0].fns()) == 1u; } #[test] @@ -193,7 +157,7 @@ fn should_prune_unexported_modules() { 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].mods) == 1u; + assert vec::len(doc.topmod.mods()[0].mods()) == 1u; } #[test] @@ -202,7 +166,7 @@ fn should_prune_unexported_modules_from_top_mod() { 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) == 1u; + assert vec::len(doc.topmod.mods()) == 1u; } #[test] @@ -213,7 +177,7 @@ fn should_prune_unexported_consts() { 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].consts()) == 1u; + assert vec::len(doc.topmod.mods()[0].consts()) == 1u; } #[test] @@ -240,7 +204,7 @@ fn should_prune_unexported_enums() { 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; + assert vec::len(doc.topmod.mods()[0].enums()) == 0u; } #[test] @@ -258,7 +222,7 @@ fn should_prune_unexported_variants() { 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; + assert vec::len(doc.topmod.mods()[0].enums()[0].variants) == 0u; } #[test] @@ -276,5 +240,5 @@ fn should_prune_unexported_resources() { let srv = astsrv::mk_srv_from_str(source); let doc = extract::from_srv(srv, ""); let doc = run(srv, doc); - assert vec::is_empty(doc.topmod.mods[0].resources()); + assert vec::is_empty(doc.topmod.mods()[0].resources()); } diff --git a/src/rustdoc/rustdoc.rs b/src/rustdoc/rustdoc.rs index e8b334b5ad4..6374860573d 100755 --- a/src/rustdoc/rustdoc.rs +++ b/src/rustdoc/rustdoc.rs @@ -51,8 +51,7 @@ fn test_run_passes() { path: [], brief: none, desc: none, - items: [], - mods: doc::modlist([]) + items: [] } } } @@ -67,8 +66,7 @@ fn test_run_passes() { path: [], brief: none, desc: none, - items: [], - mods: doc::modlist([]) + items: [] } } } diff --git a/src/rustdoc/trim_pass.rs b/src/rustdoc/trim_pass.rs index 7e33cf53777..b5a635b9357 100644 --- a/src/rustdoc/trim_pass.rs +++ b/src/rustdoc/trim_pass.rs @@ -22,8 +22,8 @@ fn should_trim_mod() { let doc = extract::from_srv(srv, ""); let doc = attr_pass::mk_pass()(srv, doc); let doc = mk_pass()(srv, doc); - assert doc.topmod.mods[0].brief == some("brief"); - assert doc.topmod.mods[0].desc == some("desc"); + assert doc.topmod.mods()[0].brief == some("brief"); + assert doc.topmod.mods()[0].desc == some("desc"); } #[test]