1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
use syn::{Expr, Ident};
use crate::{
analyze::{Analysis, Location, Priority},
ast::{Access, App, LateResource},
};
impl App {
pub fn resource(&self, name: &Ident) -> Option<(&LateResource, Option<&Expr>)> {
self.late_resources
.get(name)
.map(|late| (late, None))
.or_else(|| {
self.resources
.get(name)
.map(|res| (&res.late, Some(&*res.expr)))
})
}
pub fn resources<'a>(
&'a self,
analysis: &'a Analysis,
) -> impl Iterator<Item = (&'a Ident, &'a LateResource, Option<&'a Expr>, &'a Location)> {
analysis.locations.iter().map(move |(name, loc)| {
let (res, expr) = self.resource(name).expect("UNREACHABLE");
(name, res, expr, loc)
})
}
pub(crate) fn resource_accesses(
&self,
) -> impl Iterator<Item = (Option<Priority>, &Ident, Access)> {
self.inits
.iter()
.flat_map(|init| {
init.args
.resources
.iter()
.map(move |(name, access)| (None, name, *access))
})
.chain(self.idles.iter().flat_map(|idle| {
idle.args
.resources
.iter()
.map(move |(name, access)| (Some(0), name, *access))
}))
.chain(self.hardware_tasks.values().flat_map(|task| {
task.args
.resources
.iter()
.map(move |(name, access)| (Some(task.args.priority), name, *access))
}))
.chain(self.software_tasks.values().flat_map(|task| {
task.args
.resources
.iter()
.map(move |(name, access)| (Some(task.args.priority), name, *access))
}))
}
}