diff options
Diffstat (limited to 'macros/src/syntax/ast.rs')
-rw-r--r-- | macros/src/syntax/ast.rs | 335 |
1 files changed, 0 insertions, 335 deletions
diff --git a/macros/src/syntax/ast.rs b/macros/src/syntax/ast.rs deleted file mode 100644 index 27e6773f..00000000 --- a/macros/src/syntax/ast.rs +++ /dev/null @@ -1,335 +0,0 @@ -//! Abstract Syntax Tree - -use syn::{Attribute, Expr, Ident, Item, ItemUse, Pat, PatType, Path, Stmt, Type}; - -use crate::syntax::Map; - -/// The `#[app]` attribute -#[derive(Debug)] -#[non_exhaustive] -pub struct App { - /// The arguments to the `#[app]` attribute - pub args: AppArgs, - - /// The name of the `const` item on which the `#[app]` attribute has been placed - pub name: Ident, - - /// The `#[init]` function - pub init: Init, - - /// The `#[idle]` function - pub idle: Option<Idle>, - - /// Resources shared between tasks defined in `#[shared]` - pub shared_resources: Map<SharedResource>, - - /// Task local resources defined in `#[local]` - pub local_resources: Map<LocalResource>, - - /// User imports - pub user_imports: Vec<ItemUse>, - - /// User code - pub user_code: Vec<Item>, - - /// Hardware tasks: `#[task(binds = ..)]`s - pub hardware_tasks: Map<HardwareTask>, - - /// Async software tasks: `#[task]` - pub software_tasks: Map<SoftwareTask>, -} - -/// Interrupts used to dispatch software tasks -pub type Dispatchers = Map<Dispatcher>; - -/// Interrupt that could be used to dispatch software tasks -#[derive(Debug, Clone)] -#[non_exhaustive] -pub struct Dispatcher { - /// Attributes that will apply to this interrupt handler - pub attrs: Vec<Attribute>, -} - -/// The arguments of the `#[app]` attribute -#[derive(Debug)] -pub struct AppArgs { - /// Device - pub device: Path, - - /// Peripherals - pub peripherals: bool, - - /// Interrupts used to dispatch software tasks - pub dispatchers: Dispatchers, -} - -/// The `init`-ialization function -#[derive(Debug)] -#[non_exhaustive] -pub struct Init { - /// `init` context metadata - pub args: InitArgs, - - /// Attributes that will apply to this `init` function - pub attrs: Vec<Attribute>, - - /// The name of the `#[init]` function - pub name: Ident, - - /// The context argument - pub context: Box<Pat>, - - /// The statements that make up this `init` function - pub stmts: Vec<Stmt>, - - /// The name of the user provided shared resources struct - pub user_shared_struct: Ident, - - /// The name of the user provided local resources struct - pub user_local_struct: Ident, -} - -/// `init` context metadata -#[derive(Debug)] -#[non_exhaustive] -pub struct InitArgs { - /// Local resources that can be accessed from this context - pub local_resources: LocalResources, -} - -impl Default for InitArgs { - fn default() -> Self { - Self { - local_resources: LocalResources::new(), - } - } -} - -/// The `idle` context -#[derive(Debug)] -#[non_exhaustive] -pub struct Idle { - /// `idle` context metadata - pub args: IdleArgs, - - /// Attributes that will apply to this `idle` function - pub attrs: Vec<Attribute>, - - /// The name of the `#[idle]` function - pub name: Ident, - - /// The context argument - pub context: Box<Pat>, - - /// The statements that make up this `idle` function - pub stmts: Vec<Stmt>, -} - -/// `idle` context metadata -#[derive(Debug)] -#[non_exhaustive] -pub struct IdleArgs { - /// Local resources that can be accessed from this context - pub local_resources: LocalResources, - - /// Shared resources that can be accessed from this context - pub shared_resources: SharedResources, -} - -impl Default for IdleArgs { - fn default() -> Self { - Self { - local_resources: LocalResources::new(), - shared_resources: SharedResources::new(), - } - } -} - -/// Shared resource properties -#[derive(Debug)] -pub struct SharedResourceProperties { - /// A lock free (exclusive resource) - pub lock_free: bool, -} - -/// A shared resource, defined in `#[shared]` -#[derive(Debug)] -#[non_exhaustive] -pub struct SharedResource { - /// `#[cfg]` attributes like `#[cfg(debug_assertions)]` - pub cfgs: Vec<Attribute>, - - /// `#[doc]` attributes like `/// this is a docstring` - pub docs: Vec<Attribute>, - - /// Attributes that will apply to this resource - pub attrs: Vec<Attribute>, - - /// The type of this resource - pub ty: Box<Type>, - - /// Shared resource properties - pub properties: SharedResourceProperties, -} - -/// A local resource, defined in `#[local]` -#[derive(Debug)] -#[non_exhaustive] -pub struct LocalResource { - /// `#[cfg]` attributes like `#[cfg(debug_assertions)]` - pub cfgs: Vec<Attribute>, - - /// `#[doc]` attributes like `/// this is a docstring` - pub docs: Vec<Attribute>, - - /// Attributes that will apply to this resource - pub attrs: Vec<Attribute>, - - /// The type of this resource - pub ty: Box<Type>, -} - -/// An async software task -#[derive(Debug)] -#[non_exhaustive] -pub struct SoftwareTask { - /// Software task metadata - pub args: SoftwareTaskArgs, - - /// `#[cfg]` attributes like `#[cfg(debug_assertions)]` - pub cfgs: Vec<Attribute>, - - /// Attributes that will apply to this interrupt handler - pub attrs: Vec<Attribute>, - - /// The context argument - pub context: Box<Pat>, - - /// The inputs of this software task - pub inputs: Vec<PatType>, - - /// The statements that make up the task handler - pub stmts: Vec<Stmt>, - - /// The task is declared externally - pub is_extern: bool, -} - -/// Software task metadata -#[derive(Debug)] -#[non_exhaustive] -pub struct SoftwareTaskArgs { - /// The priority of this task - pub priority: u8, - - /// Local resources that can be accessed from this context - pub local_resources: LocalResources, - - /// Shared resources that can be accessed from this context - pub shared_resources: SharedResources, -} - -impl Default for SoftwareTaskArgs { - fn default() -> Self { - Self { - priority: 1, - local_resources: LocalResources::new(), - shared_resources: SharedResources::new(), - } - } -} - -/// A hardware task -#[derive(Debug)] -#[non_exhaustive] -pub struct HardwareTask { - /// Hardware task metadata - pub args: HardwareTaskArgs, - - /// `#[cfg]` attributes like `#[cfg(debug_assertions)]` - pub cfgs: Vec<Attribute>, - - /// Attributes that will apply to this interrupt handler - pub attrs: Vec<Attribute>, - - /// The context argument - pub context: Box<Pat>, - - /// The statements that make up the task handler - pub stmts: Vec<Stmt>, - - /// The task is declared externally - pub is_extern: bool, -} - -/// Hardware task metadata -#[derive(Debug)] -#[non_exhaustive] -pub struct HardwareTaskArgs { - /// The interrupt or exception that this task is bound to - pub binds: Ident, - - /// The priority of this task - pub priority: u8, - - /// Local resources that can be accessed from this context - pub local_resources: LocalResources, - - /// Shared resources that can be accessed from this context - pub shared_resources: SharedResources, -} - -/// A `static mut` variable local to and owned by a context -#[derive(Debug)] -#[non_exhaustive] -pub struct Local { - /// Attributes like `#[link_section]` - pub attrs: Vec<Attribute>, - - /// `#[cfg]` attributes like `#[cfg(debug_assertions)]` - pub cfgs: Vec<Attribute>, - - /// Type - pub ty: Box<Type>, - - /// Initial value - pub expr: Box<Expr>, -} - -/// A wrapper of the 2 kinds of locals that tasks can have -#[derive(Debug)] -#[non_exhaustive] -pub enum TaskLocal { - /// The local is declared externally (i.e. `#[local]` struct) - External, - /// The local is declared in the task - Declared(Local), -} - -/// Resource access -#[derive(Clone, Copy, Debug, Eq, PartialEq)] -pub enum Access { - /// `[x]`, a mutable resource - Exclusive, - - /// `[&x]`, a static non-mutable resource - Shared, -} - -impl Access { - /// Is this enum in the `Exclusive` variant? - pub fn is_exclusive(&self) -> bool { - *self == Access::Exclusive - } - - /// Is this enum in the `Shared` variant? - pub fn is_shared(&self) -> bool { - *self == Access::Shared - } -} - -/// Shared resource access list in task attribute -pub type SharedResources = Map<Access>; - -/// Local resource access/declaration list in task attribute -pub type LocalResources = Map<TaskLocal>; |