From d455d46b150d261b627afbc32ed809aaf6770ed5 Mon Sep 17 00:00:00 2001 From: Brian Anderson Date: Mon, 16 Jan 2012 16:27:28 -0800 Subject: [PATCH] rustdoc: Remove non-attribute related stuff from attr_parser --- src/rustdoc/attr_parser.rs | 136 ++++++++++++++++--------------------- 1 file changed, 60 insertions(+), 76 deletions(-) diff --git a/src/rustdoc/attr_parser.rs b/src/rustdoc/attr_parser.rs index 8eab5030ba4e..c447e0d72b30 100644 --- a/src/rustdoc/attr_parser.rs +++ b/src/rustdoc/attr_parser.rs @@ -1,67 +1,52 @@ import rustc::syntax::ast; +export fn_attrs, arg_attrs; export parse_fn; -fn parse_fn( +type fn_attrs = { + brief: option, + desc: option, + args: [arg_attrs], + return: option +}; + +type arg_attrs = { name: str, - id: ast::node_id, + desc: str +}; + +fn parse_fn( attrs: [ast::attribute] -) -> doc::fndoc { - let _fndoc = none; - for attr: ast::attribute in attrs { +) -> fn_attrs { + + for attr in attrs { alt attr.node.value.node { - ast::meta_name_value( - "doc", {node: ast::lit_str(value), span: _}) { - _fndoc = some(~{ - id: id, - name: name, - brief: some(value), - desc: none, - return: none, - args: [] - }); - } - ast::meta_list("doc", docs) { - _fndoc = some( - parse_fn_(name, id, docs)); - } + ast::meta_name_value( + "doc", {node: ast::lit_str(value), span: _}) { + ret { + brief: none, + desc: some(value), + args: [], + return: none + }; + } + ast::meta_list("doc", docs) { + ret parse_fn_(docs); + } } } - let _fndoc0 = alt _fndoc { - some(_d) { _d } - none. { - ~{ - id: id, - name: name, - brief: none, - desc: none, - return: none, - args: [] - } - } - }; - - ret _fndoc0; + { + brief: none, + desc: none, + args: [], + return: none + } } -#[doc( - brief = "Parses function docs from a complex #[doc] attribute.", - desc = "Supported attributes: - -* `brief`: Brief description -* `desc`: Long description -* `return`: Description of return value -* `args`: List of argname = argdesc pairs -", - args(items = "Doc attribute contents"), - return = "Parsed function docs." -)] fn parse_fn_( - name: str, - id: ast::node_id, items: [@ast::meta_item] -) -> doc::fndoc { +) -> fn_attrs { let brief = none; let desc = none; let return = none; @@ -95,23 +80,22 @@ fn parse_fn_( alt d.node { ast::meta_name_value(key, {node: ast::lit_str(value), span: _}) { - argdocs += [(key, value)]; + argdocs += [{ + name: key, + desc: value + }]; } } } } } - ~{ - id: id, - name: name, + { brief: brief, desc: desc, - return: some({ - desc: return, - ty: none, - }), - args: argdocs } + args: argdocs, + return: return + } } #[cfg(test)] @@ -138,51 +122,51 @@ mod tests { fn parse_fn_should_handle_undocumented_functions() { let source = ""; let attrs = parse_attributes(source); - let doc = parse_fn("f", 0, attrs); - assert doc.brief == none; - assert doc.desc == none; - assert doc.return == none; - assert vec::len(doc.args) == 0u; + let attrs = parse_fn(attrs); + assert attrs.brief == none; + assert attrs.desc == none; + assert attrs.return == none; + assert vec::len(attrs.args) == 0u; } - #[test] + #[tes] fn parse_fn_should_parse_simple_doc_attributes() { let source = "#[doc = \"basic\"]"; let attrs = parse_attributes(source); - let doc = parse_fn("f", 0, attrs); - assert doc.brief == some("basic"); + let attrs = parse_fn(attrs); + assert attrs.brief == some("basic"); } #[test] fn parse_fn_should_parse_the_brief_description() { let source = "#[doc(brief = \"short\")]"; let attrs = parse_attributes(source); - let doc = parse_fn("f", 0, attrs); - assert doc.brief == some("short"); + let attrs = parse_fn(attrs); + assert attrs.brief == some("short"); } #[test] fn parse_fn_should_parse_the_long_description() { let source = "#[doc(desc = \"description\")]"; let attrs = parse_attributes(source); - let doc = parse_fn("f", 0, attrs); - assert doc.desc == some("description"); + let attrs = parse_fn(attrs); + assert attrs.desc == some("description"); } #[test] fn parse_fn_should_parse_the_return_value_description() { let source = "#[doc(return = \"return value\")]"; let attrs = parse_attributes(source); - let doc = parse_fn("f", 0, attrs); - assert option::get(doc.return).desc == some("return value"); + let attrs = parse_fn(attrs); + assert attrs.return == some("return value"); } #[test] fn parse_fn_should_parse_the_argument_descriptions() { let source = "#[doc(args(a = \"arg a\", b = \"arg b\"))]"; let attrs = parse_attributes(source); - let doc = parse_fn("f", 0, attrs); - assert doc.args[0] == ("a", "arg a"); - assert doc.args[1] == ("b", "arg b"); + let attrs = parse_fn(attrs); + assert attrs.args[0] == {name: "a", desc: "arg a"}; + assert attrs.args[1] == {name: "b", desc: "arg b"}; } } \ No newline at end of file