diff options
| author | Eduard-Mihai Burtescu <edy.burt@gmail.com> | 2019-04-20 18:26:26 +0300 |
|---|---|---|
| committer | Eduard-Mihai Burtescu <edy.burt@gmail.com> | 2019-05-03 22:48:27 +0300 |
| commit | a3fcab36d25317ff2bad24d67f7e932c37f35d19 (patch) | |
| tree | 3f24997e9d0e1d57bfb7912ec33f9be3743fafda /src/librustdoc | |
| parent | 3af1bdc4bcc502d576b1e836f99bae1eb29dbafd (diff) | |
rustc: factor most DefId-containing variants out of Def and into DefKind.
Diffstat (limited to 'src/librustdoc')
| -rw-r--r-- | src/librustdoc/clean/inline.rs | 30 | ||||
| -rw-r--r-- | src/librustdoc/clean/mod.rs | 94 | ||||
| -rw-r--r-- | src/librustdoc/passes/collect_intra_doc_links.rs | 39 | ||||
| -rw-r--r-- | src/librustdoc/visit_ast.rs | 21 | ||||
| -rw-r--r-- | src/librustdoc/visit_lib.rs | 4 |
5 files changed, 106 insertions, 82 deletions
diff --git a/src/librustdoc/clean/inline.rs b/src/librustdoc/clean/inline.rs index 5da74a588c9..365af15e006 100644 --- a/src/librustdoc/clean/inline.rs +++ b/src/librustdoc/clean/inline.rs @@ -7,7 +7,7 @@ use syntax::ext::base::{MacroKind, SyntaxExtension}; use syntax_pos::Span; use rustc::hir; -use rustc::hir::def::{Def, CtorKind}; +use rustc::hir::def::{Def, DefKind, CtorKind}; use rustc::hir::def_id::DefId; use rustc_metadata::cstore::LoadedMacro; use rustc::ty; @@ -50,59 +50,59 @@ pub fn try_inline( if did.is_local() { return None } let mut ret = Vec::new(); let inner = match def { - Def::Trait(did) => { + Def::Def(DefKind::Trait, did) => { record_extern_fqn(cx, did, clean::TypeKind::Trait); ret.extend(build_impls(cx, did)); clean::TraitItem(build_external_trait(cx, did)) } - Def::Fn(did) => { + Def::Def(DefKind::Fn, did) => { record_extern_fqn(cx, did, clean::TypeKind::Function); clean::FunctionItem(build_external_function(cx, did)) } - Def::Struct(did) => { + Def::Def(DefKind::Struct, did) => { record_extern_fqn(cx, did, clean::TypeKind::Struct); ret.extend(build_impls(cx, did)); clean::StructItem(build_struct(cx, did)) } - Def::Union(did) => { + Def::Def(DefKind::Union, did) => { record_extern_fqn(cx, did, clean::TypeKind::Union); ret.extend(build_impls(cx, did)); clean::UnionItem(build_union(cx, did)) } - Def::TyAlias(did) => { + Def::Def(DefKind::TyAlias, did) => { record_extern_fqn(cx, did, clean::TypeKind::Typedef); ret.extend(build_impls(cx, did)); clean::TypedefItem(build_type_alias(cx, did), false) } - Def::Enum(did) => { + Def::Def(DefKind::Enum, did) => { record_extern_fqn(cx, did, clean::TypeKind::Enum); ret.extend(build_impls(cx, did)); clean::EnumItem(build_enum(cx, did)) } - Def::ForeignTy(did) => { + Def::Def(DefKind::ForeignTy, did) => { record_extern_fqn(cx, did, clean::TypeKind::Foreign); ret.extend(build_impls(cx, did)); clean::ForeignTypeItem } // Never inline enum variants but leave them shown as re-exports. - Def::Variant(..) => return None, + Def::Def(DefKind::Variant, _) => return None, // Assume that enum variants and struct types are re-exported next to // their constructors. - Def::Ctor(..) | Def::SelfCtor(..) => return Some(Vec::new()), - Def::Mod(did) => { + Def::Def(DefKind::Ctor(..), _) | Def::SelfCtor(..) => return Some(Vec::new()), + Def::Def(DefKind::Mod, did) => { record_extern_fqn(cx, did, clean::TypeKind::Module); clean::ModuleItem(build_module(cx, did, visited)) } - Def::Static(did) => { + Def::Def(DefKind::Static, did) => { record_extern_fqn(cx, did, clean::TypeKind::Static); clean::StaticItem(build_static(cx, did, cx.tcx.is_mutable_static(did))) } - Def::Const(did) => { + Def::Def(DefKind::Const, did) => { record_extern_fqn(cx, did, clean::TypeKind::Const); clean::ConstantItem(build_const(cx, did)) } // FIXME: proc-macros don't propagate attributes or spans across crates, so they look empty - Def::Macro(did, MacroKind::Bang) => { + Def::Def(DefKind::Macro(MacroKind::Bang), did) => { let mac = build_macro(cx, did, name); if let clean::MacroItem(..) = mac { record_extern_fqn(cx, did, clean::TypeKind::Macro); @@ -135,7 +135,7 @@ pub fn try_inline_glob(cx: &DocContext<'_>, def: Def, visited: &mut FxHashSet<De if did.is_local() { return None } match def { - Def::Mod(did) => { + Def::Def(DefKind::Mod, did) => { let m = build_module(cx, did, visited); Some(m.items) } diff --git a/src/librustdoc/clean/mod.rs b/src/librustdoc/clean/mod.rs index 7f5ba91900b..95a2664954d 100644 --- a/src/librustdoc/clean/mod.rs +++ b/src/librustdoc/clean/mod.rs @@ -19,7 +19,7 @@ use rustc::middle::lang_items; use rustc::middle::stability; use rustc::mir::interpret::{GlobalId, ConstValue}; use rustc::hir::{self, HirVec}; -use rustc::hir::def::{self, Def, CtorKind}; +use rustc::hir::def::{self, Def, DefKind, CtorKind}; use rustc::hir::def_id::{CrateNum, DefId, CRATE_DEF_INDEX, LOCAL_CRATE}; use rustc::ty::subst::{InternalSubsts, SubstsRef, UnpackedKind}; use rustc::ty::{self, DefIdTree, TyCtxt, Region, RegionVid, Ty, AdtKind}; @@ -258,7 +258,7 @@ impl Clean<ExternalCrate> for CrateNum { // duplicately for the same primitive. This is handled later on when // rendering by delegating everything to a hash map. let as_primitive = |def: Def| { - if let Def::Mod(def_id) = def { + if let Def::Def(DefKind::Mod, def_id) = def { let attrs = cx.tcx.get_attrs(def_id).clean(cx); let mut prim = None; for attr in attrs.lists("doc") { @@ -281,7 +281,10 @@ impl Clean<ExternalCrate> for CrateNum { let item = cx.tcx.hir().expect_item_by_hir_id(id.id); match item.node { hir::ItemKind::Mod(_) => { - as_primitive(Def::Mod(cx.tcx.hir().local_def_id_from_hir_id(id.id))) + as_primitive(Def::Def( + DefKind::Mod, + cx.tcx.hir().local_def_id_from_hir_id(id.id), + )) } hir::ItemKind::Use(ref path, hir::UseKind::Single) if item.vis.node.is_pub() => { @@ -299,7 +302,7 @@ impl Clean<ExternalCrate> for CrateNum { }; let as_keyword = |def: Def| { - if let Def::Mod(def_id) = def { + if let Def::Def(DefKind::Mod, def_id) = def { let attrs = cx.tcx.get_attrs(def_id).clean(cx); let mut keyword = None; for attr in attrs.lists("doc") { @@ -323,7 +326,10 @@ impl Clean<ExternalCrate> for CrateNum { let item = cx.tcx.hir().expect_item_by_hir_id(id.id); match item.node { hir::ItemKind::Mod(_) => { - as_keyword(Def::Mod(cx.tcx.hir().local_def_id_from_hir_id(id.id))) + as_keyword(Def::Def( + DefKind::Mod, + cx.tcx.hir().local_def_id_from_hir_id(id.id), + )) } hir::ItemKind::Use(ref path, hir::UseKind::Single) if item.vis.node.is_pub() => { @@ -2785,14 +2791,14 @@ impl Clean<Type> for hir::Ty { return new_ty; } - if let Def::TyParam(did) = path.def { + if let Def::Def(DefKind::TyParam, did) = path.def { if let Some(bounds) = cx.impl_trait_bounds.borrow_mut().remove(&did) { return ImplTrait(bounds); } } let mut alias = None; - if let Def::TyAlias(def_id) = path.def { + if let Def::Def(DefKind::TyAlias, def_id) = path.def { // Substitute private type aliases if let Some(hir_id) = cx.tcx.hir().as_local_hir_id(def_id) { if !cx.renderinfo.borrow().access_levels.is_exported(def_id) { @@ -2835,8 +2841,10 @@ impl Clean<Type> for hir::Ty { } hir::GenericParamKind::Type { ref default, .. } => { let ty_param_def = - Def::TyParam( - cx.tcx.hir().local_def_id_from_hir_id(param.hir_id)); + Def::Def( + DefKind::TyParam, + cx.tcx.hir().local_def_id_from_hir_id(param.hir_id), + ); let mut j = 0; let type_ = generic_args.args.iter().find_map(|arg| { match arg { @@ -2860,8 +2868,10 @@ impl Clean<Type> for hir::Ty { } hir::GenericParamKind::Const { .. } => { let const_param_def = - Def::ConstParam( - cx.tcx.hir().local_def_id_from_hir_id(param.hir_id)); + Def::Def( + DefKind::ConstParam, + cx.tcx.hir().local_def_id_from_hir_id(param.hir_id), + ); let mut j = 0; let const_ = generic_args.args.iter().find_map(|arg| { match arg { @@ -2893,7 +2903,10 @@ impl Clean<Type> for hir::Ty { segments.pop(); let trait_path = hir::Path { span: p.span, - def: Def::Trait(cx.tcx.associated_item(p.def.def_id()).container.id()), + def: Def::Def( + DefKind::Trait, + cx.tcx.associated_item(p.def.def_id()).container.id(), + ), segments: segments.into(), }; Type::QPath { @@ -2906,7 +2919,7 @@ impl Clean<Type> for hir::Ty { let mut def = Def::Err; let ty = hir_ty_to_ty(cx.tcx, self); if let ty::Projection(proj) = ty.sty { - def = Def::Trait(proj.trait_ref(cx.tcx).def_id); + def = Def::Def(DefKind::Trait, proj.trait_ref(cx.tcx).def_id); } let trait_path = hir::Path { span: self.span, @@ -3898,10 +3911,13 @@ impl Clean<Vec<Item>> for doctree::ExternCrate { if please_inline { let mut visited = FxHashSet::default(); - let def = Def::Mod(DefId { - krate: self.cnum, - index: CRATE_DEF_INDEX, - }); + let def = Def::Def( + DefKind::Mod, + DefId { + krate: self.cnum, + index: CRATE_DEF_INDEX, + }, + ); if let Some(items) = inline::try_inline(cx, def, self.name, &mut visited) { return items; @@ -3951,10 +3967,12 @@ impl Clean<Vec<Item>> for doctree::Import { let name = self.name; if !please_inline { match path.def { - Def::Mod(did) => if !did.is_local() && did.index == CRATE_DEF_INDEX { - // if we're `pub use`ing an extern crate root, don't inline it unless we - // were specifically asked for it - denied = true; + Def::Def(DefKind::Mod, did) => { + if !did.is_local() && did.index == CRATE_DEF_INDEX { + // if we're `pub use`ing an extern crate root, don't inline it unless we + // were specifically asked for it + denied = true; + } } _ => {} } @@ -4157,10 +4175,12 @@ fn resolve_type(cx: &DocContext<'_>, Def::SelfTy(..) if path.segments.len() == 1 => { return Generic(keywords::SelfUpper.name().to_string()); } - Def::TyParam(..) if path.segments.len() == 1 => { + Def::Def(DefKind::TyParam, _) if path.segments.len() == 1 => { return Generic(format!("{:#}", path)); } - Def::SelfTy(..) | Def::TyParam(..) | Def::AssociatedTy(..) => true, + Def::SelfTy(..) + | Def::Def(DefKind::TyParam, _) + | Def::Def(DefKind::AssociatedTy, _) => true, _ => false, }; let did = register_def(&*cx, path.def); @@ -4171,25 +4191,25 @@ pub fn register_def(cx: &DocContext<'_>, def: Def) -> DefId { debug!("register_def({:?})", def); let (did, kind) = match def { - Def::Fn(i) => (i, TypeKind::Function), - Def::TyAlias(i) => (i, TypeKind::Typedef), - Def::Enum(i) => (i, TypeKind::Enum), - Def::Trait(i) => (i, TypeKind::Trait), - Def::Struct(i) => (i, TypeKind::Struct), - Def::Union(i) => (i, TypeKind::Union), - Def::Mod(i) => (i, TypeKind::Module), - Def::ForeignTy(i) => (i, TypeKind::Foreign), - Def::Const(i) => (i, TypeKind::Const), - Def::Static(i) => (i, TypeKind::Static), - Def::Variant(i) => (cx.tcx.parent(i).expect("cannot get parent def id"), + Def::Def(DefKind::Fn, i) => (i, TypeKind::Function), + Def::Def(DefKind::TyAlias, i) => (i, TypeKind::Typedef), + Def::Def(DefKind::Enum, i) => (i, TypeKind::Enum), + Def::Def(DefKind::Trait, i) => (i, TypeKind::Trait), + Def::Def(DefKind::Struct, i) => (i, TypeKind::Struct), + Def::Def(DefKind::Union, i) => (i, TypeKind::Union), + Def::Def(DefKind::Mod, i) => (i, TypeKind::Module), + Def::Def(DefKind::ForeignTy, i) => (i, TypeKind::Foreign), + Def::Def(DefKind::Const, i) => (i, TypeKind::Const), + Def::Def(DefKind::Static, i) => (i, TypeKind::Static), + Def::Def(DefKind::Variant, i) => (cx.tcx.parent(i).expect("cannot get parent def id"), TypeKind::Enum), - Def::Macro(i, mac_kind) => match mac_kind { + Def::Def(DefKind::Macro(mac_kind), i) => match mac_kind { MacroKind::Bang => (i, TypeKind::Macro), MacroKind::Attr => (i, TypeKind::Attr), MacroKind::Derive => (i, TypeKind::Derive), MacroKind::ProcMacroStub => unreachable!(), }, - Def::TraitAlias(i) => (i, TypeKind::TraitAlias), + Def::Def(DefKind::TraitAlias, i) => (i, TypeKind::TraitAlias), Def::SelfTy(Some(def_id), _) => (def_id, TypeKind::Trait), Def::SelfTy(_, Some(impl_def_id)) => return impl_def_id, _ => return def.def_id() @@ -4418,7 +4438,7 @@ pub fn path_to_def(tcx: TyCtxt<'_, '_, '_>, path: &[&str]) -> Option<DefId> { if item.ident.name == *segment { if path_it.peek().is_none() { return match item.def { - def::Def::Trait(did) => Some(did), + def::Def::Def(DefKind::Trait, did) => Some(did), _ => None, } } diff --git a/src/librustdoc/passes/collect_intra_doc_links.rs b/src/librustdoc/passes/collect_intra_doc_links.rs index 902414bd8fd..f5b97797897 100644 --- a/src/librustdoc/passes/collect_intra_doc_links.rs +++ b/src/librustdoc/passes/collect_intra_doc_links.rs @@ -1,5 +1,5 @@ use errors::Applicability; -use rustc::hir::def::{Def, Namespace::{self, *}, PerNS}; +use rustc::hir::def::{Def, DefKind, Namespace::{self, *}, PerNS}; use rustc::hir::def_id::DefId; use rustc::hir; use rustc::lint as lint; @@ -75,9 +75,9 @@ impl<'a, 'tcx> LinkCollector<'a, 'tcx> { // In case this is a trait item, skip the // early return and try looking for the trait. let value = match result.def { - Def::Method(_) | Def::AssociatedConst(_) => true, - Def::AssociatedTy(_) => false, - Def::Variant(_) => return handle_variant(cx, result.def), + Def::Def(DefKind::Method, _) | Def::Def(DefKind::AssociatedConst, _) => true, + Def::Def(DefKind::AssociatedTy, _) => false, + Def::Def(DefKind::Variant, _) => return handle_variant(cx, result.def), // Not a trait item; just return what we found. _ => return Ok((result.def, None)) }; @@ -133,7 +133,10 @@ impl<'a, 'tcx> LinkCollector<'a, 'tcx> { resolver.resolve_str_path_error(DUMMY_SP, &path, false) }))?; match ty.def { - Def::Struct(did) | Def::Union(did) | Def::Enum(did) | Def::TyAlias(did) => { + Def::Def(DefKind::Struct, did) + | Def::Def(DefKind::Union, did) + | Def::Def(DefKind::Enum, did) + | Def::Def(DefKind::TyAlias, did) => { let item = cx.tcx.inherent_impls(did) .iter() .flat_map(|imp| cx.tcx.associated_items(*imp)) @@ -172,7 +175,7 @@ impl<'a, 'tcx> LinkCollector<'a, 'tcx> { } } } - Def::Trait(did) => { + Def::Def(DefKind::Trait, did) => { let item = cx.tcx.associated_item_def_ids(did).iter() .map(|item| cx.tcx.associated_item(*item)) .find(|item| item.ident.name == item_name); @@ -347,7 +350,7 @@ impl<'a, 'tcx> DocFolder for LinkCollector<'a, 'tcx> { .and_then(|(def, fragment)| { // Constructors are picked up in the type namespace. match def { - Def::Ctor(..) | Def::SelfCtor(..) => None, + Def::Def(DefKind::Ctor(..), _) | Def::SelfCtor(..) => None, _ => Some((def, fragment)) } }), @@ -427,7 +430,7 @@ fn macro_resolve(cx: &DocContext<'_>, path_str: &str) -> Option<Def> { let parent_scope = resolver.dummy_parent_scope(); if let Ok(def) = resolver.resolve_macro_to_def_inner(&path, MacroKind::Bang, &parent_scope, false, false) { - if let Def::Macro(_, MacroKind::ProcMacroStub) = def { + if let Def::Def(DefKind::Macro(MacroKind::ProcMacroStub), _) = def { // skip proc-macro stubs, they'll cause `get_macro` to crash } else { if let SyntaxExtension::DeclMacro { .. } = *resolver.get_macro(def) { @@ -541,21 +544,21 @@ fn ambiguity_error( for (def, ns) in candidates { let (action, mut suggestion) = match def { - Def::Method(..) | Def::Fn(..) => { + Def::Def(DefKind::Method, _) | Def::Def(DefKind::Fn, _) => { ("add parentheses", format!("{}()", path_str)) } - Def::Macro(..) => { + Def::Def(DefKind::Macro(..), _) => { ("add an exclamation mark", format!("{}!", path_str)) } _ => { let type_ = match (def, ns) { - (Def::Const(..), _) => "const", - (Def::Static(..), _) => "static", - (Def::Struct(..), _) => "struct", - (Def::Enum(..), _) => "enum", - (Def::Union(..), _) => "union", - (Def::Trait(..), _) => "trait", - (Def::Mod(..), _) => "module", + (Def::Def(DefKind::Const, _), _) => "const", + (Def::Def(DefKind::Static, _), _) => "static", + (Def::Def(DefKind::Struct, _), _) => "struct", + (Def::Def(DefKind::Enum, _), _) => "enum", + (Def::Def(DefKind::Union, _), _) => "union", + (Def::Def(DefKind::Trait, _), _) => "trait", + (Def::Def(DefKind::Mod, _), _) => "module", (_, TypeNS) => "type", (_, ValueNS) => "value", (_, MacroNS) => "macro", @@ -609,7 +612,7 @@ fn handle_variant(cx: &DocContext<'_>, def: Def) -> Result<(Def, Option<String>) } else { return Err(()) }; - let parent_def = Def::Enum(parent); + let parent_def = Def::Def(DefKind::Enum, parent); let variant = cx.tcx.expect_variant_def(def); Ok((parent_def, Some(format!("{}.v", variant.ident.name)))) } diff --git a/src/librustdoc/visit_ast.rs b/src/librustdoc/visit_ast.rs index badf37c9671..b7a617cdbd9 100644 --- a/src/librustdoc/visit_ast.rs +++ b/src/librustdoc/visit_ast.rs @@ -2,7 +2,7 @@ //! usable for `clean`. use rustc::hir::{self, Node}; -use rustc::hir::def::Def; +use rustc::hir::def::{Def, DefKind}; use rustc::hir::def_id::{DefId, LOCAL_CRATE}; use rustc::middle::privacy::AccessLevel; use rustc::util::nodemap::{FxHashSet, FxHashMap}; @@ -306,18 +306,18 @@ impl<'a, 'tcx> RustdocVisitor<'a, 'tcx> { let attrs = clean::inline::load_attrs(self.cx, def_did); let self_is_hidden = attrs.lists("doc").has_word("hidden"); match def { - Def::Trait(did) | - Def::Struct(did) | - Def::Union(did) | - Def::Enum(did) | - Def::ForeignTy(did) | - Def::TyAlias(did) if !self_is_hidden => { + Def::Def(DefKind::Trait, did) | + Def::Def(DefKind::Struct, did) | + Def::Def(DefKind::Union, did) | + Def::Def(DefKind::Enum, did) | + Def::Def(DefKind::ForeignTy, did) | + Def::Def(DefKind::TyAlias, did) if !self_is_hidden => { self.cx.renderinfo .borrow_mut() .access_levels.map .insert(did, AccessLevel::Public); }, - Def::Mod(did) => if !self_is_hidden { + Def::Def(DefKind::Mod, did) => if !self_is_hidden { crate::visit_lib::LibEmbargoVisitor::new(self.cx).visit_mod(did); }, _ => {}, @@ -421,8 +421,9 @@ impl<'a, 'tcx> RustdocVisitor<'a, 'tcx> { // Struct and variant constructors and proc macro stubs always show up alongside // their definitions, we've already processed them so just discard these. match path.def { - Def::Ctor(..) | Def::SelfCtor(..) | Def::Macro(_, MacroKind::ProcMacroStub) => - return, + Def::Def(DefKind::Ctor(..), _) + | Def::SelfCtor(..) + | Def::Def(DefKind::Macro(MacroKind::ProcMacroStub), _) => return, _ => {} } diff --git a/src/librustdoc/visit_lib.rs b/src/librustdoc/visit_lib.rs index def6f8b557b..22c750011d9 100644 --- a/src/librustdoc/visit_lib.rs +++ b/src/librustdoc/visit_lib.rs @@ -1,5 +1,5 @@ use rustc::middle::privacy::{AccessLevels, AccessLevel}; -use rustc::hir::def::Def; +use rustc::hir::def::{Def, DefKind}; use rustc::hir::def_id::{CrateNum, CRATE_DEF_INDEX, DefId}; use rustc::ty::Visibility; use rustc::util::nodemap::FxHashSet; @@ -80,7 +80,7 @@ impl<'a, 'tcx> LibEmbargoVisitor<'a, 'tcx> { let item_level = self.update(def_id, inherited_item_level); - if let Def::Mod(..) = def { + if let Def::Def(DefKind::Mod, _) = def { let orig_level = self.prev_level; self.prev_level = item_level; |
