dyon/lifetime/
kind.rs

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    /// A loop can infer range from the body using variable.
221    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    /// An in-loop receives an object from a receiver channel.
231    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    /// An un-loop has fixed range and replaces variable in body.
241    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}