1mod branch;
2mod error;
3mod filter;
4mod graph;
5mod group;
6mod res;
7pub use branch::*;
8pub use error::*;
9pub use filter::*;
10pub use graph::*;
11pub use group::*;
12pub use res::*;
13
14pub mod defs;
15pub mod mir;
16pub use defs::Defs;
17
18type Result<T, E = DeclareError> = std::result::Result<T, E>;
19
20#[cfg(test)]
21mod tests {
22
23 use super::*;
24
25 #[test]
26 fn feature() {
27 let no_span = terl::Span::new(0, 0);
36 let ordered_span = |idx: usize| terl::Span::new(idx, idx + 1);
37
38 use py_ir::types::{ComplexType, TypeDefine};
39
40 let raw_types = (0..6)
41 .map(|idx| TypeDefine::from(ComplexType::no_decorators(format!("t{idx}"))))
42 .collect::<Vec<_>>();
43 let types = raw_types
44 .iter()
45 .map(|raw| Type::from(raw.clone()))
46 .collect::<Vec<_>>();
47 let filters = raw_types
48 .iter()
49 .map(|raw| filters::TypeEqual::new(raw, no_span))
50 .collect::<Vec<_>>();
51
52 let mut map = DeclareGraph::new();
53 let defs = Defs::new();
54
55 let m1 = map.build_group(GroupBuilder::new(
56 ordered_span(1),
57 vec![
58 types[1].clone().into(),
59 types[2].clone().into(),
60 types[3].clone().into(),
61 ],
62 ));
63 let n1 = map.build_group(GroupBuilder::new(
64 ordered_span(2),
65 vec![
66 types[2].clone().into(),
67 types[3].clone().into(),
68 types[4].clone().into(),
69 ],
70 ));
71
72 let i = {
73 let gb = GroupBuilder::new(
74 ordered_span(11),
75 vec![
76 BranchesBuilder::new(types[3].clone())
77 .new_depend::<Directly, _>(&mut map, &defs, m1, &filters[1])
78 .new_depend::<Directly, _>(&mut map, &defs, n1, &filters[2]),
79 BranchesBuilder::new(types[4].clone())
80 .new_depend::<Directly, _>(&mut map, &defs, m1, &filters[2])
81 .new_depend::<Directly, _>(&mut map, &defs, n1, &filters[3]),
82 BranchesBuilder::new(types[5].clone())
83 .new_depend::<Directly, _>(&mut map, &defs, m1, &filters[3])
84 .new_depend::<Directly, _>(&mut map, &defs, n1, &filters[4]),
85 ],
86 );
87
88 map.build_group(gb)
89 };
90
91 let m2 = map.build_group(GroupBuilder::new(
92 ordered_span(3),
93 vec![
94 types[1].clone().into(),
95 types[2].clone().into(),
96 types[3].clone().into(),
97 ],
98 ));
99 let n2 = map.build_group(GroupBuilder::new(
100 ordered_span(4),
101 vec![
102 types[2].clone().into(),
103 types[3].clone().into(),
104 types[4].clone().into(),
105 ],
106 ));
107 let j = {
108 let gb = GroupBuilder::new(
109 ordered_span(12),
110 vec![
111 BranchesBuilder::new(types[3].clone())
112 .new_depend::<Directly, _>(&mut map, &defs, m2, &filters[1])
113 .new_depend::<Directly, _>(&mut map, &defs, n2, &filters[2]),
114 BranchesBuilder::new(types[4].clone())
115 .new_depend::<Directly, _>(&mut map, &defs, m2, &filters[2])
116 .new_depend::<Directly, _>(&mut map, &defs, n2, &filters[3]),
117 BranchesBuilder::new(types[5].clone())
118 .new_depend::<Directly, _>(&mut map, &defs, m2, &filters[3])
119 .new_depend::<Directly, _>(&mut map, &defs, n2, &filters[4]),
120 ],
121 );
122 map.build_group(gb)
123 };
124
125 let _k = {
126 let gb = GroupBuilder::new(
127 ordered_span(21),
128 vec![
129 BranchesBuilder::new(types[3].clone())
130 .new_depend::<Directly, _>(&mut map, &defs, i, &filters[1])
131 .new_depend::<Directly, _>(&mut map, &defs, j, &filters[2]),
132 BranchesBuilder::new(types[4].clone())
133 .new_depend::<Directly, _>(&mut map, &defs, i, &filters[2])
134 .new_depend::<Directly, _>(&mut map, &defs, j, &filters[3]),
135 BranchesBuilder::new(types[5].clone())
136 .new_depend::<Directly, _>(&mut map, &defs, i, &filters[3])
137 .new_depend::<Directly, _>(&mut map, &defs, j, &filters[4]),
138 ],
139 );
140 map.build_group(gb)
141 };
142
143 assert!(map.declare_all().is_ok());
146 }
147}