1#[derive(Debug, Clone, Copy, PartialEq, Eq)]
2pub enum Kind {
3 Ns,
4 Uses,
5 Use,
6 Fn,
7 Arg,
8 Current,
9 Block,
10 Expr,
11 Add,
12 Mul,
13 Pow,
14 Val,
15 Call,
16 CallArg,
17 Assign,
18 Left,
19 Right,
20 Item,
21 ItemExtra,
22 Return,
23 Object,
24 Array,
25 ArrayItem,
26 ArrayFill,
27 Fill,
28 N,
29 KeyValue,
30 For,
31 ForN,
32 ForIn,
33 Sum,
34 SumIn,
35 SumVec4,
36 Prod,
37 ProdIn,
38 ProdVec4,
39 Min,
40 MinIn,
41 Max,
42 MaxIn,
43 Sift,
44 SiftIn,
45 Any,
46 AnyIn,
47 All,
48 AllIn,
49 Vec4UnLoop,
50 Start,
51 End,
52 Init,
53 Cond,
54 Iter,
55 ElseIfCond,
56 ElseIfBlock,
57 Step,
58 Compare,
59 If,
60 TrueBlock,
61 ElseBlock,
62 Loop,
63 Id,
64 Break,
65 Continue,
66 Norm,
67 Not,
68 Neg,
69 Vec4,
70 X,
71 Y,
72 Z,
73 W,
74 Mat4,
75 EX,
76 EY,
77 EZ,
78 EW,
79 Type,
80 Arr,
81 Opt,
82 Res,
83 RetType,
84 ReturnVoid,
85 Go,
86 Swizzle,
87 Sw0,
88 Sw1,
89 Sw2,
90 Sw3,
91 Link,
92 LinkFor,
93 LinkIn,
94 LinkItem,
95 Closure,
96 CallClosure,
97 ClosureType,
98 ClArg,
99 ClRet,
100 Grab,
101 TryExpr,
102 In,
103 Ty,
104 TyArg,
105 TyRet,
106}
107
108impl Kind {
109 pub fn new(name: &str) -> Option<Kind> {
110 Some(match name {
111 "ns" => Kind::Ns,
112 "uses" => Kind::Uses,
113 "use" => Kind::Use,
114 "fn" => Kind::Fn,
115 "arg" => Kind::Arg,
116 "current" => Kind::Current,
117 "block" => Kind::Block,
118 "expr" => Kind::Expr,
119 "add" => Kind::Add,
120 "mul" => Kind::Mul,
121 "pow" => Kind::Pow,
122 "val" => Kind::Val,
123 "call" => Kind::Call,
124 "call_arg" => Kind::CallArg,
125 "named_call" => Kind::Call,
126 "assign" => Kind::Assign,
127 "left" => Kind::Left,
128 "right" => Kind::Right,
129 "item" => Kind::Item,
130 "item_extra" => Kind::ItemExtra,
131 "return" => Kind::Return,
132 "object" => Kind::Object,
133 "array" => Kind::Array,
134 "array_item" => Kind::ArrayItem,
135 "array_fill" => Kind::ArrayFill,
136 "fill" => Kind::Fill,
137 "n" => Kind::N,
138 "key_value" => Kind::KeyValue,
139 "for" => Kind::For,
140 "for_n" => Kind::ForN,
141 "for_in" => Kind::ForIn,
142 "sum" => Kind::Sum,
143 "sum_in" => Kind::SumIn,
144 "sum_vec4" => Kind::SumVec4,
145 "prod" => Kind::Prod,
146 "prod_in" => Kind::ProdIn,
147 "prod_vec4" => Kind::ProdVec4,
148 "min" => Kind::Min,
149 "min_in" => Kind::MinIn,
150 "max" => Kind::Max,
151 "max_in" => Kind::MaxIn,
152 "sift" => Kind::Sift,
153 "sift_in" => Kind::SiftIn,
154 "start" => Kind::Start,
155 "any" => Kind::Any,
156 "any_in" => Kind::AnyIn,
157 "all" => Kind::All,
158 "all_in" => Kind::AllIn,
159 "vec4_un_loop" => Kind::Vec4UnLoop,
160 "end" => Kind::End,
161 "init" => Kind::Init,
162 "cond" => Kind::Cond,
163 "iter" => Kind::Iter,
164 "else_if_cond" => Kind::ElseIfCond,
165 "else_if_block" => Kind::ElseIfBlock,
166 "step" => Kind::Step,
167 "compare" => Kind::Compare,
168 "if" => Kind::If,
169 "true_block" => Kind::TrueBlock,
170 "else_block" => Kind::ElseBlock,
171 "loop" => Kind::Loop,
172 "id" => Kind::Id,
173 "break" => Kind::Break,
174 "continue" => Kind::Continue,
175 "norm" => Kind::Norm,
176 "not" => Kind::Not,
177 "neg" => Kind::Neg,
178 "vec4" => Kind::Vec4,
179 "x" => Kind::X,
180 "y" => Kind::Y,
181 "z" => Kind::Z,
182 "w" => Kind::W,
183 "mat4" => Kind::Mat4,
184 "ex" => Kind::EX,
185 "ey" => Kind::EY,
186 "ez" => Kind::EZ,
187 "ew" => Kind::EW,
188 "type" => Kind::Type,
189 "arr" => Kind::Arr,
190 "opt" => Kind::Opt,
191 "res" => Kind::Res,
192 "ret_type" => Kind::RetType,
193 "return_void" => Kind::ReturnVoid,
194 "go" => Kind::Go,
195 "swizzle" => Kind::Swizzle,
196 "sw0" => Kind::Sw0,
197 "sw1" => Kind::Sw1,
198 "sw2" => Kind::Sw2,
199 "sw3" => Kind::Sw3,
200 "link" => Kind::Link,
201 "link_for" => Kind::LinkFor,
202 "link_in" => Kind::LinkIn,
203 "link_item" => Kind::LinkItem,
204 "closure" => Kind::Closure,
205 "call_closure" => Kind::CallClosure,
206 "named_call_closure" => Kind::CallClosure,
207 "closure_type" => Kind::ClosureType,
208 "cl_arg" => Kind::ClArg,
209 "cl_ret" => Kind::ClRet,
210 "grab" => Kind::Grab,
211 "try_expr" => Kind::TryExpr,
212 "in" => Kind::In,
213 "ty" => Kind::Ty,
214 "ty_arg" => Kind::TyArg,
215 "ty_ret" => Kind::TyRet,
216 _ => return None,
217 })
218 }
219
220 pub fn is_decl_loop(self) -> bool {
222 use self::Kind::*;
223
224 matches!(
225 self,
226 ForN | Sum | Prod | SumVec4 | ProdVec4 | Min | Max | Sift | Any | All | LinkFor
227 )
228 }
229
230 pub fn is_in_loop(self) -> bool {
232 use self::Kind::*;
233
234 matches!(
235 self,
236 ForIn | SumIn | ProdIn | MinIn | MaxIn | AnyIn | AllIn | SiftIn | LinkIn
237 )
238 }
239
240 pub fn is_decl_un_loop(self) -> bool {
242 matches!(self, Kind::Vec4UnLoop)
243 }
244
245 pub fn is_block(self) -> bool {
246 use self::Kind::*;
247
248 matches!(self, Block | ElseIfBlock | TrueBlock | ElseBlock)
249 }
250}