Skip to content

Commit f296f99

Browse files
committed
---
yaml --- r: 13915 b: refs/heads/try c: 2c495a9 h: refs/heads/master i: 13913: fe6a993 13911: 3e0cde9 v: v3
1 parent eeb5785 commit f296f99

File tree

2 files changed

+107
-25
lines changed

2 files changed

+107
-25
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,5 @@
22
refs/heads/master: 61b1875c16de39c166b0f4d54bba19f9c6777d1a
33
refs/heads/snap-stage1: e33de59e47c5076a89eadeb38f4934f58a3618a6
44
refs/heads/snap-stage3: 4a81779abd786ff22d71434c6d9a5917ea4cdfff
5-
refs/heads/try: b8a683415c995bdb3d2e8bdc0d6a2bec7fe6cf1d
5+
refs/heads/try: 2c495a9bf8c1cf6cf76d41b5aa0dad4998fb6c57
66
refs/tags/release-0.1: 1f5c5126e96c79d22cb7862f75304136e204f105

branches/try/src/rustdoc/attr_pass.rs

Lines changed: 106 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,8 @@ fn run(
2525
fold_fn: fold_fn,
2626
fold_const: fold_const,
2727
fold_enum: fold_enum,
28-
fold_res: fold_res
28+
fold_res: fold_res,
29+
fold_iface: fold_iface
2930
with *fold::default_seq_fold(srv)
3031
});
3132
fold.fold_crate(fold, doc)
@@ -142,35 +143,36 @@ fn fold_fn(
142143
with doc
143144
};
144145
}
146+
}
145147

146-
fn merge_arg_attrs(
147-
docs: [doc::argdoc],
148-
attrs: [attr_parser::arg_attrs]
149-
) -> [doc::argdoc] {
150-
vec::map(docs) {|doc|
151-
alt vec::find(attrs) {|attr|
152-
attr.name == doc.name
153-
} {
154-
some(attr) {
155-
{
156-
desc: some(attr.desc)
157-
with doc
158-
}
148+
fn merge_arg_attrs(
149+
docs: [doc::argdoc],
150+
attrs: [attr_parser::arg_attrs]
151+
) -> [doc::argdoc] {
152+
vec::map(docs) {|doc|
153+
alt vec::find(attrs) {|attr|
154+
attr.name == doc.name
155+
} {
156+
some(attr) {
157+
{
158+
desc: some(attr.desc)
159+
with doc
159160
}
160-
none { doc }
161161
}
162+
none { doc }
162163
}
163-
// FIXME: Warning when documenting a non-existent arg
164164
}
165+
// FIXME: Warning when documenting a non-existent arg
166+
}
165167

166-
fn merge_ret_attrs(
167-
doc: doc::retdoc,
168-
attrs: option<str>
169-
) -> doc::retdoc {
170-
{
171-
desc: attrs
172-
with doc
173-
}
168+
169+
fn merge_ret_attrs(
170+
doc: doc::retdoc,
171+
attrs: option<str>
172+
) -> doc::retdoc {
173+
{
174+
desc: attrs
175+
with doc
174176
}
175177
}
176178

@@ -359,4 +361,84 @@ fn fold_res_should_extract_arg_docs() {
359361
let doc = fold_res(fold, doc.topmod.resources()[0]);
360362
assert doc.args[0].name == "a";
361363
assert doc.args[0].desc == some("b");
364+
}
365+
366+
367+
fn fold_iface(
368+
fold: fold::fold<astsrv::srv>,
369+
doc: doc::ifacedoc
370+
) -> doc::ifacedoc {
371+
let srv = fold.ctxt;
372+
let doc = fold::default_seq_fold_iface(fold, doc);
373+
let attrs = parse_item_attrs(srv, doc.id, attr_parser::parse_iface);
374+
375+
{
376+
brief: attrs.brief,
377+
desc: attrs.desc,
378+
methods: merge_method_attrs(srv, doc.id, doc.methods)
379+
with doc
380+
}
381+
}
382+
383+
fn merge_method_attrs(
384+
srv: astsrv::srv,
385+
item_id: doc::ast_id,
386+
docs: [doc::methoddoc]
387+
) -> [doc::methoddoc] {
388+
// Create an assoc list from method name to attributes
389+
let attrs = astsrv::exec(srv) {|ctxt|
390+
alt ctxt.ast_map.get(item_id) {
391+
ast_map::node_item(@{
392+
node: ast::item_iface(_, methods), _
393+
}) {
394+
vec::map(methods) {|method|
395+
(method.ident, attr_parser::parse_method(method.attrs))
396+
}
397+
}
398+
}
399+
};
400+
401+
vec::map2(docs, attrs) {|doc, attrs|
402+
assert doc.name == tuple::first(attrs);
403+
let attrs = tuple::second(attrs);
404+
405+
{
406+
brief: attrs.brief,
407+
desc: attrs.desc,
408+
args: merge_arg_attrs(doc.args, attrs.args),
409+
return: merge_ret_attrs(doc.return, attrs.return),
410+
failure: attrs.failure
411+
with doc
412+
}
413+
}
414+
}
415+
416+
#[test]
417+
fn should_extract_iface_docs() {
418+
let source = "#[doc = \"whatever\"] iface i { fn a(); }";
419+
let srv = astsrv::mk_srv_from_str(source);
420+
let doc = extract::from_srv(srv, "");
421+
let doc = run(srv, doc);
422+
assert doc.topmod.ifaces()[0].desc == some("whatever");
423+
}
424+
425+
#[test]
426+
fn should_extract_iface_method_docs() {
427+
let source = "iface i {\
428+
#[doc(\
429+
brief = \"brief\",\
430+
desc = \"desc\",\
431+
args(a = \"a\"),\
432+
return = \"return\",\
433+
failure = \"failure\")]\
434+
fn f(a: bool) -> bool;\
435+
}";
436+
let srv = astsrv::mk_srv_from_str(source);
437+
let doc = extract::from_srv(srv, "");
438+
let doc = run(srv, doc);
439+
assert doc.topmod.ifaces()[0].methods[0].brief == some("brief");
440+
assert doc.topmod.ifaces()[0].methods[0].desc == some("desc");
441+
assert doc.topmod.ifaces()[0].methods[0].args[0].desc == some("a");
442+
assert doc.topmod.ifaces()[0].methods[0].return.desc == some("return");
443+
assert doc.topmod.ifaces()[0].methods[0].failure == some("failure");
362444
}

0 commit comments

Comments
 (0)