aboutsummaryrefslogtreecommitdiff
path: root/macros/src/codegen.rs
diff options
context:
space:
mode:
authorGravatar bors[bot] <26634292+bors[bot]@users.noreply.github.com> 2020-10-05 08:40:19 +0000
committerGravatar GitHub <noreply@github.com> 2020-10-05 08:40:19 +0000
commitdbf9a7f2983fb00aee130305fec0019c12eaef76 (patch)
tree0422a3712af398436cebfa9f8e6ac422de65dde1 /macros/src/codegen.rs
parent04d415c3c6cce7f763decdf02104d827f2e4de7c (diff)
parent95503b6bdff3f392450d1972b0c499b79a9c2092 (diff)
downloadrtic-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.rs96
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)*
- };
+ }
)
}