From fc64aefe0aebe547322e86b3e5daa4564d038e63 Mon Sep 17 00:00:00 2001 From: Brian Anderson Date: Tue, 24 Jan 2012 17:40:22 -0800 Subject: [PATCH] rustdoc: Add a pass to trim whitespace from docs --- src/rustdoc/rustdoc.rc | 1 + src/rustdoc/rustdoc.rs | 1 + src/rustdoc/trim_pass.rs | 130 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 132 insertions(+) create mode 100644 src/rustdoc/trim_pass.rs diff --git a/src/rustdoc/rustdoc.rc b/src/rustdoc/rustdoc.rc index 4586a02379b..258ff4aab80 100644 --- a/src/rustdoc/rustdoc.rc +++ b/src/rustdoc/rustdoc.rc @@ -24,4 +24,5 @@ mod tystr_pass; mod prune_undoc_pass; mod prune_unexported_pass; mod desc_to_brief_pass; +mod trim_pass; mod astsrv; diff --git a/src/rustdoc/rustdoc.rs b/src/rustdoc/rustdoc.rs index 46959b96173..c7445e8d35d 100755 --- a/src/rustdoc/rustdoc.rs +++ b/src/rustdoc/rustdoc.rs @@ -101,6 +101,7 @@ fn run(source_file: str) { // FIXME: This pass should be optional prune_undoc_pass::mk_pass(), desc_to_brief_pass::mk_pass(), + trim_pass::mk_pass(), gen::mk_pass {|| std::io:: stdout()} ]); } \ No newline at end of file diff --git a/src/rustdoc/trim_pass.rs b/src/rustdoc/trim_pass.rs new file mode 100644 index 00000000000..ad8ad279be7 --- /dev/null +++ b/src/rustdoc/trim_pass.rs @@ -0,0 +1,130 @@ +#[doc = " + +Pulls a brief description out of a long description. + +If the first paragraph of a long description is short enough then it +is interpreted as the brief description. + +"]; + +export mk_pass; + +fn mk_pass() -> pass { + run +} + +fn run( + _srv: astsrv::srv, + doc: doc::cratedoc +) -> doc::cratedoc { + let fold = fold::fold({ + fold_mod: fold_mod, + fold_const: fold_const, + fold_fn: fold_fn + with *fold::default_seq_fold(()) + }); + fold.fold_crate(fold, doc) +} + +fn trimopt(s: option) -> option { + option::map(s, {|s| str::trim(s) }) +} + +fn fold_mod(fold: fold::fold<()>, doc: doc::moddoc) -> doc::moddoc { + let doc = fold::default_seq_fold_mod(fold, doc); + + ~{ + brief: trimopt(doc.brief), + desc: trimopt(doc.desc) + with *doc + } +} + +#[test] +fn should_trim_mod() { + let source = "#[doc(brief = \"\nbrief\n\", \ + desc = \"\ndesc\n\")] \ + mod m { }"; + let srv = astsrv::mk_srv_from_str(source); + 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("brief"); + assert doc.topmod.mods[0].desc == some("desc"); +} + +fn fold_const(fold: fold::fold<()>, doc: doc::constdoc) -> doc::constdoc { + let doc = fold::default_seq_fold_const(fold, doc); + + ~{ + brief: trimopt(doc.brief), + desc: trimopt(doc.desc) + with *doc + } +} + +#[test] +fn should_trim_const() { + let source = "#[doc(brief = \"\nbrief\n\", \ + desc = \"\ndesc\n\")] \ + const a: bool = true;"; + let srv = astsrv::mk_srv_from_str(source); + let doc = extract::from_srv(srv, ""); + let doc = attr_pass::mk_pass()(srv, doc); + let doc = run(srv, doc); + assert doc.topmod.consts[0].brief == some("brief"); + assert doc.topmod.consts[0].desc == some("desc"); +} + +fn fold_fn(fold: fold::fold<()>, doc: doc::fndoc) -> doc::fndoc { + let doc = fold::default_seq_fold_fn(fold, doc); + + ~{ + brief: trimopt(doc.brief), + desc: trimopt(doc.desc), + args: vec::map(doc.args) {|doc| + ~{ + desc: trimopt(doc.desc) + with *doc + } + }, + return: { + desc: trimopt(doc.return.desc) + with doc.return + } + with *doc + } +} + +#[test] +fn should_trim_fn() { + let source = "#[doc(brief = \"\nbrief\n\", \ + desc = \"\ndesc\n\")] \ + fn a() { }"; + let srv = astsrv::mk_srv_from_str(source); + let doc = extract::from_srv(srv, ""); + let doc = attr_pass::mk_pass()(srv, doc); + let doc = run(srv, doc); + assert doc.topmod.fns[0].brief == some("brief"); + assert doc.topmod.fns[0].desc == some("desc"); +} + +#[test] +fn should_trim_args() { + let source = "#[doc(args(a = \"\na\n\"))] fn a(a: int) { }"; + let srv = astsrv::mk_srv_from_str(source); + let doc = extract::from_srv(srv, ""); + let doc = attr_pass::mk_pass()(srv, doc); + let doc = run(srv, doc); + assert doc.topmod.fns[0].args[0].desc == some("a"); +} + +#[test] +fn should_trim_ret() { + let source = "#[doc(return = \"\na\n\")] fn a() -> int { }"; + let srv = astsrv::mk_srv_from_str(source); + let doc = extract::from_srv(srv, ""); + let doc = attr_pass::mk_pass()(srv, doc); + let doc = run(srv, doc); + assert doc.topmod.fns[0].return.desc == some("a"); +}