From 8b88811419f3745a182e9453921101919c609739 Mon Sep 17 00:00:00 2001 From: P1start Date: Tue, 16 Sep 2014 09:13:00 +1200 Subject: [PATCH] rustdoc: Correctly distinguish enums and types This is done by adding a new field to the `DefTy` variant of `middle::def::Def`, which also clarifies an error message in the process. Closes #16712. --- src/librustc/metadata/decoder.rs | 4 ++-- src/librustc/middle/astencode.rs | 2 +- src/librustc/middle/def.rs | 4 ++-- src/librustc/middle/mem_categorization.rs | 2 +- src/librustc/middle/privacy.rs | 3 ++- src/librustc/middle/resolve.rs | 18 ++++++++--------- src/librustc/middle/save/mod.rs | 2 +- src/librustc/middle/typeck/astconv.rs | 6 +++--- src/librustc/middle/typeck/check/mod.rs | 2 +- .../middle/typeck/infer/error_reporting.rs | 2 +- src/librustdoc/clean/inline.rs | 7 ++++++- src/librustdoc/clean/mod.rs | 4 +++- src/librustdoc/html/item_type.rs | 2 +- src/librustdoc/html/render.rs | 1 + src/librustdoc/html/static/main.js | 2 +- src/test/auxiliary/static_priv_by_default.rs | 13 ++++++++---- .../compile-fail/xcrate-private-by-default.rs | 20 ++++++++++++------- 17 files changed, 57 insertions(+), 37 deletions(-) diff --git a/src/librustc/metadata/decoder.rs b/src/librustc/metadata/decoder.rs index c7af7b249398a..748e59b75ed63 100644 --- a/src/librustc/metadata/decoder.rs +++ b/src/librustc/metadata/decoder.rs @@ -325,7 +325,7 @@ fn item_to_def_like(item: rbml::Doc, did: ast::DefId, cnum: ast::CrateNum) }; DlDef(def::DefStaticMethod(did, provenance, fn_style)) } - Type | ForeignType => DlDef(def::DefTy(did)), + Type | ForeignType => DlDef(def::DefTy(did, false)), Mod => DlDef(def::DefMod(did)), ForeignMod => DlDef(def::DefForeignMod(did)), StructVariant => { @@ -337,7 +337,7 @@ fn item_to_def_like(item: rbml::Doc, did: ast::DefId, cnum: ast::CrateNum) DlDef(def::DefVariant(enum_did, did, false)) } Trait => DlDef(def::DefTrait(did)), - Enum => DlDef(def::DefTy(did)), + Enum => DlDef(def::DefTy(did, true)), Impl => DlImpl(did), PublicField | InheritedField => DlField, } diff --git a/src/librustc/middle/astencode.rs b/src/librustc/middle/astencode.rs index 272b7111fb88f..880445ff38d32 100644 --- a/src/librustc/middle/astencode.rs +++ b/src/librustc/middle/astencode.rs @@ -454,7 +454,7 @@ impl tr for def::Def { def::DefVariant(e_did.tr(dcx), v_did.tr(dcx), is_s) }, def::DefTrait(did) => def::DefTrait(did.tr(dcx)), - def::DefTy(did) => def::DefTy(did.tr(dcx)), + def::DefTy(did, is_enum) => def::DefTy(did.tr(dcx), is_enum), def::DefPrimTy(p) => def::DefPrimTy(p), def::DefTyParam(s, did, v) => def::DefTyParam(s, did.tr(dcx), v), def::DefBinding(nid, bm) => def::DefBinding(dcx.tr_id(nid), bm), diff --git a/src/librustc/middle/def.rs b/src/librustc/middle/def.rs index 914cf451ebe29..70a9b6c533772 100644 --- a/src/librustc/middle/def.rs +++ b/src/librustc/middle/def.rs @@ -25,7 +25,7 @@ pub enum Def { DefArg(ast::NodeId, ast::BindingMode), DefLocal(ast::NodeId, ast::BindingMode), DefVariant(ast::DefId /* enum */, ast::DefId /* variant */, bool /* is_structure */), - DefTy(ast::DefId), + DefTy(ast::DefId, bool /* is_enum */), DefTrait(ast::DefId), DefPrimTy(ast::PrimTy), DefTyParam(ParamSpace, ast::DefId, uint), @@ -62,7 +62,7 @@ impl Def { match *self { DefFn(id, _) | DefStaticMethod(id, _, _) | DefMod(id) | DefForeignMod(id) | DefStatic(id, _) | - DefVariant(_, id, _) | DefTy(id) | DefTyParam(_, id, _) | + DefVariant(_, id, _) | DefTy(id, _) | DefTyParam(_, id, _) | DefUse(id) | DefStruct(id) | DefTrait(id) | DefMethod(id, _) => { id } diff --git a/src/librustc/middle/mem_categorization.rs b/src/librustc/middle/mem_categorization.rs index 3e42ee9187c42..4f9cc9c080f9b 100644 --- a/src/librustc/middle/mem_categorization.rs +++ b/src/librustc/middle/mem_categorization.rs @@ -531,7 +531,7 @@ impl<'t,'tcx,TYPER:Typer<'tcx>> MemCategorizationContext<'t,TYPER> { Ok(self.cat_rvalue_node(id, span, expr_ty)) } def::DefMod(_) | def::DefForeignMod(_) | def::DefUse(_) | - def::DefTrait(_) | def::DefTy(_) | def::DefPrimTy(_) | + def::DefTrait(_) | def::DefTy(..) | def::DefPrimTy(_) | def::DefTyParam(..) | def::DefTyParamBinder(..) | def::DefRegion(_) | def::DefLabel(_) | def::DefSelfTy(..) | def::DefMethod(..) => { Ok(Rc::new(cmt_ { diff --git a/src/librustc/middle/privacy.rs b/src/librustc/middle/privacy.rs index 56c785d3c2592..0eb684fe18e10 100644 --- a/src/librustc/middle/privacy.rs +++ b/src/librustc/middle/privacy.rs @@ -771,7 +771,8 @@ impl<'a, 'tcx> PrivacyVisitor<'a, 'tcx> { def::DefFn(..) => ck("function"), def::DefStatic(..) => ck("static"), def::DefVariant(..) => ck("variant"), - def::DefTy(..) => ck("type"), + def::DefTy(_, false) => ck("type"), + def::DefTy(_, true) => ck("enum"), def::DefTrait(..) => ck("trait"), def::DefStruct(..) => ck("struct"), def::DefMethod(_, Some(..)) => ck("trait method"), diff --git a/src/librustc/middle/resolve.rs b/src/librustc/middle/resolve.rs index ded4883350ff2..191f7113cc90d 100644 --- a/src/librustc/middle/resolve.rs +++ b/src/librustc/middle/resolve.rs @@ -1252,7 +1252,7 @@ impl<'a> Resolver<'a> { sp); name_bindings.define_type - (DefTy(local_def(item.id)), sp, is_public); + (DefTy(local_def(item.id), false), sp, is_public); parent } @@ -1264,7 +1264,7 @@ impl<'a> Resolver<'a> { sp); name_bindings.define_type - (DefTy(local_def(item.id)), sp, is_public); + (DefTy(local_def(item.id), true), sp, is_public); for variant in (*enum_definition).variants.iter() { self.build_reduced_graph_for_variant( @@ -1287,7 +1287,7 @@ impl<'a> Resolver<'a> { let name_bindings = self.add_child(ident, parent.clone(), forbid, sp); // Define a name in the type namespace. - name_bindings.define_type(DefTy(local_def(item.id)), sp, is_public); + name_bindings.define_type(DefTy(local_def(item.id), false), sp, is_public); // If this is a newtype or unit-like struct, define a name // in the value namespace as well @@ -1732,7 +1732,7 @@ impl<'a> Resolver<'a> { match def { DefMod(def_id) | DefForeignMod(def_id) | DefStruct(def_id) | - DefTy(def_id) => { + DefTy(def_id, _) => { let type_def = child_name_bindings.type_def.borrow().clone(); match type_def { Some(TypeNsDef { module_def: Some(module_def), .. }) => { @@ -1823,7 +1823,7 @@ impl<'a> Resolver<'a> { is_public, DUMMY_SP) } - DefTy(_) => { + DefTy(..) => { debug!("(building reduced graph for external \ crate) building type {}", final_ident); @@ -4320,7 +4320,7 @@ impl<'a> Resolver<'a> { // If it's a typedef, give a note match def { - DefTy(_) => { + DefTy(..) => { self.session.span_note( trait_reference.path.span, format!("`type` aliases cannot \ @@ -4381,7 +4381,7 @@ impl<'a> Resolver<'a> { Some(ref t) => match t.node { TyPath(ref path, None, path_id) => { match this.resolve_path(id, path, TypeNS, true) { - Some((DefTy(def_id), lp)) if this.structs.contains_key(&def_id) => { + Some((DefTy(def_id, _), lp)) if this.structs.contains_key(&def_id) => { let def = DefStruct(def_id); debug!("(resolving struct) resolved `{}` to type {:?}", token::get_ident(path.segments @@ -5440,7 +5440,7 @@ impl<'a> Resolver<'a> { if allowed == Everything { // Look for a field with the same name in the current self_type. match self.def_map.borrow().find(&node_id) { - Some(&DefTy(did)) + Some(&DefTy(did, _)) | Some(&DefStruct(did)) | Some(&DefVariant(_, did, _)) => match self.structs.find(&did) { None => {} @@ -5582,7 +5582,7 @@ impl<'a> Resolver<'a> { // structs, which wouldn't result in this error.) match self.with_no_errors(|this| this.resolve_path(expr.id, path, TypeNS, false)) { - Some((DefTy(struct_id), _)) + Some((DefTy(struct_id, _), _)) if self.structs.contains_key(&struct_id) => { self.resolve_error(expr.span, format!("`{}` is a structure name, but \ diff --git a/src/librustc/middle/save/mod.rs b/src/librustc/middle/save/mod.rs index fe066c732ddc6..37ba3b75f8917 100644 --- a/src/librustc/middle/save/mod.rs +++ b/src/librustc/middle/save/mod.rs @@ -226,7 +226,7 @@ impl <'l, 'tcx> DxrVisitor<'l, 'tcx> { def::DefMod(_) | def::DefForeignMod(_) => Some(recorder::ModRef), def::DefStruct(_) => Some(recorder::StructRef), - def::DefTy(_) | + def::DefTy(..) | def::DefTrait(_) => Some(recorder::TypeRef), def::DefStatic(_, _) | def::DefBinding(_, _) | diff --git a/src/librustc/middle/typeck/astconv.rs b/src/librustc/middle/typeck/astconv.rs index cb449f80ed4a4..a9b633d483b6a 100644 --- a/src/librustc/middle/typeck/astconv.rs +++ b/src/librustc/middle/typeck/astconv.rs @@ -438,7 +438,7 @@ pub fn ast_ty_to_builtin_ty<'tcx, AC: AstConv<'tcx>, RS: RegionScope>( // FIXME(#12938): This is a hack until we have full support for // DST. match a_def { - def::DefTy(did) | def::DefStruct(did) + def::DefTy(did, _) | def::DefStruct(did) if Some(did) == this.tcx().lang_items.owned_box() => { if path.segments .iter() @@ -462,7 +462,7 @@ pub fn ast_ty_to_builtin_ty<'tcx, AC: AstConv<'tcx>, RS: RegionScope>( "not enough type parameters supplied to `Box`"); Some(ty::mk_err()) } - def::DefTy(did) | def::DefStruct(did) + def::DefTy(did, _) | def::DefStruct(did) if Some(did) == this.tcx().lang_items.gc() => { if path.segments .iter() @@ -833,7 +833,7 @@ pub fn ast_ty_to_ty<'tcx, AC: AstConv<'tcx>, RS: RegionScope>( result.substs.clone(), bounds) } - def::DefTy(did) | def::DefStruct(did) => { + def::DefTy(did, _) | def::DefStruct(did) => { ast_path_to_ty(this, rscope, did, path).ty } def::DefTyParam(space, id, n) => { diff --git a/src/librustc/middle/typeck/check/mod.rs b/src/librustc/middle/typeck/check/mod.rs index 20fe8186adf40..3bda07e92070e 100644 --- a/src/librustc/middle/typeck/check/mod.rs +++ b/src/librustc/middle/typeck/check/mod.rs @@ -4937,7 +4937,7 @@ pub fn polytype_for_def(fcx: &FnCtxt, return polytype_for_def(fcx, sp, *inner); } def::DefTrait(_) | - def::DefTy(_) | + def::DefTy(..) | def::DefPrimTy(_) | def::DefTyParam(..)=> { fcx.ccx.tcx.sess.span_bug(sp, "expected value, found type"); diff --git a/src/librustc/middle/typeck/infer/error_reporting.rs b/src/librustc/middle/typeck/infer/error_reporting.rs index 499740a78ef39..af670f25e5626 100644 --- a/src/librustc/middle/typeck/infer/error_reporting.rs +++ b/src/librustc/middle/typeck/infer/error_reporting.rs @@ -1235,7 +1235,7 @@ impl<'a, 'tcx> Rebuilder<'a, 'tcx> { Some(&d) => d }; match a_def { - def::DefTy(did) | def::DefStruct(did) => { + def::DefTy(did, _) | def::DefStruct(did) => { let generics = ty::lookup_item_type(self.tcx, did).generics; let expected = diff --git a/src/librustdoc/clean/inline.rs b/src/librustdoc/clean/inline.rs index ccff8afc50b03..ccb01ca620eb7 100644 --- a/src/librustdoc/clean/inline.rs +++ b/src/librustdoc/clean/inline.rs @@ -87,7 +87,12 @@ fn try_inline_def(cx: &DocContext, tcx: &ty::ctxt, ret.extend(build_impls(cx, tcx, did).into_iter()); clean::StructItem(build_struct(cx, tcx, did)) } - def::DefTy(did) => { + def::DefTy(did, false) => { + record_extern_fqn(cx, did, clean::TypeTypedef); + ret.extend(build_impls(cx, tcx, did).into_iter()); + build_type(cx, tcx, did) + } + def::DefTy(did, true) => { record_extern_fqn(cx, did, clean::TypeEnum); ret.extend(build_impls(cx, tcx, did).into_iter()); build_type(cx, tcx, did) diff --git a/src/librustdoc/clean/mod.rs b/src/librustdoc/clean/mod.rs index c42d8c79144dc..c03c56cd22312 100644 --- a/src/librustdoc/clean/mod.rs +++ b/src/librustdoc/clean/mod.rs @@ -1094,6 +1094,7 @@ pub enum TypeKind { TypeStruct, TypeTrait, TypeVariant, + TypeTypedef, } impl Primitive { @@ -2049,7 +2050,8 @@ fn resolve_type(cx: &DocContext, path: Path, fn register_def(cx: &DocContext, def: def::Def) -> ast::DefId { let (did, kind) = match def { def::DefFn(i, _) => (i, TypeFunction), - def::DefTy(i) => (i, TypeEnum), + def::DefTy(i, false) => (i, TypeTypedef), + def::DefTy(i, true) => (i, TypeEnum), def::DefTrait(i) => (i, TypeTrait), def::DefStruct(i) => (i, TypeStruct), def::DefMod(i) => (i, TypeModule), diff --git a/src/librustdoc/html/item_type.rs b/src/librustdoc/html/item_type.rs index f36c81f8f8d8d..6e240b0d8d4a6 100644 --- a/src/librustdoc/html/item_type.rs +++ b/src/librustdoc/html/item_type.rs @@ -45,7 +45,7 @@ impl ItemType { match *self { Module => "mod", Struct => "struct", - Enum => "type", + Enum => "enum", Function => "fn", Typedef => "type", Static => "static", diff --git a/src/librustdoc/html/render.rs b/src/librustdoc/html/render.rs index 169446b0ac077..a0c4283711e68 100644 --- a/src/librustdoc/html/render.rs +++ b/src/librustdoc/html/render.rs @@ -308,6 +308,7 @@ pub fn run(mut krate: clean::Crate, external_html: &ExternalHtml, dst: Path) -> clean::TypeModule => item_type::Module, clean::TypeStatic => item_type::Static, clean::TypeVariant => item_type::Variant, + clean::TypeTypedef => item_type::Typedef, })) }).collect() }).unwrap_or(HashMap::new()); diff --git a/src/librustdoc/html/static/main.js b/src/librustdoc/html/static/main.js index 93bf8d115b3a0..dc18a08a4f862 100644 --- a/src/librustdoc/html/static/main.js +++ b/src/librustdoc/html/static/main.js @@ -555,7 +555,7 @@ // `rustdoc::html::item_type::ItemType` type in Rust. var itemTypes = ["mod", "struct", - "type", + "enum", "fn", "type", "static", diff --git a/src/test/auxiliary/static_priv_by_default.rs b/src/test/auxiliary/static_priv_by_default.rs index b756eb2b582f7..6951ed729b27b 100644 --- a/src/test/auxiliary/static_priv_by_default.rs +++ b/src/test/auxiliary/static_priv_by_default.rs @@ -24,6 +24,7 @@ mod foo { pub fn b() {} pub struct c; pub enum d {} + pub type e = int; pub struct A(()); @@ -36,6 +37,7 @@ mod foo { pub fn reexported_b() {} pub struct reexported_c; pub enum reexported_d {} + pub type reexported_e = int; } pub mod bar { @@ -43,14 +45,17 @@ pub mod bar { pub use foo::reexported_b as f; pub use foo::reexported_c as g; pub use foo::reexported_d as h; + pub use foo::reexported_e as i; } pub static a: int = 0; pub fn b() {} pub struct c; pub enum d {} +pub type e = int; -static i: int = 0; -fn j() {} -struct k; -enum l {} +static j: int = 0; +fn k() {} +struct l; +enum m {} +type n = int; diff --git a/src/test/compile-fail/xcrate-private-by-default.rs b/src/test/compile-fail/xcrate-private-by-default.rs index 70b2ea87ac180..43be96965d01f 100644 --- a/src/test/compile-fail/xcrate-private-by-default.rs +++ b/src/test/compile-fail/xcrate-private-by-default.rs @@ -20,22 +20,26 @@ fn main() { static_priv_by_default::b; static_priv_by_default::c; foo::(); + foo::(); // publicly re-exported items should be available static_priv_by_default::bar::e; static_priv_by_default::bar::f; static_priv_by_default::bar::g; foo::(); + foo::(); // private items at the top should be inaccessible - static_priv_by_default::i; - //~^ ERROR: static `i` is private static_priv_by_default::j; - //~^ ERROR: function `j` is private + //~^ ERROR: static `j` is private static_priv_by_default::k; - //~^ ERROR: struct `k` is private - foo::(); - //~^ ERROR: type `l` is private + //~^ ERROR: function `k` is private + static_priv_by_default::l; + //~^ ERROR: struct `l` is private + foo::(); + //~^ ERROR: enum `m` is private + foo::(); + //~^ ERROR: type `n` is private // public items in a private mod should be inaccessible static_priv_by_default::foo::a; @@ -45,5 +49,7 @@ fn main() { static_priv_by_default::foo::c; //~^ ERROR: struct `c` is private foo::(); - //~^ ERROR: type `d` is private + //~^ ERROR: enum `d` is private + foo::(); + //~^ ERROR: type `e` is private }