From 876cb76f1be63da0756a106ba743a617a5dfb2c8 Mon Sep 17 00:00:00 2001
From: Alex Crichton <alex@alexcrichton.com>
Date: Mon, 16 Sep 2013 16:31:04 -0700
Subject: [PATCH] Add the rustdoc_ng binary to the makefile rules

Now rustdoc_ng will be built as both a binary and a library (using the same
rules as all the other binaries that rust has). Furthermore, this will also
start building rustdoc_ng unit tests (and running them).
---
 Makefile.in                               |  1 +
 mk/clean.mk                               |  2 ++
 mk/dist.mk                                |  1 +
 mk/install.mk                             |  3 ++
 mk/tests.mk                               | 10 +++++-
 mk/tools.mk                               | 10 +++++-
 src/driver/driver.rs                      |  3 ++
 src/rustdoc_ng/clean.rs                   | 24 --------------
 src/rustdoc_ng/lib.rs                     | 37 ---------------------
 src/rustdoc_ng/{main.rs => rustdoc_ng.rs} | 39 +++++++++++++++++------
 10 files changed, 57 insertions(+), 73 deletions(-)
 delete mode 100644 src/rustdoc_ng/lib.rs
 rename src/rustdoc_ng/{main.rs => rustdoc_ng.rs} (83%)

diff --git a/Makefile.in b/Makefile.in
index 171ce8f1925..a1c276cd3d2 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -442,6 +442,7 @@ CSREQ$(1)_T_$(2)_H_$(3) = \
 	$$(TSREQ$(1)_T_$(2)_H_$(3)) \
 	$$(HBIN$(1)_H_$(3))/rustpkg$$(X_$(3)) \
 	$$(HBIN$(1)_H_$(3))/rustdoc$$(X_$(3)) \
+	$$(HBIN$(1)_H_$(3))/rustdoc_ng$$(X_$(3)) \
 	$$(HBIN$(1)_H_$(3))/rusti$$(X_$(3)) \
 	$$(HBIN$(1)_H_$(3))/rust$$(X_$(3)) \
 	$$(HLIB$(1)_H_$(3))/$(CFG_LIBRUSTPKG_$(3)) \
diff --git a/mk/clean.mk b/mk/clean.mk
index 5e8d9835db2..30ec6b15bfe 100644
--- a/mk/clean.mk
+++ b/mk/clean.mk
@@ -68,6 +68,7 @@ clean$(1)_H_$(2):
 	$(Q)rm -f $$(HBIN$(1)_H_$(2))/rustpkg$(X_$(2))
 	$(Q)rm -f $$(HBIN$(1)_H_$(2))/serializer$(X_$(2))
 	$(Q)rm -f $$(HBIN$(1)_H_$(2))/rustdoc$(X_$(2))
+	$(Q)rm -f $$(HBIN$(1)_H_$(2))/rustdoc_ng$(X_$(2))
 	$(Q)rm -f $$(HBIN$(1)_H_$(2))/rusti$(X_$(2))
 	$(Q)rm -f $$(HBIN$(1)_H_$(2))/rust$(X_$(2))
 	$(Q)rm -f $$(HLIB$(1)_H_$(2))/$(CFG_LIBRUSTPKG_$(2))
@@ -105,6 +106,7 @@ clean$(1)_T_$(2)_H_$(3):
 	$(Q)rm -f $$(TBIN$(1)_T_$(2)_H_$(3))/rustpkg$(X_$(2))
 	$(Q)rm -f $$(TBIN$(1)_T_$(2)_H_$(3))/serializer$(X_$(2))
 	$(Q)rm -f $$(TBIN$(1)_T_$(2)_H_$(3))/rustdoc$(X_$(2))
+	$(Q)rm -f $$(TBIN$(1)_T_$(2)_H_$(3))/rustdoc_ng$(X_$(2))
 	$(Q)rm -f $$(TBIN$(1)_T_$(2)_H_$(3))/rusti$(X_$(2))
 	$(Q)rm -f $$(TBIN$(1)_T_$(2)_H_$(3))/rust$(X_$(2))
 	$(Q)rm -f $$(TLIB$(1)_T_$(2)_H_$(3))/$(CFG_LIBRUSTPKG_$(2))
diff --git a/mk/dist.mk b/mk/dist.mk
index 4a980edf767..34230e6a5aa 100644
--- a/mk/dist.mk
+++ b/mk/dist.mk
@@ -39,6 +39,7 @@ PKG_FILES := \
       libsyntax                                \
       rt                                       \
       librustdoc                               \
