Skip to content

Commit

Permalink
rustdoc: Correctly distinguish enums and types
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
ftxqxd committed Sep 17, 2014
1 parent ef4b921 commit 8b88811
Show file tree
Hide file tree
Showing 17 changed files with 57 additions and 37 deletions.
4 changes: 2 additions & 2 deletions src/librustc/metadata/decoder.rs
Expand Up @@ -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 => {
Expand All @@ -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,
}
Expand Down
2 changes: 1 addition & 1 deletion src/librustc/middle/astencode.rs
Expand Up @@ -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),
Expand Down
4 changes: 2 additions & 2 deletions src/librustc/middle/def.rs
Expand Up @@ -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),
Expand Down Expand Up @@ -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
}
Expand Down
2 changes: 1 addition & 1 deletion src/librustc/middle/mem_categorization.rs
Expand Up @@ -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_ {
Expand Down
3 changes: 2 additions & 1 deletion src/librustc/middle/privacy.rs
Expand Up @@ -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"),
Expand Down
18 changes: 9 additions & 9 deletions src/librustc/middle/resolve.rs
Expand Up @@ -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
}

Expand All @@ -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(
Expand All @@ -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
Expand Down Expand Up @@ -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), .. }) => {
Expand Down Expand Up @@ -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);

Expand Down Expand Up @@ -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 \
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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 => {}
Expand Down Expand Up @@ -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 \
Expand Down
2 changes: 1 addition & 1 deletion src/librustc/middle/save/mod.rs
Expand Up @@ -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(_, _) |
Expand Down
6 changes: 3 additions & 3 deletions src/librustc/middle/typeck/astconv.rs
Expand Up @@ -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()
Expand All @@ -462,7 +462,7 @@ pub fn ast_ty_to_builtin_ty<'tcx, AC: AstConv<'tcx>, RS: RegionScope>(
"not enough type parameters supplied to `Box<T>`");
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()
Expand Down Expand Up @@ -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) => {
Expand Down
2 changes: 1 addition & 1 deletion src/librustc/middle/typeck/check/mod.rs
Expand Up @@ -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");
Expand Down
2 changes: 1 addition & 1 deletion src/librustc/middle/typeck/infer/error_reporting.rs
Expand Up @@ -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 =
Expand Down
7 changes: 6 additions & 1 deletion src/librustdoc/clean/inline.rs
Expand Up @@ -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)
Expand Down
4 changes: 3 additions & 1 deletion src/librustdoc/clean/mod.rs
Expand Up @@ -1094,6 +1094,7 @@ pub enum TypeKind {
TypeStruct,
TypeTrait,
TypeVariant,
TypeTypedef,
}

impl Primitive {
Expand Down Expand Up @@ -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),
Expand Down
2 changes: 1 addition & 1 deletion src/librustdoc/html/item_type.rs
Expand Up @@ -45,7 +45,7 @@ impl ItemType {
match *self {
Module => "mod",
Struct => "struct",
Enum => "type",
Enum => "enum",
Function => "fn",
Typedef => "type",
Static => "static",
Expand Down
1 change: 1 addition & 0 deletions src/librustdoc/html/render.rs
Expand Up @@ -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());
Expand Down
2 changes: 1 addition & 1 deletion src/librustdoc/html/static/main.js
Expand Up @@ -555,7 +555,7 @@
// `rustdoc::html::item_type::ItemType` type in Rust.
var itemTypes = ["mod",
"struct",
"type",
"enum",
"fn",
"type",
"static",
Expand Down
13 changes: 9 additions & 4 deletions src/test/auxiliary/static_priv_by_default.rs
Expand Up @@ -24,6 +24,7 @@ mod foo {
pub fn b() {}
pub struct c;
pub enum d {}
pub type e = int;

pub struct A(());

Expand All @@ -36,21 +37,25 @@ mod foo {
pub fn reexported_b() {}
pub struct reexported_c;
pub enum reexported_d {}
pub type reexported_e = int;
}

pub mod bar {
pub use foo::reexported_a as e;
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;
20 changes: 13 additions & 7 deletions src/test/compile-fail/xcrate-private-by-default.rs
Expand Up @@ -20,22 +20,26 @@ fn main() {
static_priv_by_default::b;
static_priv_by_default::c;
foo::<static_priv_by_default::d>();
foo::<static_priv_by_default::e>();

// 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::<static_priv_by_default::bar::h>();
foo::<static_priv_by_default::bar::i>();

// 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::<static_priv_by_default::l>();
//~^ ERROR: type `l` is private
//~^ ERROR: function `k` is private
static_priv_by_default::l;
//~^ ERROR: struct `l` is private
foo::<static_priv_by_default::m>();
//~^ ERROR: enum `m` is private
foo::<static_priv_by_default::n>();
//~^ ERROR: type `n` is private

// public items in a private mod should be inaccessible
static_priv_by_default::foo::a;
Expand All @@ -45,5 +49,7 @@ fn main() {
static_priv_by_default::foo::c;
//~^ ERROR: struct `c` is private
foo::<static_priv_by_default::foo::d>();
//~^ ERROR: type `d` is private
//~^ ERROR: enum `d` is private
foo::<static_priv_by_default::foo::e>();
//~^ ERROR: type `e` is private
}

0 comments on commit 8b88811

Please sign in to comment.