diff options
Diffstat (limited to 'src/librustdoc')
| -rw-r--r-- | src/librustdoc/clean/mod.rs | 73 | ||||
| -rw-r--r-- | src/librustdoc/core.rs | 27 | ||||
| -rw-r--r-- | src/librustdoc/html/format.rs | 6 | ||||
| -rw-r--r-- | src/librustdoc/html/render.rs | 39 | ||||
| -rw-r--r-- | src/librustdoc/passes.rs | 39 | ||||
| -rw-r--r-- | src/librustdoc/test.rs | 8 | ||||
| -rw-r--r-- | src/librustdoc/visit_ast.rs | 20 |
7 files changed, 117 insertions, 95 deletions
diff --git a/src/librustdoc/clean/mod.rs b/src/librustdoc/clean/mod.rs index 89020b011a9..3492635a20b 100644 --- a/src/librustdoc/clean/mod.rs +++ b/src/librustdoc/clean/mod.rs @@ -39,7 +39,7 @@ use rustc::metadata::cstore; use rustc::metadata::csearch; use rustc::metadata::decoder; use rustc::middle::def; -use rustc::middle::def_id::{DefId, LOCAL_CRATE}; +use rustc::middle::def_id::{DefId, DefIndex}; use rustc::middle::subst::{self, ParamSpace, VecPerParamSpace}; use rustc::middle::ty; use rustc::middle::stability; @@ -188,7 +188,7 @@ impl<'a, 'tcx> Clean<Crate> for visit_ast::RustdocVisitor<'a, 'tcx> { attrs: child.attrs.clone(), visibility: Some(hir::Public), stability: None, - def_id: DefId::local(prim.to_node_id()), + def_id: DefId::local(prim.to_def_index()), inner: PrimitiveItem(prim), }); } @@ -419,7 +419,7 @@ impl Clean<Item> for doctree::Module { source: whence.clean(cx), visibility: self.vis.clean(cx), stability: self.stab.clean(cx), - def_id: DefId::local(self.id), + def_id: cx.map.local_def_id(self.id), inner: ModuleItem(Module { is_crate: self.is_crate, items: items @@ -495,7 +495,7 @@ impl Clean<TyParam> for hir::TyParam { fn clean(&self, cx: &DocContext) -> TyParam { TyParam { name: self.name.clean(cx), - did: DefId { krate: LOCAL_CRATE, node: self.id }, + did: cx.map.local_def_id(self.id), bounds: self.bounds.clean(cx), default: self.default.clean(cx), } @@ -1087,7 +1087,7 @@ impl Clean<Item> for doctree::Function { source: self.whence.clean(cx), visibility: self.vis.clean(cx), stability: self.stab.clean(cx), - def_id: DefId::local(self.id), + def_id: cx.map.local_def_id(self.id), inner: FunctionItem(Function { decl: self.decl.clean(cx), generics: self.generics.clean(cx), @@ -1137,10 +1137,10 @@ impl<'tcx> Clean<Type> for ty::FnOutput<'tcx> { impl<'a, 'tcx> Clean<FnDecl> for (DefId, &'a ty::PolyFnSig<'tcx>) { fn clean(&self, cx: &DocContext) -> FnDecl { let (did, sig) = *self; - let mut names = if did.node != 0 { - csearch::get_method_arg_names(&cx.tcx().sess.cstore, did).into_iter() + let mut names = if let Some(_) = cx.map.as_local_node_id(did) { + vec![].into_iter() } else { - Vec::new().into_iter() + csearch::get_method_arg_names(&cx.tcx().sess.cstore, did).into_iter() }.peekable(); if names.peek().map(|s| &**s) == Some("self") { let _ = names.next(); @@ -1210,7 +1210,7 @@ impl Clean<Item> for doctree::Trait { name: Some(self.name.clean(cx)), attrs: self.attrs.clean(cx), source: self.whence.clean(cx), - def_id: DefId::local(self.id), + def_id: cx.map.local_def_id(self.id), visibility: self.vis.clean(cx), stability: self.stab.clean(cx), inner: TraitItem(Trait { @@ -1260,9 +1260,9 @@ impl Clean<Item> for hir::TraitItem { name: Some(self.name.clean(cx)), attrs: self.attrs.clean(cx), source: self.span.clean(cx), - def_id: DefId::local(self.id), + def_id: cx.map.local_def_id(self.id), visibility: None, - stability: get_stability(cx, DefId::local(self.id)), + stability: get_stability(cx, cx.map.local_def_id(self.id)), inner: inner } } @@ -1293,9 +1293,9 @@ impl Clean<Item> for hir::ImplItem { name: Some(self.name.clean(cx)), source: self.span.clean(cx), attrs: self.attrs.clean(cx), - def_id: DefId::local(self.id), + def_id: cx.map.local_def_id(self.id), visibility: self.vis.clean(cx), - stability: get_stability(cx, DefId::local(self.id)), + stability: get_stability(cx, cx.map.local_def_id(self.id)), inner: inner } } @@ -1559,8 +1559,9 @@ impl PrimitiveType { /// Creates a rustdoc-specific node id for primitive types. /// /// These node ids are generally never used by the AST itself. - pub fn to_node_id(&self) -> ast::NodeId { - u32::MAX - 1 - (*self as u32) + pub fn to_def_index(&self) -> DefIndex { + let x = u32::MAX - 1 - (*self as u32); + DefIndex::new(x as usize) } } @@ -1659,7 +1660,7 @@ impl<'tcx> Clean<Type> for ty::Ty<'tcx> { type_params: Vec::new(), where_predicates: Vec::new() }, - decl: (DefId::local(0), &fty.sig).clean(cx), + decl: (cx.map.local_def_id(0), &fty.sig).clean(cx), abi: fty.abi.to_string(), }), ty::TyStruct(def, substs) | @@ -1727,8 +1728,8 @@ impl Clean<Item> for hir::StructField { attrs: self.node.attrs.clean(cx), source: self.span.clean(cx), visibility: Some(vis), - stability: get_stability(cx, DefId::local(self.node.id)), - def_id: DefId::local(self.node.id), + stability: get_stability(cx, cx.map.local_def_id(self.node.id)), + def_id: cx.map.local_def_id(self.node.id), inner: StructFieldItem(TypedStructField(self.node.ty.clean(cx))), } } @@ -1744,7 +1745,7 @@ impl<'tcx> Clean<Item> for ty::FieldDefData<'tcx, 'static> { let (name, attrs) = if self.name == unnamed_field.name { (None, None) } else { - (Some(self.name), Some(attr_map.get(&self.did.node).unwrap())) + (Some(self.name), Some(attr_map.get(&self.did).unwrap())) }; Item { @@ -1781,7 +1782,7 @@ impl Clean<Item> for doctree::Struct { name: Some(self.name.clean(cx)), attrs: self.attrs.clean(cx), source: self.whence.clean(cx), - def_id: DefId::local(self.id), + def_id: cx.map.local_def_id(self.id), visibility: self.vis.clean(cx), stability: self.stab.clean(cx), inner: StructItem(Struct { @@ -1827,7 +1828,7 @@ impl Clean<Item> for doctree::Enum { name: Some(self.name.clean(cx)), attrs: self.attrs.clean(cx), source: self.whence.clean(cx), - def_id: DefId::local(self.id), + def_id: cx.map.local_def_id(self.id), visibility: self.vis.clean(cx), stability: self.stab.clean(cx), inner: EnumItem(Enum { @@ -1852,7 +1853,7 @@ impl Clean<Item> for doctree::Variant { source: self.whence.clean(cx), visibility: None, stability: self.stab.clean(cx), - def_id: DefId::local(self.id), + def_id: cx.map.local_def_id(self.id), inner: VariantItem(Variant { kind: self.kind.clean(cx), }), @@ -2082,7 +2083,7 @@ impl Clean<Item> for doctree::Typedef { name: Some(self.name.clean(cx)), attrs: self.attrs.clean(cx), source: self.whence.clean(cx), - def_id: DefId::local(self.id.clone()), + def_id: cx.map.local_def_id(self.id.clone()), visibility: self.vis.clean(cx), stability: self.stab.clean(cx), inner: TypedefItem(Typedef { @@ -2133,7 +2134,7 @@ impl Clean<Item> for doctree::Static { name: Some(self.name.clean(cx)), attrs: self.attrs.clean(cx), source: self.whence.clean(cx), - def_id: DefId::local(self.id), + def_id: cx.map.local_def_id(self.id), visibility: self.vis.clean(cx), stability: self.stab.clean(cx), inner: StaticItem(Static { @@ -2157,7 +2158,7 @@ impl Clean<Item> for doctree::Constant { name: Some(self.name.clean(cx)), attrs: self.attrs.clean(cx), source: self.whence.clean(cx), - def_id: DefId::local(self.id), + def_id: cx.map.local_def_id(self.id), visibility: self.vis.clean(cx), stability: self.stab.clean(cx), inner: ConstantItem(Constant { @@ -2231,7 +2232,7 @@ impl Clean<Vec<Item>> for doctree::Impl { name: None, attrs: self.attrs.clean(cx), source: self.whence.clean(cx), - def_id: DefId::local(self.id), + def_id: cx.map.local_def_id(self.id), visibility: self.vis.clean(cx), stability: self.stab.clean(cx), inner: ImplItem(Impl { @@ -2313,7 +2314,7 @@ impl Clean<Item> for doctree::DefaultImpl { name: None, attrs: self.attrs.clean(cx), source: self.whence.clean(cx), - def_id: DefId::local(self.id), + def_id: cx.map.local_def_id(self.id), visibility: Some(hir::Public), stability: None, inner: DefaultImplItem(DefaultImpl { @@ -2330,7 +2331,7 @@ impl Clean<Item> for doctree::ExternCrate { name: None, attrs: self.attrs.clean(cx), source: self.whence.clean(cx), - def_id: DefId::local(0), + def_id: cx.map.local_def_id(0), visibility: self.vis.clean(cx), stability: None, inner: ExternCrateItem(self.name.clean(cx), self.path.clone()) @@ -2395,7 +2396,7 @@ impl Clean<Vec<Item>> for doctree::Import { name: None, attrs: self.attrs.clean(cx), source: self.whence.clean(cx), - def_id: DefId::local(0), + def_id: cx.map.local_def_id(0), visibility: self.vis.clean(cx), stability: None, inner: ImportItem(inner) @@ -2481,9 +2482,9 @@ impl Clean<Item> for hir::ForeignItem { name: Some(self.name.clean(cx)), attrs: self.attrs.clean(cx), source: self.span.clean(cx), - def_id: DefId::local(self.id), + def_id: cx.map.local_def_id(self.id), visibility: self.vis.clean(cx), - stability: get_stability(cx, DefId::local(self.id)), + stability: get_stability(cx, cx.map.local_def_id(self.id)), inner: inner, } } @@ -2570,17 +2571,19 @@ fn name_from_pat(p: &hir::Pat) -> String { fn resolve_type(cx: &DocContext, path: Path, id: ast::NodeId) -> Type { + debug!("resolve_type({:?},{:?})", path, id); let tcx = match cx.tcx_opt() { Some(tcx) => tcx, // If we're extracting tests, this return value doesn't matter. None => return Primitive(Bool), }; - debug!("searching for {} in defmap", id); let def = match tcx.def_map.borrow().get(&id) { Some(k) => k.full_def(), None => panic!("unresolved id not in defmap") }; + debug!("resolve_type: def={:?}", def); + let is_generic = match def { def::DefPrimTy(p) => match p { hir::TyStr => return Primitive(Str), @@ -2610,6 +2613,8 @@ fn resolve_type(cx: &DocContext, } fn register_def(cx: &DocContext, def: def::Def) -> DefId { + debug!("register_def({:?})", def); + let (did, kind) = match def { def::DefFn(i, _) => (i, TypeFunction), def::DefTy(i, false) => (i, TypeTypedef), @@ -2619,6 +2624,8 @@ fn register_def(cx: &DocContext, def: def::Def) -> DefId { def::DefMod(i) => (i, TypeModule), def::DefStatic(i, _) => (i, TypeStatic), def::DefVariant(i, _, _) => (i, TypeEnum), + def::DefSelfTy(Some(def_id), _) => (def_id, TypeTrait), + def::DefSelfTy(_, Some((impl_id, _))) => return cx.map.local_def_id(impl_id), _ => return def.def_id() }; if did.is_local() { return did } @@ -2661,7 +2668,7 @@ impl Clean<Item> for doctree::Macro { source: self.whence.clean(cx), visibility: hir::Public.clean(cx), stability: self.stab.clean(cx), - def_id: DefId::local(self.id), + def_id: cx.map.local_def_id(self.id), inner: MacroItem(Macro { source: self.whence.to_src(cx), imported_from: self.imported_from.clean(cx), diff --git a/src/librustdoc/core.rs b/src/librustdoc/core.rs index d7238c827ab..c84a7e7c560 100644 --- a/src/librustdoc/core.rs +++ b/src/librustdoc/core.rs @@ -13,13 +13,13 @@ use rustc_lint; use rustc_driver::{driver, target_features}; use rustc::session::{self, config}; use rustc::middle::def_id::DefId; -use rustc::middle::{privacy, ty}; +use rustc::middle::ty; use rustc::front::map as hir_map; use rustc::lint; +use rustc::util::nodemap::DefIdSet; use rustc_trans::back::link; use rustc_resolve as resolve; use rustc_front::lowering::lower_crate; -use rustc_front::hir; use syntax::{ast, codemap, diagnostic}; use syntax::feature_gate::UnstableFeatures; @@ -44,7 +44,7 @@ pub type ExternalPaths = RefCell<Option<HashMap<DefId, (Vec<String>, clean::TypeKind)>>>; pub struct DocContext<'a, 'tcx: 'a> { - pub krate: &'tcx hir::Crate, + pub map: &'a hir_map::Map<'tcx>, pub maybe_typed: MaybeTyped<'a, 'tcx>, pub input: Input, pub external_paths: ExternalPaths, @@ -77,8 +77,8 @@ impl<'b, 'tcx> DocContext<'b, 'tcx> { } pub struct CrateAnalysis { - pub exported_items: privacy::ExportedItems, - pub public_items: privacy::PublicItems, + pub exported_items: DefIdSet, + pub public_items: DefIdSet, pub external_paths: ExternalPaths, pub external_typarams: RefCell<Option<HashMap<DefId, String>>>, pub inlined: RefCell<Option<HashSet<DefId>>>, @@ -147,8 +147,19 @@ pub fn run_core(search_paths: SearchPaths, cfgs: Vec<String>, externs: Externs, |tcx, analysis| { let ty::CrateAnalysis { exported_items, public_items, .. } = analysis; + // Convert from a NodeId set to a DefId set since we don't always have easy access + // to the map from defid -> nodeid + let exported_items: DefIdSet = + exported_items.into_iter() + .map(|n| tcx.map.local_def_id(n)) + .collect(); + let public_items: DefIdSet = + public_items.into_iter() + .map(|n| tcx.map.local_def_id(n)) + .collect(); + let ctxt = DocContext { - krate: tcx.map.krate(), + map: &tcx.map, maybe_typed: Typed(tcx), input: input, external_traits: RefCell::new(Some(HashMap::new())), @@ -158,7 +169,7 @@ pub fn run_core(search_paths: SearchPaths, cfgs: Vec<String>, externs: Externs, populated_crate_impls: RefCell::new(HashSet::new()), deref_trait_did: Cell::new(None), }; - debug!("crate: {:?}", ctxt.krate); + debug!("crate: {:?}", ctxt.map.krate()); let mut analysis = CrateAnalysis { exported_items: exported_items, @@ -171,7 +182,7 @@ pub fn run_core(search_paths: SearchPaths, cfgs: Vec<String>, externs: Externs, let krate = { let mut v = RustdocVisitor::new(&ctxt, Some(&analysis)); - v.visit(ctxt.krate); + v.visit(ctxt.map.krate()); v.clean(&ctxt) }; diff --git a/src/librustdoc/html/format.rs b/src/librustdoc/html/format.rs index 947ae3abd8d..d12c5d2c6fb 100644 --- a/src/librustdoc/html/format.rs +++ b/src/librustdoc/html/format.rs @@ -18,9 +18,9 @@ use std::fmt; use std::iter::repeat; -use rustc::middle::def_id::{DefId, LOCAL_CRATE}; +use rustc::metadata::cstore::LOCAL_CRATE; +use rustc::middle::def_id::{CRATE_DEF_INDEX, DefId}; use syntax::abi::Abi; -use syntax::ast; use rustc_front::hir; use clean; @@ -386,7 +386,7 @@ fn primitive_link(f: &mut fmt::Formatter, Some(&cnum) => { let path = &m.paths[&DefId { krate: cnum, - node: ast::CRATE_NODE_ID, + index: CRATE_DEF_INDEX, }]; let loc = match m.extern_locations[&cnum] { (_, render::Remote(ref s)) => Some(s.to_string()), diff --git a/src/librustdoc/html/render.rs b/src/librustdoc/html/render.rs index b34f1a01a2b..cf03482e18b 100644 --- a/src/librustdoc/html/render.rs +++ b/src/librustdoc/html/render.rs @@ -53,8 +53,9 @@ use externalfiles::ExternalHtml; use serialize::json::{self, ToJson}; use syntax::{abi, ast, attr}; -use rustc::middle::def_id::{DefId, LOCAL_CRATE}; -use rustc::util::nodemap::NodeSet; +use rustc::metadata::cstore::LOCAL_CRATE; +use rustc::middle::def_id::{CRATE_DEF_INDEX, DefId}; +use rustc::util::nodemap::DefIdSet; use rustc_front::hir; use clean::{self, SelfTy}; @@ -205,7 +206,7 @@ pub struct Cache { search_index: Vec<IndexItem>, privmod: bool, remove_priv: bool, - public_items: NodeSet, + public_items: DefIdSet, deref_trait_did: Option<DefId>, // In rare case where a structure is defined in one module but implemented @@ -213,7 +214,7 @@ pub struct Cache { // then the fully qualified name of the structure isn't presented in `paths` // yet when its implementation methods are being indexed. Caches such methods // and their parent id here and indexes them at the end of crate parsing. - orphan_methods: Vec<(ast::NodeId, clean::Item)>, + orphan_methods: Vec<(DefId, clean::Item)>, } /// Helper struct to render all source code to HTML pages @@ -377,7 +378,7 @@ pub fn run(mut krate: clean::Crate, let analysis = ::ANALYSISKEY.with(|a| a.clone()); let analysis = analysis.borrow(); let public_items = analysis.as_ref().map(|a| a.public_items.clone()); - let public_items = public_items.unwrap_or(NodeSet()); + let public_items = public_items.unwrap_or(DefIdSet()); let paths: HashMap<DefId, (Vec<String>, ItemType)> = analysis.as_ref().map(|a| { let paths = a.external_paths.borrow_mut().take().unwrap(); @@ -412,7 +413,7 @@ pub fn run(mut krate: clean::Crate, for &(n, ref e) in &krate.externs { cache.extern_locations.insert(n, (e.name.clone(), extern_location(e, &cx.dst))); - let did = DefId { krate: n, node: ast::CRATE_NODE_ID }; + let did = DefId { krate: n, index: CRATE_DEF_INDEX }; cache.paths.insert(did, (vec![e.name.to_string()], ItemType::Module)); } @@ -459,8 +460,7 @@ fn build_index(krate: &clean::Crate, cache: &mut Cache) -> io::Result<String> { // Attach all orphan methods to the type's definition if the type // has since been learned. - for &(pid, ref item) in orphan_methods { - let did = DefId::local(pid); + for &(did, ref item) in orphan_methods { match paths.get(&did) { Some(&(ref fqp, _)) => { // Needed to determine `self` type. @@ -968,7 +968,7 @@ impl DocFolder for Cache { if parent.is_local() { // We have a parent, but we don't know where they're // defined yet. Wait for later to index this item. - self.orphan_methods.push((parent.node, item.clone())) + self.orphan_methods.push((parent, item.clone())) } } _ => {} @@ -994,10 +994,11 @@ impl DocFolder for Cache { // `public_items` map, so we can skip inserting into the // paths map if there was already an entry present and we're // not a public item. - let id = item.def_id.node; - if !self.paths.contains_key(&item.def_id) || - !item.def_id.is_local() || - self.public_items.contains(&id) { + if + !self.paths.contains_key(&item.def_id) || + !item.def_id.is_local() || + self.public_items.contains(&item.def_id) + { self.paths.insert(item.def_id, (self.stack.clone(), shortty(&item))); } @@ -1033,7 +1034,7 @@ impl DocFolder for Cache { ref t => { match t.primitive_type() { Some(prim) => { - let did = DefId::local(prim.to_node_id()); + let did = DefId::local(prim.to_def_index()); self.parent_stack.push(did); true } @@ -1078,8 +1079,8 @@ impl DocFolder for Cache { ref t => { t.primitive_type().and_then(|t| { self.primitive_locations.get(&t).map(|n| { - let id = t.to_node_id(); - DefId { krate: *n, node: id } + let id = t.to_def_index(); + DefId { krate: *n, index: id } }) }) } @@ -1420,7 +1421,7 @@ impl<'a> Item<'a> { root = root, path = path[..path.len() - 1].join("/"), file = item_path(self.item), - goto = self.item.def_id.node)) + goto = self.item.def_id.index.as_usize())) } } } @@ -1480,7 +1481,7 @@ impl<'a> fmt::Display for Item<'a> { Some(l) => { try!(write!(fmt, "<a id='src-{}' class='srclink' \ href='{}' title='{}'>[src]</a>", - self.item.def_id.node, l, "goto source code")); + self.item.def_id.index.as_usize(), l, "goto source code")); } None => {} } @@ -2336,7 +2337,7 @@ fn render_deref_methods(w: &mut fmt::Formatter, cx: &Context, impl_: &Impl) -> f _ => { if let Some(prim) = target.primitive_type() { if let Some(c) = cache().primitive_locations.get(&prim) { - let did = DefId { krate: *c, node: prim.to_node_id() }; + let did = DefId { krate: *c, index: prim.to_def_index() }; try!(render_assoc_items(w, cx, did, what)); } } diff --git a/src/librustdoc/passes.rs b/src/librustdoc/passes.rs index 8a57a50bdea..e7e38220825 100644 --- a/src/librustdoc/passes.rs +++ b/src/librustdoc/passes.rs @@ -8,12 +8,10 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. -use std::collections::HashSet; -use rustc::util::nodemap::NodeSet; +use rustc::util::nodemap::DefIdSet; use std::cmp; use std::string::String; use std::usize; -use syntax::ast; use rustc_front::hir; use clean; @@ -24,18 +22,18 @@ use fold::DocFolder; /// Strip items marked `#[doc(hidden)]` pub fn strip_hidden(krate: clean::Crate) -> plugins::PluginResult { - let mut stripped = HashSet::new(); + let mut stripped = DefIdSet(); // strip all #[doc(hidden)] items let krate = { struct Stripper<'a> { - stripped: &'a mut HashSet<ast::NodeId> + stripped: &'a mut DefIdSet }; impl<'a> fold::DocFolder for Stripper<'a> { fn fold_item(&mut self, i: Item) -> Option<Item> { if i.is_hidden_from_doc() { debug!("found one in strip_hidden; removing"); - self.stripped.insert(i.def_id.node); + self.stripped.insert(i.def_id); // use a dedicated hidden item for given item type if any match i.inner { @@ -61,7 +59,7 @@ pub fn strip_hidden(krate: clean::Crate) -> plugins::PluginResult { // strip any traits implemented on stripped items let krate = { struct ImplStripper<'a> { - stripped: &'a mut HashSet<ast::NodeId> + stripped: &'a mut DefIdSet }; impl<'a> fold::DocFolder for ImplStripper<'a> { fn fold_item(&mut self, i: Item) -> Option<Item> { @@ -70,12 +68,12 @@ pub fn strip_hidden(krate: clean::Crate) -> plugins::PluginResult { ref trait_, .. }) = i.inner { // Impls for stripped types don't need to exist - if self.stripped.contains(&did.node) { + if self.stripped.contains(&did) { return None; } // Impls of stripped traits also don't need to exist if let Some(clean::ResolvedPath { did, .. }) = *trait_ { - if self.stripped.contains(&did.node) { + if self.stripped.contains(&did) { return None; } } @@ -94,7 +92,7 @@ pub fn strip_hidden(krate: clean::Crate) -> plugins::PluginResult { /// crate, specified by the `xcrate` flag. pub fn strip_private(mut krate: clean::Crate) -> plugins::PluginResult { // This stripper collects all *retained* nodes. - let mut retained = HashSet::new(); + let mut retained = DefIdSet(); let analysis = super::ANALYSISKEY.with(|a| a.clone()); let analysis = analysis.borrow(); let analysis = analysis.as_ref().unwrap(); @@ -118,8 +116,8 @@ pub fn strip_private(mut krate: clean::Crate) -> plugins::PluginResult { } struct Stripper<'a> { - retained: &'a mut HashSet<ast::NodeId>, - exported_items: &'a NodeSet, + retained: &'a mut DefIdSet, + exported_items: &'a DefIdSet, } impl<'a> fold::DocFolder for Stripper<'a> { @@ -132,7 +130,7 @@ impl<'a> fold::DocFolder for Stripper<'a> { clean::VariantItem(..) | clean::MethodItem(..) | clean::ForeignFunctionItem(..) | clean::ForeignStaticItem(..) => { if i.def_id.is_local() { - if !self.exported_items.contains(&i.def_id.node) { + if !self.exported_items.contains(&i.def_id) { return None; } // Traits are in exported_items even when they're totally private. @@ -143,8 +141,7 @@ impl<'a> fold::DocFolder for Stripper<'a> { } clean::ConstantItem(..) => { - if i.def_id.is_local() && - !self.exported_items.contains(&i.def_id.node) { + if i.def_id.is_local() && !self.exported_items.contains(&i.def_id) { return None; } } @@ -171,8 +168,7 @@ impl<'a> fold::DocFolder for Stripper<'a> { clean::ImplItem(clean::Impl{ for_: clean::ResolvedPath{ did, .. }, .. }) => { - if did.is_local() && - !self.exported_items.contains(&did.node) { + if did.is_local() && !self.exported_items.contains(&did) { return None; } } @@ -205,7 +201,7 @@ impl<'a> fold::DocFolder for Stripper<'a> { }; let i = if fastreturn { - self.retained.insert(i.def_id.node); + self.retained.insert(i.def_id); return Some(i); } else { self.fold_item_recur(i) @@ -220,7 +216,7 @@ impl<'a> fold::DocFolder for Stripper<'a> { i.doc_value().is_none() => None, clean::ImplItem(ref i) if i.items.is_empty() => None, _ => { - self.retained.insert(i.def_id.node); + self.retained.insert(i.def_id); Some(i) } } @@ -231,14 +227,13 @@ impl<'a> fold::DocFolder for Stripper<'a> { } // This stripper discards all private impls of traits -struct ImplStripper<'a>(&'a HashSet<ast::NodeId>); +struct ImplStripper<'a>(&'a DefIdSet); impl<'a> fold::DocFolder for ImplStripper<'a> { fn fold_item(&mut self, i: Item) -> Option<Item> { if let clean::ImplItem(ref imp) = i.inner { match imp.trait_ { Some(clean::ResolvedPath{ did, .. }) => { - let ImplStripper(s) = *self; - if did.is_local() && !s.contains(&did.node) { + if did.is_local() && !self.0.contains(&did) { return None; } } diff --git a/src/librustdoc/test.rs b/src/librustdoc/test.rs index 2f47353fee7..387e1a8cc07 100644 --- a/src/librustdoc/test.rs +++ b/src/librustdoc/test.rs @@ -22,6 +22,7 @@ use std::sync::{Arc, Mutex}; use testing; use rustc_lint; +use rustc::front::map as hir_map; use rustc::session::{self, config}; use rustc::session::config::get_unstable_features_setting; use rustc::session::search_paths::{SearchPaths, PathKind}; @@ -86,8 +87,11 @@ pub fn run(input: &str, let opts = scrape_test_config(&krate); + let mut forest = hir_map::Forest::new(krate); + let map = hir_map::map_crate(&mut forest); + let ctx = core::DocContext { - krate: &krate, + map: &map, maybe_typed: core::NotTyped(sess), input: input, external_paths: RefCell::new(Some(HashMap::new())), @@ -99,7 +103,7 @@ pub fn run(input: &str, }; let mut v = RustdocVisitor::new(&ctx, None); - v.visit(ctx.krate); + v.visit(ctx.map.krate()); let mut krate = v.clean(&ctx); match crate_name { Some(name) => krate.name = name, diff --git a/src/librustdoc/visit_ast.rs b/src/librustdoc/visit_ast.rs index d8181155677..264656835a3 100644 --- a/src/librustdoc/visit_ast.rs +++ b/src/librustdoc/visit_ast.rs @@ -21,7 +21,6 @@ use syntax::attr::AttrMetaMethods; use syntax::codemap::Span; use rustc::front::map as hir_map; -use rustc::middle::def_id::DefId; use rustc::middle::stability; use rustc_front::hir; @@ -63,8 +62,11 @@ impl<'a, 'tcx> RustdocVisitor<'a, 'tcx> { } fn stability(&self, id: ast::NodeId) -> Option<attr::Stability> { - self.cx.tcx_opt().and_then( - |tcx| stability::lookup(tcx, DefId::local(id)).map(|x| x.clone())) + self.cx.tcx_opt().and_then(|tcx| { + self.cx.map.opt_local_def_id(id) + .and_then(|def_id| stability::lookup(tcx, def_id)) + .cloned() + }) } pub fn visit(&mut self, krate: &hir::Crate) { @@ -206,16 +208,18 @@ impl<'a, 'tcx> RustdocVisitor<'a, 'tcx> { None => return false }; let def = tcx.def_map.borrow()[&id].def_id(); - if !def.is_local() { return false } + let def_node_id = match tcx.map.as_local_node_id(def) { + Some(n) => n, None => return false + }; let analysis = match self.analysis { Some(analysis) => analysis, None => return false }; - if !please_inline && analysis.public_items.contains(&def.node) { + if !please_inline && analysis.public_items.contains(&def) { return false } - if !self.view_item_stack.insert(def.node) { return false } + if !self.view_item_stack.insert(def_node_id) { return false } - let ret = match tcx.map.get(def.node) { + let ret = match tcx.map.get(def_node_id) { hir_map::NodeItem(it) => { if glob { let prev = mem::replace(&mut self.inlining_from_glob, true); @@ -236,7 +240,7 @@ impl<'a, 'tcx> RustdocVisitor<'a, 'tcx> { } _ => false, }; - self.view_item_stack.remove(&id); + self.view_item_stack.remove(&def_node_id); return ret; } |
