aboutsummaryrefslogtreecommitdiff
path: root/rtic-macros/src
diff options
context:
space:
mode:
authorGravatar Andrew Gazelka <andrew.gazelka@gmail.com> 2023-04-11 13:10:26 -0700
committerGravatar Andrew Gazelka <andrew.gazelka@gmail.com> 2023-04-12 15:26:06 -0700
commite47914ee50b838cceca77cd881dce9caaf689901 (patch)
treeb2696705d5a97ec53041a772378beaf70b5c5642 /rtic-macros/src
parent44c614d792c65aa2660f841e969db575f1ee6e86 (diff)
downloadrtic-e47914ee50b838cceca77cd881dce9caaf689901.tar.gz
rtic-e47914ee50b838cceca77cd881dce9caaf689901.tar.zst
rtic-e47914ee50b838cceca77cd881dce9caaf689901.zip
remove vis restriction for local and shared resources
Diffstat (limited to 'rtic-macros/src')
-rw-r--r--rtic-macros/src/codegen/init.rs12
-rw-r--r--rtic-macros/src/syntax/ast.rs10
-rw-r--r--rtic-macros/src/syntax/parse/app.rs34
-rw-r--r--rtic-macros/src/syntax/parse/resource.rs23
4 files changed, 36 insertions, 43 deletions
diff --git a/rtic-macros/src/codegen/init.rs b/rtic-macros/src/codegen/init.rs
index 6e1059f7..b667ae0f 100644
--- a/rtic-macros/src/codegen/init.rs
+++ b/rtic-macros/src/codegen/init.rs
@@ -18,7 +18,9 @@ pub fn codegen(app: &App, analysis: &Analysis) -> TokenStream2 {
let attrs = &init.attrs;
let stmts = &init.stmts;
let shared = &init.user_shared_struct;
+ let shared_vis = &app.shared_resources_vis;
let local = &init.user_local_struct;
+ let local_vis = &app.local_resources_vis;
let shared_resources: Vec<_> = app
.shared_resources
@@ -27,10 +29,11 @@ pub fn codegen(app: &App, analysis: &Analysis) -> TokenStream2 {
let ty = &v.ty;
let cfgs = &v.cfgs;
let docs = &v.docs;
+ let vis = &v.vis;
quote!(
#(#cfgs)*
#(#docs)*
- #k: #ty,
+ #vis #k: #ty,
)
})
.collect();
@@ -41,20 +44,21 @@ pub fn codegen(app: &App, analysis: &Analysis) -> TokenStream2 {
let ty = &v.ty;
let cfgs = &v.cfgs;
let docs = &v.docs;
+ let vis = &v.vis;
quote!(
#(#cfgs)*
#(#docs)*
- #k: #ty,
+ #vis #k: #ty,
)
})
.collect();
root_init.push(quote! {
- struct #shared {
+ #shared_vis struct #shared {
#(#shared_resources)*
}
- struct #local {
+ #local_vis struct #local {
#(#local_resources)*
}
});
diff --git a/rtic-macros/src/syntax/ast.rs b/rtic-macros/src/syntax/ast.rs
index 27e6773f..d5510cbd 100644
--- a/rtic-macros/src/syntax/ast.rs
+++ b/rtic-macros/src/syntax/ast.rs
@@ -23,9 +23,13 @@ pub struct App {
/// Resources shared between tasks defined in `#[shared]`
pub shared_resources: Map<SharedResource>,
+ pub shared_resources_vis: syn::Visibility,
+
/// Task local resources defined in `#[local]`
pub local_resources: Map<LocalResource>,
+ pub local_resources_vis: syn::Visibility,
+
/// User imports
pub user_imports: Vec<ItemUse>,
@@ -170,6 +174,9 @@ pub struct SharedResource {
/// Shared resource properties
pub properties: SharedResourceProperties,
+
+ /// The visibility of this resource
+ pub vis: syn::Visibility,
}
/// A local resource, defined in `#[local]`
@@ -187,6 +194,9 @@ pub struct LocalResource {
/// The type of this resource
pub ty: Box<Type>,
+
+ /// The visibility of this resource
+ pub vis: syn::Visibility,
}
/// An async software task
diff --git a/rtic-macros/src/syntax/parse/app.rs b/rtic-macros/src/syntax/parse/app.rs
index e797f75e..2f2d8165 100644
--- a/rtic-macros/src/syntax/parse/app.rs
+++ b/rtic-macros/src/syntax/parse/app.rs
@@ -8,7 +8,6 @@ use syn::{
Expr, ExprArray, Fields, ForeignItem, Ident, Item, LitBool, Path, Token, Visibility,
};
-use super::Input;
use crate::syntax::{
ast::{
App, AppArgs, Dispatcher, Dispatchers, HardwareTask, Idle, IdleArgs, Init, InitArgs,
@@ -18,6 +17,8 @@ use crate::syntax::{
Either, Map, Set,
};
+use super::Input;
+
impl AppArgs {
pub(crate) fn parse(tokens: TokenStream2) -> parse::Result<Self> {
(|input: ParseStream<'_>| -> parse::Result<Self> {
@@ -147,9 +148,13 @@ impl App {
let mut idle = None;
let mut shared_resources_ident = None;
+ let mut shared_resources_vis = Visibility::Inherited;
let mut shared_resources = Map::new();
+
let mut local_resources_ident = None;
+ let mut local_resources_vis = Visibility::Inherited;
let mut local_resources = Map::new();
+
let mut hardware_tasks = Map::new();
let mut software_tasks = Map::new();
let mut user_imports = vec![];
@@ -283,12 +288,7 @@ impl App {
));
}
- if struct_item.vis != Visibility::Inherited {
- return Err(parse::Error::new(
- struct_item.span(),
- "this item must have inherited / private visibility",
- ));
- }
+ shared_resources_vis = struct_item.vis.clone();
if let Fields::Named(fields) = &mut struct_item.fields {
for field in &mut fields.named {
@@ -301,10 +301,8 @@ impl App {
));
}
- shared_resources.insert(
- ident.clone(),
- SharedResource::parse(field, ident.span())?,
- );
+ shared_resources
+ .insert(ident.clone(), SharedResource::parse(field)?);
}
} else {
return Err(parse::Error::new(
@@ -328,12 +326,7 @@ impl App {
));
}
- if struct_item.vis != Visibility::Inherited {
- return Err(parse::Error::new(
- struct_item.span(),
- "this item must have inherited / private visibility",
- ));
- }
+ local_resources_vis = struct_item.vis.clone();
if let Fields::Named(fields) = &mut struct_item.fields {
for field in &mut fields.named {
@@ -346,10 +339,7 @@ impl App {
));
}
- local_resources.insert(
- ident.clone(),
- LocalResource::parse(field, ident.span())?,
- );
+ local_resources.insert(ident.clone(), LocalResource::parse(field)?);
}
} else {
return Err(parse::Error::new(
@@ -470,7 +460,9 @@ impl App {
init,
idle,
shared_resources,
+ shared_resources_vis,
local_resources,
+ local_resources_vis,
user_imports,
user_code,
hardware_tasks,
diff --git a/rtic-macros/src/syntax/parse/resource.rs b/rtic-macros/src/syntax/parse/resource.rs
index ff100576..9ce67253 100644
--- a/rtic-macros/src/syntax/parse/resource.rs
+++ b/rtic-macros/src/syntax/parse/resource.rs
@@ -1,5 +1,4 @@
-use proc_macro2::Span;
-use syn::{parse, Field, Visibility};
+use syn::{parse, Field};
use crate::syntax::parse::util::FilterAttrs;
use crate::syntax::{
@@ -8,14 +7,7 @@ use crate::syntax::{
};
impl SharedResource {
- pub(crate) fn parse(item: &Field, span: Span) -> parse::Result<Self> {
- if item.vis != Visibility::Inherited {
- return Err(parse::Error::new(
- span,
- "this field must have inherited / private visibility",
- ));
- }
-
+ pub(crate) fn parse(item: &Field) -> parse::Result<Self> {
let FilterAttrs {
cfgs,
mut attrs,
@@ -30,19 +22,13 @@ impl SharedResource {
docs,
ty: Box::new(item.ty.clone()),
properties: SharedResourceProperties { lock_free },
+ vis: item.vis.clone(),
})
}
}
impl LocalResource {
- pub(crate) fn parse(item: &Field, span: Span) -> parse::Result<Self> {
- if item.vis != Visibility::Inherited {
- return Err(parse::Error::new(
- span,
- "this field must have inherited / private visibility",
- ));
- }
-
+ pub(crate) fn parse(item: &Field) -> parse::Result<Self> {
let FilterAttrs { cfgs, attrs, docs } = util::filter_attributes(item.attrs.clone());
Ok(LocalResource {
@@ -50,6 +36,7 @@ impl LocalResource {
attrs,
docs,
ty: Box::new(item.ty.clone()),
+ vis: item.vis.clone(),
})
}
}