about summary refs log tree commit diff
path: root/src/librustdoc/core.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/librustdoc/core.rs')
-rw-r--r--src/librustdoc/core.rs38
1 files changed, 31 insertions, 7 deletions
diff --git a/src/librustdoc/core.rs b/src/librustdoc/core.rs
index 7537366014e..69d9f8f5946 100644
--- a/src/librustdoc/core.rs
+++ b/src/librustdoc/core.rs
@@ -10,14 +10,17 @@
 
 use rustc;
 use rustc::{driver, middle};
+use rustc::middle::privacy;
 
 use syntax::ast;
+use syntax::ast_util::is_local;
 use syntax::diagnostic;
 use syntax::parse;
 use syntax;
 
 use std::os;
 use std::local_data;
+use std::hashmap::HashMap;
 
 use visit_ast::RustdocVisitor;
 use clean;
@@ -29,10 +32,19 @@ pub struct DocContext {
     sess: driver::session::Session
 }
 
+pub struct CrateAnalysis {
+    exported_items: privacy::ExportedItems,
+    reexports: HashMap<ast::NodeId, ~[ast::NodeId]>,
+}
+
 /// Parses, resolves, and typechecks the given crate
-fn get_ast_and_resolve(cpath: &Path, libs: ~[Path]) -> DocContext {
+fn get_ast_and_resolve(cpath: &Path,
+                       libs: ~[Path]) -> (DocContext, CrateAnalysis) {
     use syntax::codemap::dummy_spanned;
-    use rustc::driver::driver::*;
+    use rustc::driver::driver::{file_input, build_configuration,
+                                phase_1_parse_input,
+                                phase_2_configure_and_expand,
+                                phase_3_run_analysis_passes};
 
     let parsesess = parse::new_parse_sess(None);
     let input = file_input(cpath.clone());
@@ -60,14 +72,26 @@ fn get_ast_and_resolve(cpath: &Path, libs: ~[Path]) -> DocContext {
 
     let mut crate = phase_1_parse_input(sess, cfg.clone(), &input);
     crate = phase_2_configure_and_expand(sess, cfg, crate);
-    let analysis = phase_3_run_analysis_passes(sess, &crate);
+    let driver::driver::CrateAnalysis {
+        exported_items, ty_cx, exp_map2, _
+    } = phase_3_run_analysis_passes(sess, &crate);
+
+    let mut reexports = HashMap::new();
+    for (&module, nodes) in exp_map2.iter() {
+        reexports.insert(module, nodes.iter()
+                                      .filter(|e| e.reexport && is_local(e.def_id))
+                                      .map(|e| e.def_id.node)
+                                      .to_owned_vec());
+    }
 
     debug2!("crate: {:?}", crate);
-    DocContext { crate: crate, tycx: analysis.ty_cx, sess: sess }
+    return (DocContext { crate: crate, tycx: ty_cx, sess: sess },
+            CrateAnalysis { reexports: reexports, exported_items: exported_items });
 }
 
-pub fn run_core (libs: ~[Path], path: &Path) -> clean::Crate {
-    let ctxt = @get_ast_and_resolve(path, libs);
+pub fn run_core (libs: ~[Path], path: &Path) -> (clean::Crate, CrateAnalysis) {
+    let (ctxt, analysis) = get_ast_and_resolve(path, libs);
+    let ctxt = @ctxt;
     debug2!("defmap:");
     for (k, v) in ctxt.tycx.def_map.iter() {
         debug2!("{:?}: {:?}", k, v);
@@ -77,5 +101,5 @@ pub fn run_core (libs: ~[Path], path: &Path) -> clean::Crate {
     let v = @mut RustdocVisitor::new();
     v.visit(&ctxt.crate);
 
-    v.clean()
+    (v.clean(), analysis)
 }