aboutsummaryrefslogtreecommitdiff
path: root/macros/src/codegen/resources_struct.rs
diff options
context:
space:
mode:
Diffstat (limited to 'macros/src/codegen/resources_struct.rs')
-rw-r--r--macros/src/codegen/resources_struct.rs66
1 files changed, 64 insertions, 2 deletions
diff --git a/macros/src/codegen/resources_struct.rs b/macros/src/codegen/resources_struct.rs
index 07a60616..17503a66 100644
--- a/macros/src/codegen/resources_struct.rs
+++ b/macros/src/codegen/resources_struct.rs
@@ -4,6 +4,7 @@ use rtfm_syntax::{ast::App, Context};
use crate::{analyze::Analysis, codegen::util};
+// TODO need to do something different when generators are involved
pub fn codegen(
ctxt: Context,
priority: u8,
@@ -63,6 +64,67 @@ pub fn codegen(
#name: &mut #name
));
}
+ } else if ctxt.is_generator(app) {
+ let ownership = &analysis.ownerships[name];
+
+ if ownership.needs_lock(priority) {
+ if mut_.is_none() {
+ // mod gresourcesd
+ unimplemented!()
+ } else {
+ // resource proxy
+ fields.push(quote!(
+ #(#cfgs)*
+ pub #name: gresources::#name
+ ));
+
+ values.push(quote!(
+ #(#cfgs)*
+ #name: gresources::#name::new()
+
+ ));
+
+ continue;
+ }
+ } else {
+ let lt = if ctxt.runs_once(app) {
+ quote!('static)
+ } else {
+ lt = Some(quote!('a));
+ quote!('a)
+ };
+
+ if ownership.is_owned() || mut_.is_none() {
+ fields.push(quote!(
+ #(#cfgs)*
+ pub #name: &#lt #mut_ #ty
+ ));
+ } else {
+ fields.push(quote!(
+ #(#cfgs)*
+ pub #name: &#lt mut #ty
+ ));
+ }
+ }
+
+ let is_late = expr.is_none();
+ if is_late {
+ let expr = if mut_.is_some() {
+ quote!(&mut *#name.as_mut_ptr())
+ } else {
+ quote!(&*#name.as_ptr())
+ };
+
+ values.push(quote!(
+ #(#cfgs)*
+ #name: #expr
+ ));
+ } else {
+ values.push(quote!(
+ #(#cfgs)*
+ #name: &#mut_ #name
+ ));
+ }
} else {
let ownership = &analysis.ownerships[name];
@@ -92,7 +154,7 @@ pub fn codegen(
continue;
}
} else {
- let lt = if ctxt.runs_once() {
+ let lt = if ctxt.runs_once(app) {
quote!('static)
} else {
lt = Some(quote!('a));
@@ -161,7 +223,7 @@ pub fn codegen(
}
);
- let arg = if ctxt.is_init() {
+ let arg = if ctxt.is_init() || ctxt.is_generator(app) {
None
} else {
Some(quote!(priority: &#lt rtfm::export::Priority))