diff --git a/src/rustdoc/doc.rs b/src/rustdoc/doc.rs
index b7a7fb4dd88e..ccee13358356 100644
--- a/src/rustdoc/doc.rs
+++ b/src/rustdoc/doc.rs
@@ -240,6 +240,90 @@ impl util for moddoc {
}
}
+impl util for [page] {
+
+ fn mods() -> [moddoc] {
+ vec::filter_map(self) {|page|
+ alt page {
+ itempage(modtag(moddoc)) { some(moddoc) }
+ _ { none }
+ }
+ }
+ }
+
+ fn nmods() -> [nmoddoc] {
+ vec::filter_map(self) {|page|
+ alt page {
+ itempage(nmodtag(nmoddoc)) { some(nmoddoc) }
+ _ { none }
+ }
+ }
+ }
+
+ fn fns() -> [fndoc] {
+ vec::filter_map(self) {|page|
+ alt page {
+ itempage(fntag(fndoc)) { some(fndoc) }
+ _ { none }
+ }
+ }
+ }
+
+ fn consts() -> [constdoc] {
+ vec::filter_map(self) {|page|
+ alt page {
+ itempage(consttag(constdoc)) { some(constdoc) }
+ _ { none }
+ }
+ }
+ }
+
+ fn enums() -> [enumdoc] {
+ vec::filter_map(self) {|page|
+ alt page {
+ itempage(enumtag(enumdoc)) { some(enumdoc) }
+ _ { none }
+ }
+ }
+ }
+
+ fn resources() -> [resdoc] {
+ vec::filter_map(self) {|page|
+ alt page {
+ itempage(restag(resdoc)) { some(resdoc) }
+ _ { none }
+ }
+ }
+ }
+
+ fn ifaces() -> [ifacedoc] {
+ vec::filter_map(self) {|page|
+ alt page {
+ itempage(ifacetag(ifacedoc)) { some(ifacedoc) }
+ _ { none }
+ }
+ }
+ }
+
+ fn impls() -> [impldoc] {
+ vec::filter_map(self) {|page|
+ alt page {
+ itempage(impltag(impldoc)) { some(impldoc) }
+ _ { none }
+ }
+ }
+ }
+
+ fn types() -> [tydoc] {
+ vec::filter_map(self) {|page|
+ alt page {
+ itempage(tytag(tydoc)) { some(tydoc) }
+ _ { none }
+ }
+ }
+ }
+}
+
iface item {
fn item() -> itemdoc;
}
diff --git a/src/rustdoc/page_pass.rs b/src/rustdoc/page_pass.rs
new file mode 100644
index 000000000000..e3f2c4235e72
--- /dev/null
+++ b/src/rustdoc/page_pass.rs
@@ -0,0 +1,152 @@
+#[doc = "
+
+Divides the document tree into pages.
+
+Each page corresponds is a logical section. There may be pages for individual
+modules, pages for the crate, indexes, etc.
+
+"];
+
+export mk_pass;
+
+fn mk_pass(output_style: config::output_style) -> pass {
+ {
+ name: "page",
+ f: fn~(srv: astsrv::srv, doc: doc::doc) -> doc::doc {
+ run(srv, doc, output_style)
+ }
+ }
+}
+
+fn run(
+ _srv: astsrv::srv,
+ doc: doc::doc,
+ output_style: config::output_style
+) -> doc::doc {
+
+ if output_style == config::doc_per_crate {
+ ret doc;
+ }
+
+ let result_port = comm::port();
+ let result_chan = comm::chan(result_port);
+ let page_chan = task::spawn_listener {|page_port|
+ comm::send(result_chan, make_doc_from_pages(page_port));
+ };
+
+ find_pages(doc, page_chan);
+ comm::recv(result_port)
+}
+
+type page_port = comm::port