aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLi Jin <dragon-fly@qq.com>2020-02-17 15:46:38 +0800
committerLi Jin <dragon-fly@qq.com>2020-02-17 15:46:38 +0800
commit71d9ad9506524fcd3e124c4b4a460afa8fbf35eb (patch)
tree8283382f37bc7dd9e827e27c830e867a6cb6c270
parent0091db154bc4d40a0c2d79a2311ddc3711321811 (diff)
downloadyuescript-71d9ad9506524fcd3e124c4b4a460afa8fbf35eb.tar.gz
yuescript-71d9ad9506524fcd3e124c4b4a460afa8fbf35eb.tar.bz2
yuescript-71d9ad9506524fcd3e124c4b4a460afa8fbf35eb.zip
refactor some codes to be safer.
-rw-r--r--.gitignore2
-rw-r--r--src/MoonP/moon_ast.h227
-rw-r--r--src/MoonP/moon_compiler.cpp408
-rw-r--r--src/MoonP/parser.hpp11
-rw-r--r--src/moonp.cpp66
5 files changed, 358 insertions, 356 deletions
diff --git a/.gitignore b/.gitignore
index d3acf45..27acefe 100644
--- a/.gitignore
+++ b/.gitignore
@@ -2,3 +2,5 @@ moonp
2build 2build
3build.luarocks 3build.luarocks
4spec/outputs 4spec/outputs
5moonplus-*.rock*
6!moonplus-dev-1.rockspec
diff --git a/src/MoonP/moon_ast.h b/src/MoonP/moon_ast.h
index 86f5ef3..4525df1 100644
--- a/src/MoonP/moon_ast.h
+++ b/src/MoonP/moon_ast.h
@@ -13,19 +13,28 @@ using namespace parserlib;
13 13
14namespace MoonP { 14namespace MoonP {
15 15
16#define AST_LEAF(type, id) \ 16// str hash helper functions (djb2)
17inline constexpr size_t hash(char const* input) {
18 return *input ? *input + 33ull * hash(input + 1) : 5381;
19}
20
21template<class T>
22constexpr typename std::enable_if<std::is_base_of<ast_node,T>::value,size_t>::type
23id() { return 0; }
24
25#define AST_LEAF(type) \
17class type##_t : public ast_node \ 26class type##_t : public ast_node \
18{ \ 27{ \
19public: \ 28public: \
20 virtual int get_type() override { return ast_type<type##_t>(); } \ 29 virtual int get_type() override { return ast_type<type##_t>(); } \
21 virtual size_t getId() const override { return id; } \ 30 virtual size_t getId() const override { return hash(#type); }
22 31
23#define AST_NODE(type, id) \ 32#define AST_NODE(type) \
24class type##_t : public ast_container \ 33class type##_t : public ast_container \
25{ \ 34{ \
26public: \ 35public: \
27 virtual int get_type() override { return ast_type<type##_t>(); } \ 36 virtual int get_type() override { return ast_type<type##_t>(); } \
28 virtual size_t getId() const override { return id; } \ 37 virtual size_t getId() const override { return hash(#type); } \
29 38
30#define AST_MEMBER(type, ...) \ 39#define AST_MEMBER(type, ...) \
31 type##_t() { \ 40 type##_t() { \
@@ -33,73 +42,74 @@ public: \
33 } 42 }
34 43
35#define AST_END(type) \ 44#define AST_END(type) \
36}; 45}; \
46template<> constexpr size_t id<type##_t>() { return hash(#type); }
37 47
38AST_LEAF(Num, "Num"_id) 48AST_LEAF(Num)
39AST_END(Num) 49AST_END(Num)
40 50
41AST_LEAF(Name, "Name"_id) 51AST_LEAF(Name)
42AST_END(Name) 52AST_END(Name)
43 53
44AST_NODE(Variable, "Variable"_id) 54AST_NODE(Variable)
45 ast_ptr<true, Name_t> name; 55 ast_ptr<true, Name_t> name;
46 AST_MEMBER(Variable, &name) 56 AST_MEMBER(Variable, &name)
47AST_END(Variable) 57AST_END(Variable)
48 58
49AST_NODE(LuaKeyword, "LuaKeyword"_id) 59AST_NODE(LuaKeyword)
50 ast_ptr<true, Name_t> name; 60 ast_ptr<true, Name_t> name;
51 AST_MEMBER(LuaKeyword, &name) 61 AST_MEMBER(LuaKeyword, &name)
52AST_END(LuaKeyword) 62AST_END(LuaKeyword)
53 63
54AST_LEAF(self, "self"_id) 64AST_LEAF(self)
55AST_END(self) 65AST_END(self)
56 66
57AST_NODE(self_name, "self_name"_id) 67AST_NODE(self_name)
58 ast_ptr<true, Name_t> name; 68 ast_ptr<true, Name_t> name;
59 AST_MEMBER(self_name, &name) 69 AST_MEMBER(self_name, &name)
60AST_END(self_name) 70AST_END(self_name)
61 71
62AST_LEAF(self_class, "self_class"_id) 72AST_LEAF(self_class)
63AST_END(self_class) 73AST_END(self_class)
64 74
65AST_NODE(self_class_name, "self_class_name"_id) 75AST_NODE(self_class_name)
66 ast_ptr<true, Name_t> name; 76 ast_ptr<true, Name_t> name;
67 AST_MEMBER(self_class_name, &name) 77 AST_MEMBER(self_class_name, &name)
68AST_END(self_class_name) 78AST_END(self_class_name)
69 79
70AST_NODE(SelfName, "SelfName"_id) 80AST_NODE(SelfName)
71 ast_sel<true, self_class_name_t, self_class_t, self_name_t, self_t> name; 81 ast_sel<true, self_class_name_t, self_class_t, self_name_t, self_t> name;
72 AST_MEMBER(SelfName, &name) 82 AST_MEMBER(SelfName, &name)
73AST_END(SelfName) 83AST_END(SelfName)
74 84
75AST_NODE(KeyName, "KeyName"_id) 85AST_NODE(KeyName)
76 ast_sel<true, SelfName_t, Name_t> name; 86 ast_sel<true, SelfName_t, Name_t> name;
77 AST_MEMBER(KeyName, &name) 87 AST_MEMBER(KeyName, &name)
78AST_END(KeyName) 88AST_END(KeyName)
79 89
80AST_LEAF(VarArg, "VarArg"_id) 90AST_LEAF(VarArg)
81AST_END(VarArg) 91AST_END(VarArg)
82 92
83AST_LEAF(local_flag, "local_flag"_id) 93AST_LEAF(local_flag)
84AST_END(local_flag) 94AST_END(local_flag)
85 95
86AST_LEAF(Seperator, "Seperator"_id) 96AST_LEAF(Seperator)
87AST_END(Seperator) 97AST_END(Seperator)
88 98
89AST_NODE(NameList, "NameList"_id) 99AST_NODE(NameList)
90 ast_ptr<true, Seperator_t> sep; 100 ast_ptr<true, Seperator_t> sep;
91 ast_list<true, Variable_t> names; 101 ast_list<true, Variable_t> names;
92 AST_MEMBER(NameList, &sep, &names) 102 AST_MEMBER(NameList, &sep, &names)
93AST_END(NameList) 103AST_END(NameList)
94 104
95AST_NODE(Local, "Local"_id) 105AST_NODE(Local)
96 ast_sel<true, local_flag_t, NameList_t> name; 106 ast_sel<true, local_flag_t, NameList_t> name;
97 std::list<std::string> forceDecls; 107 std::list<std::string> forceDecls;
98 std::list<std::string> decls; 108 std::list<std::string> decls;
99 AST_MEMBER(Local, &name) 109 AST_MEMBER(Local, &name)
100AST_END(Local) 110AST_END(Local)
101 111
102AST_NODE(colon_import_name, "colon_import_name"_id) 112AST_NODE(colon_import_name)
103 ast_ptr<true, Variable_t> name; 113 ast_ptr<true, Variable_t> name;
104 AST_MEMBER(colon_import_name, &name) 114 AST_MEMBER(colon_import_name, &name)
105AST_END(colon_import_name) 115AST_END(colon_import_name)
@@ -107,29 +117,29 @@ AST_END(colon_import_name)
107class Exp_t; 117class Exp_t;
108class TableLit_t; 118class TableLit_t;
109 119
110AST_LEAF(import_literal_inner, "import_literal_inner"_id) 120AST_LEAF(import_literal_inner)
111AST_END(import_literal_inner) 121AST_END(import_literal_inner)
112 122
113AST_NODE(ImportLiteral, "ImportLiteral"_id) 123AST_NODE(ImportLiteral)
114 ast_ptr<true, Seperator_t> sep; 124 ast_ptr<true, Seperator_t> sep;
115 ast_sel_list<true, import_literal_inner_t> inners; 125 ast_sel_list<true, import_literal_inner_t> inners;
116 AST_MEMBER(ImportLiteral, &sep, &inners) 126 AST_MEMBER(ImportLiteral, &sep, &inners)
117AST_END(ImportLiteral) 127AST_END(ImportLiteral)
118 128
119AST_NODE(ImportAs, "ImportAs"_id) 129AST_NODE(ImportAs)
120 ast_ptr<true, ImportLiteral_t> literal; 130 ast_ptr<true, ImportLiteral_t> literal;
121 ast_sel<false, Variable_t, TableLit_t> target; 131 ast_sel<false, Variable_t, TableLit_t> target;
122 AST_MEMBER(ImportAs, &literal, &target) 132 AST_MEMBER(ImportAs, &literal, &target)
123AST_END(ImportAs) 133AST_END(ImportAs)
124 134
125AST_NODE(ImportFrom, "ImportFrom"_id) 135AST_NODE(ImportFrom)
126 ast_ptr<true, Seperator_t> sep; 136 ast_ptr<true, Seperator_t> sep;
127 ast_sel_list<true, colon_import_name_t, Variable_t> names; 137 ast_sel_list<true, colon_import_name_t, Variable_t> names;
128 ast_ptr<true, Exp_t> exp; 138 ast_ptr<true, Exp_t> exp;
129 AST_MEMBER(ImportFrom, &sep, &names, &exp) 139 AST_MEMBER(ImportFrom, &sep, &names, &exp)
130AST_END(ImportFrom) 140AST_END(ImportFrom)
131 141
132AST_NODE(Import, "Import"_id) 142AST_NODE(Import)
133 ast_sel<true, ImportAs_t, ImportFrom_t> content; 143 ast_sel<true, ImportAs_t, ImportFrom_t> content;
134 AST_MEMBER(Import, &content) 144 AST_MEMBER(Import, &content)
135AST_END(Import) 145AST_END(Import)
@@ -137,25 +147,25 @@ AST_END(Import)
137class FnArgsDef_t; 147class FnArgsDef_t;
138class ChainValue_t; 148class ChainValue_t;
139 149
140AST_NODE(Backcall, "Backcall"_id) 150AST_NODE(Backcall)
141 ast_ptr<false, FnArgsDef_t> argsDef; 151 ast_ptr<false, FnArgsDef_t> argsDef;
142 ast_ptr<true, ChainValue_t> value; 152 ast_ptr<true, ChainValue_t> value;
143 AST_MEMBER(Backcall, &argsDef, &value) 153 AST_MEMBER(Backcall, &argsDef, &value)
144AST_END(Backcall) 154AST_END(Backcall)
145 155
146AST_NODE(ExpListLow, "ExpListLow"_id) 156AST_NODE(ExpListLow)
147 ast_ptr<true, Seperator_t> sep; 157 ast_ptr<true, Seperator_t> sep;
148 ast_list<true, Exp_t> exprs; 158 ast_list<true, Exp_t> exprs;
149 AST_MEMBER(ExpListLow, &sep, &exprs) 159 AST_MEMBER(ExpListLow, &sep, &exprs)
150AST_END(ExpListLow) 160AST_END(ExpListLow)
151 161
152AST_NODE(ExpList, "ExpList"_id) 162AST_NODE(ExpList)
153 ast_ptr<true, Seperator_t> sep; 163 ast_ptr<true, Seperator_t> sep;
154 ast_list<true, Exp_t> exprs; 164 ast_list<true, Exp_t> exprs;
155 AST_MEMBER(ExpList, &sep, &exprs) 165 AST_MEMBER(ExpList, &sep, &exprs)
156AST_END(ExpList) 166AST_END(ExpList)
157 167
158AST_NODE(Return, "Return"_id) 168AST_NODE(Return)
159 ast_ptr<false, ExpListLow_t> valueList; 169 ast_ptr<false, ExpListLow_t> valueList;
160 AST_MEMBER(Return, &valueList) 170 AST_MEMBER(Return, &valueList)
161AST_END(Return) 171AST_END(Return)
@@ -163,20 +173,20 @@ AST_END(Return)
163class Assign_t; 173class Assign_t;
164class Body_t; 174class Body_t;
165 175
166AST_NODE(With, "With"_id) 176AST_NODE(With)
167 ast_ptr<true, ExpList_t> valueList; 177 ast_ptr<true, ExpList_t> valueList;
168 ast_ptr<false, Assign_t> assigns; 178 ast_ptr<false, Assign_t> assigns;
169 ast_ptr<true, Body_t> body; 179 ast_ptr<true, Body_t> body;
170 AST_MEMBER(With, &valueList, &assigns, &body) 180 AST_MEMBER(With, &valueList, &assigns, &body)
171AST_END(With) 181AST_END(With)
172 182
173AST_NODE(SwitchCase, "SwitchCase"_id) 183AST_NODE(SwitchCase)
174 ast_ptr<true, ExpList_t> valueList; 184 ast_ptr<true, ExpList_t> valueList;
175 ast_ptr<true, Body_t> body; 185 ast_ptr<true, Body_t> body;
176 AST_MEMBER(SwitchCase, &valueList, &body) 186 AST_MEMBER(SwitchCase, &valueList, &body)
177AST_END(SwitchCase) 187AST_END(SwitchCase)
178 188
179AST_NODE(Switch, "Switch"_id) 189AST_NODE(Switch)
180 ast_ptr<true, Exp_t> target; 190 ast_ptr<true, Exp_t> target;
181 ast_ptr<true, Seperator_t> sep; 191 ast_ptr<true, Seperator_t> sep;
182 ast_list<true, SwitchCase_t> branches; 192 ast_list<true, SwitchCase_t> branches;
@@ -184,36 +194,36 @@ AST_NODE(Switch, "Switch"_id)
184 AST_MEMBER(Switch, &target, &sep, &branches, &lastBranch) 194 AST_MEMBER(Switch, &target, &sep, &branches, &lastBranch)
185AST_END(Switch) 195AST_END(Switch)
186 196
187AST_NODE(IfCond, "IfCond"_id) 197AST_NODE(IfCond)
188 ast_ptr<true, Exp_t> condition; 198 ast_ptr<true, Exp_t> condition;
189 ast_ptr<false, Assign_t> assign; 199 ast_ptr<false, Assign_t> assign;
190 AST_MEMBER(IfCond, &condition, &assign) 200 AST_MEMBER(IfCond, &condition, &assign)
191AST_END(IfCond) 201AST_END(IfCond)
192 202
193AST_NODE(If, "If"_id) 203AST_NODE(If)
194 ast_ptr<true, Seperator_t> sep; 204 ast_ptr<true, Seperator_t> sep;
195 ast_sel_list<true, IfCond_t, Body_t> nodes; 205 ast_sel_list<true, IfCond_t, Body_t> nodes;
196 AST_MEMBER(If, &sep, &nodes) 206 AST_MEMBER(If, &sep, &nodes)
197AST_END(If) 207AST_END(If)
198 208
199AST_NODE(Unless, "Unless"_id) 209AST_NODE(Unless)
200 ast_ptr<true, Seperator_t> sep; 210 ast_ptr<true, Seperator_t> sep;
201 ast_sel_list<true, IfCond_t, Body_t> nodes; 211 ast_sel_list<true, IfCond_t, Body_t> nodes;
202 AST_MEMBER(Unless, &sep, &nodes) 212 AST_MEMBER(Unless, &sep, &nodes)
203AST_END(Unless) 213AST_END(Unless)
204 214
205AST_NODE(While, "While"_id) 215AST_NODE(While)
206 ast_ptr<true, Exp_t> condition; 216 ast_ptr<true, Exp_t> condition;
207 ast_ptr<true, Body_t> body; 217 ast_ptr<true, Body_t> body;
208 AST_MEMBER(While, &condition, &body) 218 AST_MEMBER(While, &condition, &body)
209AST_END(While) 219AST_END(While)
210 220
211AST_NODE(for_step_value, "for_step_value"_id) 221AST_NODE(for_step_value)
212 ast_ptr<true, Exp_t> value; 222 ast_ptr<true, Exp_t> value;
213 AST_MEMBER(for_step_value, &value) 223 AST_MEMBER(for_step_value, &value)
214AST_END(for_step_value) 224AST_END(for_step_value)
215 225
216AST_NODE(For, "For"_id) 226AST_NODE(For)
217 ast_ptr<true, Variable_t> varName; 227 ast_ptr<true, Variable_t> varName;
218 ast_ptr<true, Exp_t> startValue; 228 ast_ptr<true, Exp_t> startValue;
219 ast_ptr<true, Exp_t> stopValue; 229 ast_ptr<true, Exp_t> stopValue;
@@ -225,14 +235,14 @@ AST_END(For)
225class AssignableNameList_t; 235class AssignableNameList_t;
226class star_exp_t; 236class star_exp_t;
227 237
228AST_NODE(ForEach, "ForEach"_id) 238AST_NODE(ForEach)
229 ast_ptr<true, AssignableNameList_t> nameList; 239 ast_ptr<true, AssignableNameList_t> nameList;
230 ast_sel<true, star_exp_t, ExpList_t> loopValue; 240 ast_sel<true, star_exp_t, ExpList_t> loopValue;
231 ast_ptr<true, Body_t> body; 241 ast_ptr<true, Body_t> body;
232 AST_MEMBER(ForEach, &nameList, &loopValue, &body) 242 AST_MEMBER(ForEach, &nameList, &loopValue, &body)
233AST_END(ForEach) 243AST_END(ForEach)
234 244
235AST_NODE(Do, "Do"_id) 245AST_NODE(Do)
236 ast_ptr<true, Body_t> body; 246 ast_ptr<true, Body_t> body;
237 AST_MEMBER(Do, &body) 247 AST_MEMBER(Do, &body)
238AST_END(Do) 248AST_END(Do)
@@ -240,36 +250,36 @@ AST_END(Do)
240class CompInner_t; 250class CompInner_t;
241class Statement_t; 251class Statement_t;
242 252
243AST_NODE(Comprehension, "Comprehension"_id) 253AST_NODE(Comprehension)
244 ast_sel<true, Exp_t, Statement_t> value; 254 ast_sel<true, Exp_t, Statement_t> value;
245 ast_ptr<true, CompInner_t> forLoop; 255 ast_ptr<true, CompInner_t> forLoop;
246 AST_MEMBER(Comprehension, &value, &forLoop) 256 AST_MEMBER(Comprehension, &value, &forLoop)
247AST_END(Comprehension) 257AST_END(Comprehension)
248 258
249AST_NODE(comp_value, "comp_value"_id) 259AST_NODE(comp_value)
250 ast_ptr<true, Exp_t> value; 260 ast_ptr<true, Exp_t> value;
251 AST_MEMBER(comp_value, &value) 261 AST_MEMBER(comp_value, &value)
252AST_END(comp_value) 262AST_END(comp_value)
253 263
254AST_NODE(TblComprehension, "TblComprehension"_id) 264AST_NODE(TblComprehension)
255 ast_ptr<true, Exp_t> key; 265 ast_ptr<true, Exp_t> key;
256 ast_ptr<false, comp_value_t> value; 266 ast_ptr<false, comp_value_t> value;
257 ast_ptr<true, CompInner_t> forLoop; 267 ast_ptr<true, CompInner_t> forLoop;
258 AST_MEMBER(TblComprehension, &key, &value, &forLoop) 268 AST_MEMBER(TblComprehension, &key, &value, &forLoop)
259AST_END(TblComprehension) 269AST_END(TblComprehension)
260 270
261AST_NODE(star_exp, "star_exp"_id) 271AST_NODE(star_exp)
262 ast_ptr<true, Exp_t> value; 272 ast_ptr<true, Exp_t> value;
263 AST_MEMBER(star_exp, &value) 273 AST_MEMBER(star_exp, &value)
264AST_END(star_exp) 274AST_END(star_exp)
265 275
266AST_NODE(CompForEach, "CompForEach"_id) 276AST_NODE(CompForEach)
267 ast_ptr<true, AssignableNameList_t> nameList; 277 ast_ptr<true, AssignableNameList_t> nameList;
268 ast_sel<true, star_exp_t, Exp_t> loopValue; 278 ast_sel<true, star_exp_t, Exp_t> loopValue;
269 AST_MEMBER(CompForEach, &nameList, &loopValue) 279 AST_MEMBER(CompForEach, &nameList, &loopValue)
270AST_END(CompForEach) 280AST_END(CompForEach)
271 281
272AST_NODE(CompFor, "CompFor"_id) 282AST_NODE(CompFor)
273 ast_ptr<true, Variable_t> varName; 283 ast_ptr<true, Variable_t> varName;
274 ast_ptr<true, Exp_t> startValue; 284 ast_ptr<true, Exp_t> startValue;
275 ast_ptr<true, Exp_t> stopValue; 285 ast_ptr<true, Exp_t> stopValue;
@@ -277,7 +287,7 @@ AST_NODE(CompFor, "CompFor"_id)
277 AST_MEMBER(CompFor, &varName, &startValue, &stopValue, &stepValue) 287 AST_MEMBER(CompFor, &varName, &startValue, &stopValue, &stepValue)
278AST_END(CompFor) 288AST_END(CompFor)
279 289
280AST_NODE(CompInner, "CompInner"_id) 290AST_NODE(CompInner)
281 ast_ptr<true, Seperator_t> sep; 291 ast_ptr<true, Seperator_t> sep;
282 ast_sel_list<true, CompFor_t, CompForEach_t, Exp_t> items; 292 ast_sel_list<true, CompFor_t, CompForEach_t, Exp_t> items;
283 AST_MEMBER(CompInner, &sep, &items) 293 AST_MEMBER(CompInner, &sep, &items)
@@ -285,43 +295,43 @@ AST_END(CompInner)
285 295
286class TableBlock_t; 296class TableBlock_t;
287 297
288AST_NODE(Assign, "Assign"_id) 298AST_NODE(Assign)
289 ast_ptr<true, Seperator_t> sep; 299 ast_ptr<true, Seperator_t> sep;
290 ast_sel_list<true, With_t, If_t, Switch_t, TableBlock_t, Exp_t> values; 300 ast_sel_list<true, With_t, If_t, Switch_t, TableBlock_t, Exp_t> values;
291 AST_MEMBER(Assign, &sep, &values) 301 AST_MEMBER(Assign, &sep, &values)
292AST_END(Assign) 302AST_END(Assign)
293 303
294AST_LEAF(update_op, "update_op"_id) 304AST_LEAF(update_op)
295AST_END(update_op) 305AST_END(update_op)
296 306
297AST_NODE(Update, "Update"_id) 307AST_NODE(Update)
298 ast_ptr<true, update_op_t> op; 308 ast_ptr<true, update_op_t> op;
299 ast_ptr<true, Exp_t> value; 309 ast_ptr<true, Exp_t> value;
300 AST_MEMBER(Update, &op, &value) 310 AST_MEMBER(Update, &op, &value)
301AST_END(Update) 311AST_END(Update)
302 312
303AST_LEAF(BinaryOperator, "BinaryOperator"_id) 313AST_LEAF(BinaryOperator)
304AST_END(BinaryOperator) 314AST_END(BinaryOperator)
305 315
306AST_LEAF(BackcallOperator, "BackcallOperator"_id) 316AST_LEAF(BackcallOperator)
307AST_END(BackcallOperator) 317AST_END(BackcallOperator)
308 318
309class AssignableChain_t; 319class AssignableChain_t;
310 320
311AST_NODE(Assignable, "Assignable"_id) 321AST_NODE(Assignable)
312 ast_sel<true, AssignableChain_t, Variable_t, SelfName_t> item; 322 ast_sel<true, AssignableChain_t, Variable_t, SelfName_t> item;
313 AST_MEMBER(Assignable, &item) 323 AST_MEMBER(Assignable, &item)
314AST_END(Assignable) 324AST_END(Assignable)
315 325
316class Value_t; 326class Value_t;
317 327
318AST_NODE(exp_op_value, "exp_op_value"_id) 328AST_NODE(exp_op_value)
319 ast_sel<true, BinaryOperator_t, BackcallOperator_t> op; 329 ast_sel<true, BinaryOperator_t, BackcallOperator_t> op;
320 ast_ptr<true, Value_t> value; 330 ast_ptr<true, Value_t> value;
321 AST_MEMBER(exp_op_value, &op, &value) 331 AST_MEMBER(exp_op_value, &op, &value)
322AST_END(exp_op_value) 332AST_END(exp_op_value)
323 333
324AST_NODE(Exp, "Exp"_id) 334AST_NODE(Exp)
325 ast_ptr<true, Value_t> value; 335 ast_ptr<true, Value_t> value;
326 ast_list<false, exp_op_value_t> opValues; 336 ast_list<false, exp_op_value_t> opValues;
327 AST_MEMBER(Exp, &value, &opValues) 337 AST_MEMBER(Exp, &value, &opValues)
@@ -329,12 +339,12 @@ AST_END(Exp)
329 339
330class Parens_t; 340class Parens_t;
331 341
332AST_NODE(Callable, "Callable"_id) 342AST_NODE(Callable)
333 ast_sel<true, Variable_t, SelfName_t, VarArg_t, Parens_t> item; 343 ast_sel<true, Variable_t, SelfName_t, VarArg_t, Parens_t> item;
334 AST_MEMBER(Callable, &item) 344 AST_MEMBER(Callable, &item)
335AST_END(Callable) 345AST_END(Callable)
336 346
337AST_NODE(variable_pair, "variable_pair"_id) 347AST_NODE(variable_pair)
338 ast_ptr<true, Variable_t> name; 348 ast_ptr<true, Variable_t> name;
339 AST_MEMBER(variable_pair, &name) 349 AST_MEMBER(variable_pair, &name)
340AST_END(variable_pair) 350AST_END(variable_pair)
@@ -342,13 +352,13 @@ AST_END(variable_pair)
342class DoubleString_t; 352class DoubleString_t;
343class SingleString_t; 353class SingleString_t;
344 354
345AST_NODE(normal_pair, "normal_pair"_id) 355AST_NODE(normal_pair)
346 ast_sel<true, KeyName_t, Exp_t, DoubleString_t, SingleString_t> key; 356 ast_sel<true, KeyName_t, Exp_t, DoubleString_t, SingleString_t> key;
347 ast_sel<true, Exp_t, TableBlock_t> value; 357 ast_sel<true, Exp_t, TableBlock_t> value;
348 AST_MEMBER(normal_pair, &key, &value) 358 AST_MEMBER(normal_pair, &key, &value)
349AST_END(normal_pair) 359AST_END(normal_pair)
350 360
351AST_NODE(simple_table, "simple_table"_id) 361AST_NODE(simple_table)
352 ast_ptr<true, Seperator_t> sep; 362 ast_ptr<true, Seperator_t> sep;
353 ast_sel_list<true, variable_pair_t, normal_pair_t> pairs; 363 ast_sel_list<true, variable_pair_t, normal_pair_t> pairs;
354 AST_MEMBER(simple_table, &sep, &pairs) 364 AST_MEMBER(simple_table, &sep, &pairs)
@@ -361,7 +371,7 @@ class unary_exp_t;
361class TableLit_t; 371class TableLit_t;
362class FunLit_t; 372class FunLit_t;
363 373
364AST_NODE(SimpleValue, "SimpleValue"_id) 374AST_NODE(SimpleValue)
365 ast_sel<true, const_value_t, 375 ast_sel<true, const_value_t,
366 If_t, Unless_t, Switch_t, With_t, ClassDecl_t, 376 If_t, Unless_t, Switch_t, With_t, ClassDecl_t,
367 ForEach_t, For_t, While_t, Do_t, unary_exp_t, 377 ForEach_t, For_t, While_t, Do_t, unary_exp_t,
@@ -370,50 +380,50 @@ AST_NODE(SimpleValue, "SimpleValue"_id)
370 AST_MEMBER(SimpleValue, &value) 380 AST_MEMBER(SimpleValue, &value)
371AST_END(SimpleValue) 381AST_END(SimpleValue)
372 382
373AST_LEAF(LuaStringOpen, "LuaStringOpen"_id) 383AST_LEAF(LuaStringOpen)
374AST_END(LuaStringOpen) 384AST_END(LuaStringOpen)
375 385
376AST_LEAF(LuaStringContent, "LuaStringContent"_id) 386AST_LEAF(LuaStringContent)
377AST_END(LuaStringContent) 387AST_END(LuaStringContent)
378 388
379AST_LEAF(LuaStringClose, "LuaStringClose"_id) 389AST_LEAF(LuaStringClose)
380AST_END(LuaStringClose) 390AST_END(LuaStringClose)
381 391
382AST_NODE(LuaString, "LuaString"_id) 392AST_NODE(LuaString)
383 ast_ptr<true, LuaStringOpen_t> open; 393 ast_ptr<true, LuaStringOpen_t> open;
384 ast_ptr<true, LuaStringContent_t> content; 394 ast_ptr<true, LuaStringContent_t> content;
385 ast_ptr<true, LuaStringClose_t> close; 395 ast_ptr<true, LuaStringClose_t> close;
386 AST_MEMBER(LuaString, &open, &content, &close) 396 AST_MEMBER(LuaString, &open, &content, &close)
387AST_END(LuaString) 397AST_END(LuaString)
388 398
389AST_LEAF(SingleString, "SingleString"_id) 399AST_LEAF(SingleString)
390AST_END(SingleString) 400AST_END(SingleString)
391 401
392AST_LEAF(double_string_inner, "double_string_inner"_id) 402AST_LEAF(double_string_inner)
393AST_END(double_string_inner) 403AST_END(double_string_inner)
394 404
395AST_NODE(double_string_content, "double_string_content"_id) 405AST_NODE(double_string_content)
396 ast_sel<true, double_string_inner_t, Exp_t> content; 406 ast_sel<true, double_string_inner_t, Exp_t> content;
397 AST_MEMBER(double_string_content, &content) 407 AST_MEMBER(double_string_content, &content)
398AST_END(double_string_content) 408AST_END(double_string_content)
399 409
400AST_NODE(DoubleString, "DoubleString"_id) 410AST_NODE(DoubleString)
401 ast_ptr<true, Seperator_t> sep; 411 ast_ptr<true, Seperator_t> sep;
402 ast_list<false, double_string_content_t> segments; 412 ast_list<false, double_string_content_t> segments;
403 AST_MEMBER(DoubleString, &sep, &segments) 413 AST_MEMBER(DoubleString, &sep, &segments)
404AST_END(DoubleString) 414AST_END(DoubleString)
405 415
406AST_NODE(String, "String"_id) 416AST_NODE(String)
407 ast_sel<true, DoubleString_t, SingleString_t, LuaString_t> str; 417 ast_sel<true, DoubleString_t, SingleString_t, LuaString_t> str;
408 AST_MEMBER(String, &str) 418 AST_MEMBER(String, &str)
409AST_END(String) 419AST_END(String)
410 420
411AST_NODE(DotChainItem, "DotChainItem"_id) 421AST_NODE(DotChainItem)
412 ast_ptr<true, Name_t> name; 422 ast_ptr<true, Name_t> name;
413 AST_MEMBER(DotChainItem, &name) 423 AST_MEMBER(DotChainItem, &name)
414AST_END(DotChainItem) 424AST_END(DotChainItem)
415 425
416AST_NODE(ColonChainItem, "ColonChainItem"_id) 426AST_NODE(ColonChainItem)
417 ast_sel<true, LuaKeyword_t, Name_t> name; 427 ast_sel<true, LuaKeyword_t, Name_t> name;
418 bool switchToDot = false; 428 bool switchToDot = false;
419 AST_MEMBER(ColonChainItem, &name) 429 AST_MEMBER(ColonChainItem, &name)
@@ -421,180 +431,180 @@ AST_END(ColonChainItem)
421 431
422class default_value_t; 432class default_value_t;
423 433
424AST_NODE(Slice, "Slice"_id) 434AST_NODE(Slice)
425 ast_sel<true, Exp_t, default_value_t> startValue; 435 ast_sel<true, Exp_t, default_value_t> startValue;
426 ast_sel<true, Exp_t, default_value_t> stopValue; 436 ast_sel<true, Exp_t, default_value_t> stopValue;
427 ast_sel<true, Exp_t, default_value_t> stepValue; 437 ast_sel<true, Exp_t, default_value_t> stepValue;
428 AST_MEMBER(Slice, &startValue, &stopValue, &stepValue) 438 AST_MEMBER(Slice, &startValue, &stopValue, &stepValue)
429AST_END(Slice) 439AST_END(Slice)
430 440
431AST_NODE(Parens, "Parens"_id) 441AST_NODE(Parens)
432 ast_ptr<true, Exp_t> expr; 442 ast_ptr<true, Exp_t> expr;
433 AST_MEMBER(Parens, &expr) 443 AST_MEMBER(Parens, &expr)
434AST_END(Parens) 444AST_END(Parens)
435 445
436AST_NODE(Invoke, "Invoke"_id) 446AST_NODE(Invoke)
437 ast_ptr<true, Seperator_t> sep; 447 ast_ptr<true, Seperator_t> sep;
438 ast_sel_list<false, Exp_t, SingleString_t, DoubleString_t, LuaString_t> args; 448 ast_sel_list<false, Exp_t, SingleString_t, DoubleString_t, LuaString_t> args;
439 AST_MEMBER(Invoke, &sep, &args) 449 AST_MEMBER(Invoke, &sep, &args)
440AST_END(Invoke) 450AST_END(Invoke)
441 451
442AST_LEAF(existential_op, "existential_op"_id) 452AST_LEAF(existential_op)
443AST_END(existential_op) 453AST_END(existential_op)
444 454
445class InvokeArgs_t; 455class InvokeArgs_t;
446 456
447AST_NODE(ChainValue, "ChainValue"_id) 457AST_NODE(ChainValue)
448 ast_ptr<true, Seperator_t> sep; 458 ast_ptr<true, Seperator_t> sep;
449 ast_sel_list<true, Callable_t, Invoke_t, DotChainItem_t, ColonChainItem_t, Slice_t, Exp_t, String_t, InvokeArgs_t, existential_op_t> items; 459 ast_sel_list<true, Callable_t, Invoke_t, DotChainItem_t, ColonChainItem_t, Slice_t, Exp_t, String_t, InvokeArgs_t, existential_op_t> items;
450 AST_MEMBER(ChainValue, &sep, &items) 460 AST_MEMBER(ChainValue, &sep, &items)
451AST_END(ChainValue) 461AST_END(ChainValue)
452 462
453AST_NODE(AssignableChain, "AssignableChain"_id) 463AST_NODE(AssignableChain)
454 ast_ptr<true, Seperator_t> sep; 464 ast_ptr<true, Seperator_t> sep;
455 ast_sel_list<true, Callable_t, Invoke_t, DotChainItem_t, ColonChainItem_t, Exp_t, String_t> items; 465 ast_sel_list<true, Callable_t, Invoke_t, DotChainItem_t, ColonChainItem_t, Exp_t, String_t> items;
456 AST_MEMBER(AssignableChain, &sep, &items) 466 AST_MEMBER(AssignableChain, &sep, &items)
457AST_END(AssignableChain) 467AST_END(AssignableChain)
458 468
459AST_NODE(Value, "Value"_id) 469AST_NODE(Value)
460 ast_sel<true, SimpleValue_t, simple_table_t, ChainValue_t, String_t> item; 470 ast_sel<true, SimpleValue_t, simple_table_t, ChainValue_t, String_t> item;
461 AST_MEMBER(Value, &item) 471 AST_MEMBER(Value, &item)
462AST_END(Value) 472AST_END(Value)
463 473
464AST_LEAF(default_value, "default_value"_id) 474AST_LEAF(default_value)
465AST_END(default_value) 475AST_END(default_value)
466 476
467AST_NODE(TableLit, "TableLit"_id) 477AST_NODE(TableLit)
468 ast_ptr<true, Seperator_t> sep; 478 ast_ptr<true, Seperator_t> sep;
469 ast_sel_list<false, variable_pair_t, normal_pair_t, Exp_t> values; 479 ast_sel_list<false, variable_pair_t, normal_pair_t, Exp_t> values;
470 AST_MEMBER(TableLit, &sep, &values) 480 AST_MEMBER(TableLit, &sep, &values)
471AST_END(TableLit) 481AST_END(TableLit)
472 482
473AST_NODE(TableBlock, "TableBlock"_id) 483AST_NODE(TableBlock)
474 ast_ptr<true, Seperator_t> sep; 484 ast_ptr<true, Seperator_t> sep;
475 ast_sel_list<false, variable_pair_t, normal_pair_t> values; 485 ast_sel_list<false, variable_pair_t, normal_pair_t> values;
476 AST_MEMBER(TableBlock, &sep, &values) 486 AST_MEMBER(TableBlock, &sep, &values)
477AST_END(TableBlock) 487AST_END(TableBlock)
478 488
479AST_NODE(class_member_list, "class_member_list"_id) 489AST_NODE(class_member_list)
480 ast_ptr<true, Seperator_t> sep; 490 ast_ptr<true, Seperator_t> sep;
481 ast_sel_list<true, variable_pair_t, normal_pair_t> values; 491 ast_sel_list<true, variable_pair_t, normal_pair_t> values;
482 AST_MEMBER(class_member_list, &sep, &values) 492 AST_MEMBER(class_member_list, &sep, &values)
483AST_END(class_member_list) 493AST_END(class_member_list)
484 494
485AST_NODE(ClassBlock, "ClassBlock"_id) 495AST_NODE(ClassBlock)
486 ast_ptr<true, Seperator_t> sep; 496 ast_ptr<true, Seperator_t> sep;
487 ast_sel_list<true, class_member_list_t, Statement_t> contents; 497 ast_sel_list<true, class_member_list_t, Statement_t> contents;
488 AST_MEMBER(ClassBlock, &sep, &contents) 498 AST_MEMBER(ClassBlock, &sep, &contents)
489AST_END(ClassBlock) 499AST_END(ClassBlock)
490 500
491AST_NODE(ClassDecl, "ClassDecl"_id) 501AST_NODE(ClassDecl)
492 ast_ptr<false, Assignable_t> name; 502 ast_ptr<false, Assignable_t> name;
493 ast_ptr<false, Exp_t> extend; 503 ast_ptr<false, Exp_t> extend;
494 ast_ptr<false, ClassBlock_t> body; 504 ast_ptr<false, ClassBlock_t> body;
495 AST_MEMBER(ClassDecl, &name, &extend, &body) 505 AST_MEMBER(ClassDecl, &name, &extend, &body)
496AST_END(ClassDecl) 506AST_END(ClassDecl)
497 507
498AST_NODE(export_values, "export_values"_id) 508AST_NODE(export_values)
499 ast_ptr<true, NameList_t> nameList; 509 ast_ptr<true, NameList_t> nameList;
500 ast_ptr<false, ExpListLow_t> valueList; 510 ast_ptr<false, ExpListLow_t> valueList;
501 AST_MEMBER(export_values, &nameList, &valueList) 511 AST_MEMBER(export_values, &nameList, &valueList)
502AST_END(export_values) 512AST_END(export_values)
503 513
504AST_LEAF(export_op, "export_op"_id) 514AST_LEAF(export_op)
505AST_END(export_op) 515AST_END(export_op)
506 516
507AST_NODE(Export, "Export"_id) 517AST_NODE(Export)
508 ast_sel<true, ClassDecl_t, export_op_t, export_values_t> item; 518 ast_sel<true, ClassDecl_t, export_op_t, export_values_t> item;
509 AST_MEMBER(Export, &item) 519 AST_MEMBER(Export, &item)
510AST_END(Export) 520AST_END(Export)
511 521
512AST_NODE(FnArgDef, "FnArgDef"_id) 522AST_NODE(FnArgDef)
513 ast_sel<true, Variable_t, SelfName_t> name; 523 ast_sel<true, Variable_t, SelfName_t> name;
514 ast_ptr<false, Exp_t> defaultValue; 524 ast_ptr<false, Exp_t> defaultValue;
515 AST_MEMBER(FnArgDef, &name, &defaultValue) 525 AST_MEMBER(FnArgDef, &name, &defaultValue)
516AST_END(FnArgDef) 526AST_END(FnArgDef)
517 527
518AST_NODE(FnArgDefList, "FnArgDefList"_id) 528AST_NODE(FnArgDefList)
519 ast_ptr<true, Seperator_t> sep; 529 ast_ptr<true, Seperator_t> sep;
520 ast_list<false, FnArgDef_t> definitions; 530 ast_list<false, FnArgDef_t> definitions;
521 ast_ptr<false, VarArg_t> varArg; 531 ast_ptr<false, VarArg_t> varArg;
522 AST_MEMBER(FnArgDefList, &sep, &definitions, &varArg) 532 AST_MEMBER(FnArgDefList, &sep, &definitions, &varArg)
523AST_END(FnArgDefList) 533AST_END(FnArgDefList)
524 534
525AST_NODE(outer_var_shadow, "outer_var_shadow"_id) 535AST_NODE(outer_var_shadow)
526 ast_ptr<false, NameList_t> varList; 536 ast_ptr<false, NameList_t> varList;
527 AST_MEMBER(outer_var_shadow, &varList) 537 AST_MEMBER(outer_var_shadow, &varList)
528AST_END(outer_var_shadow) 538AST_END(outer_var_shadow)
529 539
530AST_NODE(FnArgsDef, "FnArgsDef"_id) 540AST_NODE(FnArgsDef)
531 ast_ptr<false, FnArgDefList_t> defList; 541 ast_ptr<false, FnArgDefList_t> defList;
532 ast_ptr<false, outer_var_shadow_t> shadowOption; 542 ast_ptr<false, outer_var_shadow_t> shadowOption;
533 AST_MEMBER(FnArgsDef, &defList, &shadowOption) 543 AST_MEMBER(FnArgsDef, &defList, &shadowOption)
534AST_END(FnArgsDef) 544AST_END(FnArgsDef)
535 545
536AST_LEAF(fn_arrow, "fn_arrow"_id) 546AST_LEAF(fn_arrow)
537AST_END(fn_arrow) 547AST_END(fn_arrow)
538 548
539AST_NODE(FunLit, "FunLit"_id) 549AST_NODE(FunLit)
540 ast_ptr<false, FnArgsDef_t> argsDef; 550 ast_ptr<false, FnArgsDef_t> argsDef;
541 ast_ptr<true, fn_arrow_t> arrow; 551 ast_ptr<true, fn_arrow_t> arrow;
542 ast_ptr<false, Body_t> body; 552 ast_ptr<false, Body_t> body;
543 AST_MEMBER(FunLit, &argsDef, &arrow, &body) 553 AST_MEMBER(FunLit, &argsDef, &arrow, &body)
544AST_END(FunLit) 554AST_END(FunLit)
545 555
546AST_NODE(NameOrDestructure, "NameOrDestructure"_id) 556AST_NODE(NameOrDestructure)
547 ast_sel<true, Variable_t, TableLit_t> item; 557 ast_sel<true, Variable_t, TableLit_t> item;
548 AST_MEMBER(NameOrDestructure, &item) 558 AST_MEMBER(NameOrDestructure, &item)
549AST_END(NameOrDestructure) 559AST_END(NameOrDestructure)
550 560
551AST_NODE(AssignableNameList, "AssignableNameList"_id) 561AST_NODE(AssignableNameList)
552 ast_ptr<true, Seperator_t> sep; 562 ast_ptr<true, Seperator_t> sep;
553 ast_list<true, NameOrDestructure_t> items; 563 ast_list<true, NameOrDestructure_t> items;
554 AST_MEMBER(AssignableNameList, &sep, &items) 564 AST_MEMBER(AssignableNameList, &sep, &items)
555AST_END(AssignableNameList) 565AST_END(AssignableNameList)
556 566
557AST_NODE(InvokeArgs, "InvokeArgs"_id) 567AST_NODE(InvokeArgs)
558 ast_ptr<true, Seperator_t> sep; 568 ast_ptr<true, Seperator_t> sep;
559 ast_sel_list<true, Exp_t, TableBlock_t> args; 569 ast_sel_list<true, Exp_t, TableBlock_t> args;
560 AST_MEMBER(InvokeArgs, &sep, &args) 570 AST_MEMBER(InvokeArgs, &sep, &args)
561AST_END(InvokeArgs) 571AST_END(InvokeArgs)
562 572
563AST_LEAF(const_value, "const_value"_id) 573AST_LEAF(const_value)
564AST_END(const_value) 574AST_END(const_value)
565 575
566AST_NODE(unary_exp, "unary_exp"_id) 576AST_NODE(unary_exp)
567 ast_ptr<true, Exp_t> item; 577 ast_ptr<true, Exp_t> item;
568 AST_MEMBER(unary_exp, &item) 578 AST_MEMBER(unary_exp, &item)
569AST_END(unary_exp) 579AST_END(unary_exp)
570 580
571AST_NODE(ExpListAssign, "ExpListAssign"_id) 581AST_NODE(ExpListAssign)
572 ast_ptr<true, ExpList_t> expList; 582 ast_ptr<true, ExpList_t> expList;
573 ast_sel<false, Update_t, Assign_t> action; 583 ast_sel<false, Update_t, Assign_t> action;
574 AST_MEMBER(ExpListAssign, &expList, &action) 584 AST_MEMBER(ExpListAssign, &expList, &action)
575AST_END(ExpListAssign) 585AST_END(ExpListAssign)
576 586
577AST_NODE(if_else_line, "if_else_line"_id) 587AST_NODE(if_else_line)
578 ast_ptr<true, Exp_t> condition; 588 ast_ptr<true, Exp_t> condition;
579 ast_ptr<false, Assign_t> assign; 589 ast_ptr<false, Assign_t> assign;
580 ast_sel<false, Exp_t, default_value_t> elseExpr; 590 ast_sel<false, Exp_t, default_value_t> elseExpr;
581 AST_MEMBER(if_else_line, &condition, &assign, &elseExpr) 591 AST_MEMBER(if_else_line, &condition, &assign, &elseExpr)
582AST_END(if_else_line) 592AST_END(if_else_line)
583 593
584AST_NODE(unless_line, "unless_line"_id) 594AST_NODE(unless_line)
585 ast_ptr<true, Exp_t> condition; 595 ast_ptr<true, Exp_t> condition;
586 AST_MEMBER(unless_line, &condition) 596 AST_MEMBER(unless_line, &condition)
587AST_END(unless_line) 597AST_END(unless_line)
588 598
589AST_NODE(statement_appendix, "statement_appendix"_id) 599AST_NODE(statement_appendix)
590 ast_sel<true, if_else_line_t, unless_line_t, CompInner_t> item; 600 ast_sel<true, if_else_line_t, unless_line_t, CompInner_t> item;
591 AST_MEMBER(statement_appendix, &item) 601 AST_MEMBER(statement_appendix, &item)
592AST_END(statement_appendix) 602AST_END(statement_appendix)
593 603
594AST_LEAF(BreakLoop, "BreakLoop"_id) 604AST_LEAF(BreakLoop)
595AST_END(BreakLoop) 605AST_END(BreakLoop)
596 606
597AST_NODE(Statement, "Statement"_id) 607AST_NODE(Statement)
598 ast_sel<true, Import_t, While_t, For_t, ForEach_t, 608 ast_sel<true, Import_t, While_t, For_t, ForEach_t,
599 Return_t, Local_t, Export_t, BreakLoop_t, 609 Return_t, Local_t, Export_t, BreakLoop_t,
600 Backcall_t, ExpListAssign_t> content; 610 Backcall_t, ExpListAssign_t> content;
@@ -604,20 +614,21 @@ AST_END(Statement)
604 614
605class Block_t; 615class Block_t;
606 616
607AST_NODE(Body, "Body"_id) 617AST_NODE(Body)
608 ast_sel<true, Block_t, Statement_t> content; 618 ast_sel<true, Block_t, Statement_t> content;
609 AST_MEMBER(Body, &content) 619 AST_MEMBER(Body, &content)
610AST_END(Body) 620AST_END(Body)
611 621
612AST_NODE(Block, "Block"_id) 622AST_NODE(Block)
613 ast_ptr<true, Seperator_t> sep; 623 ast_ptr<true, Seperator_t> sep;
614 ast_list<false, Statement_t> statements; 624 ast_list<false, Statement_t> statements;
615 AST_MEMBER(Block, &sep, &statements) 625 AST_MEMBER(Block, &sep, &statements)
616AST_END(Block) 626AST_END(Block)
617 627
618AST_NODE(File, "File"_id) 628AST_NODE(File)
619 ast_ptr<true, Block_t> block; 629 ast_ptr<true, Block_t> block;
620 AST_MEMBER(File, &block) 630 AST_MEMBER(File, &block)
621AST_END(File) 631AST_END(File)
622 632
623} // namespace MoonP 633} // namespace MoonP
634
diff --git a/src/MoonP/moon_compiler.cpp b/src/MoonP/moon_compiler.cpp
index 4406dbd..fa55496 100644
--- a/src/MoonP/moon_compiler.cpp
+++ b/src/MoonP/moon_compiler.cpp
@@ -314,17 +314,17 @@ private:
314 Value_t* singleValueFrom(ast_node* item) const { 314 Value_t* singleValueFrom(ast_node* item) const {
315 Exp_t* exp = nullptr; 315 Exp_t* exp = nullptr;
316 switch (item->getId()) { 316 switch (item->getId()) {
317 case "Exp"_id: 317 case id<Exp_t>():
318 exp = static_cast<Exp_t*>(item); 318 exp = static_cast<Exp_t*>(item);
319 break; 319 break;
320 case "ExpList"_id: { 320 case id<ExpList_t>(): {
321 auto expList = static_cast<ExpList_t*>(item); 321 auto expList = static_cast<ExpList_t*>(item);
322 if (expList->exprs.size() == 1) { 322 if (expList->exprs.size() == 1) {
323 exp = static_cast<Exp_t*>(expList->exprs.front()); 323 exp = static_cast<Exp_t*>(expList->exprs.front());
324 } 324 }
325 break; 325 break;
326 } 326 }
327 case "ExpListLow"_id: { 327 case id<ExpListLow_t>(): {
328 auto expList = static_cast<ExpListLow_t*>(item); 328 auto expList = static_cast<ExpListLow_t*>(item);
329 if (expList->exprs.size() == 1) { 329 if (expList->exprs.size() == 1) {
330 exp = static_cast<Exp_t*>(expList->exprs.front()); 330 exp = static_cast<Exp_t*>(expList->exprs.front());
@@ -459,18 +459,18 @@ private:
459 auto firstItem = chainItems.back(); 459 auto firstItem = chainItems.back();
460 if (auto callable = ast_cast<Callable_t>(firstItem)) { 460 if (auto callable = ast_cast<Callable_t>(firstItem)) {
461 switch (callable->item->getId()) { 461 switch (callable->item->getId()) {
462 case "Variable"_id: 462 case id<Variable_t>():
463 case "SelfName"_id: 463 case id<SelfName_t>():
464 return true; 464 return true;
465 } 465 }
466 } else if (firstItem->getId() == "DotChainItem"_id) { 466 } else if (firstItem->getId() == id<DotChainItem_t>()) {
467 return true; 467 return true;
468 } 468 }
469 } else { 469 } else {
470 auto lastItem = chainItems.back(); 470 auto lastItem = chainItems.back();
471 switch (lastItem->getId()) { 471 switch (lastItem->getId()) {
472 case "DotChainItem"_id: 472 case id<DotChainItem_t>():
473 case "Exp"_id: 473 case id<Exp_t>():
474 return true; 474 return true;
475 } 475 }
476 } 476 }
@@ -481,16 +481,16 @@ private:
481 if (auto value = singleValueFrom(exp)) { 481 if (auto value = singleValueFrom(exp)) {
482 auto item = value->item.get(); 482 auto item = value->item.get();
483 switch (item->getId()) { 483 switch (item->getId()) {
484 case "simple_table"_id: 484 case id<simple_table_t>():
485 return true; 485 return true;
486 case "SimpleValue"_id: { 486 case id<SimpleValue_t>(): {
487 auto simpleValue = static_cast<SimpleValue_t*>(item); 487 auto simpleValue = static_cast<SimpleValue_t*>(item);
488 if (simpleValue->value. is<TableLit_t>()) { 488 if (simpleValue->value. is<TableLit_t>()) {
489 return true; 489 return true;
490 } 490 }
491 return false; 491 return false;
492 } 492 }
493 case "ChainValue"_id: { 493 case id<ChainValue_t>(): {
494 auto chainValue = static_cast<ChainValue_t*>(item); 494 auto chainValue = static_cast<ChainValue_t*>(item);
495 return isAssignable(chainValue->items.objects()); 495 return isAssignable(chainValue->items.objects());
496 } 496 }
@@ -539,7 +539,7 @@ private:
539 } 539 }
540 auto appendix = statement->appendix.get(); 540 auto appendix = statement->appendix.get();
541 switch (appendix->item->getId()) { 541 switch (appendix->item->getId()) {
542 case "if_else_line"_id: { 542 case id<if_else_line_t>(): {
543 auto if_else_line = appendix->item.to<if_else_line_t>(); 543 auto if_else_line = appendix->item.to<if_else_line_t>();
544 auto ifNode = x->new_ptr<If_t>(); 544 auto ifNode = x->new_ptr<If_t>();
545 545
@@ -580,7 +580,7 @@ private:
580 statement->content.set(expListAssign); 580 statement->content.set(expListAssign);
581 break; 581 break;
582 } 582 }
583 case "unless_line"_id: { 583 case id<unless_line_t>(): {
584 auto unless_line = appendix->item.to<unless_line_t>(); 584 auto unless_line = appendix->item.to<unless_line_t>();
585 auto unless = x->new_ptr<Unless_t>(); 585 auto unless = x->new_ptr<Unless_t>();
586 586
@@ -608,7 +608,7 @@ private:
608 statement->content.set(expListAssign); 608 statement->content.set(expListAssign);
609 break; 609 break;
610 } 610 }
611 case "CompInner"_id: { 611 case id<CompInner_t>(): {
612 auto compInner = appendix->item.to<CompInner_t>(); 612 auto compInner = appendix->item.to<CompInner_t>();
613 auto comp = x->new_ptr<Comprehension_t>(); 613 auto comp = x->new_ptr<Comprehension_t>();
614 comp->forLoop.set(compInner); 614 comp->forLoop.set(compInner);
@@ -629,7 +629,7 @@ private:
629 statement->appendix.set(nullptr); 629 statement->appendix.set(nullptr);
630 break; 630 break;
631 } 631 }
632 default: break; 632 default: assert(false); break;
633 } 633 }
634 } 634 }
635 auto content = statement->content.get(); 635 auto content = statement->content.get();
@@ -638,15 +638,15 @@ private:
638 return; 638 return;
639 } 639 }
640 switch (content->getId()) { 640 switch (content->getId()) {
641 case "Import"_id: transformImport(static_cast<Import_t*>(content), out); break; 641 case id<Import_t>(): transformImport(static_cast<Import_t*>(content), out); break;
642 case "While"_id: transformWhile(static_cast<While_t*>(content), out); break; 642 case id<While_t>(): transformWhile(static_cast<While_t*>(content), out); break;
643 case "For"_id: transformFor(static_cast<For_t*>(content), out); break; 643 case id<For_t>(): transformFor(static_cast<For_t*>(content), out); break;
644 case "ForEach"_id: transformForEach(static_cast<ForEach_t*>(content), out); break; 644 case id<ForEach_t>(): transformForEach(static_cast<ForEach_t*>(content), out); break;
645 case "Return"_id: transformReturn(static_cast<Return_t*>(content), out); break; 645 case id<Return_t>(): transformReturn(static_cast<Return_t*>(content), out); break;
646 case "Local"_id: transformLocal(static_cast<Local_t*>(content), out); break; 646 case id<Local_t>(): transformLocal(static_cast<Local_t*>(content), out); break;
647 case "Export"_id: transformExport(static_cast<Export_t*>(content), out); break; 647 case id<Export_t>(): transformExport(static_cast<Export_t*>(content), out); break;
648 case "BreakLoop"_id: transformBreakLoop(static_cast<BreakLoop_t*>(content), out); break; 648 case id<BreakLoop_t>(): transformBreakLoop(static_cast<BreakLoop_t*>(content), out); break;
649 case "ExpListAssign"_id: { 649 case id<ExpListAssign_t>(): {
650 auto expListAssign = static_cast<ExpListAssign_t*>(content); 650 auto expListAssign = static_cast<ExpListAssign_t*>(content);
651 if (expListAssign->action) { 651 if (expListAssign->action) {
652 transformAssignment(expListAssign, out); 652 transformAssignment(expListAssign, out);
@@ -661,16 +661,16 @@ private:
661 auto value = simpleValue->value.get(); 661 auto value = simpleValue->value.get();
662 bool specialSingleValue = true; 662 bool specialSingleValue = true;
663 switch (value->getId()) { 663 switch (value->getId()) {
664 case "If"_id: transformIf(static_cast<If_t*>(value), out, ExpUsage::Common); break; 664 case id<If_t>(): transformIf(static_cast<If_t*>(value), out, ExpUsage::Common); break;
665 case "ClassDecl"_id: transformClassDecl(static_cast<ClassDecl_t*>(value), out, ExpUsage::Common); break; 665 case id<ClassDecl_t>(): transformClassDecl(static_cast<ClassDecl_t*>(value), out, ExpUsage::Common); break;
666 case "Unless"_id: transformUnless(static_cast<Unless_t*>(value), out, ExpUsage::Common); break; 666 case id<Unless_t>(): transformUnless(static_cast<Unless_t*>(value), out, ExpUsage::Common); break;
667 case "Switch"_id: transformSwitch(static_cast<Switch_t*>(value), out, ExpUsage::Common); break; 667 case id<Switch_t>(): transformSwitch(static_cast<Switch_t*>(value), out, ExpUsage::Common); break;
668 case "With"_id: transformWith(static_cast<With_t*>(value), out); break; 668 case id<With_t>(): transformWith(static_cast<With_t*>(value), out); break;
669 case "ForEach"_id: transformForEach(static_cast<ForEach_t*>(value), out); break; 669 case id<ForEach_t>(): transformForEach(static_cast<ForEach_t*>(value), out); break;
670 case "For"_id: transformFor(static_cast<For_t*>(value), out); break; 670 case id<For_t>(): transformFor(static_cast<For_t*>(value), out); break;
671 case "While"_id: transformWhile(static_cast<While_t*>(value), out); break; 671 case id<While_t>(): transformWhile(static_cast<While_t*>(value), out); break;
672 case "Do"_id: transformDo(static_cast<Do_t*>(value), out, ExpUsage::Common); break; 672 case id<Do_t>(): transformDo(static_cast<Do_t*>(value), out, ExpUsage::Common); break;
673 case "Comprehension"_id: transformCompCommon(static_cast<Comprehension_t*>(value), out); break; 673 case id<Comprehension_t>(): transformCompCommon(static_cast<Comprehension_t*>(value), out); break;
674 default: specialSingleValue = false; break; 674 default: specialSingleValue = false; break;
675 } 675 }
676 if (specialSingleValue) { 676 if (specialSingleValue) {
@@ -694,7 +694,7 @@ private:
694 } 694 }
695 break; 695 break;
696 } 696 }
697 default: break; 697 default: assert(false); break;
698 } 698 }
699 } 699 }
700 700
@@ -834,20 +834,20 @@ private:
834 } 834 }
835 } 835 }
836 switch (value->getId()) { 836 switch (value->getId()) {
837 case "If"_id: 837 case id<If_t>():
838 case "Unless"_id: { 838 case id<Unless_t>(): {
839 auto expList = assignment->expList.get(); 839 auto expList = assignment->expList.get();
840 str_list temp; 840 str_list temp;
841 auto defs = transformAssignDefs(expList); 841 auto defs = transformAssignDefs(expList);
842 if (!defs.empty()) temp.push_back(getPredefine(defs) + nll(expList)); 842 if (!defs.empty()) temp.push_back(getPredefine(defs) + nll(expList));
843 switch (value->getId()) { 843 switch (value->getId()) {
844 case "If"_id: transformIf(static_cast<If_t*>(value), temp, ExpUsage::Assignment, expList); break; 844 case id<If_t>(): transformIf(static_cast<If_t*>(value), temp, ExpUsage::Assignment, expList); break;
845 case "Unless"_id: transformUnless(static_cast<Unless_t*>(value), temp, ExpUsage::Assignment, expList); break; 845 case id<Unless_t>(): transformUnless(static_cast<Unless_t*>(value), temp, ExpUsage::Assignment, expList); break;
846 } 846 }
847 out.push_back(join(temp)); 847 out.push_back(join(temp));
848 return; 848 return;
849 } 849 }
850 case "Switch"_id: { 850 case id<Switch_t>(): {
851 auto switchNode = static_cast<Switch_t*>(value); 851 auto switchNode = static_cast<Switch_t*>(value);
852 auto assignList = assignment->expList.get(); 852 auto assignList = assignment->expList.get();
853 std::string preDefine = getPredefine(assignment); 853 std::string preDefine = getPredefine(assignment);
@@ -855,7 +855,7 @@ private:
855 out.back().insert(0, preDefine.empty() ? Empty : preDefine + nll(assignment)); 855 out.back().insert(0, preDefine.empty() ? Empty : preDefine + nll(assignment));
856 return; 856 return;
857 } 857 }
858 case "With"_id: { 858 case id<With_t>(): {
859 auto withNode = static_cast<With_t*>(value); 859 auto withNode = static_cast<With_t*>(value);
860 auto expList = assignment->expList.get(); 860 auto expList = assignment->expList.get();
861 std::string preDefine = getPredefine(assignment); 861 std::string preDefine = getPredefine(assignment);
@@ -863,7 +863,7 @@ private:
863 out.back().insert(0, preDefine.empty() ? Empty : preDefine + nll(assignment)); 863 out.back().insert(0, preDefine.empty() ? Empty : preDefine + nll(assignment));
864 return; 864 return;
865 } 865 }
866 case "Do"_id: { 866 case id<Do_t>(): {
867 auto expList = assignment->expList.get(); 867 auto expList = assignment->expList.get();
868 auto doNode = static_cast<Do_t*>(value); 868 auto doNode = static_cast<Do_t*>(value);
869 std::string preDefine = getPredefine(assignment); 869 std::string preDefine = getPredefine(assignment);
@@ -871,42 +871,42 @@ private:
871 out.back().insert(0, preDefine.empty() ? Empty : preDefine + nll(assignment)); 871 out.back().insert(0, preDefine.empty() ? Empty : preDefine + nll(assignment));
872 return; 872 return;
873 } 873 }
874 case "Comprehension"_id: { 874 case id<Comprehension_t>(): {
875 auto expList = assignment->expList.get(); 875 auto expList = assignment->expList.get();
876 std::string preDefine = getPredefine(assignment); 876 std::string preDefine = getPredefine(assignment);
877 transformComprehension(static_cast<Comprehension_t*>(value), out, ExpUsage::Assignment, expList); 877 transformComprehension(static_cast<Comprehension_t*>(value), out, ExpUsage::Assignment, expList);
878 out.back().insert(0, preDefine.empty() ? Empty : preDefine + nll(assignment)); 878 out.back().insert(0, preDefine.empty() ? Empty : preDefine + nll(assignment));
879 return; 879 return;
880 } 880 }
881 case "TblComprehension"_id: { 881 case id<TblComprehension_t>(): {
882 auto expList = assignment->expList.get(); 882 auto expList = assignment->expList.get();
883 std::string preDefine = getPredefine(assignment); 883 std::string preDefine = getPredefine(assignment);
884 transformTblComprehension(static_cast<TblComprehension_t*>(value), out, ExpUsage::Assignment, expList); 884 transformTblComprehension(static_cast<TblComprehension_t*>(value), out, ExpUsage::Assignment, expList);
885 out.back().insert(0, preDefine.empty() ? Empty : preDefine + nll(assignment)); 885 out.back().insert(0, preDefine.empty() ? Empty : preDefine + nll(assignment));
886 return; 886 return;
887 } 887 }
888 case "For"_id: { 888 case id<For_t>(): {
889 auto expList = assignment->expList.get(); 889 auto expList = assignment->expList.get();
890 std::string preDefine = getPredefine(assignment); 890 std::string preDefine = getPredefine(assignment);
891 transformForInPlace(static_cast<For_t*>(value), out, expList); 891 transformForInPlace(static_cast<For_t*>(value), out, expList);
892 out.back().insert(0, preDefine.empty() ? Empty : preDefine + nll(assignment)); 892 out.back().insert(0, preDefine.empty() ? Empty : preDefine + nll(assignment));
893 return; 893 return;
894 } 894 }
895 case "ForEach"_id: { 895 case id<ForEach_t>(): {
896 auto expList = assignment->expList.get(); 896 auto expList = assignment->expList.get();
897 std::string preDefine = getPredefine(assignment); 897 std::string preDefine = getPredefine(assignment);
898 transformForEachInPlace(static_cast<ForEach_t*>(value), out, expList); 898 transformForEachInPlace(static_cast<ForEach_t*>(value), out, expList);
899 out.back().insert(0, preDefine.empty() ? Empty : preDefine + nll(assignment)); 899 out.back().insert(0, preDefine.empty() ? Empty : preDefine + nll(assignment));
900 return; 900 return;
901 } 901 }
902 case "ClassDecl"_id: { 902 case id<ClassDecl_t>(): {
903 auto expList = assignment->expList.get(); 903 auto expList = assignment->expList.get();
904 std::string preDefine = getPredefine(assignment); 904 std::string preDefine = getPredefine(assignment);
905 transformClassDecl(static_cast<ClassDecl_t*>(value), out, ExpUsage::Assignment, expList); 905 transformClassDecl(static_cast<ClassDecl_t*>(value), out, ExpUsage::Assignment, expList);
906 out.back().insert(0, preDefine.empty() ? Empty : preDefine + nll(assignment)); 906 out.back().insert(0, preDefine.empty() ? Empty : preDefine + nll(assignment));
907 return; 907 return;
908 } 908 }
909 case "While"_id: { 909 case id<While_t>(): {
910 auto expList = assignment->expList.get(); 910 auto expList = assignment->expList.get();
911 std::string preDefine = getPredefine(assignment); 911 std::string preDefine = getPredefine(assignment);
912 transformWhileInPlace(static_cast<While_t*>(value), out, expList); 912 transformWhileInPlace(static_cast<While_t*>(value), out, expList);
@@ -1006,12 +1006,12 @@ private:
1006 1006
1007 void transformAssignItem(ast_node* value, str_list& out) { 1007 void transformAssignItem(ast_node* value, str_list& out) {
1008 switch (value->getId()) { 1008 switch (value->getId()) {
1009 case "With"_id: transformWithClosure(static_cast<With_t*>(value), out); break; 1009 case id<With_t>(): transformWithClosure(static_cast<With_t*>(value), out); break;
1010 case "If"_id: transformIf(static_cast<If_t*>(value), out, ExpUsage::Closure); break; 1010 case id<If_t>(): transformIf(static_cast<If_t*>(value), out, ExpUsage::Closure); break;
1011 case "Switch"_id: transformSwitch(static_cast<Switch_t*>(value), out, ExpUsage::Closure); break; 1011 case id<Switch_t>(): transformSwitch(static_cast<Switch_t*>(value), out, ExpUsage::Closure); break;
1012 case "TableBlock"_id: transformTableBlock(static_cast<TableBlock_t*>(value), out); break; 1012 case id<TableBlock_t>(): transformTableBlock(static_cast<TableBlock_t*>(value), out); break;
1013 case "Exp"_id: transformExp(static_cast<Exp_t*>(value), out, ExpUsage::Closure); break; 1013 case id<Exp_t>(): transformExp(static_cast<Exp_t*>(value), out, ExpUsage::Closure); break;
1014 default: break; 1014 default: assert(false); break;
1015 } 1015 }
1016 } 1016 }
1017 1017
@@ -1034,7 +1034,7 @@ private:
1034 int index = 0; 1034 int index = 0;
1035 for (auto pair : *tableItems) { 1035 for (auto pair : *tableItems) {
1036 switch (pair->getId()) { 1036 switch (pair->getId()) {
1037 case "Exp"_id: { 1037 case id<Exp_t>(): {
1038 ++index; 1038 ++index;
1039 if (!isAssignable(static_cast<Exp_t*>(pair))) { 1039 if (!isAssignable(static_cast<Exp_t*>(pair))) {
1040 throw std::logic_error(_info.errorMessage("Can't destructure value."sv, pair)); 1040 throw std::logic_error(_info.errorMessage("Can't destructure value."sv, pair));
@@ -1068,7 +1068,7 @@ private:
1068 } 1068 }
1069 break; 1069 break;
1070 } 1070 }
1071 case "variable_pair"_id: { 1071 case id<variable_pair_t>(): {
1072 auto vp = static_cast<variable_pair_t*>(pair); 1072 auto vp = static_cast<variable_pair_t*>(pair);
1073 auto name = _parser.toString(vp->name); 1073 auto name = _parser.toString(vp->name);
1074 if (Keywords.find(name) != Keywords.end()) { 1074 if (Keywords.find(name) != Keywords.end()) {
@@ -1078,7 +1078,7 @@ private:
1078 } 1078 }
1079 break; 1079 break;
1080 } 1080 }
1081 case "normal_pair"_id: { 1081 case id<normal_pair_t>(): {
1082 auto np = static_cast<normal_pair_t*>(pair); 1082 auto np = static_cast<normal_pair_t*>(pair);
1083 auto key = np->key->getByPath<Name_t>(); 1083 auto key = np->key->getByPath<Name_t>();
1084 if (!key) throw std::logic_error(_info.errorMessage("Invalid key for destructure."sv, np)); 1084 if (!key) throw std::logic_error(_info.errorMessage("Invalid key for destructure."sv, np));
@@ -1135,6 +1135,7 @@ private:
1135 } 1135 }
1136 break; 1136 break;
1137 } 1137 }
1138 default: assert(false); break;
1138 } 1139 }
1139 } 1140 }
1140 return pairs; 1141 return pairs;
@@ -1203,7 +1204,7 @@ private:
1203 auto expList = assignment->expList.get(); 1204 auto expList = assignment->expList.get();
1204 auto action = assignment->action.get(); 1205 auto action = assignment->action.get();
1205 switch (action->getId()) { 1206 switch (action->getId()) {
1206 case "Update"_id: { 1207 case id<Update_t>(): {
1207 if (expList->exprs.size() > 1) throw std::logic_error(_info.errorMessage("Can not apply update to multiple values."sv, expList)); 1208 if (expList->exprs.size() > 1) throw std::logic_error(_info.errorMessage("Can not apply update to multiple values."sv, expList));
1208 auto update = static_cast<Update_t*>(action); 1209 auto update = static_cast<Update_t*>(action);
1209 auto leftExp = static_cast<Exp_t*>(expList->exprs.objects().front()); 1210 auto leftExp = static_cast<Exp_t*>(expList->exprs.objects().front());
@@ -1247,7 +1248,7 @@ private:
1247 out.push_back(clearBuf()); 1248 out.push_back(clearBuf());
1248 break; 1249 break;
1249 } 1250 }
1250 case "Assign"_id: { 1251 case id<Assign_t>(): {
1251 bool oneLined = true; 1252 bool oneLined = true;
1252 auto assign = static_cast<Assign_t*>(action); 1253 auto assign = static_cast<Assign_t*>(action);
1253 for (auto val : assign->values.objects()) { 1254 for (auto val : assign->values.objects()) {
@@ -1292,7 +1293,7 @@ private:
1292 } 1293 }
1293 break; 1294 break;
1294 } 1295 }
1295 default: break; 1296 default: assert(false); break;
1296 } 1297 }
1297 } 1298 }
1298 1299
@@ -1344,14 +1345,14 @@ private:
1344 ifCondPairs.emplace_back(); 1345 ifCondPairs.emplace_back();
1345 for (auto node : nodes) { 1346 for (auto node : nodes) {
1346 switch (node->getId()) { 1347 switch (node->getId()) {
1347 case "IfCond"_id: 1348 case id<IfCond_t>():
1348 ifCondPairs.back().first = static_cast<IfCond_t*>(node); 1349 ifCondPairs.back().first = static_cast<IfCond_t*>(node);
1349 break; 1350 break;
1350 case "Body"_id: 1351 case id<Body_t>():
1351 ifCondPairs.back().second = static_cast<Body_t*>(node); 1352 ifCondPairs.back().second = static_cast<Body_t*>(node);
1352 ifCondPairs.emplace_back(); 1353 ifCondPairs.emplace_back();
1353 break; 1354 break;
1354 default: break; 1355 default: assert(false); break;
1355 } 1356 }
1356 } 1357 }
1357 auto assign = ifCondPairs.front().first->assign.get(); 1358 auto assign = ifCondPairs.front().first->assign.get();
@@ -1571,22 +1572,22 @@ private:
1571 void transformValue(Value_t* value, str_list& out) { 1572 void transformValue(Value_t* value, str_list& out) {
1572 auto item = value->item.get(); 1573 auto item = value->item.get();
1573 switch (item->getId()) { 1574 switch (item->getId()) {
1574 case "SimpleValue"_id: transformSimpleValue(static_cast<SimpleValue_t*>(item), out); break; 1575 case id<SimpleValue_t>(): transformSimpleValue(static_cast<SimpleValue_t*>(item), out); break;
1575 case "simple_table"_id: transform_simple_table(static_cast<simple_table_t*>(item), out); break; 1576 case id<simple_table_t>(): transform_simple_table(static_cast<simple_table_t*>(item), out); break;
1576 case "ChainValue"_id: { 1577 case id<ChainValue_t>(): {
1577 auto chainValue = static_cast<ChainValue_t*>(item); 1578 auto chainValue = static_cast<ChainValue_t*>(item);
1578 transformChainValue(chainValue, out, ExpUsage::Closure); 1579 transformChainValue(chainValue, out, ExpUsage::Closure);
1579 break; 1580 break;
1580 } 1581 }
1581 case "String"_id: transformString(static_cast<String_t*>(item), out); break; 1582 case id<String_t>(): transformString(static_cast<String_t*>(item), out); break;
1582 default: break; 1583 default: assert(false); break;
1583 } 1584 }
1584 } 1585 }
1585 1586
1586 void transformCallable(Callable_t* callable, str_list& out, const ast_sel<false,Invoke_t,InvokeArgs_t>& invoke = {}) { 1587 void transformCallable(Callable_t* callable, str_list& out, const ast_sel<false,Invoke_t,InvokeArgs_t>& invoke = {}) {
1587 auto item = callable->item.get(); 1588 auto item = callable->item.get();
1588 switch (item->getId()) { 1589 switch (item->getId()) {
1589 case "Variable"_id: { 1590 case id<Variable_t>(): {
1590 transformVariable(static_cast<Variable_t*>(item), out); 1591 transformVariable(static_cast<Variable_t*>(item), out);
1591 if (_config.lintGlobalVariable && !isDefined(out.back())) { 1592 if (_config.lintGlobalVariable && !isDefined(out.back())) {
1592 if (_globals.find(out.back()) == _globals.end()) { 1593 if (_globals.find(out.back()) == _globals.end()) {
@@ -1595,7 +1596,7 @@ private:
1595 } 1596 }
1596 break; 1597 break;
1597 } 1598 }
1598 case "SelfName"_id: { 1599 case id<SelfName_t>(): {
1599 transformSelfName(static_cast<SelfName_t*>(item), out, invoke); 1600 transformSelfName(static_cast<SelfName_t*>(item), out, invoke);
1600 if (_config.lintGlobalVariable) { 1601 if (_config.lintGlobalVariable) {
1601 std::string self("self"sv); 1602 std::string self("self"sv);
@@ -1607,9 +1608,9 @@ private:
1607 } 1608 }
1608 break; 1609 break;
1609 } 1610 }
1610 case "VarArg"_id: out.push_back(s("..."sv)); break; 1611 case id<VarArg_t>(): out.push_back(s("..."sv)); break;
1611 case "Parens"_id: transformParens(static_cast<Parens_t*>(item), out); break; 1612 case id<Parens_t>(): transformParens(static_cast<Parens_t*>(item), out); break;
1612 default: break; 1613 default: assert(false); break;
1613 } 1614 }
1614 } 1615 }
1615 1616
@@ -1622,23 +1623,23 @@ private:
1622 void transformSimpleValue(SimpleValue_t* simpleValue, str_list& out) { 1623 void transformSimpleValue(SimpleValue_t* simpleValue, str_list& out) {
1623 auto value = simpleValue->value.get(); 1624 auto value = simpleValue->value.get();
1624 switch (value->getId()) { 1625 switch (value->getId()) {
1625 case "const_value"_id: transform_const_value(static_cast<const_value_t*>(value), out); break; 1626 case id<const_value_t>(): transform_const_value(static_cast<const_value_t*>(value), out); break;
1626 case "If"_id: transformIf(static_cast<If_t*>(value), out, ExpUsage::Closure); break; 1627 case id<If_t>(): transformIf(static_cast<If_t*>(value), out, ExpUsage::Closure); break;
1627 case "Unless"_id: transformUnless(static_cast<Unless_t*>(value), out, ExpUsage::Closure); break; 1628 case id<Unless_t>(): transformUnless(static_cast<Unless_t*>(value), out, ExpUsage::Closure); break;
1628 case "Switch"_id: transformSwitch(static_cast<Switch_t*>(value), out, ExpUsage::Closure); break; 1629 case id<Switch_t>(): transformSwitch(static_cast<Switch_t*>(value), out, ExpUsage::Closure); break;
1629 case "With"_id: transformWithClosure(static_cast<With_t*>(value), out); break; 1630 case id<With_t>(): transformWithClosure(static_cast<With_t*>(value), out); break;
1630 case "ClassDecl"_id: transformClassDeclClosure(static_cast<ClassDecl_t*>(value), out); break; 1631 case id<ClassDecl_t>(): transformClassDeclClosure(static_cast<ClassDecl_t*>(value), out); break;
1631 case "ForEach"_id: transformForEachClosure(static_cast<ForEach_t*>(value), out); break; 1632 case id<ForEach_t>(): transformForEachClosure(static_cast<ForEach_t*>(value), out); break;
1632 case "For"_id: transformForClosure(static_cast<For_t*>(value), out); break; 1633 case id<For_t>(): transformForClosure(static_cast<For_t*>(value), out); break;
1633 case "While"_id: transformWhileClosure(static_cast<While_t*>(value), out); break; 1634 case id<While_t>(): transformWhileClosure(static_cast<While_t*>(value), out); break;
1634 case "Do"_id: transformDo(static_cast<Do_t*>(value), out, ExpUsage::Closure); break; 1635 case id<Do_t>(): transformDo(static_cast<Do_t*>(value), out, ExpUsage::Closure); break;
1635 case "unary_exp"_id: transform_unary_exp(static_cast<unary_exp_t*>(value), out); break; 1636 case id<unary_exp_t>(): transform_unary_exp(static_cast<unary_exp_t*>(value), out); break;
1636 case "TblComprehension"_id: transformTblComprehension(static_cast<TblComprehension_t*>(value), out, ExpUsage::Closure); break; 1637 case id<TblComprehension_t>(): transformTblComprehension(static_cast<TblComprehension_t*>(value), out, ExpUsage::Closure); break;
1637 case "TableLit"_id: transformTableLit(static_cast<TableLit_t*>(value), out); break; 1638 case id<TableLit_t>(): transformTableLit(static_cast<TableLit_t*>(value), out); break;
1638 case "Comprehension"_id: transformComprehension(static_cast<Comprehension_t*>(value), out, ExpUsage::Closure); break; 1639 case id<Comprehension_t>(): transformComprehension(static_cast<Comprehension_t*>(value), out, ExpUsage::Closure); break;
1639 case "FunLit"_id: transformFunLit(static_cast<FunLit_t*>(value), out); break; 1640 case id<FunLit_t>(): transformFunLit(static_cast<FunLit_t*>(value), out); break;
1640 case "Num"_id: transformNum(static_cast<Num_t*>(value), out); break; 1641 case id<Num_t>(): transformNum(static_cast<Num_t*>(value), out); break;
1641 default: break; 1642 default: assert(false); break;
1642 } 1643 }
1643 } 1644 }
1644 1645
@@ -1882,8 +1883,7 @@ private:
1882 } 1883 }
1883 break; 1884 break;
1884 } 1885 }
1885 default: 1886 default: break;
1886 break;
1887 } 1887 }
1888 if (!nodes.empty()) { 1888 if (!nodes.empty()) {
1889 str_list temp; 1889 str_list temp;
@@ -1909,37 +1909,37 @@ private:
1909 if (auto simpleValue = singleValue->item.as<SimpleValue_t>()) { 1909 if (auto simpleValue = singleValue->item.as<SimpleValue_t>()) {
1910 auto value = simpleValue->value.get(); 1910 auto value = simpleValue->value.get();
1911 switch (value->getId()) { 1911 switch (value->getId()) {
1912 case "Comprehension"_id: 1912 case id<Comprehension_t>():
1913 transformComprehension(static_cast<Comprehension_t*>(value), out, ExpUsage::Return); 1913 transformComprehension(static_cast<Comprehension_t*>(value), out, ExpUsage::Return);
1914 return; 1914 return;
1915 case "TblComprehension"_id: 1915 case id<TblComprehension_t>():
1916 transformTblComprehension(static_cast<TblComprehension_t*>(value), out, ExpUsage::Return); 1916 transformTblComprehension(static_cast<TblComprehension_t*>(value), out, ExpUsage::Return);
1917 return; 1917 return;
1918 case "With"_id: 1918 case id<With_t>():
1919 transformWith(static_cast<With_t*>(value), out, nullptr, true); 1919 transformWith(static_cast<With_t*>(value), out, nullptr, true);
1920 return; 1920 return;
1921 case "ClassDecl"_id: 1921 case id<ClassDecl_t>():
1922 transformClassDecl(static_cast<ClassDecl_t*>(value), out, ExpUsage::Return); 1922 transformClassDecl(static_cast<ClassDecl_t*>(value), out, ExpUsage::Return);
1923 return; 1923 return;
1924 case "Do"_id: 1924 case id<Do_t>():
1925 transformDo(static_cast<Do_t*>(value), out, ExpUsage::Return); 1925 transformDo(static_cast<Do_t*>(value), out, ExpUsage::Return);
1926 return; 1926 return;
1927 case "Switch"_id: 1927 case id<Switch_t>():
1928 transformSwitch(static_cast<Switch_t*>(value), out, ExpUsage::Return); 1928 transformSwitch(static_cast<Switch_t*>(value), out, ExpUsage::Return);
1929 return; 1929 return;
1930 case "While"_id: 1930 case id<While_t>():
1931 transformWhileInPlace(static_cast<While_t*>(value), out); 1931 transformWhileInPlace(static_cast<While_t*>(value), out);
1932 return; 1932 return;
1933 case "For"_id: 1933 case id<For_t>():
1934 transformForInPlace(static_cast<For_t*>(value), out); 1934 transformForInPlace(static_cast<For_t*>(value), out);
1935 return; 1935 return;
1936 case "ForEach"_id: 1936 case id<ForEach_t>():
1937 transformForEachInPlace(static_cast<ForEach_t*>(value), out); 1937 transformForEachInPlace(static_cast<ForEach_t*>(value), out);
1938 return; 1938 return;
1939 case "If"_id: 1939 case id<If_t>():
1940 transformIf(static_cast<If_t*>(value), out, ExpUsage::Return); 1940 transformIf(static_cast<If_t*>(value), out, ExpUsage::Return);
1941 return; 1941 return;
1942 case "Unless"_id: 1942 case id<Unless_t>():
1943 transformUnless(static_cast<Unless_t*>(value), out, ExpUsage::Return); 1943 transformUnless(static_cast<Unless_t*>(value), out, ExpUsage::Return);
1944 return; 1944 return;
1945 } 1945 }
@@ -1998,34 +1998,35 @@ private:
1998 auto def = static_cast<FnArgDef_t*>(_def); 1998 auto def = static_cast<FnArgDef_t*>(_def);
1999 auto& arg = argItems.emplace_back(); 1999 auto& arg = argItems.emplace_back();
2000 switch (def->name->getId()) { 2000 switch (def->name->getId()) {
2001 case "Variable"_id: arg.name = _parser.toString(def->name); break; 2001 case id<Variable_t>(): arg.name = _parser.toString(def->name); break;
2002 case "SelfName"_id: { 2002 case id<SelfName_t>(): {
2003 assignSelf = true; 2003 assignSelf = true;
2004 auto selfName = static_cast<SelfName_t*>(def->name.get()); 2004 auto selfName = static_cast<SelfName_t*>(def->name.get());
2005 switch (selfName->name->getId()) { 2005 switch (selfName->name->getId()) {
2006 case "self_class_name"_id: { 2006 case id<self_class_name_t>(): {
2007 auto clsName = static_cast<self_class_name_t*>(selfName->name.get()); 2007 auto clsName = static_cast<self_class_name_t*>(selfName->name.get());
2008 arg.name = _parser.toString(clsName->name); 2008 arg.name = _parser.toString(clsName->name);
2009 arg.assignSelf = s("self.__class."sv) + arg.name; 2009 arg.assignSelf = s("self.__class."sv) + arg.name;
2010 break; 2010 break;
2011 } 2011 }
2012 case "self_class"_id: 2012 case id<self_class_t>():
2013 arg.name = "self.__class"sv; 2013 arg.name = "self.__class"sv;
2014 break; 2014 break;
2015 case "self_name"_id: { 2015 case id<self_name_t>(): {
2016 2016
2017 auto sfName = static_cast<self_name_t*>(selfName->name.get()); 2017 auto sfName = static_cast<self_name_t*>(selfName->name.get());
2018 arg.name = _parser.toString(sfName->name); 2018 arg.name = _parser.toString(sfName->name);
2019 arg.assignSelf = s("self."sv) + arg.name; 2019 arg.assignSelf = s("self."sv) + arg.name;
2020 break; 2020 break;
2021 } 2021 }
2022 case "self"_id: 2022 case id<self_t>():
2023 arg.name = "self"sv; 2023 arg.name = "self"sv;
2024 break; 2024 break;
2025 default: break; 2025 default: assert(false); break;
2026 } 2026 }
2027 break; 2027 break;
2028 } 2028 }
2029 default: assert(false); break;
2029 } 2030 }
2030 forceAddToScope(arg.name); 2031 forceAddToScope(arg.name);
2031 if (def->defaultValue) { 2032 if (def->defaultValue) {
@@ -2075,7 +2076,7 @@ private:
2075 auto x = selfName; 2076 auto x = selfName;
2076 auto name = selfName->name.get(); 2077 auto name = selfName->name.get();
2077 switch (name->getId()) { 2078 switch (name->getId()) {
2078 case "self_class_name"_id: { 2079 case id<self_class_name_t>(): {
2079 auto clsName = static_cast<self_class_name_t*>(name); 2080 auto clsName = static_cast<self_class_name_t*>(name);
2080 auto nameStr = _parser.toString(clsName->name); 2081 auto nameStr = _parser.toString(clsName->name);
2081 if (LuaKeywords.find(nameStr) != LuaKeywords.end()) { 2082 if (LuaKeywords.find(nameStr) != LuaKeywords.end()) {
@@ -2093,10 +2094,10 @@ private:
2093 } 2094 }
2094 break; 2095 break;
2095 } 2096 }
2096 case "self_class"_id: 2097 case id<self_class_t>():
2097 out.push_back(s("self.__class"sv)); 2098 out.push_back(s("self.__class"sv));
2098 break; 2099 break;
2099 case "self_name"_id: { 2100 case id<self_name_t>(): {
2100 auto sfName = static_cast<self_class_name_t*>(name); 2101 auto sfName = static_cast<self_class_name_t*>(name);
2101 auto nameStr = _parser.toString(sfName->name); 2102 auto nameStr = _parser.toString(sfName->name);
2102 if (LuaKeywords.find(nameStr) != LuaKeywords.end()) { 2103 if (LuaKeywords.find(nameStr) != LuaKeywords.end()) {
@@ -2114,9 +2115,10 @@ private:
2114 } 2115 }
2115 break; 2116 break;
2116 } 2117 }
2117 case "self"_id: 2118 case id<self_t>():
2118 out.push_back(s("self"sv)); 2119 out.push_back(s("self"sv));
2119 break; 2120 break;
2121 default: assert(false); break;
2120 } 2122 }
2121 } 2123 }
2122 2124
@@ -2344,8 +2346,8 @@ private:
2344 } 2346 }
2345 auto baseChain = x->new_ptr<ChainValue_t>(); 2347 auto baseChain = x->new_ptr<ChainValue_t>();
2346 switch (chainList.front()->getId()) { 2348 switch (chainList.front()->getId()) {
2347 case "DotChainItem"_id: 2349 case id<DotChainItem_t>():
2348 case "ColonChainItem"_id: 2350 case id<ColonChainItem_t>():
2349 if (_withVars.empty()) { 2351 if (_withVars.empty()) {
2350 throw std::logic_error(_info.errorMessage("Short dot/colon syntax must be called within a with block."sv, chainList.front())); 2352 throw std::logic_error(_info.errorMessage("Short dot/colon syntax must be called within a with block."sv, chainList.front()));
2351 } else { 2353 } else {
@@ -2426,8 +2428,8 @@ private:
2426 auto x = chainList.front(); 2428 auto x = chainList.front();
2427 str_list temp; 2429 str_list temp;
2428 switch (x->getId()) { 2430 switch (x->getId()) {
2429 case "DotChainItem"_id: 2431 case id<DotChainItem_t>():
2430 case "ColonChainItem"_id: 2432 case id<ColonChainItem_t>():
2431 if (_withVars.empty()) { 2433 if (_withVars.empty()) {
2432 throw std::logic_error(_info.errorMessage("Short dot/colon syntax must be called within a with block."sv, x)); 2434 throw std::logic_error(_info.errorMessage("Short dot/colon syntax must be called within a with block."sv, x));
2433 } else { 2435 } else {
@@ -2438,13 +2440,13 @@ private:
2438 for (auto it = chainList.begin(); it != chainList.end(); ++it) { 2440 for (auto it = chainList.begin(); it != chainList.end(); ++it) {
2439 auto item = *it; 2441 auto item = *it;
2440 switch (item->getId()) { 2442 switch (item->getId()) {
2441 case "Invoke"_id: 2443 case id<Invoke_t>():
2442 transformInvoke(static_cast<Invoke_t*>(item), temp); 2444 transformInvoke(static_cast<Invoke_t*>(item), temp);
2443 break; 2445 break;
2444 case "DotChainItem"_id: 2446 case id<DotChainItem_t>():
2445 transformDotChainItem(static_cast<DotChainItem_t*>(item), temp); 2447 transformDotChainItem(static_cast<DotChainItem_t*>(item), temp);
2446 break; 2448 break;
2447 case "ColonChainItem"_id: { 2449 case id<ColonChainItem_t>(): {
2448 auto colonItem = static_cast<ColonChainItem_t*>(item); 2450 auto colonItem = static_cast<ColonChainItem_t*>(item);
2449 auto current = it; 2451 auto current = it;
2450 auto next = current; ++next; 2452 auto next = current; ++next;
@@ -2469,8 +2471,8 @@ private:
2469 { 2471 {
2470 auto chainValue = x->new_ptr<ChainValue_t>(); 2472 auto chainValue = x->new_ptr<ChainValue_t>();
2471 switch (chainList.front()->getId()) { 2473 switch (chainList.front()->getId()) {
2472 case "DotChainItem"_id: 2474 case id<DotChainItem_t>():
2473 case "ColonChainItem"_id: 2475 case id<ColonChainItem_t>():
2474 chainValue->items.push_back(toAst<Callable_t>(_withVars.top(), x)); 2476 chainValue->items.push_back(toAst<Callable_t>(_withVars.top(), x));
2475 break; 2477 break;
2476 } 2478 }
@@ -2559,10 +2561,10 @@ private:
2559 transformColonChainItem(colonItem, temp); 2561 transformColonChainItem(colonItem, temp);
2560 break; 2562 break;
2561 } 2563 }
2562 case "Slice"_id: 2564 case id<Slice_t>():
2563 transformSlice(static_cast<Slice_t*>(item), temp); 2565 transformSlice(static_cast<Slice_t*>(item), temp);
2564 break; 2566 break;
2565 case "Callable"_id: { 2567 case id<Callable_t>(): {
2566 auto next = it; ++next; 2568 auto next = it; ++next;
2567 auto followItem = next != chainList.end() ? *next : nullptr; 2569 auto followItem = next != chainList.end() ? *next : nullptr;
2568 ast_sel<false, Invoke_t, InvokeArgs_t> invoke; 2570 ast_sel<false, Invoke_t, InvokeArgs_t> invoke;
@@ -2572,16 +2574,16 @@ private:
2572 transformCallable(static_cast<Callable_t*>(item), temp, invoke); 2574 transformCallable(static_cast<Callable_t*>(item), temp, invoke);
2573 break; 2575 break;
2574 } 2576 }
2575 case "String"_id: 2577 case id<String_t>():
2576 transformString(static_cast<String_t*>(item), temp); 2578 transformString(static_cast<String_t*>(item), temp);
2577 temp.back() = s("("sv) + temp.back() + s(")"sv); 2579 temp.back() = s("("sv) + temp.back() + s(")"sv);
2578 break; 2580 break;
2579 case "Exp"_id: 2581 case id<Exp_t>():
2580 transformExp(static_cast<Exp_t*>(item), temp, ExpUsage::Closure); 2582 transformExp(static_cast<Exp_t*>(item), temp, ExpUsage::Closure);
2581 temp.back() = s("["sv) + temp.back() + s("]"sv); 2583 temp.back() = s("["sv) + temp.back() + s("]"sv);
2582 break; 2584 break;
2583 case "InvokeArgs"_id: transformInvokeArgs(static_cast<InvokeArgs_t*>(item), temp); break; 2585 case id<InvokeArgs_t>(): transformInvokeArgs(static_cast<InvokeArgs_t*>(item), temp); break;
2584 default: break; 2586 default: assert(false); break;
2585 } 2587 }
2586 } 2588 }
2587 switch (usage) { 2589 switch (usage) {
@@ -2637,11 +2639,11 @@ private:
2637 str_list temp; 2639 str_list temp;
2638 for (auto arg : invoke->args.objects()) { 2640 for (auto arg : invoke->args.objects()) {
2639 switch (arg->getId()) { 2641 switch (arg->getId()) {
2640 case "Exp"_id: transformExp(static_cast<Exp_t*>(arg), temp, ExpUsage::Closure); break; 2642 case id<Exp_t>(): transformExp(static_cast<Exp_t*>(arg), temp, ExpUsage::Closure); break;
2641 case "SingleString"_id: transformSingleString(static_cast<SingleString_t*>(arg), temp); break; 2643 case id<SingleString_t>(): transformSingleString(static_cast<SingleString_t*>(arg), temp); break;
2642 case "DoubleString"_id: transformDoubleString(static_cast<DoubleString_t*>(arg), temp); break; 2644 case id<DoubleString_t>(): transformDoubleString(static_cast<DoubleString_t*>(arg), temp); break;
2643 case "LuaString"_id: transformLuaString(static_cast<LuaString_t*>(arg), temp); break; 2645 case id<LuaString_t>(): transformLuaString(static_cast<LuaString_t*>(arg), temp); break;
2644 default: break; 2646 default: assert(false); break;
2645 } 2647 }
2646 } 2648 }
2647 out.push_back(s("("sv) + join(temp, ", "sv) + s(")"sv)); 2649 out.push_back(s("("sv) + join(temp, ", "sv) + s(")"sv));
@@ -2672,17 +2674,18 @@ private:
2672 auto compInner = comp->forLoop.get(); 2674 auto compInner = comp->forLoop.get();
2673 for (auto item : compInner->items.objects()) { 2675 for (auto item : compInner->items.objects()) {
2674 switch (item->getId()) { 2676 switch (item->getId()) {
2675 case "CompForEach"_id: 2677 case id<CompForEach_t>():
2676 transformCompForEach(static_cast<CompForEach_t*>(item), temp); 2678 transformCompForEach(static_cast<CompForEach_t*>(item), temp);
2677 break; 2679 break;
2678 case "CompFor"_id: 2680 case id<CompFor_t>():
2679 transformCompFor(static_cast<CompFor_t*>(item), temp); 2681 transformCompFor(static_cast<CompFor_t*>(item), temp);
2680 break; 2682 break;
2681 case "Exp"_id: 2683 case id<Exp_t>():
2682 transformExp(static_cast<Exp_t*>(item), temp, ExpUsage::Closure); 2684 transformExp(static_cast<Exp_t*>(item), temp, ExpUsage::Closure);
2683 temp.back() = indent() + s("if "sv) + temp.back() + s(" then"sv) + nll(item); 2685 temp.back() = indent() + s("if "sv) + temp.back() + s(" then"sv) + nll(item);
2684 pushScope(); 2686 pushScope();
2685 break; 2687 break;
2688 default: assert(false); break;
2686 } 2689 }
2687 } 2690 }
2688 if (auto stmt = comp->value.as<Statement_t>()) { 2691 if (auto stmt = comp->value.as<Statement_t>()) {
@@ -2724,17 +2727,18 @@ private:
2724 auto compInner = comp->forLoop.get(); 2727 auto compInner = comp->forLoop.get();
2725 for (auto item : compInner->items.objects()) { 2728 for (auto item : compInner->items.objects()) {
2726 switch (item->getId()) { 2729 switch (item->getId()) {
2727 case "CompForEach"_id: 2730 case id<CompForEach_t>():
2728 transformCompForEach(static_cast<CompForEach_t*>(item), temp); 2731 transformCompForEach(static_cast<CompForEach_t*>(item), temp);
2729 break; 2732 break;
2730 case "CompFor"_id: 2733 case id<CompFor_t>():
2731 transformCompFor(static_cast<CompFor_t*>(item), temp); 2734 transformCompFor(static_cast<CompFor_t*>(item), temp);
2732 break; 2735 break;
2733 case "Exp"_id: 2736 case id<Exp_t>():
2734 transformExp(static_cast<Exp_t*>(item), temp, ExpUsage::Closure); 2737 transformExp(static_cast<Exp_t*>(item), temp, ExpUsage::Closure);
2735 temp.back() = indent() + s("if "sv) + temp.back() + s(" then"sv) + nll(item); 2738 temp.back() = indent() + s("if "sv) + temp.back() + s(" then"sv) + nll(item);
2736 pushScope(); 2739 pushScope();
2737 break; 2740 break;
2741 default: assert(false); break;
2738 } 2742 }
2739 } 2743 }
2740 { 2744 {
@@ -2802,22 +2806,22 @@ private:
2802 for (auto _item : nameList->items.objects()) { 2806 for (auto _item : nameList->items.objects()) {
2803 auto item = static_cast<NameOrDestructure_t*>(_item)->item.get(); 2807 auto item = static_cast<NameOrDestructure_t*>(_item)->item.get();
2804 switch (item->getId()) { 2808 switch (item->getId()) {
2805 case "Variable"_id: 2809 case id<Variable_t>():
2806 transformVariable(static_cast<Variable_t*>(item), vars); 2810 transformVariable(static_cast<Variable_t*>(item), vars);
2807 varAfter.push_back(vars.back()); 2811 varAfter.push_back(vars.back());
2808 break; 2812 break;
2809 case "TableLit"_id: { 2813 case id<TableLit_t>(): {
2810 auto desVar = getUnusedName("_des_"sv); 2814 auto desVar = getUnusedName("_des_"sv);
2811 destructPairs.emplace_back(item, toAst<Exp_t>(desVar, x)); 2815 destructPairs.emplace_back(item, toAst<Exp_t>(desVar, x));
2812 vars.push_back(desVar); 2816 vars.push_back(desVar);
2813 varAfter.push_back(desVar); 2817 varAfter.push_back(desVar);
2814 break; 2818 break;
2815 } 2819 }
2816 default: break; 2820 default: assert(false); break;
2817 } 2821 }
2818 } 2822 }
2819 switch (loopTarget->getId()) { 2823 switch (loopTarget->getId()) {
2820 case "star_exp"_id: { 2824 case id<star_exp_t>(): {
2821 auto star_exp = static_cast<star_exp_t*>(loopTarget); 2825 auto star_exp = static_cast<star_exp_t*>(loopTarget);
2822 auto listVar = singleVariableFrom(star_exp->value); 2826 auto listVar = singleVariableFrom(star_exp->value);
2823 auto indexVar = getUnusedName("_index_"); 2827 auto indexVar = getUnusedName("_index_");
@@ -2902,17 +2906,17 @@ private:
2902 } 2906 }
2903 break; 2907 break;
2904 } 2908 }
2905 case "Exp"_id: 2909 case id<Exp_t>():
2906 transformExp(static_cast<Exp_t*>(loopTarget), temp, ExpUsage::Closure); 2910 transformExp(static_cast<Exp_t*>(loopTarget), temp, ExpUsage::Closure);
2907 _buf << indent() << "for "sv << join(vars, ", "sv) << " in "sv << temp.back() << " do"sv << nlr(loopTarget); 2911 _buf << indent() << "for "sv << join(vars, ", "sv) << " in "sv << temp.back() << " do"sv << nlr(loopTarget);
2908 out.push_back(clearBuf()); 2912 out.push_back(clearBuf());
2909 break; 2913 break;
2910 case "ExpList"_id: 2914 case id<ExpList_t>():
2911 transformExpList(static_cast<ExpList_t*>(loopTarget), temp); 2915 transformExpList(static_cast<ExpList_t*>(loopTarget), temp);
2912 _buf << indent() << "for "sv << join(vars, ", "sv) << " in "sv << temp.back() << " do"sv << nlr(loopTarget); 2916 _buf << indent() << "for "sv << join(vars, ", "sv) << " in "sv << temp.back() << " do"sv << nlr(loopTarget);
2913 out.push_back(clearBuf()); 2917 out.push_back(clearBuf());
2914 break; 2918 break;
2915 default: break; 2919 default: assert(false); break;
2916 } 2920 }
2917 for (auto& var : varBefore) addToScope(var); 2921 for (auto& var : varBefore) addToScope(var);
2918 pushScope(); 2922 pushScope();
@@ -2947,9 +2951,9 @@ private:
2947 str_list temp; 2951 str_list temp;
2948 for (auto arg : invokeArgs->args.objects()) { 2952 for (auto arg : invokeArgs->args.objects()) {
2949 switch (arg->getId()) { 2953 switch (arg->getId()) {
2950 case "Exp"_id: transformExp(static_cast<Exp_t*>(arg), temp, ExpUsage::Closure); break; 2954 case id<Exp_t>(): transformExp(static_cast<Exp_t*>(arg), temp, ExpUsage::Closure); break;
2951 case "TableBlock"_id: transformTableBlock(static_cast<TableBlock_t*>(arg), temp); break; 2955 case id<TableBlock_t>(): transformTableBlock(static_cast<TableBlock_t*>(arg), temp); break;
2952 default: break; 2956 default: assert(false); break;
2953 } 2957 }
2954 } 2958 }
2955 out.push_back(s("("sv) + join(temp, ", "sv) + s(")"sv)); 2959 out.push_back(s("("sv) + join(temp, ", "sv) + s(")"sv));
@@ -2979,10 +2983,10 @@ private:
2979 str_list temp; 2983 str_list temp;
2980 bool withContinue = traversal::Stop == body->traverse([&](ast_node* node) { 2984 bool withContinue = traversal::Stop == body->traverse([&](ast_node* node) {
2981 switch (node->getId()) { 2985 switch (node->getId()) {
2982 case "For"_id: 2986 case id<For_t>():
2983 case "ForEach"_id: 2987 case id<ForEach_t>():
2984 return traversal::Return; 2988 return traversal::Return;
2985 case "BreakLoop"_id: { 2989 case id<BreakLoop_t>(): {
2986 return _parser.toString(node) == "continue"sv ? 2990 return _parser.toString(node) == "continue"sv ?
2987 traversal::Stop : traversal::Return; 2991 traversal::Stop : traversal::Return;
2988 } 2992 }
@@ -3156,31 +3160,31 @@ private:
3156 auto key = pair->key.get(); 3160 auto key = pair->key.get();
3157 str_list temp; 3161 str_list temp;
3158 switch (key->getId()) { 3162 switch (key->getId()) {
3159 case "KeyName"_id: { 3163 case id<KeyName_t>(): {
3160 transformKeyName(static_cast<KeyName_t*>(key), temp); 3164 transformKeyName(static_cast<KeyName_t*>(key), temp);
3161 if (LuaKeywords.find(temp.back()) != LuaKeywords.end()) { 3165 if (LuaKeywords.find(temp.back()) != LuaKeywords.end()) {
3162 temp.back() = s("[\""sv) + temp.back() + s("\"]"); 3166 temp.back() = s("[\""sv) + temp.back() + s("\"]");
3163 } 3167 }
3164 break; 3168 break;
3165 } 3169 }
3166 case "Exp"_id: 3170 case id<Exp_t>():
3167 transformExp(static_cast<Exp_t*>(key), temp, ExpUsage::Closure); 3171 transformExp(static_cast<Exp_t*>(key), temp, ExpUsage::Closure);
3168 temp.back() = s("["sv) + temp.back() + s("]"sv); 3172 temp.back() = s("["sv) + temp.back() + s("]"sv);
3169 break; 3173 break;
3170 case "DoubleString"_id: 3174 case id<DoubleString_t>():
3171 transformDoubleString(static_cast<DoubleString_t*>(key), temp); 3175 transformDoubleString(static_cast<DoubleString_t*>(key), temp);
3172 temp.back() = s("["sv) + temp.back() + s("]"sv); 3176 temp.back() = s("["sv) + temp.back() + s("]"sv);
3173 break; 3177 break;
3174 case "SingleString"_id: transformSingleString(static_cast<SingleString_t*>(key), temp); 3178 case id<SingleString_t>(): transformSingleString(static_cast<SingleString_t*>(key), temp);
3175 temp.back() = s("["sv) + temp.back() + s("]"sv); 3179 temp.back() = s("["sv) + temp.back() + s("]"sv);
3176 break; 3180 break;
3177 default: break; 3181 default: assert(false); break;
3178 } 3182 }
3179 auto value = pair->value.get(); 3183 auto value = pair->value.get();
3180 switch (value->getId()) { 3184 switch (value->getId()) {
3181 case "Exp"_id: transformExp(static_cast<Exp_t*>(value), temp, ExpUsage::Closure); break; 3185 case id<Exp_t>(): transformExp(static_cast<Exp_t*>(value), temp, ExpUsage::Closure); break;
3182 case "TableBlock"_id: transformTableBlock(static_cast<TableBlock_t*>(value), temp); break; 3186 case id<TableBlock_t>(): transformTableBlock(static_cast<TableBlock_t*>(value), temp); break;
3183 default: break; 3187 default: assert(false); break;
3184 } 3188 }
3185 out.push_back(temp.front() + s(" = "sv) + temp.back()); 3189 out.push_back(temp.front() + s(" = "sv) + temp.back());
3186 } 3190 }
@@ -3188,9 +3192,9 @@ private:
3188 void transformKeyName(KeyName_t* keyName, str_list& out) { 3192 void transformKeyName(KeyName_t* keyName, str_list& out) {
3189 auto name = keyName->name.get(); 3193 auto name = keyName->name.get();
3190 switch (name->getId()) { 3194 switch (name->getId()) {
3191 case "SelfName"_id: transformSelfName(static_cast<SelfName_t*>(name), out); break; 3195 case id<SelfName_t>(): transformSelfName(static_cast<SelfName_t*>(name), out); break;
3192 case "Name"_id: out.push_back(_parser.toString(name)); break; 3196 case id<Name_t>(): out.push_back(_parser.toString(name)); break;
3193 default: break; 3197 default: assert(false); break;
3194 } 3198 }
3195 } 3199 }
3196 3200
@@ -3214,18 +3218,18 @@ private:
3214 auto seg = static_cast<double_string_content_t*>(_seg); 3218 auto seg = static_cast<double_string_content_t*>(_seg);
3215 auto content = seg->content.get(); 3219 auto content = seg->content.get();
3216 switch (content->getId()) { 3220 switch (content->getId()) {
3217 case "double_string_inner"_id: { 3221 case id<double_string_inner_t>(): {
3218 auto str = _parser.toString(content); 3222 auto str = _parser.toString(content);
3219 Utils::replace(str, "\r"sv, ""); 3223 Utils::replace(str, "\r"sv, "");
3220 Utils::replace(str, "\n"sv, "\\n"sv); 3224 Utils::replace(str, "\n"sv, "\\n"sv);
3221 temp.push_back(s("\""sv) + str + s("\""sv)); 3225 temp.push_back(s("\""sv) + str + s("\""sv));
3222 break; 3226 break;
3223 } 3227 }
3224 case "Exp"_id: 3228 case id<Exp_t>():
3225 transformExp(static_cast<Exp_t*>(content), temp, ExpUsage::Closure); 3229 transformExp(static_cast<Exp_t*>(content), temp, ExpUsage::Closure);
3226 temp.back() = s("tostring("sv) + temp.back() + s(")"sv); 3230 temp.back() = s("tostring("sv) + temp.back() + s(")"sv);
3227 break; 3231 break;
3228 default: break; 3232 default: assert(false); break;
3229 } 3233 }
3230 } 3234 }
3231 out.push_back(temp.empty() ? s("\"\""sv) : join(temp, " .. "sv)); 3235 out.push_back(temp.empty() ? s("\"\""sv) : join(temp, " .. "sv));
@@ -3234,10 +3238,10 @@ private:
3234 void transformString(String_t* string, str_list& out) { 3238 void transformString(String_t* string, str_list& out) {
3235 auto str = string->str.get(); 3239 auto str = string->str.get();
3236 switch (str->getId()) { 3240 switch (str->getId()) {
3237 case "SingleString"_id: transformSingleString(static_cast<SingleString_t*>(str), out); break; 3241 case id<SingleString_t>(): transformSingleString(static_cast<SingleString_t*>(str), out); break;
3238 case "DoubleString"_id: transformDoubleString(static_cast<DoubleString_t*>(str), out); break; 3242 case id<DoubleString_t>(): transformDoubleString(static_cast<DoubleString_t*>(str), out); break;
3239 case "LuaString"_id: transformLuaString(static_cast<LuaString_t*>(str), out); break; 3243 case id<LuaString_t>(): transformLuaString(static_cast<LuaString_t*>(str), out); break;
3240 default: break; 3244 default: assert(false); break;
3241 } 3245 }
3242 } 3246 }
3243 3247
@@ -3370,7 +3374,7 @@ private:
3370 std::list<ClassMember> members; 3374 std::list<ClassMember> members;
3371 for (auto content : classDecl->body->contents.objects()) { 3375 for (auto content : classDecl->body->contents.objects()) {
3372 switch (content->getId()) { 3376 switch (content->getId()) {
3373 case "class_member_list"_id: { 3377 case id<class_member_list_t>(): {
3374 size_t inc = transform_class_member_list(static_cast<class_member_list_t*>(content), members, classVar); 3378 size_t inc = transform_class_member_list(static_cast<class_member_list_t*>(content), members, classVar);
3375 auto it = members.end(); 3379 auto it = members.end();
3376 for (size_t i = 0; i < inc; ++i, --it); 3380 for (size_t i = 0; i < inc; ++i, --it);
@@ -3384,10 +3388,10 @@ private:
3384 } 3388 }
3385 break; 3389 break;
3386 } 3390 }
3387 case "Statement"_id: 3391 case id<Statement_t>():
3388 transformStatement(static_cast<Statement_t*>(content), statements); 3392 transformStatement(static_cast<Statement_t*>(content), statements);
3389 break; 3393 break;
3390 default: break; 3394 default: assert(false); break;
3391 } 3395 }
3392 } 3396 }
3393 for (auto& member : members) { 3397 for (auto& member : members) {
@@ -3530,7 +3534,7 @@ private:
3530 } 3534 }
3531 } 3535 }
3532 normal_pair->value->traverse([&](ast_node* node) { 3536 normal_pair->value->traverse([&](ast_node* node) {
3533 if (node->getId() == "ClassDecl"_id) return traversal::Return; 3537 if (node->getId() == id<ClassDecl_t>()) return traversal::Return;
3534 if (auto chainValue = ast_cast<ChainValue_t>(node)) { 3538 if (auto chainValue = ast_cast<ChainValue_t>(node)) {
3535 if (auto callable = ast_cast<Callable_t>(chainValue->items.front())) { 3539 if (auto callable = ast_cast<Callable_t>(chainValue->items.front())) {
3536 auto var = callable->item.get(); 3540 auto var = callable->item.get();
@@ -3538,12 +3542,12 @@ private:
3538 auto insertSelfToArguments = [&](ast_node* item) { 3542 auto insertSelfToArguments = [&](ast_node* item) {
3539 auto x = item; 3543 auto x = item;
3540 switch (item->getId()) { 3544 switch (item->getId()) {
3541 case "InvokeArgs"_id: { 3545 case id<InvokeArgs_t>(): {
3542 auto invoke = static_cast<InvokeArgs_t*>(item); 3546 auto invoke = static_cast<InvokeArgs_t*>(item);
3543 invoke->args.push_front(toAst<Exp_t>("self"sv, x)); 3547 invoke->args.push_front(toAst<Exp_t>("self"sv, x));
3544 return true; 3548 return true;
3545 } 3549 }
3546 case "Invoke"_id: { 3550 case id<Invoke_t>(): {
3547 auto invoke = static_cast<Invoke_t*>(item); 3551 auto invoke = static_cast<Invoke_t*>(item);
3548 invoke->args.push_front(toAst<Exp_t>("self"sv, x)); 3552 invoke->args.push_front(toAst<Exp_t>("self"sv, x));
3549 return true; 3553 return true;
@@ -3584,12 +3588,13 @@ private:
3584 decIndentOffset(); 3588 decIndentOffset();
3585 } 3589 }
3586 switch (keyValue->getId()) { 3590 switch (keyValue->getId()) {
3587 case "variable_pair"_id: 3591 case id<variable_pair_t>():
3588 transform_variable_pair(static_cast<variable_pair_t*>(keyValue), temp); 3592 transform_variable_pair(static_cast<variable_pair_t*>(keyValue), temp);
3589 break; 3593 break;
3590 case "normal_pair"_id: 3594 case id<normal_pair_t>():
3591 transform_normal_pair(static_cast<normal_pair_t*>(keyValue), temp); 3595 transform_normal_pair(static_cast<normal_pair_t*>(keyValue), temp);
3592 break; 3596 break;
3597 default: assert(false); break;
3593 } 3598 }
3594 if (type == MemType::Property) { 3599 if (type == MemType::Property) {
3595 incIndentOffset(); 3600 incIndentOffset();
@@ -3605,10 +3610,10 @@ private:
3605 void transformAssignable(Assignable_t* assignable, str_list& out) { 3610 void transformAssignable(Assignable_t* assignable, str_list& out) {
3606 auto item = assignable->item.get(); 3611 auto item = assignable->item.get();
3607 switch (item->getId()) { 3612 switch (item->getId()) {
3608 case "AssignableChain"_id: transformAssignableChain(static_cast<AssignableChain_t*>(item), out); break; 3613 case id<AssignableChain_t>(): transformAssignableChain(static_cast<AssignableChain_t*>(item), out); break;
3609 case "Variable"_id: transformVariable(static_cast<Variable_t*>(item), out); break; 3614 case id<Variable_t>(): transformVariable(static_cast<Variable_t*>(item), out); break;
3610 case "SelfName"_id: transformSelfName(static_cast<SelfName_t*>(item), out); break; 3615 case id<SelfName_t>(): transformSelfName(static_cast<SelfName_t*>(item), out); break;
3611 default: break; 3616 default: assert(false); break;
3612 } 3617 }
3613 } 3618 }
3614 3619
@@ -3771,23 +3776,23 @@ private:
3771 auto x = exportNode; 3776 auto x = exportNode;
3772 auto item = exportNode->item.get(); 3777 auto item = exportNode->item.get();
3773 switch (item->getId()) { 3778 switch (item->getId()) {
3774 case "ClassDecl"_id: { 3779 case id<ClassDecl_t>(): {
3775 auto classDecl = static_cast<ClassDecl_t*>(item); 3780 auto classDecl = static_cast<ClassDecl_t*>(item);
3776 if (classDecl->name && classDecl->name->item->getId() == "Variable"_id) { 3781 if (classDecl->name && classDecl->name->item->getId() == id<Variable_t>()) {
3777 markVarExported(ExportMode::Any, true); 3782 markVarExported(ExportMode::Any, true);
3778 addExportedVar(_parser.toString(classDecl->name->item)); 3783 addExportedVar(_parser.toString(classDecl->name->item));
3779 } 3784 }
3780 transformClassDecl(classDecl, out, ExpUsage::Common); 3785 transformClassDecl(classDecl, out, ExpUsage::Common);
3781 break; 3786 break;
3782 } 3787 }
3783 case "export_op"_id: 3788 case id<export_op_t>():
3784 if (_parser.toString(item) == "*"sv) { 3789 if (_parser.toString(item) == "*"sv) {
3785 markVarExported(ExportMode::Any, false); 3790 markVarExported(ExportMode::Any, false);
3786 } else { 3791 } else {
3787 markVarExported(ExportMode::Capital, false); 3792 markVarExported(ExportMode::Capital, false);
3788 } 3793 }
3789 break; 3794 break;
3790 case "export_values"_id: { 3795 case id<export_values_t>(): {
3791 markVarExported(ExportMode::Any, true); 3796 markVarExported(ExportMode::Any, true);
3792 auto values = exportNode->item.to<export_values_t>(); 3797 auto values = exportNode->item.to<export_values_t>();
3793 if (values->valueList) { 3798 if (values->valueList) {
@@ -3817,8 +3822,7 @@ private:
3817 } 3822 }
3818 break; 3823 break;
3819 } 3824 }
3820 default: 3825 default: assert(false); break;
3821 break;
3822 } 3826 }
3823 } 3827 }
3824 3828
@@ -3831,9 +3835,10 @@ private:
3831 pushScope(); 3835 pushScope();
3832 for (auto pair : pairs) { 3836 for (auto pair : pairs) {
3833 switch (pair->getId()) { 3837 switch (pair->getId()) {
3834 case "Exp"_id: transformExp(static_cast<Exp_t*>(pair), temp, ExpUsage::Closure); break; 3838 case id<Exp_t>(): transformExp(static_cast<Exp_t*>(pair), temp, ExpUsage::Closure); break;
3835 case "variable_pair"_id: transform_variable_pair(static_cast<variable_pair_t*>(pair), temp); break; 3839 case id<variable_pair_t>(): transform_variable_pair(static_cast<variable_pair_t*>(pair), temp); break;
3836 case "normal_pair"_id: transform_normal_pair(static_cast<normal_pair_t*>(pair), temp); break; 3840 case id<normal_pair_t>(): transform_normal_pair(static_cast<normal_pair_t*>(pair), temp); break;
3841 default: assert(false); break;
3837 } 3842 }
3838 temp.back() = indent() + temp.back() + (pair == pairs.back() ? Empty : s(","sv)) + nll(pair); 3843 temp.back() = indent() + temp.back() + (pair == pairs.back() ? Empty : s(","sv)) + nll(pair);
3839 } 3844 }
@@ -3863,17 +3868,18 @@ private:
3863 auto compInner = comp->forLoop.get(); 3868 auto compInner = comp->forLoop.get();
3864 for (auto item : compInner->items.objects()) { 3869 for (auto item : compInner->items.objects()) {
3865 switch (item->getId()) { 3870 switch (item->getId()) {
3866 case "CompForEach"_id: 3871 case id<CompForEach_t>():
3867 transformCompForEach(static_cast<CompForEach_t*>(item), temp); 3872 transformCompForEach(static_cast<CompForEach_t*>(item), temp);
3868 break; 3873 break;
3869 case "CompFor"_id: 3874 case id<CompFor_t>():
3870 transformCompFor(static_cast<CompFor_t*>(item), temp); 3875 transformCompFor(static_cast<CompFor_t*>(item), temp);
3871 break; 3876 break;
3872 case "Exp"_id: 3877 case id<Exp_t>():
3873 transformExp(static_cast<Exp_t*>(item), temp, ExpUsage::Closure); 3878 transformExp(static_cast<Exp_t*>(item), temp, ExpUsage::Closure);
3874 temp.back() = indent() + s("if "sv) + temp.back() + s(" then"sv) + nll(item); 3879 temp.back() = indent() + s("if "sv) + temp.back() + s(" then"sv) + nll(item);
3875 pushScope(); 3880 pushScope();
3876 break; 3881 break;
3882 default: assert(false); break;
3877 } 3883 }
3878 } 3884 }
3879 transformExp(comp->key, kv, ExpUsage::Closure); 3885 transformExp(comp->key, kv, ExpUsage::Closure);
@@ -3989,7 +3995,7 @@ private:
3989 auto assign = x->new_ptr<Assign_t>(); 3995 auto assign = x->new_ptr<Assign_t>();
3990 for (auto name : import->names.objects()) { 3996 for (auto name : import->names.objects()) {
3991 switch (name->getId()) { 3997 switch (name->getId()) {
3992 case "Variable"_id: { 3998 case id<Variable_t>(): {
3993 auto var = ast_to<Variable_t>(name); 3999 auto var = ast_to<Variable_t>(name);
3994 { 4000 {
3995 auto callable = toAst<Callable_t>(objVar, x); 4001 auto callable = toAst<Callable_t>(objVar, x);
@@ -4015,7 +4021,7 @@ private:
4015 expList->exprs.push_back(exp); 4021 expList->exprs.push_back(exp);
4016 break; 4022 break;
4017 } 4023 }
4018 case "colon_import_name"_id: { 4024 case id<colon_import_name_t>(): {
4019 auto var = static_cast<colon_import_name_t*>(name)->name.get(); 4025 auto var = static_cast<colon_import_name_t*>(name)->name.get();
4020 { 4026 {
4021 auto nameNode = var->name.get(); 4027 auto nameNode = var->name.get();
@@ -4042,6 +4048,7 @@ private:
4042 expList->exprs.push_back(exp); 4048 expList->exprs.push_back(exp);
4043 break; 4049 break;
4044 } 4050 }
4051 default: assert(false); break;
4045 } 4052 }
4046 } 4053 }
4047 if (objAssign) { 4054 if (objAssign) {
@@ -4101,14 +4108,13 @@ private:
4101 void transformImport(Import_t* import, str_list& out) { 4108 void transformImport(Import_t* import, str_list& out) {
4102 auto content = import->content.get(); 4109 auto content = import->content.get();
4103 switch (content->getId()) { 4110 switch (content->getId()) {
4104 case "ImportAs"_id: 4111 case id<ImportAs_t>():
4105 transformImportAs(static_cast<ImportAs_t*>(content), out); 4112 transformImportAs(static_cast<ImportAs_t*>(content), out);
4106 break; 4113 break;
4107 case "ImportFrom"_id: 4114 case id<ImportFrom_t>():
4108 transformImportFrom(static_cast<ImportFrom_t*>(content), out); 4115 transformImportFrom(static_cast<ImportFrom_t*>(content), out);
4109 break; 4116 break;
4110 default: 4117 default: assert(false); break;
4111 break;
4112 } 4118 }
4113 } 4119 }
4114 4120
diff --git a/src/MoonP/parser.hpp b/src/MoonP/parser.hpp
index 01d1050..14abe1a 100644
--- a/src/MoonP/parser.hpp
+++ b/src/MoonP/parser.hpp
@@ -28,17 +28,6 @@ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
28 28
29namespace parserlib { 29namespace parserlib {
30 30
31// const str hash helper functions
32inline constexpr size_t hash(char const* input) {
33 return *input ? *input + 33ull * hash(input + 1) : 5381;
34}
35inline size_t hash(const char* input, int size, int index) {
36 return index < size ? input[index] + 33ull * hash(input, size, index + 1) : 5381;
37}
38inline size_t constexpr operator"" _id(const char* s, size_t) {
39 return hash(s);
40}
41
42///type of the parser's input. 31///type of the parser's input.
43typedef std::basic_string<wchar_t> input; 32typedef std::basic_string<wchar_t> input;
44typedef input::iterator input_it; 33typedef input::iterator input_it;
diff --git a/src/moonp.cpp b/src/moonp.cpp
index cb53b55..32d85ed 100644
--- a/src/moonp.cpp
+++ b/src/moonp.cpp
@@ -37,43 +37,37 @@ int main(int narg, const char** args) {
37 std::string resultFile; 37 std::string resultFile;
38 std::list<std::string> files; 38 std::list<std::string> files;
39 for (int i = 1; i < narg; ++i) { 39 for (int i = 1; i < narg; ++i) {
40 switch (hash(args[i])) { 40 std::string arg = args[i];
41 case "-l"_id: 41 if (arg == "-l"sv) {
42 config.reserveLineNumber = true; 42 config.reserveLineNumber = true;
43 break; 43 } else if (arg == "-p"sv) {
44 case "-p"_id: 44 writeToFile = false;
45 writeToFile = false; 45 } else if (arg == "-t"sv) {
46 break; 46 ++i;
47 case "-t"_id: 47 if (i < narg) {
48 ++i; 48 targetPath = args[i];
49 if (i < narg) { 49 } else {
50 targetPath = args[i];
51 } else {
52 std::cout << help;
53 return 1;
54 }
55 break;
56 case "-b"_id:
57 dumpCompileTime = true;
58 break;
59 case "-h"_id:
60 std::cout << help; 50 std::cout << help;
61 return 0; 51 return 1;
62 case "-v"_id: 52 }
63 std::cout << "Moonscript version: " << MoonP::moonScriptVersion() << '\n'; 53 } else if (arg == "-b"sv) {
64 return 0; 54 dumpCompileTime = true;
65 case "-o"_id: 55 } else if (arg == "-h"sv) {
66 ++i; 56 std::cout << help;
67 if (i < narg) { 57 return 0;
68 resultFile = args[i]; 58 } else if (arg == "-v"sv) {
69 } else { 59 std::cout << "Moonscript version: " << MoonP::moonScriptVersion() << '\n';
70 std::cout << help; 60 return 0;
71 return 1; 61 } else if (arg == "-o"sv) {
72 } 62 ++i;
73 break; 63 if (i < narg) {
74 default: 64 resultFile = args[i];
75 files.push_back(args[i]); 65 } else {
76 break; 66 std::cout << help;
67 return 1;
68 }
69 } else {
70 files.push_back(arg);
77 } 71 }
78 } 72 }
79 if (files.empty()) { 73 if (files.empty()) {