diff options
| author | Alex Crichton <alex@alexcrichton.com> | 2015-04-06 15:10:55 -0700 |
|---|---|---|
| committer | Alex Crichton <alex@alexcrichton.com> | 2015-04-07 17:54:33 -0700 |
| commit | 458102eefa0cf8fc3f33928ab90a86ac4c564f90 (patch) | |
| tree | 647c56c3c67dbd6c6a130d4b43b68fb032c30aa5 /src/librustdoc | |
| parent | d3647fe81543f0a04a0d6aee15f4bb8c08774295 (diff) | |
| download | rust-458102eefa0cf8fc3f33928ab90a86ac4c564f90.tar.gz rust-458102eefa0cf8fc3f33928ab90a86ac4c564f90.zip | |
rustdoc: Run external traits through filters
This ensures that all external traits are run through the same filters that the rest of the AST goes through, stripping hidden function as necessary. Closes #13698
Diffstat (limited to 'src/librustdoc')
| -rw-r--r-- | src/librustdoc/clean/inline.rs | 7 | ||||
| -rw-r--r-- | src/librustdoc/clean/mod.rs | 5 | ||||
| -rw-r--r-- | src/librustdoc/core.rs | 4 | ||||
| -rw-r--r-- | src/librustdoc/fold.rs | 9 | ||||
| -rw-r--r-- | src/librustdoc/html/render.rs | 20 |
5 files changed, 22 insertions, 23 deletions
diff --git a/src/librustdoc/clean/inline.rs b/src/librustdoc/clean/inline.rs index aa17bf20d74..e4b2e82b21b 100644 --- a/src/librustdoc/clean/inline.rs +++ b/src/librustdoc/clean/inline.rs @@ -331,9 +331,10 @@ fn build_impl(cx: &DocContext, let did = assoc_ty.def_id; let type_scheme = ty::lookup_item_type(tcx, did); let predicates = ty::lookup_predicates(tcx, did); - // Not sure the choice of ParamSpace actually matters here, because an - // associated type won't have generics on the LHS - let typedef = (type_scheme, predicates, subst::ParamSpace::TypeSpace).clean(cx); + // Not sure the choice of ParamSpace actually matters here, + // because an associated type won't have generics on the LHS + let typedef = (type_scheme, predicates, + subst::ParamSpace::TypeSpace).clean(cx); Some(clean::Item { name: Some(assoc_ty.name.clean(cx)), inner: clean::TypedefItem(typedef), diff --git a/src/librustdoc/clean/mod.rs b/src/librustdoc/clean/mod.rs index e0ed83f4019..53824d088ee 100644 --- a/src/librustdoc/clean/mod.rs +++ b/src/librustdoc/clean/mod.rs @@ -44,9 +44,10 @@ use rustc::middle::subst::{self, ParamSpace, VecPerParamSpace}; use rustc::middle::ty; use rustc::middle::stability; +use std::collections::HashMap; +use std::path::PathBuf; use std::rc::Rc; use std::u32; -use std::path::PathBuf; use core::DocContext; use doctree; @@ -119,6 +120,7 @@ pub struct Crate { pub module: Option<Item>, pub externs: Vec<(ast::CrateNum, ExternalCrate)>, pub primitives: Vec<PrimitiveType>, + pub external_traits: HashMap<ast::DefId, Trait>, } impl<'a, 'tcx> Clean<Crate> for visit_ast::RustdocVisitor<'a, 'tcx> { @@ -197,6 +199,7 @@ impl<'a, 'tcx> Clean<Crate> for visit_ast::RustdocVisitor<'a, 'tcx> { module: Some(module), externs: externs, primitives: primitives, + external_traits: cx.external_traits.borrow_mut().take().unwrap(), } } } diff --git a/src/librustdoc/core.rs b/src/librustdoc/core.rs index 113a622b07a..a637ba9f297 100644 --- a/src/librustdoc/core.rs +++ b/src/librustdoc/core.rs @@ -75,7 +75,6 @@ pub struct CrateAnalysis { pub exported_items: privacy::ExportedItems, pub public_items: privacy::PublicItems, pub external_paths: ExternalPaths, - pub external_traits: RefCell<Option<HashMap<ast::DefId, clean::Trait>>>, pub external_typarams: RefCell<Option<HashMap<ast::DefId, String>>>, pub inlined: RefCell<Option<HashSet<ast::DefId>>>, } @@ -155,7 +154,6 @@ pub fn run_core(search_paths: SearchPaths, cfgs: Vec<String>, externs: Externs, exported_items: exported_items, public_items: public_items, external_paths: RefCell::new(None), - external_traits: RefCell::new(None), external_typarams: RefCell::new(None), inlined: RefCell::new(None), }; @@ -168,8 +166,6 @@ pub fn run_core(search_paths: SearchPaths, cfgs: Vec<String>, externs: Externs, let external_paths = ctxt.external_paths.borrow_mut().take(); *analysis.external_paths.borrow_mut() = external_paths; - let map = ctxt.external_traits.borrow_mut().take(); - *analysis.external_traits.borrow_mut() = map; let map = ctxt.external_typarams.borrow_mut().take(); *analysis.external_typarams.borrow_mut() = map; let map = ctxt.inlined.borrow_mut().take(); diff --git a/src/librustdoc/fold.rs b/src/librustdoc/fold.rs index cdeeacfb783..0a1860c66f2 100644 --- a/src/librustdoc/fold.rs +++ b/src/librustdoc/fold.rs @@ -9,7 +9,7 @@ // except according to those terms. use clean::*; -use std::iter::Extend; +use std::collections::HashMap; use std::mem::{replace, swap}; pub trait DocFolder : Sized { @@ -80,6 +80,13 @@ pub trait DocFolder : Sized { c.module = match replace(&mut c.module, None) { Some(module) => self.fold_item(module), None => None }; + let external_traits = replace(&mut c.external_traits, HashMap::new()); + c.external_traits = external_traits.into_iter().map(|(k, mut v)| { + let items = replace(&mut v.items, Vec::new()); + v.items = items.into_iter().filter_map(|i| self.fold_item(i)) + .collect(); + (k, v) + }).collect(); return c; } } diff --git a/src/librustdoc/html/render.rs b/src/librustdoc/html/render.rs index ac097d051b2..da59ffd785a 100644 --- a/src/librustdoc/html/render.rs +++ b/src/librustdoc/html/render.rs @@ -44,6 +44,7 @@ use std::fs::{self, File}; use std::io::prelude::*; use std::io::{self, BufWriter, BufReader}; use std::iter::repeat; +use std::mem; use std::path::{PathBuf, Path}; use std::str; use std::sync::Arc; @@ -383,9 +384,7 @@ pub fn run(mut krate: clean::Crate, privmod: false, public_items: public_items, orphan_methods: Vec::new(), - traits: analysis.as_ref().map(|a| { - a.external_traits.borrow_mut().take().unwrap() - }).unwrap_or(HashMap::new()), + traits: mem::replace(&mut krate.external_traits, HashMap::new()), typarams: analysis.as_ref().map(|a| { a.external_typarams.borrow_mut().take().unwrap() }).unwrap_or(HashMap::new()), @@ -2239,7 +2238,7 @@ fn render_impl(w: &mut fmt::Formatter, i: &Impl) -> fmt::Result { } try!(write!(w, "<div class='impl-items'>")); - for trait_item in &i.impl_.items { + for trait_item in i.impl_.items.iter() { try!(doctraititem(w, trait_item, true)); } @@ -2262,17 +2261,10 @@ fn render_impl(w: &mut fmt::Formatter, i: &Impl) -> fmt::Result { // default methods which weren't overridden in the implementation block. // FIXME: this also needs to be done for associated types, whenever defaults // for them work. - match i.impl_.trait_ { - Some(clean::ResolvedPath { did, .. }) => { - try!({ - match cache().traits.get(&did) { - Some(t) => try!(render_default_methods(w, t, &i.impl_)), - None => {} - } - Ok(()) - }) + if let Some(clean::ResolvedPath { did, .. }) = i.impl_.trait_ { + if let Some(t) = cache().traits.get(&did) { + try!(render_default_methods(w, t, &i.impl_)); } - Some(..) | None => {} } try!(write!(w, "</div>")); Ok(()) |
