diff options
| author | Laurenz <laurmaedje@gmail.com> | 2022-12-22 00:34:03 +0100 |
|---|---|---|
| committer | Laurenz <laurmaedje@gmail.com> | 2022-12-22 00:34:03 +0100 |
| commit | 990224c0f8bcf885d3bca58f3f1a87b54c180f52 (patch) | |
| tree | 595d79acc43bc25c1854424a9a14b756413858a2 /macros | |
| parent | 4c92ab4ace41a20ccea59bbdf6917b5dfa29121f (diff) | |
Annotate return values
Diffstat (limited to 'macros')
| -rw-r--r-- | macros/src/func.rs | 25 |
1 files changed, 21 insertions, 4 deletions
diff --git a/macros/src/func.rs b/macros/src/func.rs index 1f6bb626..fe06749b 100644 --- a/macros/src/func.rs +++ b/macros/src/func.rs @@ -17,7 +17,7 @@ pub fn func(item: syn::Item) -> Result<TokenStream> { let mut docs = docs[first.len()..].to_string(); let example = example(&mut docs, 2); - let params = params(&mut docs)?; + let (params, returns) = params(&mut docs)?; let syntax = quote_option(section(&mut docs, "Syntax", 2)); let category = section(&mut docs, "Category", 2).expect("missing category"); let example = quote_option(example); @@ -36,6 +36,7 @@ pub fn func(item: syn::Item) -> Result<TokenStream> { example: #example, syntax: #syntax, params: ::std::vec![#(#params),*], + returns: ::std::vec![#(#returns),*] } }; @@ -119,10 +120,14 @@ pub fn example(docs: &mut String, level: usize) -> Option<String> { } /// Parse the parameter section. -fn params(docs: &mut String) -> Result<Vec<TokenStream>> { - let Some(section) = section(docs, "Parameters", 2) else { return Ok(vec![]) }; +fn params(docs: &mut String) -> Result<(Vec<TokenStream>, Vec<String>)> { + let Some(section) = section(docs, "Parameters", 2) else { + return Ok((vec![], vec![])); + }; + let mut s = Scanner::new(§ion); let mut infos = vec![]; + let mut returns = vec![]; while s.eat_if('-') { let mut named = false; @@ -134,6 +139,18 @@ fn params(docs: &mut String) -> Result<Vec<TokenStream>> { s.eat_whitespace(); let name = s.eat_until(':'); s.expect(": "); + + if name == "returns" { + returns = s + .eat_until('\n') + .split(" or ") + .map(str::trim) + .map(Into::into) + .collect(); + s.eat_whitespace(); + continue; + } + let ty: syn::Type = syn::parse_str(s.eat_until(char::is_whitespace))?; s.eat_whitespace(); s.expect('('); @@ -182,5 +199,5 @@ fn params(docs: &mut String) -> Result<Vec<TokenStream>> { s.eat_whitespace(); } - Ok(infos) + Ok((infos, returns)) } |
