diff options
author | 2020-10-05 08:40:19 +0000 | |
---|---|---|
committer | 2020-10-05 08:40:19 +0000 | |
commit | dbf9a7f2983fb00aee130305fec0019c12eaef76 (patch) | |
tree | 0422a3712af398436cebfa9f8e6ac422de65dde1 /macros/src/codegen.rs | |
parent | 04d415c3c6cce7f763decdf02104d827f2e4de7c (diff) | |
parent | 95503b6bdff3f392450d1972b0c499b79a9c2092 (diff) | |
download | rtic-dbf9a7f2983fb00aee130305fec0019c12eaef76.tar.gz rtic-dbf9a7f2983fb00aee130305fec0019c12eaef76.tar.zst rtic-dbf9a7f2983fb00aee130305fec0019c12eaef76.zip |
Merge #368
368: Mod over const r=korken89 a=AfoHT
Related [RFC](https://github.com/rtic-rs/rfcs/pull/34)
Dependent on [rtic-syntax-PR30](https://github.com/rtic-rs/rtic-syntax/pull/30)
~~Currently using my own dev-branch~~
Co-authored-by: Henrik Tjäder <henrik@tjaders.com>
Diffstat (limited to 'macros/src/codegen.rs')
-rw-r--r-- | macros/src/codegen.rs | 96 |
1 files changed, 70 insertions, 26 deletions
diff --git a/macros/src/codegen.rs b/macros/src/codegen.rs index fe4d59a6..f230d395 100644 --- a/macros/src/codegen.rs +++ b/macros/src/codegen.rs @@ -25,21 +25,36 @@ mod util; // TODO document the syntax here or in `rtic-syntax` pub fn app(app: &App, analysis: &Analysis, extra: &Extra) -> TokenStream2 { - let mut const_app = vec![]; + let mut mod_app = vec![]; + let mut mod_app_imports = vec![]; let mut mains = vec![]; let mut root = vec![]; let mut user = vec![]; + let mut imports = vec![]; // Generate the `main` function let assertion_stmts = assertions::codegen(analysis); let pre_init_stmts = pre_init::codegen(&app, analysis, extra); - let (const_app_init, root_init, user_init, call_init) = init::codegen(app, analysis, extra); + let (mod_app_init, root_init, user_init, user_init_imports, call_init) = + init::codegen(app, analysis, extra); let post_init_stmts = post_init::codegen(&app, analysis); - let (const_app_idle, root_idle, user_idle, call_idle) = idle::codegen(app, analysis, extra); + let (mod_app_idle, root_idle, user_idle, user_idle_imports, call_idle) = + idle::codegen(app, analysis, extra); + + if user_init.is_some() { + mod_app_imports.push(quote!( + use super::init; + )) + } + if user_idle.is_some() { + mod_app_imports.push(quote!( + use super::idle; + )) + } user.push(quote!( #user_init @@ -47,16 +62,21 @@ pub fn app(app: &App, analysis: &Analysis, extra: &Extra) -> TokenStream2 { #user_idle )); + imports.push(quote!( + #(#user_init_imports)* + #(#user_idle_imports)* + )); + root.push(quote!( #(#root_init)* #(#root_idle)* )); - const_app.push(quote!( - #const_app_init + mod_app.push(quote!( + #mod_app_init - #const_app_idle + #mod_app_idle )); let main = util::suffixed("main"); @@ -77,22 +97,33 @@ pub fn app(app: &App, analysis: &Analysis, extra: &Extra) -> TokenStream2 { } )); - let (const_app_resources, mod_resources) = resources::codegen(app, analysis, extra); + let (mod_app_resources, mod_resources, mod_resources_imports) = + resources::codegen(app, analysis, extra); - let (const_app_hardware_tasks, root_hardware_tasks, user_hardware_tasks) = - hardware_tasks::codegen(app, analysis, extra); + let ( + mod_app_hardware_tasks, + root_hardware_tasks, + user_hardware_tasks, + user_hardware_tasks_imports, + ) = hardware_tasks::codegen(app, analysis, extra); - let (const_app_software_tasks, root_software_tasks, user_software_tasks) = - software_tasks::codegen(app, analysis, extra); + let ( + mod_app_software_tasks, + root_software_tasks, + user_software_tasks, + user_software_tasks_imports, + ) = software_tasks::codegen(app, analysis, extra); - let const_app_dispatchers = dispatchers::codegen(app, analysis, extra); + let mod_app_dispatchers = dispatchers::codegen(app, analysis, extra); - let const_app_spawn = spawn::codegen(app, analysis, extra); + let mod_app_spawn = spawn::codegen(app, analysis, extra); - let const_app_timer_queue = timer_queue::codegen(app, analysis, extra); + let mod_app_timer_queue = timer_queue::codegen(app, analysis, extra); - let const_app_schedule = schedule::codegen(app, extra); + let mod_app_schedule = schedule::codegen(app, extra); + let user_imports = app.user_imports.clone(); + let user_code = app.user_code.clone(); let name = &app.name; let device = extra.device; quote!( @@ -111,28 +142,41 @@ pub fn app(app: &App, analysis: &Analysis, extra: &Extra) -> TokenStream2 { #(#root_software_tasks)* /// Implementation details - // The user can't access the items within this `const` item - const #name: () = { + mod #name { /// Always include the device crate which contains the vector table use #device as _; + #(#imports)* + #(#user_imports)* + + /// User code from within the module + #(#user_code)* + /// User code end + - #(#const_app)* + #(#user_hardware_tasks_imports)* - #(#const_app_resources)* + #(#user_software_tasks_imports)* - #(#const_app_hardware_tasks)* + #(#mod_resources_imports)* - #(#const_app_software_tasks)* + /// app module + #(#mod_app)* - #(#const_app_dispatchers)* + #(#mod_app_resources)* - #(#const_app_spawn)* + #(#mod_app_hardware_tasks)* - #(#const_app_timer_queue)* + #(#mod_app_software_tasks)* - #(#const_app_schedule)* + #(#mod_app_dispatchers)* + + #(#mod_app_spawn)* + + #(#mod_app_timer_queue)* + + #(#mod_app_schedule)* #(#mains)* - }; + } ) } |