diff --git a/rtic-macros/src/codegen/init.rs b/rtic-macros/src/codegen/init.rs index 6e1059f7eb..b667ae0fa5 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 27e6773f7f..d5510cbd5d 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, + pub shared_resources_vis: syn::Visibility, + /// Task local resources defined in `#[local]` pub local_resources: Map, + pub local_resources_vis: syn::Visibility, + /// User imports pub user_imports: Vec, @@ -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, + + /// 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 e797f75e37..2f2d816522 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 { (|input: ParseStream<'_>| -> parse::Result { @@ -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 ff1005763e..9ce6725384 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 { - 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 { 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 { - 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 { 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(), }) } } diff --git a/rtic-macros/ui/local-pub.rs b/rtic-macros/ui/local-pub.rs deleted file mode 100644 index 42da4f4746..0000000000 --- a/rtic-macros/ui/local-pub.rs +++ /dev/null @@ -1,15 +0,0 @@ -#![no_main] - -#[rtic_macros::mock_app(device = mock)] -mod app { - #[shared] - struct Shared {} - - #[local] - struct Local { - pub x: u32, - } - - #[init] - fn init(_: init::Context) -> (Shared, Local) {} -} diff --git a/rtic-macros/ui/local-pub.stderr b/rtic-macros/ui/local-pub.stderr deleted file mode 100644 index e4814ca080..0000000000 --- a/rtic-macros/ui/local-pub.stderr +++ /dev/null @@ -1,5 +0,0 @@ -error: this field must have inherited / private visibility - --> ui/local-pub.rs:10:13 - | -10 | pub x: u32, - | ^ diff --git a/rtic-macros/ui/shared-pub.rs b/rtic-macros/ui/shared-pub.rs deleted file mode 100644 index 10351fd562..0000000000 --- a/rtic-macros/ui/shared-pub.rs +++ /dev/null @@ -1,9 +0,0 @@ -#![no_main] - -#[rtic_macros::mock_app(device = mock)] -mod app { - #[shared] - struct Shared { - pub x: u32, - } -} diff --git a/rtic-macros/ui/shared-pub.stderr b/rtic-macros/ui/shared-pub.stderr deleted file mode 100644 index 71488933d1..0000000000 --- a/rtic-macros/ui/shared-pub.stderr +++ /dev/null @@ -1,5 +0,0 @@ -error: this field must have inherited / private visibility - --> ui/shared-pub.rs:7:13 - | -7 | pub x: u32, - | ^