From a57c15bf88cfa8a684947af5d28c8154ef2f6456 Mon Sep 17 00:00:00 2001 From: Brian Anderson Date: Fri, 3 Feb 2012 12:00:49 -0800 Subject: [PATCH] rustdoc: Add various sorting passes --- src/rustdoc/rustdoc.rc | 4 ++- src/rustdoc/rustdoc.rs | 2 ++ src/rustdoc/sort_item_name_pass.rs | 19 ++++++++++++ src/rustdoc/sort_item_type_pass.rs | 47 ++++++++++++++++++++++++++++++ 4 files changed, 71 insertions(+), 1 deletion(-) create mode 100644 src/rustdoc/sort_item_name_pass.rs create mode 100644 src/rustdoc/sort_item_type_pass.rs diff --git a/src/rustdoc/rustdoc.rc b/src/rustdoc/rustdoc.rc index a8669237368..036a2190657 100644 --- a/src/rustdoc/rustdoc.rc +++ b/src/rustdoc/rustdoc.rc @@ -30,4 +30,6 @@ mod unindent_pass; mod trim_pass; mod astsrv; mod demo; -mod sort_pass; \ No newline at end of file +mod sort_pass; +mod sort_item_name_pass; +mod sort_item_type_pass; \ No newline at end of file diff --git a/src/rustdoc/rustdoc.rs b/src/rustdoc/rustdoc.rs index e117222aedf..eb210d2f4ac 100755 --- a/src/rustdoc/rustdoc.rs +++ b/src/rustdoc/rustdoc.rs @@ -106,6 +106,8 @@ fn run(source_file: str) { desc_to_brief_pass::mk_pass(), trim_pass::mk_pass(), unindent_pass::mk_pass(), + sort_item_name_pass::mk_pass(), + sort_item_type_pass::mk_pass(), markdown_pass::mk_pass {|f| f(std::io:: stdout()) } ]); } \ No newline at end of file diff --git a/src/rustdoc/sort_item_name_pass.rs b/src/rustdoc/sort_item_name_pass.rs new file mode 100644 index 00000000000..be0478f3302 --- /dev/null +++ b/src/rustdoc/sort_item_name_pass.rs @@ -0,0 +1,19 @@ +#[doc = "Sorts items by name"]; + +export mk_pass; + +fn mk_pass() -> pass { + sort_pass::mk_pass { |item1, item2| + str::le(item1.name(), item2.name()) + } +} + +#[test] +fn test() { + let source = "mod z { } fn y() { }"; + let srv = astsrv::mk_srv_from_str(source); + let doc = extract::from_srv(srv, ""); + let doc = mk_pass()(srv, doc); + assert doc.topmod.items[0].name() == "y"; + assert doc.topmod.items[1].name() == "z"; +} diff --git a/src/rustdoc/sort_item_type_pass.rs b/src/rustdoc/sort_item_type_pass.rs new file mode 100644 index 00000000000..af6212c24dd --- /dev/null +++ b/src/rustdoc/sort_item_type_pass.rs @@ -0,0 +1,47 @@ +#[doc = "Sorts items by type"]; + +export mk_pass; + +fn mk_pass() -> pass { + sort_pass::mk_pass { |item1, item2| + fn score(item: doc::itemtag) -> int { + alt item { + doc::consttag(_) { 0 } + doc::tytag(_) { 1 } + doc::enumtag(_) { 2 } + doc::restag(_) { 3 } + doc::ifacetag(_) { 4 } + doc::impltag(_) { 5 } + doc::fntag(_) { 6 } + doc::modtag(_) { 7 } + _ { fail } + } + } + + score(item1) <= score(item2) + } +} + +#[test] +fn test() { + let source = + "mod imod { } \ + const iconst: int = 0; \ + fn ifn() { } \ + enum ienum { ivar } \ + resource ires(a: bool) { } \ + iface iiface { fn a(); } \ + impl iimpl for int { fn a() { } } \ + type itype = int;"; + let srv = astsrv::mk_srv_from_str(source); + let doc = extract::from_srv(srv, ""); + let doc = mk_pass()(srv, doc); + assert doc.topmod.items[0].name() == "iconst"; + assert doc.topmod.items[1].name() == "itype"; + assert doc.topmod.items[2].name() == "ienum"; + assert doc.topmod.items[3].name() == "ires"; + assert doc.topmod.items[4].name() == "iiface"; + assert doc.topmod.items[5].name() == "iimpl"; + assert doc.topmod.items[6].name() == "ifn"; + assert doc.topmod.items[7].name() == "imod"; +}