aboutsummaryrefslogtreecommitdiff
path: root/macros/src/syntax/check.rs
diff options
context:
space:
mode:
authorEmil Fresk <emil.fresk@gmail.com>2022-12-31 14:45:13 +0100
committerHenrik Tjäder <henrik@tjaders.com>2023-03-01 00:29:10 +0100
commit7614b96fe45240dafe91ae549e712b560e2d4c10 (patch)
tree30e1666c0aac09480e1a87e5fe7965487f4a99e6 /macros/src/syntax/check.rs
parent1c5db277e4161470136dbd2a11e914ff1d383581 (diff)
RTIC v2: Initial commit
rtic-syntax is now part of RTIC repository
Diffstat (limited to 'macros/src/syntax/check.rs')
-rw-r--r--macros/src/syntax/check.rs66
1 files changed, 66 insertions, 0 deletions
diff --git a/macros/src/syntax/check.rs b/macros/src/syntax/check.rs
new file mode 100644
index 0000000..989d418
--- /dev/null
+++ b/macros/src/syntax/check.rs
@@ -0,0 +1,66 @@
+use std::collections::HashSet;
+
+use syn::parse;
+
+use crate::syntax::ast::App;
+
+pub fn app(app: &App) -> parse::Result<()> {
+ // Check that all referenced resources have been declared
+ // Check that resources are NOT `Exclusive`-ly shared
+ let mut owners = HashSet::new();
+ for (_, name, access) in app.shared_resource_accesses() {
+ if app.shared_resources.get(name).is_none() {
+ return Err(parse::Error::new(
+ name.span(),
+ "this shared resource has NOT been declared",
+ ));
+ }
+
+ if access.is_exclusive() {
+ owners.insert(name);
+ }
+ }
+
+ for name in app.local_resource_accesses() {
+ if app.local_resources.get(name).is_none() {
+ return Err(parse::Error::new(
+ name.span(),
+ "this local resource has NOT been declared",
+ ));
+ }
+ }
+
+ // Check that no resource has both types of access (`Exclusive` & `Shared`)
+ let exclusive_accesses = app
+ .shared_resource_accesses()
+ .filter_map(|(priority, name, access)| {
+ if priority.is_some() && access.is_exclusive() {
+ Some(name)
+ } else {
+ None
+ }
+ })
+ .collect::<HashSet<_>>();
+ for (_, name, access) in app.shared_resource_accesses() {
+ if access.is_shared() && exclusive_accesses.contains(name) {
+ return Err(parse::Error::new(
+ name.span(),
+ "this implementation doesn't support shared (`&-`) - exclusive (`&mut-`) locks; use `x` instead of `&x`",
+ ));
+ }
+ }
+
+ // check that dispatchers are not used as hardware tasks
+ for task in app.hardware_tasks.values() {
+ let binds = &task.args.binds;
+
+ if app.args.dispatchers.contains_key(binds) {
+ return Err(parse::Error::new(
+ binds.span(),
+ "dispatcher interrupts can't be used as hardware tasks",
+ ));
+ }
+ }
+
+ Ok(())
+}