Line data Source code
1 : // Copyright (c) 2011-2023 Made to Order Software Corp. All Rights Reserved
2 : //
3 : // https://snapwebsites.org/project/as2js
4 : // contact@m2osw.com
5 : //
6 : // This program is free software: you can redistribute it and/or modify
7 : // it under the terms of the GNU General Public License as published by
8 : // the Free Software Foundation, either version 3 of the License, or
9 : // (at your option) any later version.
10 : //
11 : // This program is distributed in the hope that it will be useful,
12 : // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 : // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 : // GNU General Public License for more details.
15 : //
16 : // You should have received a copy of the GNU General Public License
17 : // along with this program. If not, see <https://www.gnu.org/licenses/>.
18 :
19 :
20 : // data made common to both node .cpp files
21 : namespace
22 : {
23 :
24 : struct flags_per_node_t
25 : {
26 : as2js::flag_t const f_flag;
27 : char const * const f_name;
28 : };
29 :
30 : flags_per_node_t const g_flags_none[] =
31 : {
32 : {
33 : as2js::flag_t::NODE_FLAG_max,
34 : nullptr
35 : }
36 : };
37 :
38 : flags_per_node_t const g_flags_call[] =
39 : {
40 : {
41 : as2js::flag_t::NODE_FUNCTION_FLAG_OPERATOR,
42 : "FUNCTION/OPERATOR"
43 : },
44 : {
45 : as2js::flag_t::NODE_FLAG_max,
46 : nullptr
47 : }
48 : };
49 :
50 : flags_per_node_t const g_flags_catch[] =
51 : {
52 : {
53 : as2js::flag_t::NODE_CATCH_FLAG_TYPED,
54 : "TYPED"
55 : },
56 : {
57 : as2js::flag_t::NODE_FLAG_max,
58 : nullptr
59 : }
60 : };
61 :
62 : flags_per_node_t const g_flags_directive_list[] =
63 : {
64 : {
65 : as2js::flag_t::NODE_DIRECTIVE_LIST_FLAG_NEW_VARIABLES,
66 : "NEW-VARIABLES"
67 : },
68 : {
69 : as2js::flag_t::NODE_FLAG_max,
70 : nullptr
71 : }
72 : };
73 :
74 : flags_per_node_t const g_flags_enum[] =
75 : {
76 : {
77 : as2js::flag_t::NODE_ENUM_FLAG_CLASS,
78 : "CLASS"
79 : },
80 : {
81 : as2js::flag_t::NODE_ENUM_FLAG_INUSE,
82 : "INUSE"
83 : },
84 : {
85 : as2js::flag_t::NODE_FLAG_max,
86 : nullptr
87 : }
88 : };
89 :
90 : flags_per_node_t const g_flags_for[] =
91 : {
92 : {
93 : as2js::flag_t::NODE_FOR_FLAG_CONST,
94 : "CONST"
95 : },
96 : {
97 : as2js::flag_t::NODE_FOR_FLAG_FOREACH,
98 : "FOREACH"
99 : },
100 : {
101 : as2js::flag_t::NODE_FOR_FLAG_IN,
102 : "IN"
103 : },
104 : {
105 : as2js::flag_t::NODE_FLAG_max,
106 : nullptr
107 : }
108 : };
109 :
110 : flags_per_node_t const g_flags_function[] =
111 : {
112 : {
113 : as2js::flag_t::NODE_FUNCTION_FLAG_GETTER,
114 : "GETTER"
115 : },
116 : {
117 : as2js::flag_t::NODE_FUNCTION_FLAG_SETTER,
118 : "SETTER"
119 : },
120 : {
121 : as2js::flag_t::NODE_FUNCTION_FLAG_OUT,
122 : "OUT"
123 : },
124 : {
125 : as2js::flag_t::NODE_FUNCTION_FLAG_VOID,
126 : "VOID"
127 : },
128 : {
129 : as2js::flag_t::NODE_FUNCTION_FLAG_NEVER,
130 : "NEVER"
131 : },
132 : {
133 : as2js::flag_t::NODE_FUNCTION_FLAG_NOPARAMS,
134 : "NOPARAMS"
135 : },
136 : {
137 : as2js::flag_t::NODE_FUNCTION_FLAG_OPERATOR,
138 : "FUNCTION/OPERATOR"
139 : },
140 : {
141 : as2js::flag_t::NODE_FLAG_max,
142 : nullptr
143 : }
144 : };
145 :
146 : flags_per_node_t const g_flags_identifier[] =
147 : {
148 : {
149 : as2js::flag_t::NODE_IDENTIFIER_FLAG_WITH,
150 : "WITH"
151 : },
152 : {
153 : as2js::flag_t::NODE_IDENTIFIER_FLAG_TYPED,
154 : "TYPED"
155 : },
156 : {
157 : as2js::flag_t::NODE_IDENTIFIER_FLAG_OPERATOR,
158 : "IDENTIFIER/OPERATOR"
159 : },
160 : {
161 : as2js::flag_t::NODE_FLAG_max,
162 : nullptr
163 : }
164 : };
165 :
166 : flags_per_node_t const g_flags_string[] =
167 : {
168 : {
169 : as2js::flag_t::NODE_IDENTIFIER_FLAG_WITH,
170 : "WITH"
171 : },
172 : {
173 : as2js::flag_t::NODE_IDENTIFIER_FLAG_TYPED,
174 : "TYPED"
175 : },
176 : {
177 : as2js::flag_t::NODE_FLAG_max,
178 : nullptr
179 : }
180 : };
181 :
182 : flags_per_node_t const g_flags_import[] =
183 : {
184 : {
185 : as2js::flag_t::NODE_IMPORT_FLAG_IMPLEMENTS,
186 : "IMPLEMENTS"
187 : },
188 : {
189 : as2js::flag_t::NODE_FLAG_max,
190 : nullptr
191 : }
192 : };
193 :
194 : flags_per_node_t const g_flags_package[] =
195 : {
196 : {
197 : as2js::flag_t::NODE_PACKAGE_FLAG_FOUND_LABELS,
198 : "FOUND-LABELS"
199 : },
200 : {
201 : as2js::flag_t::NODE_PACKAGE_FLAG_REFERENCED,
202 : "REFERENCED"
203 : },
204 : {
205 : as2js::flag_t::NODE_FLAG_max,
206 : nullptr
207 : }
208 : };
209 :
210 : flags_per_node_t const g_flags_param_match[] =
211 : {
212 : {
213 : as2js::flag_t::NODE_PARAM_MATCH_FLAG_UNPROTOTYPED,
214 : "UNPROTOTYPED"
215 : },
216 : {
217 : as2js::flag_t::NODE_PARAM_MATCH_FLAG_PROTOTYPE_UNCHECKED,
218 : "PROTOTYPE_UNCHECKED"
219 : },
220 : {
221 : as2js::flag_t::NODE_FLAG_max,
222 : nullptr
223 : }
224 : };
225 :
226 : flags_per_node_t const g_flags_param[] =
227 : {
228 : {
229 : as2js::flag_t::NODE_PARAM_FLAG_CONST,
230 : "CONST"
231 : },
232 : {
233 : as2js::flag_t::NODE_PARAM_FLAG_IN,
234 : "IN"
235 : },
236 : {
237 : as2js::flag_t::NODE_PARAM_FLAG_OUT,
238 : "OUT"
239 : },
240 : {
241 : as2js::flag_t::NODE_PARAM_FLAG_NAMED,
242 : "NAMED"
243 : },
244 : {
245 : as2js::flag_t::NODE_PARAM_FLAG_REST,
246 : "REST"
247 : },
248 : {
249 : as2js::flag_t::NODE_PARAM_FLAG_UNCHECKED,
250 : "UNCHECKED"
251 : },
252 : {
253 : as2js::flag_t::NODE_PARAM_FLAG_UNPROTOTYPED,
254 : "UNPROTOTYPED"
255 : },
256 : {
257 : as2js::flag_t::NODE_PARAM_FLAG_REFERENCED,
258 : "REFERENCED"
259 : },
260 : {
261 : as2js::flag_t::NODE_PARAM_FLAG_PARAMREF,
262 : "PARAMREF"
263 : },
264 : {
265 : as2js::flag_t::NODE_PARAM_FLAG_CATCH,
266 : "CATCH"
267 : },
268 : {
269 : as2js::flag_t::NODE_FLAG_max,
270 : nullptr
271 : }
272 : };
273 :
274 : flags_per_node_t const g_flags_switch[] =
275 : {
276 : {
277 : as2js::flag_t::NODE_SWITCH_FLAG_DEFAULT,
278 : "DEFAULT"
279 : },
280 : {
281 : as2js::flag_t::NODE_FLAG_max,
282 : nullptr
283 : }
284 : };
285 :
286 : flags_per_node_t const g_flags_type[] =
287 : {
288 : {
289 : as2js::flag_t::NODE_TYPE_FLAG_MODULO,
290 : "MODULO"
291 : },
292 : {
293 : as2js::flag_t::NODE_FLAG_max,
294 : nullptr
295 : }
296 : };
297 :
298 : flags_per_node_t const g_flags_variable[] =
299 : {
300 : {
301 : as2js::flag_t::NODE_VARIABLE_FLAG_CONST,
302 : "CONST",
303 : },
304 : {
305 : as2js::flag_t::NODE_VARIABLE_FLAG_FINAL,
306 : "FINAL",
307 : },
308 : {
309 : as2js::flag_t::NODE_VARIABLE_FLAG_LOCAL,
310 : "LOCAL",
311 : },
312 : {
313 : as2js::flag_t::NODE_VARIABLE_FLAG_MEMBER,
314 : "MEMBER",
315 : },
316 : {
317 : as2js::flag_t::NODE_VARIABLE_FLAG_ATTRIBUTES,
318 : "ATTRIBUTES",
319 : },
320 : {
321 : as2js::flag_t::NODE_VARIABLE_FLAG_ENUM,
322 : "ENUM",
323 : },
324 : {
325 : as2js::flag_t::NODE_VARIABLE_FLAG_COMPILED,
326 : "COMPILED",
327 : },
328 : {
329 : as2js::flag_t::NODE_VARIABLE_FLAG_INUSE,
330 : "INUSE",
331 : },
332 : {
333 : as2js::flag_t::NODE_VARIABLE_FLAG_ATTRS,
334 : "ATTRS",
335 : },
336 : {
337 : as2js::flag_t::NODE_VARIABLE_FLAG_DEFINED,
338 : "DEFINED",
339 : },
340 : {
341 : as2js::flag_t::NODE_VARIABLE_FLAG_DEFINING,
342 : "DEFINING",
343 : },
344 : {
345 : as2js::flag_t::NODE_VARIABLE_FLAG_TOADD,
346 : "TOADD",
347 : },
348 : {
349 : as2js::flag_t::NODE_VARIABLE_FLAG_TEMPORARY,
350 : "TEMPORARY",
351 : },
352 : {
353 : as2js::flag_t::NODE_VARIABLE_FLAG_NOINIT,
354 : "NOINIT",
355 : },
356 : {
357 : as2js::flag_t::NODE_VARIABLE_FLAG_VARIABLE,
358 : "VARIABLE",
359 : },
360 : {
361 : as2js::flag_t::NODE_FLAG_max,
362 : nullptr,
363 : },
364 : };
365 :
366 :
367 :
368 :
369 : struct node_type_info_t
370 : {
371 : as2js::node_t f_type;
372 : char const * f_name;
373 : char const * f_operator;
374 : uint64_t f_flags;
375 : flags_per_node_t const * f_node_flags;
376 : };
377 :
378 :
379 : uint64_t const TEST_NODE_IS_NUMBER = 0x0000000000000001;
380 : uint64_t const TEST_NODE_IS_NAN = 0x0000000000000002;
381 : uint64_t const TEST_NODE_IS_INTEGER = 0x0000000000000004;
382 : uint64_t const TEST_NODE_IS_FLOATING_POINT = 0x0000000000000008;
383 : uint64_t const TEST_NODE_IS_BOOLEAN = 0x0000000000000010;
384 : uint64_t const TEST_NODE_IS_TRUE = 0x0000000000000020;
385 : uint64_t const TEST_NODE_IS_FALSE = 0x0000000000000040;
386 : uint64_t const TEST_NODE_IS_STRING = 0x0000000000000080;
387 : uint64_t const TEST_NODE_IS_UNDEFINED = 0x0000000000000100;
388 : uint64_t const TEST_NODE_IS_NULL = 0x0000000000000200;
389 : uint64_t const TEST_NODE_IS_IDENTIFIER = 0x0000000000000400;
390 : uint64_t const TEST_NODE_ACCEPT_STRING = 0x0000000000000800;
391 : uint64_t const TEST_NODE_HAS_SIDE_EFFECTS = 0x0000000000001000;
392 : uint64_t const TEST_NODE_IS_PARAM_MATCH = 0x0000000000002000;
393 : uint64_t const TEST_NODE_IS_SWITCH_OPERATOR = 0x0000000000004000;
394 : uint64_t const TEST_NODE_IS_BASIC = 0x0000000000008000;
395 :
396 : // index from 0 to g_node_types_size - 1 to go through all the valid
397 : // node types
398 : #pragma GCC diagnostic push
399 : #pragma GCC diagnostic ignored "-Wpedantic"
400 : // pedantic because the .<field_name> is not accepted by default in C++
401 : node_type_info_t const g_node_types[] =
402 : {
403 : {
404 : .f_type = as2js::node_t::NODE_EOF,
405 : .f_name = "EOF",
406 : .f_operator = nullptr,
407 : .f_flags = TEST_NODE_IS_NAN,
408 : .f_node_flags = g_flags_none
409 : },
410 : {
411 : .f_type = as2js::node_t::NODE_UNKNOWN,
412 : .f_name = "UNKNOWN",
413 : .f_operator = nullptr,
414 : .f_flags = TEST_NODE_IS_NAN | TEST_NODE_IS_SWITCH_OPERATOR,
415 : .f_node_flags = g_flags_none
416 : },
417 : {
418 : .f_type = as2js::node_t::NODE_ADD,
419 : .f_name = "ADD",
420 : .f_operator = "+",
421 : .f_flags = TEST_NODE_IS_NAN,
422 : .f_node_flags = g_flags_none
423 : },
424 : {
425 : .f_type = as2js::node_t::NODE_ASSIGNMENT,
426 : .f_name = "ASSIGNMENT",
427 : .f_operator = "=",
428 : .f_flags = TEST_NODE_IS_NAN | TEST_NODE_HAS_SIDE_EFFECTS,
429 : .f_node_flags = g_flags_none
430 : },
431 : {
432 : .f_type = as2js::node_t::NODE_ASSIGNMENT_COALESCE,
433 : .f_name = "ASSIGNMENT_COALESCE",
434 : .f_operator = "??=",
435 : .f_flags = TEST_NODE_IS_NAN,
436 : .f_node_flags = g_flags_none
437 : },
438 : {
439 : .f_type = as2js::node_t::NODE_BITWISE_AND,
440 : .f_name = "BITWISE_AND",
441 : .f_operator = "&",
442 : .f_flags = TEST_NODE_IS_NAN,
443 : .f_node_flags = g_flags_none
444 : },
445 : {
446 : .f_type = as2js::node_t::NODE_BITWISE_NOT,
447 : .f_name = "BITWISE_NOT",
448 : .f_operator = "~",
449 : .f_flags = TEST_NODE_IS_NAN,
450 : .f_node_flags = g_flags_none
451 : },
452 : {
453 : .f_type = as2js::node_t::NODE_BITWISE_OR,
454 : .f_name = "BITWISE_OR",
455 : .f_operator = "|",
456 : .f_flags = TEST_NODE_IS_NAN,
457 : .f_node_flags = g_flags_none
458 : },
459 : {
460 : .f_type = as2js::node_t::NODE_BITWISE_XOR,
461 : .f_name = "BITWISE_XOR",
462 : .f_operator = "^",
463 : .f_flags = TEST_NODE_IS_NAN,
464 : .f_node_flags = g_flags_none
465 : },
466 : {
467 : .f_type = as2js::node_t::NODE_CLOSE_CURVLY_BRACKET,
468 : .f_name = "CLOSE_CURVLY_BRACKET",
469 : .f_operator = nullptr,
470 : .f_flags = TEST_NODE_IS_NAN,
471 : .f_node_flags = g_flags_none
472 : },
473 : {
474 : .f_type = as2js::node_t::NODE_CLOSE_PARENTHESIS,
475 : .f_name = "CLOSE_PARENTHESIS",
476 : .f_operator = nullptr,
477 : .f_flags = TEST_NODE_IS_NAN,
478 : .f_node_flags = g_flags_none
479 : },
480 : {
481 : .f_type = as2js::node_t::NODE_CLOSE_SQUARE_BRACKET,
482 : .f_name = "CLOSE_SQUARE_BRACKET",
483 : .f_operator = nullptr,
484 : .f_flags = TEST_NODE_IS_NAN,
485 : .f_node_flags = g_flags_none
486 : },
487 : {
488 : .f_type = as2js::node_t::NODE_COLON,
489 : .f_name = "COLON",
490 : .f_operator = nullptr,
491 : .f_flags = TEST_NODE_IS_NAN,
492 : .f_node_flags = g_flags_none
493 : },
494 : {
495 : .f_type = as2js::node_t::NODE_COMMA,
496 : .f_name = "COMMA",
497 : .f_operator = ",",
498 : .f_flags = TEST_NODE_IS_NAN,
499 : .f_node_flags = g_flags_none
500 : },
501 : {
502 : .f_type = as2js::node_t::NODE_CONDITIONAL,
503 : .f_name = "CONDITIONAL",
504 : .f_operator = nullptr,
505 : .f_flags = TEST_NODE_IS_NAN,
506 : .f_node_flags = g_flags_none
507 : },
508 : {
509 : .f_type = as2js::node_t::NODE_DIVIDE,
510 : .f_name = "DIVIDE",
511 : .f_operator = "/",
512 : .f_flags = TEST_NODE_IS_NAN,
513 : .f_node_flags = g_flags_none
514 : },
515 : {
516 : .f_type = as2js::node_t::NODE_GREATER,
517 : .f_name = "GREATER",
518 : .f_operator = ">",
519 : .f_flags = TEST_NODE_IS_NAN | TEST_NODE_IS_SWITCH_OPERATOR,
520 : .f_node_flags = g_flags_none
521 : },
522 : {
523 : .f_type = as2js::node_t::NODE_LESS,
524 : .f_name = "LESS",
525 : .f_operator = "<",
526 : .f_flags = TEST_NODE_IS_NAN | TEST_NODE_IS_SWITCH_OPERATOR,
527 : .f_node_flags = g_flags_none
528 : },
529 : {
530 : .f_type = as2js::node_t::NODE_LOGICAL_NOT,
531 : .f_name = "LOGICAL_NOT",
532 : .f_operator = "!",
533 : .f_flags = TEST_NODE_IS_NAN,
534 : .f_node_flags = g_flags_none
535 : },
536 : {
537 : .f_type = as2js::node_t::NODE_MODULO,
538 : .f_name = "MODULO",
539 : .f_operator = "%",
540 : .f_flags = TEST_NODE_IS_NAN,
541 : .f_node_flags = g_flags_none
542 : },
543 : {
544 : .f_type = as2js::node_t::NODE_MULTIPLY,
545 : .f_name = "MULTIPLY",
546 : .f_operator = "*",
547 : .f_flags = TEST_NODE_IS_NAN,
548 : .f_node_flags = g_flags_none
549 : },
550 : {
551 : .f_type = as2js::node_t::NODE_OPEN_CURVLY_BRACKET,
552 : .f_name = "OPEN_CURVLY_BRACKET",
553 : .f_operator = nullptr,
554 : .f_flags = TEST_NODE_IS_NAN,
555 : .f_node_flags = g_flags_none
556 : },
557 : {
558 : .f_type = as2js::node_t::NODE_OPEN_PARENTHESIS,
559 : .f_name = "OPEN_PARENTHESIS",
560 : .f_operator = nullptr,
561 : .f_flags = TEST_NODE_IS_NAN,
562 : .f_node_flags = g_flags_none
563 : },
564 : {
565 : .f_type = as2js::node_t::NODE_OPEN_SQUARE_BRACKET,
566 : .f_name = "OPEN_SQUARE_BRACKET",
567 : .f_operator = nullptr,
568 : .f_flags = TEST_NODE_IS_NAN,
569 : .f_node_flags = g_flags_none
570 : },
571 : {
572 : .f_type = as2js::node_t::NODE_OPTIONAL_MEMBER,
573 : .f_name = "OPTIONAL_MEMBER",
574 : .f_operator = "?.",
575 : .f_flags = TEST_NODE_IS_NAN,
576 : .f_node_flags = g_flags_none
577 : },
578 : {
579 : .f_type = as2js::node_t::NODE_MEMBER,
580 : .f_name = "MEMBER",
581 : .f_operator = nullptr,
582 : .f_flags = TEST_NODE_IS_NAN,
583 : .f_node_flags = g_flags_none
584 : },
585 : {
586 : .f_type = as2js::node_t::NODE_SEMICOLON,
587 : .f_name = "SEMICOLON",
588 : .f_operator = nullptr,
589 : .f_flags = TEST_NODE_IS_NAN,
590 : .f_node_flags = g_flags_none
591 : },
592 : {
593 : .f_type = as2js::node_t::NODE_SUBTRACT,
594 : .f_name = "SUBTRACT",
595 : .f_operator = "-",
596 : .f_flags = TEST_NODE_IS_NAN,
597 : .f_node_flags = g_flags_none
598 : },
599 : {
600 : .f_type = as2js::node_t::NODE_ABSOLUTE_VALUE,
601 : .f_name = "ABSOLUTE_VALUE",
602 : .f_operator = nullptr,
603 : .f_flags = TEST_NODE_IS_NAN,
604 : .f_node_flags = g_flags_none
605 : },
606 : {
607 : .f_type = as2js::node_t::NODE_ABSTRACT,
608 : .f_name = "ABSTRACT",
609 : .f_operator = nullptr,
610 : .f_flags = TEST_NODE_IS_NAN,
611 : .f_node_flags = g_flags_none
612 : },
613 : {
614 : .f_type = as2js::node_t::NODE_ACOS,
615 : .f_name = "ACOS",
616 : .f_operator = nullptr,
617 : .f_flags = TEST_NODE_IS_NAN,
618 : .f_node_flags = g_flags_none
619 : },
620 : {
621 : .f_type = as2js::node_t::NODE_ACOSH,
622 : .f_name = "ACOSH",
623 : .f_operator = nullptr,
624 : .f_flags = TEST_NODE_IS_NAN,
625 : .f_node_flags = g_flags_none
626 : },
627 : {
628 : .f_type = as2js::node_t::NODE_ALMOST_EQUAL,
629 : .f_name = "ALMOST_EQUAL",
630 : .f_operator = "\u2248",
631 : .f_flags = TEST_NODE_IS_NAN | TEST_NODE_IS_SWITCH_OPERATOR,
632 : .f_node_flags = g_flags_none
633 : },
634 : {
635 : .f_type = as2js::node_t::NODE_ARRAY,
636 : .f_name = "ARRAY",
637 : .f_operator = nullptr,
638 : .f_flags = TEST_NODE_IS_NAN,
639 : .f_node_flags = g_flags_none
640 : },
641 : {
642 : .f_type = as2js::node_t::NODE_ARRAY_LITERAL,
643 : .f_name = "ARRAY_LITERAL",
644 : .f_operator = nullptr,
645 : .f_flags = TEST_NODE_IS_NAN,
646 : .f_node_flags = g_flags_none
647 : },
648 : {
649 : .f_type = as2js::node_t::NODE_ARROW,
650 : .f_name = "ARROW",
651 : .f_operator = "=>",
652 : .f_flags = TEST_NODE_IS_NAN,
653 : .f_node_flags = g_flags_none
654 : },
655 : {
656 : .f_type = as2js::node_t::NODE_AS,
657 : .f_name = "AS",
658 : .f_operator = nullptr,
659 : .f_flags = TEST_NODE_IS_NAN | TEST_NODE_IS_SWITCH_OPERATOR,
660 : .f_node_flags = g_flags_none
661 : },
662 : {
663 : .f_type = as2js::node_t::NODE_ASIN,
664 : .f_name = "ASIN",
665 : .f_operator = nullptr,
666 : .f_flags = TEST_NODE_IS_NAN,
667 : .f_node_flags = g_flags_none
668 : },
669 : {
670 : .f_type = as2js::node_t::NODE_ASINH,
671 : .f_name = "ASINH",
672 : .f_operator = nullptr,
673 : .f_flags = TEST_NODE_IS_NAN,
674 : .f_node_flags = g_flags_none
675 : },
676 : {
677 : .f_type = as2js::node_t::NODE_ASSIGNMENT_ADD,
678 : .f_name = "ASSIGNMENT_ADD",
679 : .f_operator = "+=",
680 : .f_flags = TEST_NODE_IS_NAN | TEST_NODE_HAS_SIDE_EFFECTS,
681 : .f_node_flags = g_flags_none
682 : },
683 : {
684 : .f_type = as2js::node_t::NODE_ASSIGNMENT_BITWISE_AND,
685 : .f_name = "ASSIGNMENT_BITWISE_AND",
686 : .f_operator = "&=",
687 : .f_flags = TEST_NODE_IS_NAN | TEST_NODE_HAS_SIDE_EFFECTS,
688 : .f_node_flags = g_flags_none
689 : },
690 : {
691 : .f_type = as2js::node_t::NODE_ASSIGNMENT_BITWISE_OR,
692 : .f_name = "ASSIGNMENT_BITWISE_OR",
693 : .f_operator = "|=",
694 : .f_flags = TEST_NODE_IS_NAN | TEST_NODE_HAS_SIDE_EFFECTS,
695 : .f_node_flags = g_flags_none
696 : },
697 : {
698 : .f_type = as2js::node_t::NODE_ASSIGNMENT_BITWISE_XOR,
699 : .f_name = "ASSIGNMENT_BITWISE_XOR",
700 : .f_operator = "^=",
701 : .f_flags = TEST_NODE_IS_NAN | TEST_NODE_HAS_SIDE_EFFECTS,
702 : .f_node_flags = g_flags_none
703 : },
704 : {
705 : .f_type = as2js::node_t::NODE_ASSIGNMENT_DIVIDE,
706 : .f_name = "ASSIGNMENT_DIVIDE",
707 : .f_operator = "/=",
708 : .f_flags = TEST_NODE_IS_NAN | TEST_NODE_HAS_SIDE_EFFECTS,
709 : .f_node_flags = g_flags_none
710 : },
711 : {
712 : .f_type = as2js::node_t::NODE_ASSIGNMENT_LOGICAL_AND,
713 : .f_name = "ASSIGNMENT_LOGICAL_AND",
714 : .f_operator = "&&=",
715 : .f_flags = TEST_NODE_IS_NAN | TEST_NODE_HAS_SIDE_EFFECTS,
716 : .f_node_flags = g_flags_none
717 : },
718 : {
719 : .f_type = as2js::node_t::NODE_ASSIGNMENT_LOGICAL_OR,
720 : .f_name = "ASSIGNMENT_LOGICAL_OR",
721 : .f_operator = "||=",
722 : .f_flags = TEST_NODE_IS_NAN | TEST_NODE_HAS_SIDE_EFFECTS,
723 : .f_node_flags = g_flags_none
724 : },
725 : {
726 : .f_type = as2js::node_t::NODE_ASSIGNMENT_LOGICAL_XOR,
727 : .f_name = "ASSIGNMENT_LOGICAL_XOR",
728 : .f_operator = "^^=",
729 : .f_flags = TEST_NODE_IS_NAN | TEST_NODE_HAS_SIDE_EFFECTS,
730 : .f_node_flags = g_flags_none
731 : },
732 : {
733 : .f_type = as2js::node_t::NODE_ASSIGNMENT_MAXIMUM,
734 : .f_name = "ASSIGNMENT_MAXIMUM",
735 : .f_operator = ">?=",
736 : .f_flags = TEST_NODE_IS_NAN | TEST_NODE_HAS_SIDE_EFFECTS,
737 : .f_node_flags = g_flags_none
738 : },
739 : {
740 : .f_type = as2js::node_t::NODE_ASSIGNMENT_MINIMUM,
741 : .f_name = "ASSIGNMENT_MINIMUM",
742 : .f_operator = "<?=",
743 : .f_flags = TEST_NODE_IS_NAN | TEST_NODE_HAS_SIDE_EFFECTS,
744 : .f_node_flags = g_flags_none
745 : },
746 : {
747 : .f_type = as2js::node_t::NODE_ASSIGNMENT_MODULO,
748 : .f_name = "ASSIGNMENT_MODULO",
749 : .f_operator = "%=",
750 : .f_flags = TEST_NODE_IS_NAN | TEST_NODE_HAS_SIDE_EFFECTS,
751 : .f_node_flags = g_flags_none
752 : },
753 : {
754 : .f_type = as2js::node_t::NODE_ASSIGNMENT_MULTIPLY,
755 : .f_name = "ASSIGNMENT_MULTIPLY",
756 : .f_operator = "*=",
757 : .f_flags = TEST_NODE_IS_NAN | TEST_NODE_HAS_SIDE_EFFECTS,
758 : .f_node_flags = g_flags_none
759 : },
760 : {
761 : .f_type = as2js::node_t::NODE_ASSIGNMENT_POWER,
762 : .f_name = "ASSIGNMENT_POWER",
763 : .f_operator = "**=",
764 : .f_flags = TEST_NODE_IS_NAN | TEST_NODE_HAS_SIDE_EFFECTS,
765 : .f_node_flags = g_flags_none
766 : },
767 : {
768 : .f_type = as2js::node_t::NODE_ASSIGNMENT_ROTATE_LEFT,
769 : .f_name = "ASSIGNMENT_ROTATE_LEFT",
770 : .f_operator = "<%=",
771 : .f_flags = TEST_NODE_IS_NAN | TEST_NODE_HAS_SIDE_EFFECTS,
772 : .f_node_flags = g_flags_none
773 : },
774 : {
775 : .f_type = as2js::node_t::NODE_ASSIGNMENT_ROTATE_RIGHT,
776 : .f_name = "ASSIGNMENT_ROTATE_RIGHT",
777 : .f_operator = ">%=",
778 : .f_flags = TEST_NODE_IS_NAN | TEST_NODE_HAS_SIDE_EFFECTS,
779 : .f_node_flags = g_flags_none
780 : },
781 : {
782 : .f_type = as2js::node_t::NODE_ASSIGNMENT_SHIFT_LEFT,
783 : .f_name = "ASSIGNMENT_SHIFT_LEFT",
784 : .f_operator = "<<=",
785 : .f_flags = TEST_NODE_IS_NAN | TEST_NODE_HAS_SIDE_EFFECTS,
786 : .f_node_flags = g_flags_none
787 : },
788 : {
789 : .f_type = as2js::node_t::NODE_ASSIGNMENT_SHIFT_RIGHT,
790 : .f_name = "ASSIGNMENT_SHIFT_RIGHT",
791 : .f_operator = ">>=",
792 : .f_flags = TEST_NODE_IS_NAN | TEST_NODE_HAS_SIDE_EFFECTS,
793 : .f_node_flags = g_flags_none
794 : },
795 : {
796 : .f_type = as2js::node_t::NODE_ASSIGNMENT_SHIFT_RIGHT_UNSIGNED,
797 : .f_name = "ASSIGNMENT_SHIFT_RIGHT_UNSIGNED",
798 : .f_operator = ">>>=",
799 : .f_flags = TEST_NODE_IS_NAN | TEST_NODE_HAS_SIDE_EFFECTS,
800 : .f_node_flags = g_flags_none
801 : },
802 : {
803 : .f_type = as2js::node_t::NODE_ASSIGNMENT_SUBTRACT,
804 : .f_name = "ASSIGNMENT_SUBTRACT",
805 : .f_operator = "-=",
806 : .f_flags = TEST_NODE_IS_NAN | TEST_NODE_HAS_SIDE_EFFECTS,
807 : .f_node_flags = g_flags_none
808 : },
809 : {
810 : .f_type = as2js::node_t::NODE_ASYNC,
811 : .f_name = "ASYNC",
812 : .f_operator = nullptr,
813 : .f_flags = TEST_NODE_IS_NAN,
814 : .f_node_flags = g_flags_none
815 : },
816 : {
817 : .f_type = as2js::node_t::NODE_ATAN,
818 : .f_name = "ATAN",
819 : .f_operator = nullptr,
820 : .f_flags = TEST_NODE_IS_NAN,
821 : .f_node_flags = g_flags_none
822 : },
823 : {
824 : .f_type = as2js::node_t::NODE_ATAN2,
825 : .f_name = "ATAN2",
826 : .f_operator = nullptr,
827 : .f_flags = TEST_NODE_IS_NAN,
828 : .f_node_flags = g_flags_none
829 : },
830 : {
831 : .f_type = as2js::node_t::NODE_ATANH,
832 : .f_name = "ATANH",
833 : .f_operator = nullptr,
834 : .f_flags = TEST_NODE_IS_NAN,
835 : .f_node_flags = g_flags_none
836 : },
837 : {
838 : .f_type = as2js::node_t::NODE_ATTRIBUTES,
839 : .f_name = "ATTRIBUTES",
840 : .f_operator = nullptr,
841 : .f_flags = TEST_NODE_IS_NAN,
842 : .f_node_flags = g_flags_none
843 : },
844 : {
845 : .f_type = as2js::node_t::NODE_AUTO,
846 : .f_name = "AUTO",
847 : .f_operator = nullptr,
848 : .f_flags = TEST_NODE_IS_NAN,
849 : .f_node_flags = g_flags_none
850 : },
851 : {
852 : .f_type = as2js::node_t::NODE_AWAIT,
853 : .f_name = "AWAIT",
854 : .f_operator = nullptr,
855 : .f_flags = TEST_NODE_IS_NAN,
856 : .f_node_flags = g_flags_none
857 : },
858 : {
859 : .f_type = as2js::node_t::NODE_BOOLEAN,
860 : .f_name = "BOOLEAN",
861 : .f_operator = nullptr,
862 : .f_flags = TEST_NODE_IS_NAN,
863 : .f_node_flags = g_flags_none
864 : },
865 : {
866 : .f_type = as2js::node_t::NODE_BREAK,
867 : .f_name = "BREAK",
868 : .f_operator = nullptr,
869 : .f_flags = TEST_NODE_IS_NAN | TEST_NODE_ACCEPT_STRING,
870 : .f_node_flags = g_flags_none
871 : },
872 : {
873 : .f_type = as2js::node_t::NODE_BYTE,
874 : .f_name = "BYTE",
875 : .f_operator = nullptr,
876 : .f_flags = TEST_NODE_IS_NAN,
877 : .f_node_flags = g_flags_none
878 : },
879 : {
880 : .f_type = as2js::node_t::NODE_CALL,
881 : .f_name = "CALL",
882 : .f_operator = "()",
883 : .f_flags = TEST_NODE_IS_NAN | TEST_NODE_HAS_SIDE_EFFECTS,
884 : .f_node_flags = g_flags_call
885 : },
886 : {
887 : .f_type = as2js::node_t::NODE_CASE,
888 : .f_name = "CASE",
889 : .f_operator = nullptr,
890 : .f_flags = TEST_NODE_IS_NAN,
891 : .f_node_flags = g_flags_none
892 : },
893 : {
894 : .f_type = as2js::node_t::NODE_CATCH,
895 : .f_name = "CATCH",
896 : .f_operator = nullptr,
897 : .f_flags = TEST_NODE_IS_NAN,
898 : .f_node_flags = g_flags_catch
899 : },
900 : {
901 : .f_type = as2js::node_t::NODE_CBRT,
902 : .f_name = "CBRT",
903 : .f_operator = nullptr,
904 : .f_flags = TEST_NODE_IS_NAN,
905 : .f_node_flags = g_flags_none
906 : },
907 : {
908 : .f_type = as2js::node_t::NODE_CEIL,
909 : .f_name = "CEIL",
910 : .f_operator = nullptr,
911 : .f_flags = TEST_NODE_IS_NAN,
912 : .f_node_flags = g_flags_none
913 : },
914 : {
915 : .f_type = as2js::node_t::NODE_CHAR,
916 : .f_name = "CHAR",
917 : .f_operator = nullptr,
918 : .f_flags = TEST_NODE_IS_NAN,
919 : .f_node_flags = g_flags_none
920 : },
921 : {
922 : .f_type = as2js::node_t::NODE_CLASS,
923 : .f_name = "CLASS",
924 : .f_operator = nullptr,
925 : .f_flags = TEST_NODE_IS_NAN | TEST_NODE_ACCEPT_STRING,
926 : .f_node_flags = g_flags_string
927 : },
928 : {
929 : .f_type = as2js::node_t::NODE_CLZ32,
930 : .f_name = "CLZ32",
931 : .f_operator = nullptr,
932 : .f_flags = TEST_NODE_IS_NAN,
933 : .f_node_flags = g_flags_none
934 : },
935 : {
936 : .f_type = as2js::node_t::NODE_COALESCE,
937 : .f_name = "COALESCE",
938 : .f_operator = "??",
939 : .f_flags = TEST_NODE_IS_NAN,
940 : .f_node_flags = g_flags_none
941 : },
942 : {
943 : .f_type = as2js::node_t::NODE_COMPARE,
944 : .f_name = "COMPARE",
945 : .f_operator = "<=>",
946 : .f_flags = TEST_NODE_IS_NAN,
947 : .f_node_flags = g_flags_none
948 : },
949 : {
950 : .f_type = as2js::node_t::NODE_CONST,
951 : .f_name = "CONST",
952 : .f_operator = nullptr,
953 : .f_flags = TEST_NODE_IS_NAN,
954 : .f_node_flags = g_flags_none
955 : },
956 : {
957 : .f_type = as2js::node_t::NODE_CONTINUE,
958 : .f_name = "CONTINUE",
959 : .f_operator = nullptr,
960 : .f_flags = TEST_NODE_IS_NAN | TEST_NODE_ACCEPT_STRING,
961 : .f_node_flags = g_flags_none
962 : },
963 : {
964 : .f_type = as2js::node_t::NODE_COS,
965 : .f_name = "COS",
966 : .f_operator = nullptr,
967 : .f_flags = TEST_NODE_IS_NAN,
968 : .f_node_flags = g_flags_none
969 : },
970 : {
971 : .f_type = as2js::node_t::NODE_COSH,
972 : .f_name = "COSH",
973 : .f_operator = nullptr,
974 : .f_flags = TEST_NODE_IS_NAN,
975 : .f_node_flags = g_flags_none
976 : },
977 : {
978 : .f_type = as2js::node_t::NODE_DEBUGGER,
979 : .f_name = "DEBUGGER",
980 : .f_operator = nullptr,
981 : .f_flags = TEST_NODE_IS_NAN,
982 : .f_node_flags = g_flags_none
983 : },
984 : {
985 : .f_type = as2js::node_t::NODE_DECREMENT,
986 : .f_name = "DECREMENT",
987 : .f_operator = "--x",
988 : .f_flags = TEST_NODE_IS_NAN | TEST_NODE_HAS_SIDE_EFFECTS,
989 : .f_node_flags = g_flags_none
990 : },
991 : {
992 : .f_type = as2js::node_t::NODE_DEFAULT,
993 : .f_name = "DEFAULT",
994 : .f_operator = nullptr,
995 : .f_flags = TEST_NODE_IS_NAN | TEST_NODE_IS_SWITCH_OPERATOR,
996 : .f_node_flags = g_flags_none
997 : },
998 : {
999 : .f_type = as2js::node_t::NODE_DELETE,
1000 : .f_name = "DELETE",
1001 : .f_operator = nullptr,
1002 : .f_flags = TEST_NODE_IS_NAN | TEST_NODE_HAS_SIDE_EFFECTS,
1003 : .f_node_flags = g_flags_none
1004 : },
1005 : {
1006 : .f_type = as2js::node_t::NODE_DIRECTIVE_LIST,
1007 : .f_name = "DIRECTIVE_LIST",
1008 : .f_operator = nullptr,
1009 : .f_flags = TEST_NODE_IS_NAN,
1010 : .f_node_flags = g_flags_directive_list
1011 : },
1012 : {
1013 : .f_type = as2js::node_t::NODE_DO,
1014 : .f_name = "DO",
1015 : .f_operator = nullptr,
1016 : .f_flags = TEST_NODE_IS_NAN,
1017 : .f_node_flags = g_flags_none
1018 : },
1019 : {
1020 : .f_type = as2js::node_t::NODE_DOUBLE,
1021 : .f_name = "DOUBLE",
1022 : .f_operator = nullptr,
1023 : .f_flags = TEST_NODE_IS_NAN,
1024 : .f_node_flags = g_flags_none
1025 : },
1026 : {
1027 : .f_type = as2js::node_t::NODE_ELSE,
1028 : .f_name = "ELSE",
1029 : .f_operator = nullptr,
1030 : .f_flags = TEST_NODE_IS_NAN,
1031 : .f_node_flags = g_flags_none
1032 : },
1033 : {
1034 : .f_type = as2js::node_t::NODE_EMPTY,
1035 : .f_name = "EMPTY",
1036 : .f_operator = nullptr,
1037 : .f_flags = TEST_NODE_IS_NAN,
1038 : .f_node_flags = g_flags_none
1039 : },
1040 : {
1041 : .f_type = as2js::node_t::NODE_ENSURE,
1042 : .f_name = "ENSURE",
1043 : .f_operator = nullptr,
1044 : .f_flags = TEST_NODE_IS_NAN,
1045 : .f_node_flags = g_flags_none
1046 : },
1047 : {
1048 : .f_type = as2js::node_t::NODE_ENUM,
1049 : .f_name = "ENUM",
1050 : .f_operator = nullptr,
1051 : .f_flags = TEST_NODE_IS_NAN | TEST_NODE_ACCEPT_STRING,
1052 : .f_node_flags = g_flags_enum
1053 : },
1054 : {
1055 : .f_type = as2js::node_t::NODE_EQUAL,
1056 : .f_name = "EQUAL",
1057 : .f_operator = "==",
1058 : .f_flags = TEST_NODE_IS_NAN | TEST_NODE_IS_SWITCH_OPERATOR,
1059 : .f_node_flags = g_flags_none
1060 : },
1061 : {
1062 : .f_type = as2js::node_t::NODE_EXCLUDE,
1063 : .f_name = "EXCLUDE",
1064 : .f_operator = nullptr,
1065 : .f_flags = TEST_NODE_IS_NAN,
1066 : .f_node_flags = g_flags_none
1067 : },
1068 : {
1069 : .f_type = as2js::node_t::NODE_EXP,
1070 : .f_name = "EXP",
1071 : .f_operator = nullptr,
1072 : .f_flags = TEST_NODE_IS_NAN,
1073 : .f_node_flags = g_flags_none
1074 : },
1075 : {
1076 : .f_type = as2js::node_t::NODE_EXPM1,
1077 : .f_name = "EXPM1",
1078 : .f_operator = nullptr,
1079 : .f_flags = TEST_NODE_IS_NAN,
1080 : .f_node_flags = g_flags_none
1081 : },
1082 : {
1083 : .f_type = as2js::node_t::NODE_EXTENDS,
1084 : .f_name = "EXTENDS",
1085 : .f_operator = nullptr,
1086 : .f_flags = TEST_NODE_IS_NAN,
1087 : .f_node_flags = g_flags_none
1088 : },
1089 : {
1090 : .f_type = as2js::node_t::NODE_EXTERN,
1091 : .f_name = "EXTERN",
1092 : .f_operator = nullptr,
1093 : .f_flags = TEST_NODE_IS_NAN,
1094 : .f_node_flags = g_flags_none
1095 : },
1096 : {
1097 : .f_type = as2js::node_t::NODE_EXPORT,
1098 : .f_name = "EXPORT",
1099 : .f_operator = nullptr,
1100 : .f_flags = TEST_NODE_IS_NAN,
1101 : .f_node_flags = g_flags_none
1102 : },
1103 : {
1104 : .f_type = as2js::node_t::NODE_FALSE,
1105 : .f_name = "FALSE",
1106 : .f_operator = nullptr,
1107 : .f_flags = TEST_NODE_IS_BOOLEAN | TEST_NODE_IS_FALSE | TEST_NODE_IS_BASIC,
1108 : .f_node_flags = g_flags_none
1109 : },
1110 : {
1111 : .f_type = as2js::node_t::NODE_FINAL,
1112 : .f_name = "FINAL",
1113 : .f_operator = nullptr,
1114 : .f_flags = TEST_NODE_IS_NAN,
1115 : .f_node_flags = g_flags_none
1116 : },
1117 : {
1118 : .f_type = as2js::node_t::NODE_FINALLY,
1119 : .f_name = "FINALLY",
1120 : .f_operator = nullptr,
1121 : .f_flags = TEST_NODE_IS_NAN,
1122 : .f_node_flags = g_flags_none
1123 : },
1124 : {
1125 : .f_type = as2js::node_t::NODE_FLOOR,
1126 : .f_name = "FLOOR",
1127 : .f_operator = nullptr,
1128 : .f_flags = TEST_NODE_IS_NAN,
1129 : .f_node_flags = g_flags_none
1130 : },
1131 : {
1132 : .f_type = as2js::node_t::NODE_FLOAT,
1133 : .f_name = "FLOAT",
1134 : .f_operator = nullptr,
1135 : .f_flags = TEST_NODE_IS_NAN,
1136 : .f_node_flags = g_flags_none
1137 : },
1138 : {
1139 : .f_type = as2js::node_t::NODE_FLOATING_POINT,
1140 : .f_name = "FLOATING_POINT",
1141 : .f_operator = nullptr,
1142 : .f_flags = TEST_NODE_IS_NUMBER | TEST_NODE_IS_FLOATING_POINT | TEST_NODE_IS_BASIC,
1143 : .f_node_flags = g_flags_none
1144 : },
1145 : {
1146 : .f_type = as2js::node_t::NODE_FOR,
1147 : .f_name = "FOR",
1148 : .f_operator = nullptr,
1149 : .f_flags = TEST_NODE_IS_NAN,
1150 : .f_node_flags = g_flags_for
1151 : },
1152 : {
1153 : .f_type = as2js::node_t::NODE_FROUND,
1154 : .f_name = "FROUND",
1155 : .f_operator = nullptr,
1156 : .f_flags = TEST_NODE_IS_NAN,
1157 : .f_node_flags = g_flags_none
1158 : },
1159 : {
1160 : .f_type = as2js::node_t::NODE_FUNCTION,
1161 : .f_name = "FUNCTION",
1162 : .f_operator = nullptr,
1163 : .f_flags = TEST_NODE_IS_NAN | TEST_NODE_ACCEPT_STRING,
1164 : .f_node_flags = g_flags_function
1165 : },
1166 : {
1167 : .f_type = as2js::node_t::NODE_GOTO,
1168 : .f_name = "GOTO",
1169 : .f_operator = nullptr,
1170 : .f_flags = TEST_NODE_IS_NAN | TEST_NODE_ACCEPT_STRING,
1171 : .f_node_flags = g_flags_none
1172 : },
1173 : {
1174 : .f_type = as2js::node_t::NODE_GREATER_EQUAL,
1175 : .f_name = "GREATER_EQUAL",
1176 : .f_operator = ">=",
1177 : .f_flags = TEST_NODE_IS_NAN | TEST_NODE_IS_SWITCH_OPERATOR,
1178 : .f_node_flags = g_flags_none
1179 : },
1180 : {
1181 : .f_type = as2js::node_t::NODE_HYPOT,
1182 : .f_name = "HYPOT",
1183 : .f_operator = nullptr,
1184 : .f_flags = TEST_NODE_IS_NAN,
1185 : .f_node_flags = g_flags_none
1186 : },
1187 : {
1188 : .f_type = as2js::node_t::NODE_IDENTIFIER,
1189 : .f_name = "IDENTIFIER",
1190 : .f_operator = nullptr,
1191 : .f_flags = TEST_NODE_IS_NAN | TEST_NODE_IS_IDENTIFIER | TEST_NODE_ACCEPT_STRING,
1192 : .f_node_flags = g_flags_identifier
1193 : },
1194 : {
1195 : .f_type = as2js::node_t::NODE_IDENTITY,
1196 : .f_name = "IDENTITY",
1197 : .f_operator = nullptr,
1198 : .f_flags = TEST_NODE_IS_NAN,
1199 : .f_node_flags = g_flags_none
1200 : },
1201 : {
1202 : .f_type = as2js::node_t::NODE_IF,
1203 : .f_name = "IF",
1204 : .f_operator = nullptr,
1205 : .f_flags = TEST_NODE_IS_NAN,
1206 : .f_node_flags = g_flags_none
1207 : },
1208 : {
1209 : .f_type = as2js::node_t::NODE_IF_FALSE,
1210 : .f_name = "IF_FALSE",
1211 : .f_operator = nullptr,
1212 : .f_flags = TEST_NODE_IS_NAN,
1213 : .f_node_flags = g_flags_none
1214 : },
1215 : {
1216 : .f_type = as2js::node_t::NODE_IF_TRUE,
1217 : .f_name = "IF_TRUE",
1218 : .f_operator = nullptr,
1219 : .f_flags = TEST_NODE_IS_NAN,
1220 : .f_node_flags = g_flags_none
1221 : },
1222 : {
1223 : .f_type = as2js::node_t::NODE_IMPLEMENTS,
1224 : .f_name = "IMPLEMENTS",
1225 : .f_operator = nullptr,
1226 : .f_flags = TEST_NODE_IS_NAN,
1227 : .f_node_flags = g_flags_none
1228 : },
1229 : {
1230 : .f_type = as2js::node_t::NODE_IMPORT,
1231 : .f_name = "IMPORT",
1232 : .f_operator = nullptr,
1233 : .f_flags = TEST_NODE_IS_NAN | TEST_NODE_ACCEPT_STRING,
1234 : .f_node_flags = g_flags_import
1235 : },
1236 : {
1237 : .f_type = as2js::node_t::NODE_IMUL,
1238 : .f_name = "IMUL",
1239 : .f_operator = nullptr,
1240 : .f_flags = TEST_NODE_IS_NAN,
1241 : .f_node_flags = g_flags_none
1242 : },
1243 : {
1244 : .f_type = as2js::node_t::NODE_IN,
1245 : .f_name = "IN",
1246 : .f_operator = "in",
1247 : .f_flags = TEST_NODE_IS_NAN | TEST_NODE_IS_SWITCH_OPERATOR,
1248 : .f_node_flags = g_flags_none
1249 : },
1250 : {
1251 : .f_type = as2js::node_t::NODE_INCLUDE,
1252 : .f_name = "INCLUDE",
1253 : .f_operator = nullptr,
1254 : .f_flags = TEST_NODE_IS_NAN,
1255 : .f_node_flags = g_flags_none
1256 : },
1257 : {
1258 : .f_type = as2js::node_t::NODE_INCREMENT,
1259 : .f_name = "INCREMENT",
1260 : .f_operator = "++x",
1261 : .f_flags = TEST_NODE_IS_NAN | TEST_NODE_HAS_SIDE_EFFECTS,
1262 : .f_node_flags = g_flags_none
1263 : },
1264 : {
1265 : .f_type = as2js::node_t::NODE_INLINE,
1266 : .f_name = "INLINE",
1267 : .f_operator = nullptr,
1268 : .f_flags = TEST_NODE_IS_NAN,
1269 : .f_node_flags = g_flags_none
1270 : },
1271 : {
1272 : .f_type = as2js::node_t::NODE_INSTANCEOF,
1273 : .f_name = "INSTANCEOF",
1274 : .f_operator = nullptr,
1275 : .f_flags = TEST_NODE_IS_NAN | TEST_NODE_IS_SWITCH_OPERATOR,
1276 : .f_node_flags = g_flags_none
1277 : },
1278 : {
1279 : .f_type = as2js::node_t::NODE_INTEGER,
1280 : .f_name = "INTEGER",
1281 : .f_operator = nullptr,
1282 : .f_flags = TEST_NODE_IS_NUMBER | TEST_NODE_IS_INTEGER | TEST_NODE_IS_BASIC,
1283 : .f_node_flags = g_flags_none
1284 : },
1285 : {
1286 : .f_type = as2js::node_t::NODE_INTERFACE,
1287 : .f_name = "INTERFACE",
1288 : .f_operator = nullptr,
1289 : .f_flags = TEST_NODE_IS_NAN | TEST_NODE_ACCEPT_STRING,
1290 : .f_node_flags = g_flags_none
1291 : },
1292 : {
1293 : .f_type = as2js::node_t::NODE_INVARIANT,
1294 : .f_name = "INVARIANT",
1295 : .f_operator = nullptr,
1296 : .f_flags = TEST_NODE_IS_NAN,
1297 : .f_node_flags = g_flags_none
1298 : },
1299 : {
1300 : .f_type = as2js::node_t::NODE_IS,
1301 : .f_name = "IS",
1302 : .f_operator = nullptr,
1303 : .f_flags = TEST_NODE_IS_NAN | TEST_NODE_IS_SWITCH_OPERATOR,
1304 : .f_node_flags = g_flags_none
1305 : },
1306 : {
1307 : .f_type = as2js::node_t::NODE_LABEL,
1308 : .f_name = "LABEL",
1309 : .f_operator = nullptr,
1310 : .f_flags = TEST_NODE_IS_NAN | TEST_NODE_ACCEPT_STRING,
1311 : .f_node_flags = g_flags_none
1312 : },
1313 : {
1314 : .f_type = as2js::node_t::NODE_LESS_EQUAL,
1315 : .f_name = "LESS_EQUAL",
1316 : .f_operator = "<=",
1317 : .f_flags = TEST_NODE_IS_NAN | TEST_NODE_IS_SWITCH_OPERATOR,
1318 : .f_node_flags = g_flags_none
1319 : },
1320 : {
1321 : .f_type = as2js::node_t::NODE_LIST,
1322 : .f_name = "LIST",
1323 : .f_operator = nullptr,
1324 : .f_flags = TEST_NODE_IS_NAN,
1325 : .f_node_flags = g_flags_none
1326 : },
1327 : {
1328 : .f_type = as2js::node_t::NODE_LOG,
1329 : .f_name = "LOG",
1330 : .f_operator = nullptr,
1331 : .f_flags = TEST_NODE_IS_NAN,
1332 : .f_node_flags = g_flags_none
1333 : },
1334 : {
1335 : .f_type = as2js::node_t::NODE_LOG1P,
1336 : .f_name = "LOG1P",
1337 : .f_operator = nullptr,
1338 : .f_flags = TEST_NODE_IS_NAN,
1339 : .f_node_flags = g_flags_none
1340 : },
1341 : {
1342 : .f_type = as2js::node_t::NODE_LOG10,
1343 : .f_name = "LOG10",
1344 : .f_operator = nullptr,
1345 : .f_flags = TEST_NODE_IS_NAN,
1346 : .f_node_flags = g_flags_none
1347 : },
1348 : {
1349 : .f_type = as2js::node_t::NODE_LOG2,
1350 : .f_name = "LOG2",
1351 : .f_operator = nullptr,
1352 : .f_flags = TEST_NODE_IS_NAN,
1353 : .f_node_flags = g_flags_none
1354 : },
1355 : {
1356 : .f_type = as2js::node_t::NODE_LOGICAL_AND,
1357 : .f_name = "LOGICAL_AND",
1358 : .f_operator = "&&",
1359 : .f_flags = TEST_NODE_IS_NAN,
1360 : .f_node_flags = g_flags_none
1361 : },
1362 : {
1363 : .f_type = as2js::node_t::NODE_LOGICAL_OR,
1364 : .f_name = "LOGICAL_OR",
1365 : .f_operator = "||",
1366 : .f_flags = TEST_NODE_IS_NAN,
1367 : .f_node_flags = g_flags_none
1368 : },
1369 : {
1370 : .f_type = as2js::node_t::NODE_LOGICAL_XOR,
1371 : .f_name = "LOGICAL_XOR",
1372 : .f_operator = "^^",
1373 : .f_flags = TEST_NODE_IS_NAN,
1374 : .f_node_flags = g_flags_none
1375 : },
1376 : {
1377 : .f_type = as2js::node_t::NODE_LONG,
1378 : .f_name = "LONG",
1379 : .f_operator = nullptr,
1380 : .f_flags = TEST_NODE_IS_NAN,
1381 : .f_node_flags = g_flags_none
1382 : },
1383 : {
1384 : .f_type = as2js::node_t::NODE_MATCH,
1385 : .f_name = "MATCH",
1386 : .f_operator = "~=",
1387 : .f_flags = TEST_NODE_IS_NAN | TEST_NODE_IS_SWITCH_OPERATOR,
1388 : .f_node_flags = g_flags_none
1389 : },
1390 : {
1391 : .f_type = as2js::node_t::NODE_MAXIMUM,
1392 : .f_name = "MAXIMUM",
1393 : .f_operator = ">?",
1394 : .f_flags = TEST_NODE_IS_NAN,
1395 : .f_node_flags = g_flags_none
1396 : },
1397 : {
1398 : .f_type = as2js::node_t::NODE_MINIMUM,
1399 : .f_name = "MINIMUM",
1400 : .f_operator = "<?",
1401 : .f_flags = TEST_NODE_IS_NAN,
1402 : .f_node_flags = g_flags_none
1403 : },
1404 : {
1405 : .f_type = as2js::node_t::NODE_NAME,
1406 : .f_name = "NAME",
1407 : .f_operator = nullptr,
1408 : .f_flags = TEST_NODE_IS_NAN | TEST_NODE_ACCEPT_STRING,
1409 : .f_node_flags = g_flags_none
1410 : },
1411 : {
1412 : .f_type = as2js::node_t::NODE_NAMESPACE,
1413 : .f_name = "NAMESPACE",
1414 : .f_operator = nullptr,
1415 : .f_flags = TEST_NODE_IS_NAN | TEST_NODE_ACCEPT_STRING,
1416 : .f_node_flags = g_flags_none
1417 : },
1418 : {
1419 : .f_type = as2js::node_t::NODE_NATIVE,
1420 : .f_name = "NATIVE",
1421 : .f_operator = nullptr,
1422 : .f_flags = TEST_NODE_IS_NAN,
1423 : .f_node_flags = g_flags_none
1424 : },
1425 : {
1426 : .f_type = as2js::node_t::NODE_NEGATE,
1427 : .f_name = "NEGATE",
1428 : .f_operator = nullptr,
1429 : .f_flags = TEST_NODE_IS_NAN,
1430 : .f_node_flags = g_flags_none
1431 : },
1432 : {
1433 : .f_type = as2js::node_t::NODE_NEW,
1434 : .f_name = "NEW",
1435 : .f_operator = nullptr,
1436 : .f_flags = TEST_NODE_IS_NAN | TEST_NODE_HAS_SIDE_EFFECTS,
1437 : .f_node_flags = g_flags_none
1438 : },
1439 : {
1440 : .f_type = as2js::node_t::NODE_NOT_EQUAL,
1441 : .f_name = "NOT_EQUAL",
1442 : .f_operator = "!=",
1443 : .f_flags = TEST_NODE_IS_NAN | TEST_NODE_IS_SWITCH_OPERATOR,
1444 : .f_node_flags = g_flags_none
1445 : },
1446 : {
1447 : .f_type = as2js::node_t::NODE_NOT_MATCH,
1448 : .f_name = "NOT_MATCH",
1449 : .f_operator = "~!",
1450 : .f_flags = TEST_NODE_IS_NAN,
1451 : .f_node_flags = g_flags_none
1452 : },
1453 : {
1454 : .f_type = as2js::node_t::NODE_NULL,
1455 : .f_name = "NULL",
1456 : .f_operator = nullptr,
1457 : .f_flags = TEST_NODE_IS_NULL | TEST_NODE_IS_BASIC,
1458 : .f_node_flags = g_flags_none
1459 : },
1460 : {
1461 : .f_type = as2js::node_t::NODE_OBJECT_LITERAL,
1462 : .f_name = "OBJECT_LITERAL",
1463 : .f_operator = nullptr,
1464 : .f_flags = TEST_NODE_IS_NAN,
1465 : .f_node_flags = g_flags_none
1466 : },
1467 : {
1468 : .f_type = as2js::node_t::NODE_PACKAGE,
1469 : .f_name = "PACKAGE",
1470 : .f_operator = nullptr,
1471 : .f_flags = TEST_NODE_IS_NAN | TEST_NODE_ACCEPT_STRING,
1472 : .f_node_flags = g_flags_package
1473 : },
1474 : {
1475 : .f_type = as2js::node_t::NODE_PARAM,
1476 : .f_name = "PARAM",
1477 : .f_operator = nullptr,
1478 : .f_flags = TEST_NODE_IS_NAN | TEST_NODE_ACCEPT_STRING,
1479 : .f_node_flags = g_flags_param
1480 : },
1481 : {
1482 : .f_type = as2js::node_t::NODE_PARAMETERS,
1483 : .f_name = "PARAMETERS",
1484 : .f_operator = nullptr,
1485 : .f_flags = TEST_NODE_IS_NAN,
1486 : .f_node_flags = g_flags_none
1487 : },
1488 : {
1489 : .f_type = as2js::node_t::NODE_PARAM_MATCH,
1490 : .f_name = "PARAM_MATCH",
1491 : .f_operator = nullptr,
1492 : .f_flags = TEST_NODE_IS_NAN | TEST_NODE_IS_PARAM_MATCH,
1493 : .f_node_flags = g_flags_param_match
1494 : },
1495 : {
1496 : .f_type = as2js::node_t::NODE_POST_DECREMENT,
1497 : .f_name = "POST_DECREMENT",
1498 : .f_operator = "x--",
1499 : .f_flags = TEST_NODE_IS_NAN | TEST_NODE_HAS_SIDE_EFFECTS,
1500 : .f_node_flags = g_flags_none
1501 : },
1502 : {
1503 : .f_type = as2js::node_t::NODE_POST_INCREMENT,
1504 : .f_name = "POST_INCREMENT",
1505 : .f_operator = "x++",
1506 : .f_flags = TEST_NODE_IS_NAN | TEST_NODE_HAS_SIDE_EFFECTS,
1507 : .f_node_flags = g_flags_none
1508 : },
1509 : {
1510 : .f_type = as2js::node_t::NODE_POWER,
1511 : .f_name = "POWER",
1512 : .f_operator = "**",
1513 : .f_flags = TEST_NODE_IS_NAN,
1514 : .f_node_flags = g_flags_none
1515 : },
1516 : {
1517 : .f_type = as2js::node_t::NODE_PRIVATE,
1518 : .f_name = "PRIVATE",
1519 : .f_operator = nullptr,
1520 : .f_flags = TEST_NODE_IS_NAN,
1521 : .f_node_flags = g_flags_none
1522 : },
1523 : {
1524 : .f_type = as2js::node_t::NODE_PROGRAM,
1525 : .f_name = "PROGRAM",
1526 : .f_operator = nullptr,
1527 : .f_flags = TEST_NODE_IS_NAN,
1528 : .f_node_flags = g_flags_none
1529 : },
1530 : {
1531 : .f_type = as2js::node_t::NODE_PROTECTED,
1532 : .f_name = "PROTECTED",
1533 : .f_operator = nullptr,
1534 : .f_flags = TEST_NODE_IS_NAN,
1535 : .f_node_flags = g_flags_none
1536 : },
1537 : {
1538 : .f_type = as2js::node_t::NODE_PUBLIC,
1539 : .f_name = "PUBLIC",
1540 : .f_operator = nullptr,
1541 : .f_flags = TEST_NODE_IS_NAN,
1542 : .f_node_flags = g_flags_none
1543 : },
1544 : {
1545 : .f_type = as2js::node_t::NODE_RANDOM,
1546 : .f_name = "RANDOM",
1547 : .f_operator = nullptr,
1548 : .f_flags = TEST_NODE_IS_NAN,
1549 : .f_node_flags = g_flags_none
1550 : },
1551 : {
1552 : .f_type = as2js::node_t::NODE_RANGE,
1553 : .f_name = "RANGE",
1554 : .f_operator = nullptr,
1555 : .f_flags = TEST_NODE_IS_NAN,
1556 : .f_node_flags = g_flags_none
1557 : },
1558 : {
1559 : .f_type = as2js::node_t::NODE_REGULAR_EXPRESSION,
1560 : .f_name = "REGULAR_EXPRESSION",
1561 : .f_operator = nullptr,
1562 : .f_flags = TEST_NODE_IS_NAN | TEST_NODE_ACCEPT_STRING | TEST_NODE_IS_BASIC,
1563 : .f_node_flags = g_flags_none
1564 : },
1565 : {
1566 : .f_type = as2js::node_t::NODE_REQUIRE,
1567 : .f_name = "REQUIRE",
1568 : .f_operator = nullptr,
1569 : .f_flags = TEST_NODE_IS_NAN,
1570 : .f_node_flags = g_flags_none
1571 : },
1572 : {
1573 : .f_type = as2js::node_t::NODE_REST,
1574 : .f_name = "REST",
1575 : .f_operator = nullptr,
1576 : .f_flags = TEST_NODE_IS_NAN,
1577 : .f_node_flags = g_flags_none
1578 : },
1579 : {
1580 : .f_type = as2js::node_t::NODE_RETURN,
1581 : .f_name = "RETURN",
1582 : .f_operator = nullptr,
1583 : .f_flags = TEST_NODE_IS_NAN,
1584 : .f_node_flags = g_flags_none
1585 : },
1586 : {
1587 : .f_type = as2js::node_t::NODE_ROOT,
1588 : .f_name = "ROOT",
1589 : .f_operator = nullptr,
1590 : .f_flags = TEST_NODE_IS_NAN,
1591 : .f_node_flags = g_flags_none
1592 : },
1593 : {
1594 : .f_type = as2js::node_t::NODE_ROTATE_LEFT,
1595 : .f_name = "ROTATE_LEFT",
1596 : .f_operator = "<%",
1597 : .f_flags = TEST_NODE_IS_NAN,
1598 : .f_node_flags = g_flags_none
1599 : },
1600 : {
1601 : .f_type = as2js::node_t::NODE_ROTATE_RIGHT,
1602 : .f_name = "ROTATE_RIGHT",
1603 : .f_operator = ">%",
1604 : .f_flags = TEST_NODE_IS_NAN,
1605 : .f_node_flags = g_flags_none
1606 : },
1607 : {
1608 : .f_type = as2js::node_t::NODE_ROUND,
1609 : .f_name = "ROUND",
1610 : .f_operator = nullptr,
1611 : .f_flags = TEST_NODE_IS_NAN,
1612 : .f_node_flags = g_flags_none
1613 : },
1614 : {
1615 : .f_type = as2js::node_t::NODE_SCOPE,
1616 : .f_name = "SCOPE",
1617 : .f_operator = nullptr,
1618 : .f_flags = TEST_NODE_IS_NAN,
1619 : .f_node_flags = g_flags_none
1620 : },
1621 : {
1622 : .f_type = as2js::node_t::NODE_SET,
1623 : .f_name = "SET",
1624 : .f_operator = nullptr,
1625 : .f_flags = TEST_NODE_IS_NAN,
1626 : .f_node_flags = g_flags_none
1627 : },
1628 : {
1629 : .f_type = as2js::node_t::NODE_SHIFT_LEFT,
1630 : .f_name = "SHIFT_LEFT",
1631 : .f_operator = "<<",
1632 : .f_flags = TEST_NODE_IS_NAN,
1633 : .f_node_flags = g_flags_none
1634 : },
1635 : {
1636 : .f_type = as2js::node_t::NODE_SHIFT_RIGHT,
1637 : .f_name = "SHIFT_RIGHT",
1638 : .f_operator = ">>",
1639 : .f_flags = TEST_NODE_IS_NAN,
1640 : .f_node_flags = g_flags_none
1641 : },
1642 : {
1643 : .f_type = as2js::node_t::NODE_SHIFT_RIGHT_UNSIGNED,
1644 : .f_name = "SHIFT_RIGHT_UNSIGNED",
1645 : .f_operator = ">>>",
1646 : .f_flags = TEST_NODE_IS_NAN,
1647 : .f_node_flags = g_flags_none
1648 : },
1649 : {
1650 : .f_type = as2js::node_t::NODE_SHORT,
1651 : .f_name = "SHORT",
1652 : .f_operator = nullptr,
1653 : .f_flags = TEST_NODE_IS_NAN,
1654 : .f_node_flags = g_flags_none
1655 : },
1656 : {
1657 : .f_type = as2js::node_t::NODE_SIGN,
1658 : .f_name = "SIGN",
1659 : .f_operator = nullptr,
1660 : .f_flags = TEST_NODE_IS_NAN,
1661 : .f_node_flags = g_flags_none
1662 : },
1663 : {
1664 : .f_type = as2js::node_t::NODE_SIN,
1665 : .f_name = "SIN",
1666 : .f_operator = nullptr,
1667 : .f_flags = TEST_NODE_IS_NAN,
1668 : .f_node_flags = g_flags_none
1669 : },
1670 : {
1671 : .f_type = as2js::node_t::NODE_SINH,
1672 : .f_name = "SINH",
1673 : .f_operator = nullptr,
1674 : .f_flags = TEST_NODE_IS_NAN,
1675 : .f_node_flags = g_flags_none
1676 : },
1677 : {
1678 : .f_type = as2js::node_t::NODE_SMART_MATCH,
1679 : .f_name = "SMART_MATCH",
1680 : .f_operator = "~~",
1681 : .f_flags = TEST_NODE_IS_NAN,
1682 : .f_node_flags = g_flags_none
1683 : },
1684 : {
1685 : .f_type = as2js::node_t::NODE_SQRT,
1686 : .f_name = "SQRT",
1687 : .f_operator = nullptr,
1688 : .f_flags = TEST_NODE_IS_NAN,
1689 : .f_node_flags = g_flags_none
1690 : },
1691 : {
1692 : .f_type = as2js::node_t::NODE_STATIC,
1693 : .f_name = "STATIC",
1694 : .f_operator = nullptr,
1695 : .f_flags = TEST_NODE_IS_NAN,
1696 : .f_node_flags = g_flags_none
1697 : },
1698 : {
1699 : .f_type = as2js::node_t::NODE_STRICTLY_EQUAL,
1700 : .f_name = "STRICTLY_EQUAL",
1701 : .f_operator = "===",
1702 : .f_flags = TEST_NODE_IS_NAN | TEST_NODE_IS_SWITCH_OPERATOR,
1703 : .f_node_flags = g_flags_none
1704 : },
1705 : {
1706 : .f_type = as2js::node_t::NODE_STRICTLY_NOT_EQUAL,
1707 : .f_name = "STRICTLY_NOT_EQUAL",
1708 : .f_operator = "!==",
1709 : .f_flags = TEST_NODE_IS_NAN | TEST_NODE_IS_SWITCH_OPERATOR,
1710 : .f_node_flags = g_flags_none
1711 : },
1712 : {
1713 : .f_type = as2js::node_t::NODE_STRING,
1714 : .f_name = "STRING",
1715 : .f_operator = nullptr,
1716 : .f_flags = TEST_NODE_IS_NAN | TEST_NODE_IS_STRING | TEST_NODE_ACCEPT_STRING | TEST_NODE_IS_BASIC,
1717 : .f_node_flags = g_flags_string
1718 : },
1719 : {
1720 : .f_type = as2js::node_t::NODE_SUPER,
1721 : .f_name = "SUPER",
1722 : .f_operator = nullptr,
1723 : .f_flags = TEST_NODE_IS_NAN,
1724 : .f_node_flags = g_flags_none
1725 : },
1726 : {
1727 : .f_type = as2js::node_t::NODE_SWITCH,
1728 : .f_name = "SWITCH",
1729 : .f_operator = nullptr,
1730 : .f_flags = TEST_NODE_IS_NAN,
1731 : .f_node_flags = g_flags_switch
1732 : },
1733 : {
1734 : .f_type = as2js::node_t::NODE_SYNCHRONIZED,
1735 : .f_name = "SYNCHRONIZED",
1736 : .f_operator = nullptr,
1737 : .f_flags = TEST_NODE_IS_NAN,
1738 : .f_node_flags = g_flags_none
1739 : },
1740 : {
1741 : .f_type = as2js::node_t::NODE_TAN,
1742 : .f_name = "TAN",
1743 : .f_operator = nullptr,
1744 : .f_flags = TEST_NODE_IS_NAN,
1745 : .f_node_flags = g_flags_none
1746 : },
1747 : {
1748 : .f_type = as2js::node_t::NODE_TANH,
1749 : .f_name = "TANH",
1750 : .f_operator = nullptr,
1751 : .f_flags = TEST_NODE_IS_NAN,
1752 : .f_node_flags = g_flags_none
1753 : },
1754 : {
1755 : .f_type = as2js::node_t::NODE_TEMPLATE,
1756 : .f_name = "TEMPLATE",
1757 : .f_operator = nullptr,
1758 : .f_flags = TEST_NODE_IS_NAN | TEST_NODE_ACCEPT_STRING,
1759 : .f_node_flags = g_flags_none
1760 : },
1761 : {
1762 : .f_type = as2js::node_t::NODE_TEMPLATE_HEAD,
1763 : .f_name = "TEMPLATE_HEAD",
1764 : .f_operator = nullptr,
1765 : .f_flags = TEST_NODE_IS_NAN | TEST_NODE_ACCEPT_STRING,
1766 : .f_node_flags = g_flags_none
1767 : },
1768 : {
1769 : .f_type = as2js::node_t::NODE_TEMPLATE_MIDDLE,
1770 : .f_name = "TEMPLATE_MIDDLE",
1771 : .f_operator = nullptr,
1772 : .f_flags = TEST_NODE_IS_NAN | TEST_NODE_ACCEPT_STRING,
1773 : .f_node_flags = g_flags_none
1774 : },
1775 : {
1776 : .f_type = as2js::node_t::NODE_TEMPLATE_TAIL,
1777 : .f_name = "TEMPLATE_TAIL",
1778 : .f_operator = nullptr,
1779 : .f_flags = TEST_NODE_IS_NAN | TEST_NODE_ACCEPT_STRING,
1780 : .f_node_flags = g_flags_none
1781 : },
1782 : {
1783 : .f_type = as2js::node_t::NODE_THEN,
1784 : .f_name = "THEN",
1785 : .f_operator = nullptr,
1786 : .f_flags = TEST_NODE_IS_NAN,
1787 : .f_node_flags = g_flags_none
1788 : },
1789 : {
1790 : .f_type = as2js::node_t::NODE_THIS,
1791 : .f_name = "THIS",
1792 : .f_operator = nullptr,
1793 : .f_flags = TEST_NODE_IS_NAN,
1794 : .f_node_flags = g_flags_none
1795 : },
1796 : {
1797 : .f_type = as2js::node_t::NODE_THROW,
1798 : .f_name = "THROW",
1799 : .f_operator = nullptr,
1800 : .f_flags = TEST_NODE_IS_NAN,
1801 : .f_node_flags = g_flags_none
1802 : },
1803 : {
1804 : .f_type = as2js::node_t::NODE_THROWS,
1805 : .f_name = "THROWS",
1806 : .f_operator = nullptr,
1807 : .f_flags = TEST_NODE_IS_NAN,
1808 : .f_node_flags = g_flags_none
1809 : },
1810 : {
1811 : .f_type = as2js::node_t::NODE_TRANSIENT,
1812 : .f_name = "TRANSIENT",
1813 : .f_operator = nullptr,
1814 : .f_flags = TEST_NODE_IS_NAN,
1815 : .f_node_flags = g_flags_none
1816 : },
1817 : {
1818 : .f_type = as2js::node_t::NODE_TRUE,
1819 : .f_name = "TRUE",
1820 : .f_operator = nullptr,
1821 : .f_flags = TEST_NODE_IS_BOOLEAN | TEST_NODE_IS_TRUE | TEST_NODE_IS_BASIC,
1822 : .f_node_flags = g_flags_none
1823 : },
1824 : {
1825 : .f_type = as2js::node_t::NODE_TRUNC,
1826 : .f_name = "TRUNC",
1827 : .f_operator = nullptr,
1828 : .f_flags = TEST_NODE_IS_NAN,
1829 : .f_node_flags = g_flags_none
1830 : },
1831 : {
1832 : .f_type = as2js::node_t::NODE_TRY,
1833 : .f_name = "TRY",
1834 : .f_operator = nullptr,
1835 : .f_flags = TEST_NODE_IS_NAN,
1836 : .f_node_flags = g_flags_none
1837 : },
1838 : {
1839 : .f_type = as2js::node_t::NODE_TYPE,
1840 : .f_name = "TYPE",
1841 : .f_operator = nullptr,
1842 : .f_flags = TEST_NODE_IS_NAN,
1843 : .f_node_flags = g_flags_type
1844 : },
1845 : {
1846 : .f_type = as2js::node_t::NODE_TYPEOF,
1847 : .f_name = "TYPEOF",
1848 : .f_operator = nullptr,
1849 : .f_flags = TEST_NODE_IS_NAN,
1850 : .f_node_flags = g_flags_none
1851 : },
1852 : {
1853 : .f_type = as2js::node_t::NODE_UNDEFINED,
1854 : .f_name = "UNDEFINED",
1855 : .f_operator = nullptr,
1856 : .f_flags = TEST_NODE_IS_NAN | TEST_NODE_IS_UNDEFINED | TEST_NODE_IS_BASIC,
1857 : .f_node_flags = g_flags_none
1858 : },
1859 : {
1860 : .f_type = as2js::node_t::NODE_USE,
1861 : .f_name = "USE",
1862 : .f_operator = nullptr,
1863 : .f_flags = TEST_NODE_IS_NAN,
1864 : .f_node_flags = g_flags_none
1865 : },
1866 : {
1867 : .f_type = as2js::node_t::NODE_VAR,
1868 : .f_name = "VAR",
1869 : .f_operator = nullptr,
1870 : .f_flags = TEST_NODE_IS_NAN,
1871 : .f_node_flags = g_flags_variable
1872 : },
1873 : {
1874 : .f_type = as2js::node_t::NODE_VARIABLE,
1875 : .f_name = "VARIABLE",
1876 : .f_operator = nullptr,
1877 : .f_flags = TEST_NODE_IS_NAN | TEST_NODE_ACCEPT_STRING,
1878 : .f_node_flags = g_flags_variable
1879 : },
1880 : {
1881 : .f_type = as2js::node_t::NODE_VAR_ATTRIBUTES,
1882 : .f_name = "VAR_ATTRIBUTES",
1883 : .f_operator = nullptr,
1884 : .f_flags = TEST_NODE_IS_NAN | TEST_NODE_ACCEPT_STRING,
1885 : .f_node_flags = g_flags_variable
1886 : },
1887 : {
1888 : .f_type = as2js::node_t::NODE_VIDENTIFIER,
1889 : .f_name = "VIDENTIFIER",
1890 : .f_operator = nullptr,
1891 : .f_flags = TEST_NODE_IS_NAN | TEST_NODE_IS_IDENTIFIER | TEST_NODE_ACCEPT_STRING,
1892 : .f_node_flags = g_flags_identifier
1893 : },
1894 : {
1895 : .f_type = as2js::node_t::NODE_VOID,
1896 : .f_name = "VOID",
1897 : .f_operator = nullptr,
1898 : .f_flags = TEST_NODE_IS_NAN,
1899 : .f_node_flags = g_flags_none
1900 : },
1901 : {
1902 : .f_type = as2js::node_t::NODE_VOLATILE,
1903 : .f_name = "VOLATILE",
1904 : .f_operator = nullptr,
1905 : .f_flags = TEST_NODE_IS_NAN,
1906 : .f_node_flags = g_flags_none
1907 : },
1908 : {
1909 : .f_type = as2js::node_t::NODE_WHILE,
1910 : .f_name = "WHILE",
1911 : .f_operator = nullptr,
1912 : .f_flags = TEST_NODE_IS_NAN,
1913 : .f_node_flags = g_flags_none
1914 : },
1915 : {
1916 : .f_type = as2js::node_t::NODE_WITH,
1917 : .f_name = "WITH",
1918 : .f_operator = nullptr,
1919 : .f_flags = TEST_NODE_IS_NAN,
1920 : .f_node_flags = g_flags_none
1921 : },
1922 : {
1923 : .f_type = as2js::node_t::NODE_YIELD,
1924 : .f_name = "YIELD",
1925 : .f_operator = nullptr,
1926 : .f_flags = TEST_NODE_IS_NAN,
1927 : .f_node_flags = g_flags_none
1928 : }
1929 : };
1930 : #pragma GCC diagnostic pop
1931 : size_t const g_node_types_size(sizeof(g_node_types) / sizeof(g_node_types[0]));
1932 :
1933 :
1934 :
1935 : char const *g_attribute_names[static_cast<int>(as2js::attribute_t::NODE_ATTR_max)] =
1936 : {
1937 : "PUBLIC",
1938 : "PRIVATE",
1939 : "PROTECTED",
1940 : "INTERNAL",
1941 : "TRANSIENT",
1942 : "VOLATILE",
1943 : "STATIC",
1944 : "ABSTRACT",
1945 : "VIRTUAL",
1946 : "ARRAY",
1947 : "INLINE",
1948 : "REQUIRE_ELSE",
1949 : "ENSURE_THEN",
1950 : "NATIVE",
1951 : "UNIMPLEMENTED",
1952 : "DEPRECATED",
1953 : "UNSAFE",
1954 : "EXTERN",
1955 : "CONSTRUCTOR",
1956 : "FINAL",
1957 : "ENUMERABLE",
1958 : "TRUE",
1959 : "FALSE",
1960 : "UNUSED",
1961 : "DYNAMIC",
1962 : "FOREACH",
1963 : "NOBREAK",
1964 : "AUTOBREAK",
1965 : "TYPE",
1966 : "DEFINED"
1967 : };
1968 :
1969 : as2js::attribute_t const g_group_member_visibility[] =
1970 : {
1971 : as2js::attribute_t::NODE_ATTR_PRIVATE,
1972 : as2js::attribute_t::NODE_ATTR_PROTECTED,
1973 : as2js::attribute_t::NODE_ATTR_PUBLIC,
1974 : as2js::attribute_t::NODE_ATTR_max // end the list
1975 : };
1976 :
1977 : as2js::attribute_t const g_group_function_type[] =
1978 : {
1979 : as2js::attribute_t::NODE_ATTR_ABSTRACT,
1980 : as2js::attribute_t::NODE_ATTR_CONSTRUCTOR,
1981 : as2js::attribute_t::NODE_ATTR_STATIC,
1982 : as2js::attribute_t::NODE_ATTR_VIRTUAL,
1983 : as2js::attribute_t::NODE_ATTR_max // end the list
1984 : };
1985 :
1986 : as2js::attribute_t const g_group_function_contract[] =
1987 : {
1988 : as2js::attribute_t::NODE_ATTR_REQUIRE_ELSE,
1989 : as2js::attribute_t::NODE_ATTR_ENSURE_THEN,
1990 : as2js::attribute_t::NODE_ATTR_max // end the list
1991 : };
1992 :
1993 : as2js::attribute_t const g_group_switch_type[] =
1994 : {
1995 : as2js::attribute_t::NODE_ATTR_FOREACH,
1996 : as2js::attribute_t::NODE_ATTR_NOBREAK,
1997 : as2js::attribute_t::NODE_ATTR_AUTOBREAK,
1998 : as2js::attribute_t::NODE_ATTR_max // end the list
1999 : };
2000 :
2001 : as2js::attribute_t const g_group_conditional_compilation[] =
2002 : {
2003 : as2js::attribute_t::NODE_ATTR_TRUE,
2004 : as2js::attribute_t::NODE_ATTR_FALSE,
2005 : as2js::attribute_t::NODE_ATTR_max // end the list
2006 : };
2007 :
2008 : struct groups_attributes_t
2009 : {
2010 : as2js::attribute_t const * f_attributes;
2011 : char const * f_names;
2012 : };
2013 :
2014 : groups_attributes_t const g_groups_of_attributes[] =
2015 : {
2016 : {
2017 : g_group_member_visibility,
2018 : "public, private, and protected"
2019 : },
2020 : {
2021 : g_group_function_type,
2022 : "abstract, constructor, inline, native, static, and virtual"
2023 : },
2024 : {
2025 : g_group_function_contract,
2026 : "require else and ensure then"
2027 : },
2028 : {
2029 : g_group_switch_type,
2030 : "foreach, nobreak, and autobreak"
2031 : },
2032 : {
2033 : g_group_conditional_compilation,
2034 : "true and false"
2035 : }
2036 : };
2037 : size_t const g_groups_of_attributes_size(sizeof(g_groups_of_attributes) / sizeof(g_groups_of_attributes[0]));
2038 :
2039 :
2040 :
2041 :
2042 : class test_callback : public as2js::message_callback
2043 : {
2044 : public:
2045 320 : test_callback()
2046 320 : {
2047 320 : as2js::set_message_callback(this);
2048 320 : g_warning_count = as2js::warning_count();
2049 320 : g_error_count = as2js::error_count();
2050 320 : }
2051 :
2052 320 : ~test_callback()
2053 320 : {
2054 : // make sure the pointer gets reset!
2055 320 : as2js::set_message_callback(nullptr);
2056 320 : }
2057 :
2058 : // implementation of the output
2059 320 : virtual void output(as2js::message_level_t message_level, as2js::err_code_t error_code, as2js::position const& pos, std::string const& message)
2060 : {
2061 :
2062 : //std::cerr<< "\nmsg = " << pos.get_filename() << " / " << f_expected_pos.get_filename() << "\n";
2063 :
2064 320 : CATCH_REQUIRE(f_expected_call);
2065 320 : CATCH_REQUIRE(message_level == f_expected_message_level);
2066 320 : CATCH_REQUIRE(error_code == f_expected_error_code);
2067 320 : CATCH_REQUIRE(pos.get_filename() == f_expected_pos.get_filename());
2068 320 : CATCH_REQUIRE(pos.get_function() == f_expected_pos.get_function());
2069 320 : CATCH_REQUIRE(pos.get_page() == f_expected_pos.get_page());
2070 320 : CATCH_REQUIRE(pos.get_page_line() == f_expected_pos.get_page_line());
2071 320 : CATCH_REQUIRE(pos.get_paragraph() == f_expected_pos.get_paragraph());
2072 320 : CATCH_REQUIRE(pos.get_line() == f_expected_pos.get_line());
2073 320 : CATCH_REQUIRE(message == f_expected_message);
2074 :
2075 320 : if(message_level == as2js::message_level_t::MESSAGE_LEVEL_WARNING)
2076 : {
2077 0 : ++g_warning_count;
2078 0 : CATCH_REQUIRE(g_warning_count == as2js::warning_count());
2079 : }
2080 :
2081 320 : if(message_level == as2js::message_level_t::MESSAGE_LEVEL_FATAL
2082 320 : || message_level == as2js::message_level_t::MESSAGE_LEVEL_ERROR)
2083 : {
2084 320 : ++g_error_count;
2085 : //std::cerr << "error: " << g_error_count << " / " << as2js::error_count() << "\n";
2086 320 : CATCH_REQUIRE(g_error_count == as2js::error_count());
2087 : }
2088 :
2089 320 : f_got_called = true;
2090 320 : }
2091 :
2092 : bool f_expected_call = true;
2093 : bool f_got_called = false;
2094 : as2js::message_level_t f_expected_message_level = as2js::message_level_t::MESSAGE_LEVEL_OFF;
2095 : as2js::err_code_t f_expected_error_code = as2js::err_code_t::AS_ERR_NONE;
2096 : as2js::position f_expected_pos = as2js::position();
2097 : std::string f_expected_message = std::string(); // UTF-8 string
2098 :
2099 : static int32_t g_warning_count;
2100 : static int32_t g_error_count;
2101 : };
2102 :
2103 : int32_t test_callback::g_warning_count = 0;
2104 : int32_t test_callback::g_error_count = 0;
2105 :
2106 :
2107 75404 : void output_str(std::ostream & out, std::string str)
2108 : {
2109 75404 : snapdev::safe_stream stream_flags(out);
2110 :
2111 75404 : out << ": '";
2112 :
2113 2838862 : for(libutf8::utf8_iterator it(str); it != str.end(); ++it)
2114 : {
2115 2763458 : char32_t const c(*it);
2116 2763458 : if(c < 0x20)
2117 : {
2118 : // show controls as ^<letter>
2119 : //
2120 64 : out << '^' << static_cast<char>(c + '@');
2121 : }
2122 2763394 : else if(c < 0x7f)
2123 : {
2124 167 : if(c == '\'')
2125 : {
2126 1 : out << "\\'";
2127 : }
2128 : else
2129 : {
2130 166 : out << static_cast<char>(c);
2131 : }
2132 : }
2133 2763227 : else if(c < 0x100)
2134 : {
2135 232 : out << "\\x" << std::hex << static_cast<std::int32_t>(c);
2136 : }
2137 2762995 : else if(c < 0x10000)
2138 : {
2139 193612 : out << "\\u" << std::hex << std::setfill('0') << std::setw(4) << static_cast<std::int32_t>(c);
2140 : }
2141 : else
2142 : {
2143 2569383 : out << "\\U" << std::hex << std::setfill('0') << std::setw(6) << static_cast<std::int32_t>(c);
2144 : }
2145 : }
2146 75404 : out << '\'';
2147 150808 : }
2148 :
2149 :
2150 : // is attribute 'a' in conflict with attribute '*attr_list'?
2151 7952 : bool in_conflict(size_t j, as2js::attribute_t attr, as2js::attribute_t a)
2152 : {
2153 30608 : for(as2js::attribute_t const *conflict_list(g_groups_of_attributes[j].f_attributes);
2154 30608 : *conflict_list != as2js::attribute_t::NODE_ATTR_max;
2155 : ++conflict_list)
2156 : {
2157 23216 : if(a == *conflict_list)
2158 : {
2159 560 : return true;
2160 : }
2161 : }
2162 :
2163 : // the following handles exceptions
2164 : //
2165 : // From the function type:
2166 : // . abstract, constructor, static, virtual
2167 : //
2168 : // We also get:
2169 : // . abstract / native
2170 : // . abstract / constructor / inline / virtual
2171 7392 : switch(attr)
2172 : {
2173 508 : case as2js::attribute_t::NODE_ATTR_ABSTRACT:
2174 : switch(a)
2175 : {
2176 40 : case as2js::attribute_t::NODE_ATTR_NATIVE:
2177 : case as2js::attribute_t::NODE_ATTR_INLINE:
2178 40 : return true;
2179 :
2180 468 : default:
2181 468 : break;
2182 :
2183 : }
2184 468 : break;
2185 :
2186 508 : case as2js::attribute_t::NODE_ATTR_CONSTRUCTOR:
2187 : switch(a)
2188 : {
2189 20 : case as2js::attribute_t::NODE_ATTR_INLINE:
2190 20 : return true;
2191 :
2192 488 : default:
2193 488 : break;
2194 :
2195 : }
2196 488 : break;
2197 :
2198 0 : case as2js::attribute_t::NODE_ATTR_INLINE:
2199 : switch(a)
2200 : {
2201 0 : case as2js::attribute_t::NODE_ATTR_ABSTRACT:
2202 : case as2js::attribute_t::NODE_ATTR_CONSTRUCTOR:
2203 : case as2js::attribute_t::NODE_ATTR_NATIVE:
2204 : case as2js::attribute_t::NODE_ATTR_VIRTUAL:
2205 0 : return true;
2206 :
2207 0 : default:
2208 0 : break;
2209 :
2210 : }
2211 0 : break;
2212 :
2213 0 : case as2js::attribute_t::NODE_ATTR_NATIVE:
2214 : switch(a)
2215 : {
2216 0 : case as2js::attribute_t::NODE_ATTR_ABSTRACT:
2217 : case as2js::attribute_t::NODE_ATTR_INLINE:
2218 0 : return true;
2219 :
2220 0 : default:
2221 0 : break;
2222 :
2223 : }
2224 0 : break;
2225 :
2226 :
2227 508 : case as2js::attribute_t::NODE_ATTR_VIRTUAL:
2228 : switch(a)
2229 : {
2230 20 : case as2js::attribute_t::NODE_ATTR_INLINE:
2231 20 : return true;
2232 :
2233 488 : default:
2234 488 : break;
2235 :
2236 : }
2237 488 : break;
2238 :
2239 5868 : default:
2240 5868 : break;
2241 :
2242 : }
2243 :
2244 7312 : return false;
2245 : }
2246 :
2247 :
2248 :
2249 : }
2250 : // no name namespace
2251 :
2252 :
2253 :
2254 :
2255 : // vim: ts=4 sw=4 et
|