+      rustdoc_ng                               \
       rustllvm                                 \
       snapshots.txt                            \
       test)                                    \
diff --git a/mk/install.mk b/mk/install.mk
index bc4633b8225..3989e4f8119 100644
--- a/mk/install.mk
+++ b/mk/install.mk
@@ -140,6 +140,7 @@ install-host: $(CSREQ$(ISTAGE)_T_$(CFG_BUILD_TRIPLE)_H_$(CFG_BUILD_TRIPLE))
 	$(Q)$(call INSTALL,$(HB2),$(PHB),rustc$(X_$(CFG_BUILD_TRIPLE)))
 	$(Q)$(call INSTALL,$(HB2),$(PHB),rustpkg$(X_$(CFG_BUILD_TRIPLE)))
 	$(Q)$(call INSTALL,$(HB2),$(PHB),rustdoc$(X_$(CFG_BUILD_TRIPLE)))
+	$(Q)$(call INSTALL,$(HB2),$(PHB),rustdoc_ng$(X_$(CFG_BUILD_TRIPLE)))
 	$(Q)$(call INSTALL,$(HB2),$(PHB),rusti$(X_$(CFG_BUILD_TRIPLE)))
 	$(Q)$(call INSTALL,$(HB2),$(PHB),rust$(X_$(CFG_BUILD_TRIPLE)))
 	$(Q)$(call INSTALL_LIB,$(STDLIB_GLOB_$(CFG_BUILD_TRIPLE)))
@@ -171,6 +172,7 @@ uninstall:
 	$(Q)rm -f $(PHB)/rusti$(X_$(CFG_BUILD_TRIPLE))
 	$(Q)rm -f $(PHB)/rust$(X_$(CFG_BUILD_TRIPLE))
 	$(Q)rm -f $(PHB)/rustdoc$(X_$(CFG_BUILD_TRIPLE))
+	$(Q)rm -f $(PHB)/rustdoc_ng$(X_$(CFG_BUILD_TRIPLE))
 	$(Q)rm -f $(PHL)/$(CFG_RUSTLLVM_$(CFG_BUILD_TRIPLE))
 	$(Q)rm -f $(PHL)/$(CFG_RUNTIME_$(CFG_BUILD_TRIPLE))
 	$(Q)for i in \
@@ -180,6 +182,7 @@ uninstall:
           $(call HOST_LIB_FROM_HL_GLOB,$(LIBSYNTAX_GLOB_$(CFG_BUILD_TRIPLE))) \
           $(call HOST_LIB_FROM_HL_GLOB,$(LIBRUSTPKG_GLOB_$(CFG_BUILD_TRIPLE))) \
           $(call HOST_LIB_FROM_HL_GLOB,$(LIBRUSTDOC_GLOB_$(CFG_BUILD_TRIPLE))) \
+          $(call HOST_LIB_FROM_HL_GLOB,$(LIBRUSTDOCNG_GLOB_$(CFG_BUILD_TRIPLE))) \
           $(call HOST_LIB_FROM_HL_GLOB,$(LIBRUSTI_GLOB_$(CFG_BUILD_TRIPLE))) \
           $(call HOST_LIB_FROM_HL_GLOB,$(LIBRUST_GLOB_$(CFG_BUILD_TRIPLE))) \
         ; \
diff --git a/mk/tests.mk b/mk/tests.mk
index c6b4c9da37a..28bbddc787f 100644
--- a/mk/tests.mk
+++ b/mk/tests.mk
@@ -15,7 +15,7 @@
 
 # The names of crates that must be tested
 TEST_TARGET_CRATES = std extra
-TEST_HOST_CRATES = rust rusti rustpkg rustc rustdoc syntax
+TEST_HOST_CRATES = rust rusti rustpkg rustc rustdoc rustdocng syntax
 TEST_CRATES = $(TEST_TARGET_CRATES) $(TEST_HOST_CRATES)
 
 # Markdown files under doc/ that should have their code extracted and run
@@ -393,6 +393,14 @@ $(3)/stage$(1)/test/rustdoctest-$(2)$$(X_$(2)):					\
 	@$$(call E, compile_and_link: $$@)
 	$$(STAGE$(1)_T_$(2)_H_$(3)) -o $$@ $$< --test
 
