rtic_macros/codegen/
local_resources.rs

1use crate::syntax::ast::App;
2use crate::{analyze::Analysis, codegen::util};
3use proc_macro2::TokenStream as TokenStream2;
4use quote::quote;
5
6/// Generates `local` variables and local resource proxies
7///
8/// I.e. the `static` variables and theirs proxies.
9pub fn codegen(app: &App, _analysis: &Analysis) -> TokenStream2 {
10    let mut mod_app = vec![];
11
12    // All local resources declared in the `#[local]' struct
13    for (name, res) in &app.local_resources {
14        let cfgs = &res.cfgs;
15        let ty = &res.ty;
16        let mangled_name = util::static_local_resource_ident(name);
17
18        let attrs = &res.attrs;
19
20        // late resources in `util::link_section_uninit`
21        // unless user specifies custom link section
22        let section = if attrs
23            .iter()
24            .any(|attr| attr.path().is_ident("link_section"))
25        {
26            None
27        } else {
28            Some(util::link_section_uninit())
29        };
30
31        // For future use
32        // let doc = format!(" RTIC internal: {}:{}", file!(), line!());
33        mod_app.push(quote!(
34            #[allow(non_camel_case_types)]
35            #[allow(non_upper_case_globals)]
36            // #[doc = #doc]
37            #[doc(hidden)]
38            #(#attrs)*
39            #(#cfgs)*
40            #section
41            static #mangled_name: rtic::RacyCell<core::mem::MaybeUninit<#ty>> = rtic::RacyCell::new(core::mem::MaybeUninit::uninit());
42        ));
43    }
44
45    // All declared `local = [NAME: TY = EXPR]` local resources
46    for (task_name, resource_name, task_local) in app.declared_local_resources() {
47        let cfgs = &task_local.cfgs;
48        let ty = &task_local.ty;
49        let expr = &task_local.expr;
50        let attrs = &task_local.attrs;
51
52        let mangled_name = util::declared_static_local_resource_ident(resource_name, task_name);
53
54        // For future use
55        // let doc = format!(" RTIC internal: {}:{}", file!(), line!());
56        mod_app.push(quote!(
57            #[allow(non_camel_case_types)]
58            #[allow(non_upper_case_globals)]
59            // #[doc = #doc]
60            #[doc(hidden)]
61            #(#attrs)*
62            #(#cfgs)*
63            static #mangled_name: rtic::RacyCell<#ty> = rtic::RacyCell::new(#expr);
64        ));
65    }
66
67    quote!(#(#mod_app)*)
68}