Skip to content

Commit 2d2bdfe

Browse files
committed
rustdoc: Write markdown for function signatures
1 parent d1fe582 commit 2d2bdfe

File tree

2 files changed

+44
-6
lines changed

2 files changed

+44
-6
lines changed

src/rustdoc/attr_pass.rs

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -129,13 +129,11 @@ fn fold_fn(
129129
attrs: attr_parser::fn_attrs
130130
) -> doc::fndoc {
131131
ret ~{
132-
id: doc.id,
133-
name: doc.name,
134132
brief: attrs.brief,
135133
desc: attrs.desc,
136134
args: merge_arg_attrs(doc.args, attrs.args),
137-
return: merge_ret_attrs(doc.return, attrs.return),
138-
sig: none
135+
return: merge_ret_attrs(doc.return, attrs.return)
136+
with *doc
139137
};
140138
}
141139

@@ -207,4 +205,15 @@ fn fold_fn_should_extract_return_attributes() {
207205
let fold = fold::default_seq_fold(srv);
208206
let doc = fold_fn(fold, doc.topmod.fns[0]);
209207
assert option::get(doc.return).desc == some("what");
208+
}
209+
210+
#[test]
211+
fn fold_fn_should_preserve_sig() {
212+
let source = "fn a() -> int { }";
213+
let srv = astsrv::mk_srv_from_str(source);
214+
let doc = extract::from_srv(srv, "");
215+
let doc = tystr_pass::mk_pass()(srv, doc);
216+
let fold = fold::default_seq_fold(srv);
217+
let doc = fold_fn(fold, doc.topmod.fns[0]);
218+
assert doc.sig == some("fn a() -> int");
210219
}

src/rustdoc/gen.rs

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -107,12 +107,37 @@ fn write_fn(
107107
doc: doc::fndoc
108108
) {
109109
write_header(ctxt, h3, #fmt("Function `%s`", doc.name));
110+
write_sig(ctxt, doc.sig);
110111
write_brief(ctxt, doc.brief);
111112
write_desc(ctxt, doc.desc);
112113
write_args(ctxt, doc.args);
113114
write_return(ctxt, doc.return);
114115
}
115116

117+
fn write_sig(ctxt: ctxt, sig: option<str>) {
118+
alt sig {
119+
some(sig) {
120+
ctxt.w.write_line("```");
121+
ctxt.w.write_line(#fmt("%s", sig));
122+
ctxt.w.write_line("```");
123+
ctxt.w.write_line("");
124+
}
125+
none { fail "unimplemented" }
126+
}
127+
}
128+
129+
#[test]
130+
fn should_write_the_function_signature() {
131+
let markdown = test::render("#[doc = \"f\"] fn a() { }");
132+
assert str::contains(markdown, "```\nfn a()\n```");
133+
}
134+
135+
#[test]
136+
fn should_insert_blank_line_after_fn_signature() {
137+
let markdown = test::render("#[doc = \"f\"] fn a() { }");
138+
assert str::contains(markdown, "fn a()\n```\n\n");
139+
}
140+
116141
fn write_brief(
117142
ctxt: ctxt,
118143
brief: option<str>
@@ -254,9 +279,13 @@ mod test {
254279
fn render(source: str) -> str {
255280
let srv = astsrv::mk_srv_from_str(source);
256281
let doc = extract::from_srv(srv, "");
282+
#debug("doc (extract): %?", doc);
257283
let doc = tystr_pass::mk_pass()(srv, doc);
284+
#debug("doc (tystr): %?", doc);
258285
let doc = path_pass::mk_pass()(srv, doc);
286+
#debug("doc (path): %?", doc);
259287
let doc = attr_pass::mk_pass()(srv, doc);
288+
#debug("doc (attr): %?", doc);
260289
let markdown = write_markdown_str(doc);
261290
#debug("markdown: %s", markdown);
262291
markdown
@@ -299,9 +328,9 @@ mod test {
299328
}
300329

301330
#[test]
302-
fn should_leave_blank_line_between_fn_header_and_brief() {
331+
fn should_leave_blank_line_between_fn_header_and_sig() {
303332
let markdown = render("#[doc(brief = \"brief\")] fn a() { }");
304-
assert str::contains(markdown, "Function `a`\n\nbrief");
333+
assert str::contains(markdown, "Function `a`\n\n```\nfn a()");
305334
}
306335

307336
#[test]

0 commit comments

Comments
 (0)