diff options
Diffstat (limited to 'macros/src/syntax')
-rw-r--r-- | macros/src/syntax/mod.rs | 6 | ||||
-rw-r--r-- | macros/src/syntax/parse.rs | 16 |
2 files changed, 13 insertions, 9 deletions
diff --git a/macros/src/syntax/mod.rs b/macros/src/syntax/mod.rs index 53c17a82..757e05ed 100644 --- a/macros/src/syntax/mod.rs +++ b/macros/src/syntax/mod.rs @@ -10,7 +10,7 @@ pub struct App { pub device: Tokens, pub idle: Idle, pub init: Init, - pub resources: Resources, + pub resources: Statics, pub tasks: Tasks, } @@ -21,7 +21,7 @@ pub struct Init { #[derive(Debug)] pub struct Idle { - pub local: Resources, + pub local: Statics, pub path: Tokens, pub resources: HashSet<Ident>, } @@ -46,6 +46,6 @@ pub struct Resource { pub ty: Tokens, } -pub type Resources = HashMap<Ident, Resource>; +pub type Statics = HashMap<Ident, Resource>; pub type Tasks = HashMap<Ident, Task>; diff --git a/macros/src/syntax/parse.rs b/macros/src/syntax/parse.rs index 9cfbd78b..056e804a 100644 --- a/macros/src/syntax/parse.rs +++ b/macros/src/syntax/parse.rs @@ -2,7 +2,7 @@ use std::collections::{HashMap, HashSet}; use syn::{self, DelimToken, Ident, IntTy, Lit, Token, TokenTree}; -use syntax::{App, Idle, Init, Kind, Resource, Resources, Task, Tasks}; +use syntax::{App, Idle, Init, Kind, Resource, Statics, Task, Tasks}; pub fn app(input: &str) -> App { let tts = syn::parse_token_trees(input).unwrap(); @@ -96,7 +96,7 @@ pub fn app(input: &str) -> App { block.delim ); - resources = Some(super::parse::resources(block.tts)); + resources = Some(super::parse::statics(block.tts)); } } "tasks" => { @@ -169,7 +169,7 @@ pub fn idle(tts: Vec<TokenTree>) -> Idle { block.delim ); - local = Some(super::parse::resources(block.tts)); + local = Some(super::parse::statics(block.tts)); } else { panic!("expected block, found {:?}", tt); } @@ -273,7 +273,7 @@ pub fn init(tts: Vec<TokenTree>) -> Init { fn idents(tts: Vec<TokenTree>) -> HashSet<Ident> { let mut idents = HashSet::new(); - let mut tts = tts.into_iter(); + let mut tts = tts.into_iter().peekable(); while let Some(tt) = tts.next() { if let TokenTree::Token(Token::Ident(id)) = tt { assert!(!idents.contains(&id), "ident {} already listed", id); @@ -281,6 +281,10 @@ fn idents(tts: Vec<TokenTree>) -> HashSet<Ident> { if let Some(tt) = tts.next() { assert_eq!(tt, TokenTree::Token(Token::Comma)); + + if tts.peek().is_none() { + break; + } } else { break; } @@ -292,7 +296,7 @@ fn idents(tts: Vec<TokenTree>) -> HashSet<Ident> { idents } -pub fn resources(tts: Vec<TokenTree>) -> Resources { +pub fn statics(tts: Vec<TokenTree>) -> Statics { let mut resources = HashMap::new(); let mut tts = tts.into_iter(); @@ -502,7 +506,7 @@ fn task(tts: Vec<TokenTree>) -> Task { ); } - let resources = resources.expect("resources field is missing"); + let resources = resources.unwrap_or(HashSet::new()); let priority = priority.expect("priority field is missing"); let kind = if let Some(enabled) = enabled { Kind::Interrupt { enabled } |