diff options
author | 2022-12-31 14:45:13 +0100 | |
---|---|---|
committer | 2023-03-01 00:29:10 +0100 | |
commit | 7614b96fe45240dafe91ae549e712b560e2d4c10 (patch) | |
tree | 30e1666c0aac09480e1a87e5fe7965487f4a99e6 /macros/src/syntax/parse/idle.rs | |
parent | 1c5db277e4161470136dbd2a11e914ff1d383581 (diff) | |
download | rtic-7614b96fe45240dafe91ae549e712b560e2d4c10.tar.gz rtic-7614b96fe45240dafe91ae549e712b560e2d4c10.tar.zst rtic-7614b96fe45240dafe91ae549e712b560e2d4c10.zip |
RTIC v2: Initial commit
rtic-syntax is now part of RTIC repository
Diffstat (limited to 'macros/src/syntax/parse/idle.rs')
-rw-r--r-- | macros/src/syntax/parse/idle.rs | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/macros/src/syntax/parse/idle.rs b/macros/src/syntax/parse/idle.rs new file mode 100644 index 00000000..d9f3a99e --- /dev/null +++ b/macros/src/syntax/parse/idle.rs @@ -0,0 +1,45 @@ +use proc_macro2::TokenStream as TokenStream2; +use syn::{parse, ItemFn}; + +use crate::syntax::{ + ast::{Idle, IdleArgs}, + parse::util, +}; + +impl IdleArgs { + pub(crate) fn parse(tokens: TokenStream2) -> parse::Result<Self> { + crate::syntax::parse::idle_args(tokens) + } +} + +impl Idle { + pub(crate) fn parse(args: IdleArgs, item: ItemFn) -> parse::Result<Self> { + let valid_signature = util::check_fn_signature(&item, false) + && item.sig.inputs.len() == 1 + && util::type_is_bottom(&item.sig.output); + + let name = item.sig.ident.to_string(); + + if valid_signature { + if let Some((context, Ok(rest))) = util::parse_inputs(item.sig.inputs, &name) { + if rest.is_empty() { + return Ok(Idle { + args, + attrs: item.attrs, + context, + name: item.sig.ident, + stmts: item.block.stmts, + }); + } + } + } + + Err(parse::Error::new( + item.sig.ident.span(), + &format!( + "this `#[idle]` function must have signature `fn({}::Context) -> !`", + name + ), + )) + } +} |