+$(3)/stage$(1)/test/rustdocngtest-$(2)$$(X_$(2)):			    \
+		$$(RUSTDOCNG_LIB) $$(RUSTDOCNG_INPUTS)		\
+		$$(SREQ$(1)_T_$(2)_H_$(3)) \
+		$$(TLIB$(1)_T_$(2)_H_$(3))/$$(CFG_LIBSYNTAX_$(2)) \
+		$$(TLIB$(1)_T_$(2)_H_$(3))/$$(CFG_LIBRUSTC_$(2))
+	@$$(call E, compile_and_link: $$@)
+	$$(STAGE$(1)_T_$(2)_H_$(3)) -o $$@ $$< --test
+
 endef
 
 $(foreach host,$(CFG_HOST_TRIPLES), \
diff --git a/mk/tools.mk b/mk/tools.mk
index 848fa8447b6..212b7e570f7 100644
--- a/mk/tools.mk
+++ b/mk/tools.mk
@@ -25,7 +25,7 @@ RUSTDOC_INPUTS := $(wildcard $(S)src/librustdoc/*.rs)
 
 # rustdoc_ng, the next generation documentation tool
 
-RUSTDOCNG_LIB := $(S)src/rustdoc_ng/lib.rs
+RUSTDOCNG_LIB := $(S)src/rustdoc_ng/rustdoc_ng.rs
 RUSTDOCNG_INPUTS := $(wildcard $(S)src/rustdoc_ng/*.rs)
 
 # Rusti, the JIT REPL
@@ -208,6 +208,14 @@ $$(HLIB$(2)_H_$(4))/$(CFG_LIBRUSTDOCNG_$(4)):					\
 		$$(wildcard $$(TLIB$(1)_T_$(4)_H_$(3))/$(LIBRUSTDOCNG_DSYM_GLOB_$(4))) \
 	        $$(HLIB$(2)_H_$(4))
 
+$$(HBIN$(2)_H_$(4))/rustdoc_ng$$(X_$(4)):				\
+		$$(TBIN$(1)_T_$(4)_H_$(3))/rustdoc_ng$$(X_$(4))	\
+		$$(HLIB$(2)_H_$(4))/$(CFG_LIBRUSTDOCNG_$(4))	\
+		$$(HSREQ$(2)_H_$(4))				\
+		| $$(HBIN$(2)_H_$(4))/
+	@$$(call E, cp: $$@)
+	$$(Q)cp $$< $$@
+
 $$(HLIB$(2)_H_$(4))/$(CFG_LIBRUSTI_$(4)):					\
 		$$(TLIB$(1)_T_$(4)_H_$(3))/$(CFG_LIBRUSTI_$(4))	\
 		$$(HLIB$(2)_H_$(4))/$(CFG_LIBRUSTC_$(4))			\
diff --git a/src/driver/driver.rs b/src/driver/driver.rs
index e81a3230e13..991bb914fd0 100644
--- a/src/driver/driver.rs
+++ b/src/driver/driver.rs
@@ -23,4 +23,7 @@ extern mod this(name = "rust");
 #[cfg(rustc)]
 extern mod this(name = "rustc");
 
+#[cfg(rustdoc_ng)]
+extern mod this(name = "rustdoc_ng");
+
 fn main() { this::main() }
diff --git a/src/rustdoc_ng/clean.rs b/src/rustdoc_ng/clean.rs
index 1bfb8e28393..65aa070ce6e 100644
--- a/src/rustdoc_ng/clean.rs
+++ b/src/rustdoc_ng/clean.rs
@@ -1043,27 +1043,3 @@ fn resolve_type(t: &Type) -> Type {
         ResolvedPath {path: path.clone(), typarams: tpbs.clone(), id: def_id.node}
     }
 }
-
-#[cfg(test)]
-mod tests {
-    use super::NameValue;
-
-    #[test]
-    fn test_doc_collapsing() {
-        assert_eq!(collapse_docs(~"// Foo\n//Bar\n // Baz\n"), ~"Foo\nBar\nBaz");
-        assert_eq!(collapse_docs(~"* Foo\n *  Bar\n *Baz\n"), ~"Foo\n Bar\nBaz");
-        assert_eq!(collapse_docs(~"* Short desc\n *\n * Bar\n *Baz\n"), ~"Short desc\n\nBar\nBaz");
-        assert_eq!(collapse_docs(~" * Foo"), ~"Foo");
-        assert_eq!(collapse_docs(~"\n *\n *\n * Foo"), ~"Foo");
-    }
-
-    fn collapse_docs(input: ~str) -> ~str {
-        let attrs = ~[NameValue(~"doc", input)];
-        let attrs_clean = super::collapse_docs(attrs);
-
-        match attrs_clean[0] {
-            NameValue(~"doc", s) => s,
-            _ => (fail!("dude where's my doc?"))
-        }
-    }
-}
diff --git a/src/rustdoc_ng/lib.rs b/src/rustdoc_ng/lib.rs
deleted file mode 100644
index 75453aa129c..00000000000
--- a/src/rustdoc_ng/lib.rs
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright 2012-2013 The Rust Project Developers. See the COPYRIGHT
-// file at the top-level directory of this distribution and at
-// http://rust-lang.org/COPYRIGHT.
-//
-// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
-// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
-// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
-// option. This file may not be copied, modified, or distributed
-// except according to those terms.
-
-#[link(name = "rustdoc_ng",
-       vers = "0.1.0",
-       uuid = "8c6e4598-1596-4aa5-a24c-b811914bbbc6")];
-#[desc = "rustdoc, the Rust documentation extractor"];
-#[license = "MIT/ASL2"];
-#[crate_type = "lib"];
-
-#[deny(warnings)];
-
-extern mod syntax;
-extern mod rustc;
-
-extern mod extra;
-
-use extra::serialize::Encodable;
-
-pub mod core;
-pub mod doctree;
-pub mod clean;
-pub mod visit_ast;
-pub mod fold;
-pub mod plugins;
-pub mod passes;
-
-pub static SCHEMA_VERSION: &'static str = "0.8.0";
-
-pub static ctxtkey: std::local_data::Key<@core::DocContext> = &std::local_data::Key;
diff --git a/src/rustdoc_ng/main.rs b/src/rustdoc_ng/rustdoc_ng.rs
similarity index 83%
rename from src/rustdoc_ng/main.rs
rename to src/rustdoc_ng/rustdoc_ng.rs
index aad64041a63..ec6ad6974e9 100644
--- a/src/rustdoc_ng/main.rs
+++ b/src/rustdoc_ng/rustdoc_ng.rs
@@ -9,25 +9,41 @@
 // except according to those terms.
 
 #[link(name = "rustdoc_ng",
-       vers = "0.1.0",
-       uuid = "8c6e4598-1596-4aa5-a24c-b811914bbbc6")];
+       vers = "0.8-pre",
+       uuid = "8c6e4598-1596-4aa5-a24c-b811914bbbc6",
+       url = "https://github.com/mozilla/rust/tree/master/src/rustdoc_ng")];
+
 #[desc = "rustdoc, the Rust documentation extractor"];
 #[license = "MIT/ASL2"];
-#[crate_type = "bin"];
+#[crate_type = "lib"];
 
+extern mod syntax;
+extern mod rustc;
 extern mod extra;
-extern mod rustdoc_ng;
-
-use rustdoc_ng::*;
-use std::cell::Cell;
 
 use extra::serialize::Encodable;
+use std::cell::Cell;
 
-fn main() {
+pub mod core;
+pub mod doctree;
+pub mod clean;
+pub mod visit_ast;
+pub mod fold;
+pub mod plugins;
+pub mod passes;
+
+pub static SCHEMA_VERSION: &'static str = "0.8.0";
+
+local_data_key!(pub ctxtkey: @core::DocContext)
+
+pub fn main() {
+    main_args(std::os::args());
+}
+
+pub fn main_args(args: &[~str]) {
     use extra::getopts::*;
     use extra::getopts::groups::*;
 
-    let args = std::os::args();
     let opts = ~[
         optmulti("L", "library-path", "directory to add to crate search path", "DIR"),
         optmulti("p", "plugin", "plugin to load and run", "NAME"),
@@ -62,7 +78,10 @@ fn main() {
 
     let cr = Cell::new(Path(matches.free[0]));
 
-    let crate = std::task::try(|| {let cr = cr.take(); core::run_core(libs.take(), &cr)}).unwrap();
+    let crate = do std::task::try {
+        let cr = cr.take();
+        core::run_core(libs.take(), &cr)
+    }.unwrap();
 
     // { "schema": version, "crate": { parsed crate ... }, "plugins": { output of plugins ... }}
     let mut json = ~extra::treemap::TreeMap::new();