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
9pub 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}