rtic_macros/codegen/
idle.rs

1use crate::syntax::{ast::App, Context};
2use crate::{
3    analyze::Analysis,
4    codegen::{local_resources_struct, module, shared_resources_struct},
5};
6use proc_macro2::TokenStream as TokenStream2;
7use quote::quote;
8
9/// Generates support code for `#[idle]` functions
10pub fn codegen(app: &App, analysis: &Analysis) -> TokenStream2 {
11    if let Some(idle) = &app.idle {
12        let mut mod_app = vec![];
13        let mut root_idle = vec![];
14
15        let name = &idle.name;
16
17        if !idle.args.shared_resources.is_empty() {
18            let (item, constructor) = shared_resources_struct::codegen(Context::Idle, app);
19
20            root_idle.push(item);
21            mod_app.push(constructor);
22        }
23
24        if !idle.args.local_resources.is_empty() {
25            let (item, constructor) = local_resources_struct::codegen(Context::Idle, app);
26
27            root_idle.push(item);
28
29            mod_app.push(constructor);
30        }
31
32        root_idle.push(module::codegen(Context::Idle, app, analysis));
33
34        let attrs = &idle.attrs;
35        let context = &idle.context;
36        let stmts = &idle.stmts;
37        let user_idle = if !idle.is_extern {
38            Some(quote!(
39                #(#attrs)*
40                #[allow(non_snake_case)]
41                fn #name(#context: #name::Context) -> ! {
42                    use rtic::Mutex as _;
43                    use rtic::mutex::prelude::*;
44
45                    #(#stmts)*
46                }
47            ))
48        } else {
49            None
50        };
51
52        quote!(
53            #(#mod_app)*
54
55            #(#root_idle)*
56
57            #user_idle
58        )
59    } else {
60        quote!()
61    }
62}