Skip to content

Commit 2efc600

Browse files
committed
rustdoc: Parse resource doc attributes
1 parent 97a1110 commit 2efc600

File tree

1 file changed

+76
-11
lines changed

1 file changed

+76
-11
lines changed

src/rustdoc/attr_parser.rs

Lines changed: 76 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,9 @@ import rustc::front::attr;
1010
import core::tuple;
1111

1212
export crate_attrs, mod_attrs, fn_attrs, arg_attrs,
13-
const_attrs, enum_attrs, variant_attrs;
13+
const_attrs, enum_attrs, variant_attrs, res_attrs;
1414
export parse_crate, parse_mod, parse_fn, parse_const,
15-
parse_enum, parse_variant;
15+
parse_enum, parse_variant, parse_res;
1616

1717
type crate_attrs = {
1818
name: option<str>
@@ -50,6 +50,12 @@ type variant_attrs = {
5050
desc: option<str>
5151
};
5252

53+
type res_attrs = {
54+
brief: option<str>,
55+
desc: option<str>,
56+
args: [arg_attrs]
57+
};
58+
5359
#[cfg(test)]
5460
mod test {
5561

@@ -248,7 +254,19 @@ fn parse_fn_long_doc(
248254
) -> fn_attrs {
249255
let return = attr::meta_item_value_from_list(items, "return");
250256
let failure = attr::meta_item_value_from_list(items, "failure");
251-
let args = alt attr::meta_item_list_from_list(items, "args") {
257+
let args = parse_args(items);
258+
259+
{
260+
brief: brief,
261+
desc: desc,
262+
args: args,
263+
return: return,
264+
failure: failure
265+
}
266+
}
267+
268+
fn parse_args(items: [@ast::meta_item]) -> [arg_attrs] {
269+
alt attr::meta_item_list_from_list(items, "args") {
252270
some(items) {
253271
vec::filter_map(items) {|item|
254272
option::map(attr::name_value_str_pair(item)) { |pair|
@@ -260,14 +278,6 @@ fn parse_fn_long_doc(
260278
}
261279
}
262280
none { [] }
263-
};
264-
265-
{
266-
brief: brief,
267-
desc: desc,
268-
args: args,
269-
return: return,
270-
failure: failure
271281
}
272282
}
273283

@@ -417,3 +427,58 @@ fn should_parse_variant_long_doc() {
417427
let attrs = parse_variant(attrs);
418428
assert attrs.desc == some("a");
419429
}
430+
431+
fn parse_res(
432+
attrs: [ast::attribute]
433+
) -> res_attrs {
434+
435+
parse_short_doc_or(
436+
attrs,
437+
{|desc|
438+
{
439+
brief: none,
440+
desc: desc,
441+
args: []
442+
}
443+
},
444+
parse_res_long_doc
445+
)
446+
}
447+
448+
fn parse_res_long_doc(
449+
items: [@ast::meta_item],
450+
brief: option<str>,
451+
desc: option<str>
452+
) -> res_attrs {
453+
{
454+
brief: brief,
455+
desc: desc,
456+
args: parse_args(items)
457+
}
458+
}
459+
460+
#[test]
461+
fn should_parse_resource_short_desc() {
462+
let source = "#[doc = \"a\"]";
463+
let attrs = test::parse_attributes(source);
464+
let attrs = parse_res(attrs);
465+
assert attrs.desc == some("a");
466+
}
467+
468+
#[test]
469+
fn should_parse_resource_long_desc() {
470+
let source = "#[doc(brief = \"a\", desc = \"b\")]";
471+
let attrs = test::parse_attributes(source);
472+
let attrs = parse_res(attrs);
473+
assert attrs.brief == some("a");
474+
assert attrs.desc == some("b");
475+
}
476+
477+
#[test]
478+
fn shoulde_parse_resource_arg() {
479+
let source = "#[doc(args(a = \"b\"))]";
480+
let attrs = test::parse_attributes(source);
481+
let attrs = parse_res(attrs);
482+
assert attrs.args[0].name == "a";
483+
assert attrs.args[0].desc == "b";
484+
}

0 commit comments

Comments
 (0)