diff options
| author | Patrick Walton <pcwalton@mimiga.net> | 2014-08-05 19:44:21 -0700 |
|---|---|---|
| committer | Patrick Walton <pcwalton@mimiga.net> | 2014-09-17 16:38:57 -0700 |
| commit | 78a841810eb36e486ba68e6b9fa80e45d805cc4f (patch) | |
| tree | b1c7c6d9c49f84e03b374b5b70cb0c9d0b60a7de /src/librustdoc | |
| parent | 8067f4425d245a210c732a0333245fbe83190e89 (diff) | |
| download | rust-78a841810eb36e486ba68e6b9fa80e45d805cc4f.tar.gz rust-78a841810eb36e486ba68e6b9fa80e45d805cc4f.zip | |
librustc: Implement associated types behind a feature gate.
The implementation essentially desugars during type collection and AST type conversion time into the parameter scheme we have now. Only fully qualified names--e.g. `<T as Foo>::Bar`--are supported.
Diffstat (limited to 'src/librustdoc')
| -rw-r--r-- | src/librustdoc/clean/inline.rs | 4 | ||||
| -rw-r--r-- | src/librustdoc/clean/mod.rs | 58 | ||||
| -rw-r--r-- | src/librustdoc/fold.rs | 6 | ||||
| -rw-r--r-- | src/librustdoc/html/item_type.rs | 3 | ||||
| -rw-r--r-- | src/librustdoc/html/render.rs | 1 | ||||
| -rw-r--r-- | src/librustdoc/passes.rs | 3 | ||||
| -rw-r--r-- | src/librustdoc/stability_summary.rs | 5 |
7 files changed, 77 insertions, 3 deletions
diff --git a/src/librustdoc/clean/inline.rs b/src/librustdoc/clean/inline.rs index ccb01ca620e..1a324e25472 100644 --- a/src/librustdoc/clean/inline.rs +++ b/src/librustdoc/clean/inline.rs @@ -316,6 +316,10 @@ fn build_impl(cx: &DocContext, tcx: &ty::ctxt, }; Some(item) } + ty::TypeTraitItem(_) => { + // FIXME(pcwalton): Implement. + None + } } }).collect(); return Some(clean::Item { diff --git a/src/librustdoc/clean/mod.rs b/src/librustdoc/clean/mod.rs index c03c56cd223..9e05382fa55 100644 --- a/src/librustdoc/clean/mod.rs +++ b/src/librustdoc/clean/mod.rs @@ -17,7 +17,7 @@ use syntax::ast_util; use syntax::ast_util::PostExpansionMethod; use syntax::attr; use syntax::attr::{AttributeMethods, AttrMetaMethods}; -use syntax::codemap::Pos; +use syntax::codemap::{DUMMY_SP, Pos}; use syntax::parse::token::InternedString; use syntax::parse::token; use syntax::ptr::P; @@ -317,6 +317,7 @@ pub enum ItemEnum { ForeignStaticItem(Static), MacroItem(Macro), PrimitiveItem(Primitive), + AssociatedTypeItem, } #[deriving(Clone, Encodable, Decodable)] @@ -933,6 +934,7 @@ impl Clean<Type> for ast::TraitRef { pub enum TraitItem { RequiredMethod(Item), ProvidedMethod(Item), + TypeTraitItem(Item), } impl TraitItem { @@ -952,6 +954,7 @@ impl TraitItem { match *self { RequiredMethod(ref item) => item, ProvidedMethod(ref item) => item, + TypeTraitItem(ref item) => item, } } } @@ -961,6 +964,7 @@ impl Clean<TraitItem> for ast::TraitItem { match self { &ast::RequiredMethod(ref t) => RequiredMethod(t.clean(cx)), &ast::ProvidedMethod(ref t) => ProvidedMethod(t.clean(cx)), + &ast::TypeTraitItem(ref t) => TypeTraitItem(t.clean(cx)), } } } @@ -968,12 +972,14 @@ impl Clean<TraitItem> for ast::TraitItem { #[deriving(Clone, Encodable, Decodable)] pub enum ImplItem { MethodImplItem(Item), + TypeImplItem(Item), } impl Clean<ImplItem> for ast::ImplItem { fn clean(&self, cx: &DocContext) -> ImplItem { match self { &ast::MethodImplItem(ref t) => MethodImplItem(t.clean(cx)), + &ast::TypeImplItem(ref t) => TypeImplItem(t.clean(cx)), } } } @@ -1028,6 +1034,7 @@ impl Clean<Item> for ty::ImplOrTraitItem { fn clean(&self, cx: &DocContext) -> Item { match *self { ty::MethodTraitItem(ref mti) => mti.clean(cx), + ty::TypeTraitItem(ref tti) => tti.clean(cx), } } } @@ -1743,6 +1750,7 @@ impl Clean<Item> for doctree::Impl { items: self.items.clean(cx).into_iter().map(|ti| { match ti { MethodImplItem(i) => i, + TypeImplItem(i) => i, } }).collect(), derived: detect_derived(self.attrs.as_slice()), @@ -2125,6 +2133,54 @@ impl Clean<Stability> for attr::Stability { } } +impl Clean<Item> for ast::AssociatedType { + fn clean(&self, cx: &DocContext) -> Item { + Item { + source: self.span.clean(cx), + name: Some(self.ident.clean(cx)), + attrs: self.attrs.clean(cx), + inner: AssociatedTypeItem, + visibility: None, + def_id: ast_util::local_def(self.id), + stability: None, + } + } +} + +impl Clean<Item> for ty::AssociatedType { + fn clean(&self, cx: &DocContext) -> Item { + Item { + source: DUMMY_SP.clean(cx), + name: Some(self.ident.clean(cx)), + attrs: Vec::new(), + inner: AssociatedTypeItem, + visibility: None, + def_id: self.def_id, + stability: None, + } + } +} + +impl Clean<Item> for ast::Typedef { + fn clean(&self, cx: &DocContext) -> Item { + Item { + source: self.span.clean(cx), + name: Some(self.ident.clean(cx)), + attrs: self.attrs.clean(cx), + inner: TypedefItem(Typedef { + type_: self.typ.clean(cx), + generics: Generics { + lifetimes: Vec::new(), + type_params: Vec::new(), + }, + }), + visibility: None, + def_id: ast_util::local_def(self.id), + stability: None, + } + } +} + fn lang_struct(cx: &DocContext, did: Option<ast::DefId>, t: ty::t, name: &str, fallback: fn(Box<Type>) -> Type) -> Type { diff --git a/src/librustdoc/fold.rs b/src/librustdoc/fold.rs index 66e93de995e..54e9c29e11d 100644 --- a/src/librustdoc/fold.rs +++ b/src/librustdoc/fold.rs @@ -55,6 +55,12 @@ pub trait DocFolder { None => return None, } }, + TypeTraitItem(it) => { + match this.fold_item(it) { + Some(x) => return Some(TypeTraitItem(x)), + None => return None, + } + } } } let mut foo = Vec::new(); swap(&mut foo, &mut i.items); diff --git a/src/librustdoc/html/item_type.rs b/src/librustdoc/html/item_type.rs index 6e240b0d8d4..e18ab0bd14f 100644 --- a/src/librustdoc/html/item_type.rs +++ b/src/librustdoc/html/item_type.rs @@ -38,6 +38,7 @@ pub enum ItemType { ForeignStatic = 14, Macro = 15, Primitive = 16, + AssociatedType = 17, } impl ItemType { @@ -60,6 +61,7 @@ impl ItemType { ForeignStatic => "ffs", Macro => "macro", Primitive => "primitive", + AssociatedType => "associatedtype", } } } @@ -95,6 +97,7 @@ pub fn shortty(item: &clean::Item) -> ItemType { clean::ForeignStaticItem(..) => ForeignStatic, clean::MacroItem(..) => Macro, clean::PrimitiveItem(..) => Primitive, + clean::AssociatedTypeItem => AssociatedType, } } diff --git a/src/librustdoc/html/render.rs b/src/librustdoc/html/render.rs index a0c4283711e..2107854c52b 100644 --- a/src/librustdoc/html/render.rs +++ b/src/librustdoc/html/render.rs @@ -1512,6 +1512,7 @@ fn item_module(w: &mut fmt::Formatter, cx: &Context, clean::ForeignStaticItem(..) => ("ffi-statics", "Foreign Statics"), clean::MacroItem(..) => ("macros", "Macros"), clean::PrimitiveItem(..) => ("primitives", "Primitive Types"), + clean::AssociatedTypeItem(..) => ("associated-types", "Associated Types"), }; try!(write!(w, "<h2 id='{id}' class='section-header'>\ diff --git a/src/librustdoc/passes.rs b/src/librustdoc/passes.rs index eeccc3303eb..33337594b4c 100644 --- a/src/librustdoc/passes.rs +++ b/src/librustdoc/passes.rs @@ -175,6 +175,9 @@ impl<'a> fold::DocFolder for Stripper<'a> { // Primitives are never stripped clean::PrimitiveItem(..) => {} + + // Associated types are never stripped + clean::AssociatedTypeItem(..) => {} } let fastreturn = match i.inner { diff --git a/src/librustdoc/stability_summary.rs b/src/librustdoc/stability_summary.rs index 11d00fa20a4..02dc4e9bdb6 100644 --- a/src/librustdoc/stability_summary.rs +++ b/src/librustdoc/stability_summary.rs @@ -22,7 +22,7 @@ use syntax::ast::Public; use clean::{Crate, Item, ModuleItem, Module, StructItem, Struct, EnumItem, Enum}; use clean::{ImplItem, Impl, Trait, TraitItem, ProvidedMethod, RequiredMethod}; -use clean::{ViewItemItem, PrimitiveItem}; +use clean::{TypeTraitItem, ViewItemItem, PrimitiveItem}; #[deriving(Zero, Encodable, Decodable, PartialEq, Eq)] /// The counts for each stability level. @@ -131,7 +131,8 @@ fn summarize_item(item: &Item) -> (Counts, Option<ModuleSummary>) { fn extract_item<'a>(trait_item: &'a TraitItem) -> &'a Item { match *trait_item { ProvidedMethod(ref item) | - RequiredMethod(ref item) => item + RequiredMethod(ref item) | + TypeTraitItem(ref item) => item } } let subcounts = trait_items.iter() |
