Skip to content

Commit ca697d3

Browse files
committed
rustdoc: Generate documentation for foreign items
This slurps up everything inside of an 'extern' block into the enclosing module in order to document them. The documentation must be on the items themselves, and they'll show up next to everything else on the module index pages. Closes #5953
1 parent c429c7c commit ca697d3

File tree

6 files changed

+88
-33
lines changed

6 files changed

+88
-33
lines changed

src/librustdoc/clean.rs

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,8 @@ pub enum ItemEnum {
149149
MethodItem(Method),
150150
StructFieldItem(StructField),
151151
VariantItem(Variant),
152+
ForeignFunctionItem(Function),
153+
ForeignStaticItem(Static),
152154
}
153155

154156
#[deriving(Clone, Encodable, Decodable)]
@@ -172,6 +174,7 @@ impl Clean<Item> for doctree::Module {
172174
inner: ModuleItem(Module {
173175
items: std::vec::concat(&[self.structs.clean(),
174176
self.enums.clean(), self.fns.clean(),
177+
std::vec::concat(self.foreigns.clean()),
175178
self.mods.clean(), self.typedefs.clean(),
176179
self.statics.clean(), self.traits.clean(),
177180
self.impls.clean(), self.view_items.clean()])
@@ -968,6 +971,41 @@ impl Clean<ViewListIdent> for ast::path_list_ident {
968971
}
969972
}
970973

974+
impl Clean<~[Item]> for ast::foreign_mod {
975+
fn clean(&self) -> ~[Item] {
976+
self.items.clean()
977+
}
978+
}
979+
980+
impl Clean<Item> for ast::foreign_item {
981+
fn clean(&self) -> Item {
982+
let inner = match self.node {
983+
ast::foreign_item_fn(ref decl, ref generics) => {
984+
ForeignFunctionItem(Function {
985+
decl: decl.clean(),
986+
generics: generics.clean(),
987+
purity: ast::extern_fn,
988+
})
989+
}
990+
ast::foreign_item_static(ref ty, mutbl) => {
991+
ForeignStaticItem(Static {
992+
type_: ty.clean(),
993+
mutability: if mutbl {Mutable} else {Immutable},
994+
expr: ~"",
995+
})
996+
}
997+
};
998+
Item {
999+
name: Some(self.ident.clean()),
1000+
attrs: self.attrs.clean(),
1001+
source: self.span.clean(),
1002+
id: self.id,
1003+
visibility: self.vis.clean(),
1004+
inner: inner,
1005+
}
1006+
}
1007+
}
1008+
9711009
// Utilities
9721010

9731011
trait ToSource {

src/librustdoc/doctree.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ pub struct Module {
3030
traits: ~[Trait],
3131
vis: ast::visibility,
3232
impls: ~[Impl],
33+
foreigns: ~[ast::foreign_mod],
3334
view_items: ~[ast::view_item],
3435
}
3536

@@ -50,6 +51,7 @@ impl Module {
5051
traits : ~[],
5152
impls : ~[],
5253
view_items : ~[],
54+
foreigns : ~[],
5355
}
5456
}
5557
}

src/librustdoc/html/render.rs

Lines changed: 40 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -540,19 +540,21 @@ impl Context {
540540

541541
fn shortty(item: &clean::Item) -> &'static str {
542542
match item.inner {
543-
clean::ModuleItem(*) => "mod",
544-
clean::StructItem(*) => "struct",
545-
clean::EnumItem(*) => "enum",
546-
clean::FunctionItem(*) => "fn",
547-
clean::TypedefItem(*) => "typedef",
548-
clean::StaticItem(*) => "static",
549-
clean::TraitItem(*) => "trait",
550-
clean::ImplItem(*) => "impl",
551-
clean::ViewItemItem(*) => "viewitem",
552-
clean::TyMethodItem(*) => "tymethod",
553-
clean::MethodItem(*) => "method",
554-
clean::StructFieldItem(*) => "structfield",
555-
clean::VariantItem(*) => "variant",
543+
clean::ModuleItem(*) => "mod",
544+
clean::StructItem(*) => "struct",
545+
clean::EnumItem(*) => "enum",
546+
clean::FunctionItem(*) => "fn",
547+
clean::TypedefItem(*) => "typedef",
548+
clean::StaticItem(*) => "static",
549+
clean::TraitItem(*) => "trait",
550+
clean::ImplItem(*) => "impl",
551+
clean::ViewItemItem(*) => "viewitem",
552+
clean::TyMethodItem(*) => "tymethod",
553+
clean::MethodItem(*) => "method",
554+
clean::StructFieldItem(*) => "structfield",
555+
clean::VariantItem(*) => "variant",
556+
clean::ForeignFunctionItem(*) => "ffi",
557+
clean::ForeignStaticItem(*) => "ffs",
556558
}
557559
}
558560

@@ -592,7 +594,8 @@ impl<'self> fmt::Default for Item<'self> {
592594
match it.item.inner {
593595
clean::ModuleItem(ref m) => item_module(fmt.buf, it.cx,
594596
it.item, m.items),
595-
clean::FunctionItem(ref f) => item_function(fmt.buf, it.item, f),
597+
clean::FunctionItem(ref f) | clean::ForeignFunctionItem(ref f) =>
598+
item_function(fmt.buf, it.item, f),
596599
clean::TraitItem(ref t) => item_trait(fmt.buf, it.item, t),
597600
clean::StructItem(ref s) => item_struct(fmt.buf, it.item, s),
598601
clean::EnumItem(ref e) => item_enum(fmt.buf, it.item, e),
@@ -673,6 +676,10 @@ fn item_module(w: &mut io::Writer, cx: &Context,
673676
(_, &clean::EnumItem(*)) => false,
674677
(&clean::StaticItem(*), _) => true,
675678
(_, &clean::StaticItem(*)) => false,
679+
(&clean::ForeignFunctionItem(*), _) => true,
680+
(_, &clean::ForeignFunctionItem(*)) => false,
681+
(&clean::ForeignStaticItem(*), _) => true,
682+
(_, &clean::ForeignStaticItem(*)) => false,
676683
(&clean::TraitItem(*), _) => true,
677684
(_, &clean::TraitItem(*)) => false,
678685
(&clean::FunctionItem(*), _) => true,
@@ -700,27 +707,31 @@ fn item_module(w: &mut io::Writer, cx: &Context,
700707
}
701708
curty = myty;
702709
write!(w, "<h2>{}</h2>\n<table>", match myitem.inner {
703-
clean::ModuleItem(*) => "Modules",
704-
clean::StructItem(*) => "Structs",
705-
clean::EnumItem(*) => "Enums",
706-
clean::FunctionItem(*) => "Functions",
707-
clean::TypedefItem(*) => "Type Definitions",
708-
clean::StaticItem(*) => "Statics",
709-
clean::TraitItem(*) => "Traits",
710-
clean::ImplItem(*) => "Implementations",
711-
clean::ViewItemItem(*) => "Reexports",
712-
clean::TyMethodItem(*) => "Type Methods",
713-
clean::MethodItem(*) => "Methods",
714-
clean::StructFieldItem(*) => "Struct Fields",
715-
clean::VariantItem(*) => "Variants",
710+
clean::ModuleItem(*) => "Modules",
711+
clean::StructItem(*) => "Structs",
712+
clean::EnumItem(*) => "Enums",
713+
clean::FunctionItem(*) => "Functions",
714+
clean::TypedefItem(*) => "Type Definitions",
715+
clean::StaticItem(*) => "Statics",
716+
clean::TraitItem(*) => "Traits",
717+
clean::ImplItem(*) => "Implementations",
718+
clean::ViewItemItem(*) => "Reexports",
719+
clean::TyMethodItem(*) => "Type Methods",
720+
clean::MethodItem(*) => "Methods",
721+
clean::StructFieldItem(*) => "Struct Fields",
722+
clean::VariantItem(*) => "Variants",
723+
clean::ForeignFunctionItem(*) => "Foreign Functions",
724+
clean::ForeignStaticItem(*) => "Foreign Statics",
716725
});
717726
}
718727

719728
match myitem.inner {
720-
clean::StaticItem(ref s) => {
729+
clean::StaticItem(ref s) | clean::ForeignStaticItem(ref s) => {
721730
struct Initializer<'self>(&'self str);
722731
impl<'self> fmt::Default for Initializer<'self> {
723732
fn fmt(s: &Initializer<'self>, f: &mut fmt::Formatter) {
733+
if s.len() == 0 { return; }
734+
write!(f.buf, "<code> = </code>");
724735
let tag = if s.contains("\n") { "pre" } else { "code" };
725736
write!(f.buf, "<{tag}>{}</{tag}>",
726737
s.as_slice(), tag=tag);
@@ -729,7 +740,7 @@ fn item_module(w: &mut io::Writer, cx: &Context,
729740

730741
write!(w, "
731742
<tr>
732-
<td><code>{}static {}: {} = </code>{}</td>
743+
<td><code>{}static {}: {}</code>{}</td>
733744
<td class='docblock'>{}&nbsp;</td>
734745
</tr>
735746
",

src/librustdoc/passes.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,8 @@ pub fn strip_private(crate: clean::Crate) -> plugins::PluginResult {
5959
clean::TypedefItem(*) | clean::StaticItem(*) |
6060
clean::StructItem(*) | clean::EnumItem(*) |
6161
clean::TraitItem(*) | clean::FunctionItem(*) |
62-
clean::ViewItemItem(*) | clean::MethodItem(*) => {
62+
clean::ViewItemItem(*) | clean::MethodItem(*) |
63+
clean::ForeignFunctionItem(*) | clean::ForeignStaticItem(*) => {
6364
// XXX: re-exported items should get surfaced in the docs as
6465
// well (using the output of resolve analysis)
6566
if i.visibility != Some(ast::public) {

src/librustdoc/visit_ast.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,9 @@ impl RustdocVisitor {
174174
};
175175
om.impls.push(i);
176176
},
177+
ast::item_foreign_mod(ref fm) => {
178+
om.foreigns.push(fm.clone());
179+
}
177180
_ => (),
178181
}
179182
}

src/libsyntax/parse/parser.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4204,9 +4204,9 @@ impl Parser {
42044204
}
42054205
42064206
// parse a function declaration from a foreign module
4207-
fn parse_item_foreign_fn(&self, attrs: ~[Attribute]) -> @foreign_item {
4207+
fn parse_item_foreign_fn(&self, vis: ast::visibility,
4208+
attrs: ~[Attribute]) -> @foreign_item {
42084209
let lo = self.span.lo;
4209-
let vis = self.parse_visibility();
42104210
42114211
// Parse obsolete purity.
42124212
let purity = self.parse_fn_purity();
@@ -4740,7 +4740,7 @@ impl Parser {
47404740
if (self.is_keyword(keywords::Fn) || self.is_keyword(keywords::Pure) ||
47414741
self.is_keyword(keywords::Unsafe)) {
47424742
// FOREIGN FUNCTION ITEM
4743-
let item = self.parse_item_foreign_fn(attrs);
4743+
let item = self.parse_item_foreign_fn(visibility, attrs);
47444744
return iovi_foreign_item(item);
47454745
}
47464746
self.parse_macro_use_or_failure(attrs,macros_allowed,lo,visibility)

0 commit comments

Comments
 (0)