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_FLAG_max,
218 : nullptr
219 : }
220 : };
221 :
222 : flags_per_node_t const g_flags_param[] =
223 : {
224 : {
225 : as2js::flag_t::NODE_PARAM_FLAG_CONST,
226 : "CONST"
227 : },
228 : {
229 : as2js::flag_t::NODE_PARAM_FLAG_IN,
230 : "IN"
231 : },
232 : {
233 : as2js::flag_t::NODE_PARAM_FLAG_OUT,
234 : "OUT"
235 : },
236 : {
237 : as2js::flag_t::NODE_PARAM_FLAG_NAMED,
238 : "NAMED"
239 : },
240 : {
241 : as2js::flag_t::NODE_PARAM_FLAG_REST,
242 : "REST"
243 : },
244 : {
245 : as2js::flag_t::NODE_PARAM_FLAG_UNCHECKED,
246 : "UNCHECKED"
247 : },
248 : {
249 : as2js::flag_t::NODE_PARAM_FLAG_UNPROTOTYPED,
250 : "UNPROTOTYPED"
251 : },
252 : {
253 : as2js::flag_t::NODE_PARAM_FLAG_REFERENCED,
254 : "REFERENCED"
255 : },
256 : {
257 : as2js::flag_t::NODE_PARAM_FLAG_PARAMREF,
258 : "PARAMREF"
259 : },
260 : {
261 : as2js::flag_t::NODE_PARAM_FLAG_CATCH,
262 : "CATCH"
263 : },
264 : {
265 : as2js::flag_t::NODE_FLAG_max,
266 : nullptr
267 : }
268 : };
269 :
270 : flags_per_node_t const g_flags_switch[] =
271 : {
272 : {
273 : as2js::flag_t::NODE_SWITCH_FLAG_DEFAULT,
274 : "DEFAULT"
275 : },
276 : {
277 : as2js::flag_t::NODE_FLAG_max,
278 : nullptr
279 : }
280 : };
281 :
282 : flags_per_node_t const g_flags_type[] =
283 : {
284 : {
285 : as2js::flag_t::NODE_TYPE_FLAG_MODULO,
286 : "MODULO"
287 : },
288 : {
289 : as2js::flag_t::NODE_FLAG_max,
290 : nullptr
291 : }
292 : };
293 :
294 : flags_per_node_t const g_flags_variable[] =
295 : {
296 : {
297 : as2js::flag_t::NODE_VARIABLE_FLAG_CONST,
298 : "CONST",
299 : },
300 : {
301 : as2js::flag_t::NODE_VARIABLE_FLAG_FINAL,
302 : "FINAL",
303 : },
304 : {
305 : as2js::flag_t::NODE_VARIABLE_FLAG_LOCAL,
306 : "LOCAL",
307 : },
308 : {
309 : as2js::flag_t::NODE_VARIABLE_FLAG_MEMBER,
310 : "MEMBER",
311 : },
312 : {
313 : as2js::flag_t::NODE_VARIABLE_FLAG_ATTRIBUTES,
314 : "ATTRIBUTES",
315 : },
316 : {
317 : as2js::flag_t::NODE_VARIABLE_FLAG_ENUM,
318 : "ENUM",
319 : },
320 : {
321 : as2js::flag_t::NODE_VARIABLE_FLAG_COMPILED,
322 : "COMPILED",
323 : },
324 : {
325 : as2js::flag_t::NODE_VARIABLE_FLAG_INUSE,
326 : "INUSE",
327 : },
328 : {
329 : as2js::flag_t::NODE_VARIABLE_FLAG_ATTRS,
330 : "ATTRS",
331 : },
332 : {
333 : as2js::flag_t::NODE_VARIABLE_FLAG_DEFINED,
334 : "DEFINED",
335 : },
336 : {
337 : as2js::flag_t::NODE_VARIABLE_FLAG_DEFINING,
338 : "DEFINING",
339 : },
340 : {
341 : as2js::flag_t::NODE_VARIABLE_FLAG_TOADD,
342 : "TOADD",
343 : },
344 : {
345 : as2js::flag_t::NODE_VARIABLE_FLAG_TEMPORARY,
346 : "TEMPORARY",
347 : },
348 : {
349 : as2js::flag_t::NODE_FLAG_max,
350 : nullptr,
351 : },
352 : };
353 :
354 :
355 :
356 :
357 : struct node_type_info_t
358 : {
359 : as2js::node_t f_type;
360 : char const * f_name;
361 : char const * f_operator;
362 : uint64_t f_flags;
363 : flags_per_node_t const * f_node_flags;
364 : };
365 :
366 :
367 : uint64_t const TEST_NODE_IS_NUMBER = 0x0000000000000001;
368 : uint64_t const TEST_NODE_IS_NAN = 0x0000000000000002;
369 : uint64_t const TEST_NODE_IS_INTEGER = 0x0000000000000004;
370 : uint64_t const TEST_NODE_IS_FLOATING_POINT = 0x0000000000000008;
371 : uint64_t const TEST_NODE_IS_BOOLEAN = 0x0000000000000010;
372 : uint64_t const TEST_NODE_IS_TRUE = 0x0000000000000020;
373 : uint64_t const TEST_NODE_IS_FALSE = 0x0000000000000040;
374 : uint64_t const TEST_NODE_IS_STRING = 0x0000000000000080;
375 : uint64_t const TEST_NODE_IS_UNDEFINED = 0x0000000000000100;
376 : uint64_t const TEST_NODE_IS_NULL = 0x0000000000000200;
377 : uint64_t const TEST_NODE_IS_IDENTIFIER = 0x0000000000000400;
378 : uint64_t const TEST_NODE_ACCEPT_STRING = 0x0000000000000800;
379 : uint64_t const TEST_NODE_HAS_SIDE_EFFECTS = 0x0000000000001000;
380 : uint64_t const TEST_NODE_IS_PARAM_MATCH = 0x0000000000002000;
381 : uint64_t const TEST_NODE_IS_SWITCH_OPERATOR = 0x0000000000004000;
382 : uint64_t const TEST_NODE_IS_BASIC = 0x0000000000008000;
383 :
384 : // index from 0 to g_node_types_size - 1 to go through all the valid
385 : // node types
386 : #pragma GCC diagnostic push
387 : #pragma GCC diagnostic ignored "-Wpedantic"
388 : // pedantic because the .<field_name> is not accepted by default in C++
389 : node_type_info_t const g_node_types[] =
390 : {
391 : {
392 : .f_type = as2js::node_t::NODE_EOF,
393 : .f_name = "EOF",
394 : .f_operator = nullptr,
395 : .f_flags = TEST_NODE_IS_NAN,
396 : .f_node_flags = g_flags_none
397 : },
398 : {
399 : .f_type = as2js::node_t::NODE_UNKNOWN,
400 : .f_name = "UNKNOWN",
401 : .f_operator = nullptr,
402 : .f_flags = TEST_NODE_IS_NAN | TEST_NODE_IS_SWITCH_OPERATOR,
403 : .f_node_flags = g_flags_none
404 : },
405 : {
406 : .f_type = as2js::node_t::NODE_ADD,
407 : .f_name = "ADD",
408 : .f_operator = "+",
409 : .f_flags = TEST_NODE_IS_NAN,
410 : .f_node_flags = g_flags_none
411 : },
412 : {
413 : .f_type = as2js::node_t::NODE_ASSIGNMENT,
414 : .f_name = "ASSIGNMENT",
415 : .f_operator = "=",
416 : .f_flags = TEST_NODE_IS_NAN | TEST_NODE_HAS_SIDE_EFFECTS,
417 : .f_node_flags = g_flags_none
418 : },
419 : {
420 : .f_type = as2js::node_t::NODE_ASSIGNMENT_COALESCE,
421 : .f_name = "ASSIGNMENT_COALESCE",
422 : .f_operator = "??=",
423 : .f_flags = TEST_NODE_IS_NAN,
424 : .f_node_flags = g_flags_none
425 : },
426 : {
427 : .f_type = as2js::node_t::NODE_BITWISE_AND,
428 : .f_name = "BITWISE_AND",
429 : .f_operator = "&",
430 : .f_flags = TEST_NODE_IS_NAN,
431 : .f_node_flags = g_flags_none
432 : },
433 : {
434 : .f_type = as2js::node_t::NODE_BITWISE_NOT,
435 : .f_name = "BITWISE_NOT",
436 : .f_operator = "~",
437 : .f_flags = TEST_NODE_IS_NAN,
438 : .f_node_flags = g_flags_none
439 : },
440 : {
441 : .f_type = as2js::node_t::NODE_BITWISE_OR,
442 : .f_name = "BITWISE_OR",
443 : .f_operator = "|",
444 : .f_flags = TEST_NODE_IS_NAN,
445 : .f_node_flags = g_flags_none
446 : },
447 : {
448 : .f_type = as2js::node_t::NODE_BITWISE_XOR,
449 : .f_name = "BITWISE_XOR",
450 : .f_operator = "^",
451 : .f_flags = TEST_NODE_IS_NAN,
452 : .f_node_flags = g_flags_none
453 : },
454 : {
455 : .f_type = as2js::node_t::NODE_CLOSE_CURVLY_BRACKET,
456 : .f_name = "CLOSE_CURVLY_BRACKET",
457 : .f_operator = nullptr,
458 : .f_flags = TEST_NODE_IS_NAN,
459 : .f_node_flags = g_flags_none
460 : },
461 : {
462 : .f_type = as2js::node_t::NODE_CLOSE_PARENTHESIS,
463 : .f_name = "CLOSE_PARENTHESIS",
464 : .f_operator = nullptr,
465 : .f_flags = TEST_NODE_IS_NAN,
466 : .f_node_flags = g_flags_none
467 : },
468 : {
469 : .f_type = as2js::node_t::NODE_CLOSE_SQUARE_BRACKET,
470 : .f_name = "CLOSE_SQUARE_BRACKET",
471 : .f_operator = nullptr,
472 : .f_flags = TEST_NODE_IS_NAN,
473 : .f_node_flags = g_flags_none
474 : },
475 : {
476 : .f_type = as2js::node_t::NODE_COLON,
477 : .f_name = "COLON",
478 : .f_operator = nullptr,
479 : .f_flags = TEST_NODE_IS_NAN,
480 : .f_node_flags = g_flags_none
481 : },
482 : {
483 : .f_type = as2js::node_t::NODE_COMMA,
484 : .f_name = "COMMA",
485 : .f_operator = ",",
486 : .f_flags = TEST_NODE_IS_NAN,
487 : .f_node_flags = g_flags_none
488 : },
489 : {
490 : .f_type = as2js::node_t::NODE_CONDITIONAL,
491 : .f_name = "CONDITIONAL",
492 : .f_operator = nullptr,
493 : .f_flags = TEST_NODE_IS_NAN,
494 : .f_node_flags = g_flags_none
495 : },
496 : {
497 : .f_type = as2js::node_t::NODE_DIVIDE,
498 : .f_name = "DIVIDE",
499 : .f_operator = "/",
500 : .f_flags = TEST_NODE_IS_NAN,
501 : .f_node_flags = g_flags_none
502 : },
503 : {
504 : .f_type = as2js::node_t::NODE_GREATER,
505 : .f_name = "GREATER",
506 : .f_operator = ">",
507 : .f_flags = TEST_NODE_IS_NAN | TEST_NODE_IS_SWITCH_OPERATOR,
508 : .f_node_flags = g_flags_none
509 : },
510 : {
511 : .f_type = as2js::node_t::NODE_LESS,
512 : .f_name = "LESS",
513 : .f_operator = "<",
514 : .f_flags = TEST_NODE_IS_NAN | TEST_NODE_IS_SWITCH_OPERATOR,
515 : .f_node_flags = g_flags_none
516 : },
517 : {
518 : .f_type = as2js::node_t::NODE_LOGICAL_NOT,
519 : .f_name = "LOGICAL_NOT",
520 : .f_operator = "!",
521 : .f_flags = TEST_NODE_IS_NAN,
522 : .f_node_flags = g_flags_none
523 : },
524 : {
525 : .f_type = as2js::node_t::NODE_MODULO,
526 : .f_name = "MODULO",
527 : .f_operator = "%",
528 : .f_flags = TEST_NODE_IS_NAN,
529 : .f_node_flags = g_flags_none
530 : },
531 : {
532 : .f_type = as2js::node_t::NODE_MULTIPLY,
533 : .f_name = "MULTIPLY",
534 : .f_operator = "*",
535 : .f_flags = TEST_NODE_IS_NAN,
536 : .f_node_flags = g_flags_none
537 : },
538 : {
539 : .f_type = as2js::node_t::NODE_OPEN_CURVLY_BRACKET,
540 : .f_name = "OPEN_CURVLY_BRACKET",
541 : .f_operator = nullptr,
542 : .f_flags = TEST_NODE_IS_NAN,
543 : .f_node_flags = g_flags_none
544 : },
545 : {
546 : .f_type = as2js::node_t::NODE_OPEN_PARENTHESIS,
547 : .f_name = "OPEN_PARENTHESIS",
548 : .f_operator = nullptr,
549 : .f_flags = TEST_NODE_IS_NAN,
550 : .f_node_flags = g_flags_none
551 : },
552 : {
553 : .f_type = as2js::node_t::NODE_OPEN_SQUARE_BRACKET,
554 : .f_name = "OPEN_SQUARE_BRACKET",
555 : .f_operator = nullptr,
556 : .f_flags = TEST_NODE_IS_NAN,
557 : .f_node_flags = g_flags_none
558 : },
559 : {
560 : .f_type = as2js::node_t::NODE_OPTIONAL_MEMBER,
561 : .f_name = "OPTIONAL_MEMBER",
562 : .f_operator = "?.",
563 : .f_flags = TEST_NODE_IS_NAN,
564 : .f_node_flags = g_flags_none
565 : },
566 : {
567 : .f_type = as2js::node_t::NODE_MEMBER,
568 : .f_name = "MEMBER",
569 : .f_operator = nullptr,
570 : .f_flags = TEST_NODE_IS_NAN,
571 : .f_node_flags = g_flags_none
572 : },
573 : {
574 : .f_type = as2js::node_t::NODE_SEMICOLON,
575 : .f_name = "SEMICOLON",
576 : .f_operator = nullptr,
577 : .f_flags = TEST_NODE_IS_NAN,
578 : .f_node_flags = g_flags_none
579 : },
580 : {
581 : .f_type = as2js::node_t::NODE_SUBTRACT,
582 : .f_name = "SUBTRACT",
583 : .f_operator = "-",
584 : .f_flags = TEST_NODE_IS_NAN,
585 : .f_node_flags = g_flags_none
586 : },
587 : {
588 : .f_type = as2js::node_t::NODE_ABSTRACT,
589 : .f_name = "ABSTRACT",
590 : .f_operator = nullptr,
591 : .f_flags = TEST_NODE_IS_NAN,
592 : .f_node_flags = g_flags_none
593 : },
594 : {
595 : .f_type = as2js::node_t::NODE_ALMOST_EQUAL,
596 : .f_name = "ALMOST_EQUAL",
597 : .f_operator = "\u2248",
598 : .f_flags = TEST_NODE_IS_NAN | TEST_NODE_IS_SWITCH_OPERATOR,
599 : .f_node_flags = g_flags_none
600 : },
601 : {
602 : .f_type = as2js::node_t::NODE_ARRAY,
603 : .f_name = "ARRAY",
604 : .f_operator = nullptr,
605 : .f_flags = TEST_NODE_IS_NAN,
606 : .f_node_flags = g_flags_none
607 : },
608 : {
609 : .f_type = as2js::node_t::NODE_ARRAY_LITERAL,
610 : .f_name = "ARRAY_LITERAL",
611 : .f_operator = nullptr,
612 : .f_flags = TEST_NODE_IS_NAN,
613 : .f_node_flags = g_flags_none
614 : },
615 : {
616 : .f_type = as2js::node_t::NODE_ARROW,
617 : .f_name = "ARROW",
618 : .f_operator = nullptr,
619 : .f_flags = TEST_NODE_IS_NAN,
620 : .f_node_flags = g_flags_none
621 : },
622 : {
623 : .f_type = as2js::node_t::NODE_AS,
624 : .f_name = "AS",
625 : .f_operator = nullptr,
626 : .f_flags = TEST_NODE_IS_NAN | TEST_NODE_IS_SWITCH_OPERATOR,
627 : .f_node_flags = g_flags_none
628 : },
629 : {
630 : .f_type = as2js::node_t::NODE_ASSIGNMENT_ADD,
631 : .f_name = "ASSIGNMENT_ADD",
632 : .f_operator = "+=",
633 : .f_flags = TEST_NODE_IS_NAN | TEST_NODE_HAS_SIDE_EFFECTS,
634 : .f_node_flags = g_flags_none
635 : },
636 : {
637 : .f_type = as2js::node_t::NODE_ASSIGNMENT_BITWISE_AND,
638 : .f_name = "ASSIGNMENT_BITWISE_AND",
639 : .f_operator = "&=",
640 : .f_flags = TEST_NODE_IS_NAN | TEST_NODE_HAS_SIDE_EFFECTS,
641 : .f_node_flags = g_flags_none
642 : },
643 : {
644 : .f_type = as2js::node_t::NODE_ASSIGNMENT_BITWISE_OR,
645 : .f_name = "ASSIGNMENT_BITWISE_OR",
646 : .f_operator = "|=",
647 : .f_flags = TEST_NODE_IS_NAN | TEST_NODE_HAS_SIDE_EFFECTS,
648 : .f_node_flags = g_flags_none
649 : },
650 : {
651 : .f_type = as2js::node_t::NODE_ASSIGNMENT_BITWISE_XOR,
652 : .f_name = "ASSIGNMENT_BITWISE_XOR",
653 : .f_operator = "^=",
654 : .f_flags = TEST_NODE_IS_NAN | TEST_NODE_HAS_SIDE_EFFECTS,
655 : .f_node_flags = g_flags_none
656 : },
657 : {
658 : .f_type = as2js::node_t::NODE_ASSIGNMENT_DIVIDE,
659 : .f_name = "ASSIGNMENT_DIVIDE",
660 : .f_operator = "/=",
661 : .f_flags = TEST_NODE_IS_NAN | TEST_NODE_HAS_SIDE_EFFECTS,
662 : .f_node_flags = g_flags_none
663 : },
664 : {
665 : .f_type = as2js::node_t::NODE_ASSIGNMENT_LOGICAL_AND,
666 : .f_name = "ASSIGNMENT_LOGICAL_AND",
667 : .f_operator = "&&=",
668 : .f_flags = TEST_NODE_IS_NAN | TEST_NODE_HAS_SIDE_EFFECTS,
669 : .f_node_flags = g_flags_none
670 : },
671 : {
672 : .f_type = as2js::node_t::NODE_ASSIGNMENT_LOGICAL_OR,
673 : .f_name = "ASSIGNMENT_LOGICAL_OR",
674 : .f_operator = "||=",
675 : .f_flags = TEST_NODE_IS_NAN | TEST_NODE_HAS_SIDE_EFFECTS,
676 : .f_node_flags = g_flags_none
677 : },
678 : {
679 : .f_type = as2js::node_t::NODE_ASSIGNMENT_LOGICAL_XOR,
680 : .f_name = "ASSIGNMENT_LOGICAL_XOR",
681 : .f_operator = "^^=",
682 : .f_flags = TEST_NODE_IS_NAN | TEST_NODE_HAS_SIDE_EFFECTS,
683 : .f_node_flags = g_flags_none
684 : },
685 : {
686 : .f_type = as2js::node_t::NODE_ASSIGNMENT_MAXIMUM,
687 : .f_name = "ASSIGNMENT_MAXIMUM",
688 : .f_operator = ">?=",
689 : .f_flags = TEST_NODE_IS_NAN | TEST_NODE_HAS_SIDE_EFFECTS,
690 : .f_node_flags = g_flags_none
691 : },
692 : {
693 : .f_type = as2js::node_t::NODE_ASSIGNMENT_MINIMUM,
694 : .f_name = "ASSIGNMENT_MINIMUM",
695 : .f_operator = "<?=",
696 : .f_flags = TEST_NODE_IS_NAN | TEST_NODE_HAS_SIDE_EFFECTS,
697 : .f_node_flags = g_flags_none
698 : },
699 : {
700 : .f_type = as2js::node_t::NODE_ASSIGNMENT_MODULO,
701 : .f_name = "ASSIGNMENT_MODULO",
702 : .f_operator = "%=",
703 : .f_flags = TEST_NODE_IS_NAN | TEST_NODE_HAS_SIDE_EFFECTS,
704 : .f_node_flags = g_flags_none
705 : },
706 : {
707 : .f_type = as2js::node_t::NODE_ASSIGNMENT_MULTIPLY,
708 : .f_name = "ASSIGNMENT_MULTIPLY",
709 : .f_operator = "*=",
710 : .f_flags = TEST_NODE_IS_NAN | TEST_NODE_HAS_SIDE_EFFECTS,
711 : .f_node_flags = g_flags_none
712 : },
713 : {
714 : .f_type = as2js::node_t::NODE_ASSIGNMENT_POWER,
715 : .f_name = "ASSIGNMENT_POWER",
716 : .f_operator = "**=",
717 : .f_flags = TEST_NODE_IS_NAN | TEST_NODE_HAS_SIDE_EFFECTS,
718 : .f_node_flags = g_flags_none
719 : },
720 : {
721 : .f_type = as2js::node_t::NODE_ASSIGNMENT_ROTATE_LEFT,
722 : .f_name = "ASSIGNMENT_ROTATE_LEFT",
723 : .f_operator = "<%=",
724 : .f_flags = TEST_NODE_IS_NAN | TEST_NODE_HAS_SIDE_EFFECTS,
725 : .f_node_flags = g_flags_none
726 : },
727 : {
728 : .f_type = as2js::node_t::NODE_ASSIGNMENT_ROTATE_RIGHT,
729 : .f_name = "ASSIGNMENT_ROTATE_RIGHT",
730 : .f_operator = ">%=",
731 : .f_flags = TEST_NODE_IS_NAN | TEST_NODE_HAS_SIDE_EFFECTS,
732 : .f_node_flags = g_flags_none
733 : },
734 : {
735 : .f_type = as2js::node_t::NODE_ASSIGNMENT_SHIFT_LEFT,
736 : .f_name = "ASSIGNMENT_SHIFT_LEFT",
737 : .f_operator = "<<=",
738 : .f_flags = TEST_NODE_IS_NAN | TEST_NODE_HAS_SIDE_EFFECTS,
739 : .f_node_flags = g_flags_none
740 : },
741 : {
742 : .f_type = as2js::node_t::NODE_ASSIGNMENT_SHIFT_RIGHT,
743 : .f_name = "ASSIGNMENT_SHIFT_RIGHT",
744 : .f_operator = ">>=",
745 : .f_flags = TEST_NODE_IS_NAN | TEST_NODE_HAS_SIDE_EFFECTS,
746 : .f_node_flags = g_flags_none
747 : },
748 : {
749 : .f_type = as2js::node_t::NODE_ASSIGNMENT_SHIFT_RIGHT_UNSIGNED,
750 : .f_name = "ASSIGNMENT_SHIFT_RIGHT_UNSIGNED",
751 : .f_operator = ">>>=",
752 : .f_flags = TEST_NODE_IS_NAN | TEST_NODE_HAS_SIDE_EFFECTS,
753 : .f_node_flags = g_flags_none
754 : },
755 : {
756 : .f_type = as2js::node_t::NODE_ASSIGNMENT_SUBTRACT,
757 : .f_name = "ASSIGNMENT_SUBTRACT",
758 : .f_operator = "-=",
759 : .f_flags = TEST_NODE_IS_NAN | TEST_NODE_HAS_SIDE_EFFECTS,
760 : .f_node_flags = g_flags_none
761 : },
762 : {
763 : .f_type = as2js::node_t::NODE_ASYNC,
764 : .f_name = "ASYNC",
765 : .f_operator = nullptr,
766 : .f_flags = TEST_NODE_IS_NAN,
767 : .f_node_flags = g_flags_none
768 : },
769 : {
770 : .f_type = as2js::node_t::NODE_ATTRIBUTES,
771 : .f_name = "ATTRIBUTES",
772 : .f_operator = nullptr,
773 : .f_flags = TEST_NODE_IS_NAN,
774 : .f_node_flags = g_flags_none
775 : },
776 : {
777 : .f_type = as2js::node_t::NODE_AUTO,
778 : .f_name = "AUTO",
779 : .f_operator = nullptr,
780 : .f_flags = TEST_NODE_IS_NAN,
781 : .f_node_flags = g_flags_none
782 : },
783 : {
784 : .f_type = as2js::node_t::NODE_AWAIT,
785 : .f_name = "AWAIT",
786 : .f_operator = nullptr,
787 : .f_flags = TEST_NODE_IS_NAN,
788 : .f_node_flags = g_flags_none
789 : },
790 : {
791 : .f_type = as2js::node_t::NODE_BOOLEAN,
792 : .f_name = "BOOLEAN",
793 : .f_operator = nullptr,
794 : .f_flags = TEST_NODE_IS_NAN,
795 : .f_node_flags = g_flags_none
796 : },
797 : {
798 : .f_type = as2js::node_t::NODE_BREAK,
799 : .f_name = "BREAK",
800 : .f_operator = nullptr,
801 : .f_flags = TEST_NODE_IS_NAN | TEST_NODE_ACCEPT_STRING,
802 : .f_node_flags = g_flags_none
803 : },
804 : {
805 : .f_type = as2js::node_t::NODE_BYTE,
806 : .f_name = "BYTE",
807 : .f_operator = nullptr,
808 : .f_flags = TEST_NODE_IS_NAN,
809 : .f_node_flags = g_flags_none
810 : },
811 : {
812 : .f_type = as2js::node_t::NODE_CALL,
813 : .f_name = "CALL",
814 : .f_operator = "()",
815 : .f_flags = TEST_NODE_IS_NAN | TEST_NODE_HAS_SIDE_EFFECTS,
816 : .f_node_flags = g_flags_call
817 : },
818 : {
819 : .f_type = as2js::node_t::NODE_CASE,
820 : .f_name = "CASE",
821 : .f_operator = nullptr,
822 : .f_flags = TEST_NODE_IS_NAN,
823 : .f_node_flags = g_flags_none
824 : },
825 : {
826 : .f_type = as2js::node_t::NODE_CATCH,
827 : .f_name = "CATCH",
828 : .f_operator = nullptr,
829 : .f_flags = TEST_NODE_IS_NAN,
830 : .f_node_flags = g_flags_catch
831 : },
832 : {
833 : .f_type = as2js::node_t::NODE_CHAR,
834 : .f_name = "CHAR",
835 : .f_operator = nullptr,
836 : .f_flags = TEST_NODE_IS_NAN,
837 : .f_node_flags = g_flags_none
838 : },
839 : {
840 : .f_type = as2js::node_t::NODE_CLASS,
841 : .f_name = "CLASS",
842 : .f_operator = nullptr,
843 : .f_flags = TEST_NODE_IS_NAN | TEST_NODE_ACCEPT_STRING,
844 : .f_node_flags = g_flags_string
845 : },
846 : {
847 : .f_type = as2js::node_t::NODE_COALESCE,
848 : .f_name = "COALESCE",
849 : .f_operator = "??",
850 : .f_flags = TEST_NODE_IS_NAN,
851 : .f_node_flags = g_flags_none
852 : },
853 : {
854 : .f_type = as2js::node_t::NODE_COMPARE,
855 : .f_name = "COMPARE",
856 : .f_operator = "<=>",
857 : .f_flags = TEST_NODE_IS_NAN,
858 : .f_node_flags = g_flags_none
859 : },
860 : {
861 : .f_type = as2js::node_t::NODE_CONST,
862 : .f_name = "CONST",
863 : .f_operator = nullptr,
864 : .f_flags = TEST_NODE_IS_NAN,
865 : .f_node_flags = g_flags_none
866 : },
867 : {
868 : .f_type = as2js::node_t::NODE_CONTINUE,
869 : .f_name = "CONTINUE",
870 : .f_operator = nullptr,
871 : .f_flags = TEST_NODE_IS_NAN | TEST_NODE_ACCEPT_STRING,
872 : .f_node_flags = g_flags_none
873 : },
874 : {
875 : .f_type = as2js::node_t::NODE_DEBUGGER,
876 : .f_name = "DEBUGGER",
877 : .f_operator = nullptr,
878 : .f_flags = TEST_NODE_IS_NAN,
879 : .f_node_flags = g_flags_none
880 : },
881 : {
882 : .f_type = as2js::node_t::NODE_DECREMENT,
883 : .f_name = "DECREMENT",
884 : .f_operator = "--x",
885 : .f_flags = TEST_NODE_IS_NAN | TEST_NODE_HAS_SIDE_EFFECTS,
886 : .f_node_flags = g_flags_none
887 : },
888 : {
889 : .f_type = as2js::node_t::NODE_DEFAULT,
890 : .f_name = "DEFAULT",
891 : .f_operator = nullptr,
892 : .f_flags = TEST_NODE_IS_NAN | TEST_NODE_IS_SWITCH_OPERATOR,
893 : .f_node_flags = g_flags_none
894 : },
895 : {
896 : .f_type = as2js::node_t::NODE_DELETE,
897 : .f_name = "DELETE",
898 : .f_operator = nullptr,
899 : .f_flags = TEST_NODE_IS_NAN | TEST_NODE_HAS_SIDE_EFFECTS,
900 : .f_node_flags = g_flags_none
901 : },
902 : {
903 : .f_type = as2js::node_t::NODE_DIRECTIVE_LIST,
904 : .f_name = "DIRECTIVE_LIST",
905 : .f_operator = nullptr,
906 : .f_flags = TEST_NODE_IS_NAN,
907 : .f_node_flags = g_flags_directive_list
908 : },
909 : {
910 : .f_type = as2js::node_t::NODE_DO,
911 : .f_name = "DO",
912 : .f_operator = nullptr,
913 : .f_flags = TEST_NODE_IS_NAN,
914 : .f_node_flags = g_flags_none
915 : },
916 : {
917 : .f_type = as2js::node_t::NODE_DOUBLE,
918 : .f_name = "DOUBLE",
919 : .f_operator = nullptr,
920 : .f_flags = TEST_NODE_IS_NAN,
921 : .f_node_flags = g_flags_none
922 : },
923 : {
924 : .f_type = as2js::node_t::NODE_ELSE,
925 : .f_name = "ELSE",
926 : .f_operator = nullptr,
927 : .f_flags = TEST_NODE_IS_NAN,
928 : .f_node_flags = g_flags_none
929 : },
930 : {
931 : .f_type = as2js::node_t::NODE_EMPTY,
932 : .f_name = "EMPTY",
933 : .f_operator = nullptr,
934 : .f_flags = TEST_NODE_IS_NAN,
935 : .f_node_flags = g_flags_none
936 : },
937 : {
938 : .f_type = as2js::node_t::NODE_ENSURE,
939 : .f_name = "ENSURE",
940 : .f_operator = nullptr,
941 : .f_flags = TEST_NODE_IS_NAN,
942 : .f_node_flags = g_flags_none
943 : },
944 : {
945 : .f_type = as2js::node_t::NODE_ENUM,
946 : .f_name = "ENUM",
947 : .f_operator = nullptr,
948 : .f_flags = TEST_NODE_IS_NAN | TEST_NODE_ACCEPT_STRING,
949 : .f_node_flags = g_flags_enum
950 : },
951 : {
952 : .f_type = as2js::node_t::NODE_EQUAL,
953 : .f_name = "EQUAL",
954 : .f_operator = "==",
955 : .f_flags = TEST_NODE_IS_NAN | TEST_NODE_IS_SWITCH_OPERATOR,
956 : .f_node_flags = g_flags_none
957 : },
958 : {
959 : .f_type = as2js::node_t::NODE_EXCLUDE,
960 : .f_name = "EXCLUDE",
961 : .f_operator = nullptr,
962 : .f_flags = TEST_NODE_IS_NAN,
963 : .f_node_flags = g_flags_none
964 : },
965 : {
966 : .f_type = as2js::node_t::NODE_EXTENDS,
967 : .f_name = "EXTENDS",
968 : .f_operator = nullptr,
969 : .f_flags = TEST_NODE_IS_NAN,
970 : .f_node_flags = g_flags_none
971 : },
972 : {
973 : .f_type = as2js::node_t::NODE_EXTERN,
974 : .f_name = "EXTERN",
975 : .f_operator = nullptr,
976 : .f_flags = TEST_NODE_IS_NAN,
977 : .f_node_flags = g_flags_none
978 : },
979 : {
980 : .f_type = as2js::node_t::NODE_EXPORT,
981 : .f_name = "EXPORT",
982 : .f_operator = nullptr,
983 : .f_flags = TEST_NODE_IS_NAN,
984 : .f_node_flags = g_flags_none
985 : },
986 : {
987 : .f_type = as2js::node_t::NODE_FALSE,
988 : .f_name = "FALSE",
989 : .f_operator = nullptr,
990 : .f_flags = TEST_NODE_IS_BOOLEAN | TEST_NODE_IS_FALSE | TEST_NODE_IS_BASIC,
991 : .f_node_flags = g_flags_none
992 : },
993 : {
994 : .f_type = as2js::node_t::NODE_FINAL,
995 : .f_name = "FINAL",
996 : .f_operator = nullptr,
997 : .f_flags = TEST_NODE_IS_NAN,
998 : .f_node_flags = g_flags_none
999 : },
1000 : {
1001 : .f_type = as2js::node_t::NODE_FINALLY,
1002 : .f_name = "FINALLY",
1003 : .f_operator = nullptr,
1004 : .f_flags = TEST_NODE_IS_NAN,
1005 : .f_node_flags = g_flags_none
1006 : },
1007 : {
1008 : .f_type = as2js::node_t::NODE_FLOAT,
1009 : .f_name = "FLOAT",
1010 : .f_operator = nullptr,
1011 : .f_flags = TEST_NODE_IS_NAN,
1012 : .f_node_flags = g_flags_none
1013 : },
1014 : {
1015 : .f_type = as2js::node_t::NODE_FLOATING_POINT,
1016 : .f_name = "FLOATING_POINT",
1017 : .f_operator = nullptr,
1018 : .f_flags = TEST_NODE_IS_NUMBER | TEST_NODE_IS_FLOATING_POINT | TEST_NODE_IS_BASIC,
1019 : .f_node_flags = g_flags_none
1020 : },
1021 : {
1022 : .f_type = as2js::node_t::NODE_FOR,
1023 : .f_name = "FOR",
1024 : .f_operator = nullptr,
1025 : .f_flags = TEST_NODE_IS_NAN,
1026 : .f_node_flags = g_flags_for
1027 : },
1028 : {
1029 : .f_type = as2js::node_t::NODE_FUNCTION,
1030 : .f_name = "FUNCTION",
1031 : .f_operator = nullptr,
1032 : .f_flags = TEST_NODE_IS_NAN | TEST_NODE_ACCEPT_STRING,
1033 : .f_node_flags = g_flags_function
1034 : },
1035 : {
1036 : .f_type = as2js::node_t::NODE_GOTO,
1037 : .f_name = "GOTO",
1038 : .f_operator = nullptr,
1039 : .f_flags = TEST_NODE_IS_NAN | TEST_NODE_ACCEPT_STRING,
1040 : .f_node_flags = g_flags_none
1041 : },
1042 : {
1043 : .f_type = as2js::node_t::NODE_GREATER_EQUAL,
1044 : .f_name = "GREATER_EQUAL",
1045 : .f_operator = ">=",
1046 : .f_flags = TEST_NODE_IS_NAN | TEST_NODE_IS_SWITCH_OPERATOR,
1047 : .f_node_flags = g_flags_none
1048 : },
1049 : {
1050 : .f_type = as2js::node_t::NODE_IDENTIFIER,
1051 : .f_name = "IDENTIFIER",
1052 : .f_operator = nullptr,
1053 : .f_flags = TEST_NODE_IS_NAN | TEST_NODE_IS_IDENTIFIER | TEST_NODE_ACCEPT_STRING,
1054 : .f_node_flags = g_flags_identifier
1055 : },
1056 : {
1057 : .f_type = as2js::node_t::NODE_IDENTITY,
1058 : .f_name = "IDENTITY",
1059 : .f_operator = nullptr,
1060 : .f_flags = TEST_NODE_IS_NAN,
1061 : .f_node_flags = g_flags_none
1062 : },
1063 : {
1064 : .f_type = as2js::node_t::NODE_IF,
1065 : .f_name = "IF",
1066 : .f_operator = nullptr,
1067 : .f_flags = TEST_NODE_IS_NAN,
1068 : .f_node_flags = g_flags_none
1069 : },
1070 : {
1071 : .f_type = as2js::node_t::NODE_IF_FALSE,
1072 : .f_name = "IF_FALSE",
1073 : .f_operator = nullptr,
1074 : .f_flags = TEST_NODE_IS_NAN,
1075 : .f_node_flags = g_flags_none
1076 : },
1077 : {
1078 : .f_type = as2js::node_t::NODE_IF_TRUE,
1079 : .f_name = "IF_TRUE",
1080 : .f_operator = nullptr,
1081 : .f_flags = TEST_NODE_IS_NAN,
1082 : .f_node_flags = g_flags_none
1083 : },
1084 : {
1085 : .f_type = as2js::node_t::NODE_IMPLEMENTS,
1086 : .f_name = "IMPLEMENTS",
1087 : .f_operator = nullptr,
1088 : .f_flags = TEST_NODE_IS_NAN,
1089 : .f_node_flags = g_flags_none
1090 : },
1091 : {
1092 : .f_type = as2js::node_t::NODE_IMPORT,
1093 : .f_name = "IMPORT",
1094 : .f_operator = nullptr,
1095 : .f_flags = TEST_NODE_IS_NAN | TEST_NODE_ACCEPT_STRING,
1096 : .f_node_flags = g_flags_import
1097 : },
1098 : {
1099 : .f_type = as2js::node_t::NODE_IN,
1100 : .f_name = "IN",
1101 : .f_operator = nullptr,
1102 : .f_flags = TEST_NODE_IS_NAN | TEST_NODE_IS_SWITCH_OPERATOR,
1103 : .f_node_flags = g_flags_none
1104 : },
1105 : {
1106 : .f_type = as2js::node_t::NODE_INCLUDE,
1107 : .f_name = "INCLUDE",
1108 : .f_operator = nullptr,
1109 : .f_flags = TEST_NODE_IS_NAN,
1110 : .f_node_flags = g_flags_none
1111 : },
1112 : {
1113 : .f_type = as2js::node_t::NODE_INCREMENT,
1114 : .f_name = "INCREMENT",
1115 : .f_operator = "++x",
1116 : .f_flags = TEST_NODE_IS_NAN | TEST_NODE_HAS_SIDE_EFFECTS,
1117 : .f_node_flags = g_flags_none
1118 : },
1119 : {
1120 : .f_type = as2js::node_t::NODE_INLINE,
1121 : .f_name = "INLINE",
1122 : .f_operator = nullptr,
1123 : .f_flags = TEST_NODE_IS_NAN,
1124 : .f_node_flags = g_flags_none
1125 : },
1126 : {
1127 : .f_type = as2js::node_t::NODE_INSTANCEOF,
1128 : .f_name = "INSTANCEOF",
1129 : .f_operator = nullptr,
1130 : .f_flags = TEST_NODE_IS_NAN | TEST_NODE_IS_SWITCH_OPERATOR,
1131 : .f_node_flags = g_flags_none
1132 : },
1133 : {
1134 : .f_type = as2js::node_t::NODE_INTEGER,
1135 : .f_name = "INTEGER",
1136 : .f_operator = nullptr,
1137 : .f_flags = TEST_NODE_IS_NUMBER | TEST_NODE_IS_INTEGER | TEST_NODE_IS_BASIC,
1138 : .f_node_flags = g_flags_none
1139 : },
1140 : {
1141 : .f_type = as2js::node_t::NODE_INTERFACE,
1142 : .f_name = "INTERFACE",
1143 : .f_operator = nullptr,
1144 : .f_flags = TEST_NODE_IS_NAN | TEST_NODE_ACCEPT_STRING,
1145 : .f_node_flags = g_flags_none
1146 : },
1147 : {
1148 : .f_type = as2js::node_t::NODE_INVARIANT,
1149 : .f_name = "INVARIANT",
1150 : .f_operator = nullptr,
1151 : .f_flags = TEST_NODE_IS_NAN,
1152 : .f_node_flags = g_flags_none
1153 : },
1154 : {
1155 : .f_type = as2js::node_t::NODE_IS,
1156 : .f_name = "IS",
1157 : .f_operator = nullptr,
1158 : .f_flags = TEST_NODE_IS_NAN | TEST_NODE_IS_SWITCH_OPERATOR,
1159 : .f_node_flags = g_flags_none
1160 : },
1161 : {
1162 : .f_type = as2js::node_t::NODE_LABEL,
1163 : .f_name = "LABEL",
1164 : .f_operator = nullptr,
1165 : .f_flags = TEST_NODE_IS_NAN | TEST_NODE_ACCEPT_STRING,
1166 : .f_node_flags = g_flags_none
1167 : },
1168 : {
1169 : .f_type = as2js::node_t::NODE_LESS_EQUAL,
1170 : .f_name = "LESS_EQUAL",
1171 : .f_operator = "<=",
1172 : .f_flags = TEST_NODE_IS_NAN | TEST_NODE_IS_SWITCH_OPERATOR,
1173 : .f_node_flags = g_flags_none
1174 : },
1175 : {
1176 : .f_type = as2js::node_t::NODE_LIST,
1177 : .f_name = "LIST",
1178 : .f_operator = nullptr,
1179 : .f_flags = TEST_NODE_IS_NAN,
1180 : .f_node_flags = g_flags_none
1181 : },
1182 : {
1183 : .f_type = as2js::node_t::NODE_LOGICAL_AND,
1184 : .f_name = "LOGICAL_AND",
1185 : .f_operator = "&&",
1186 : .f_flags = TEST_NODE_IS_NAN,
1187 : .f_node_flags = g_flags_none
1188 : },
1189 : {
1190 : .f_type = as2js::node_t::NODE_LOGICAL_OR,
1191 : .f_name = "LOGICAL_OR",
1192 : .f_operator = "||",
1193 : .f_flags = TEST_NODE_IS_NAN,
1194 : .f_node_flags = g_flags_none
1195 : },
1196 : {
1197 : .f_type = as2js::node_t::NODE_LOGICAL_XOR,
1198 : .f_name = "LOGICAL_XOR",
1199 : .f_operator = "^^",
1200 : .f_flags = TEST_NODE_IS_NAN,
1201 : .f_node_flags = g_flags_none
1202 : },
1203 : {
1204 : .f_type = as2js::node_t::NODE_LONG,
1205 : .f_name = "LONG",
1206 : .f_operator = nullptr,
1207 : .f_flags = TEST_NODE_IS_NAN,
1208 : .f_node_flags = g_flags_none
1209 : },
1210 : {
1211 : .f_type = as2js::node_t::NODE_MATCH,
1212 : .f_name = "MATCH",
1213 : .f_operator = "~=",
1214 : .f_flags = TEST_NODE_IS_NAN | TEST_NODE_IS_SWITCH_OPERATOR,
1215 : .f_node_flags = g_flags_none
1216 : },
1217 : {
1218 : .f_type = as2js::node_t::NODE_MAXIMUM,
1219 : .f_name = "MAXIMUM",
1220 : .f_operator = ">?",
1221 : .f_flags = TEST_NODE_IS_NAN,
1222 : .f_node_flags = g_flags_none
1223 : },
1224 : {
1225 : .f_type = as2js::node_t::NODE_MINIMUM,
1226 : .f_name = "MINIMUM",
1227 : .f_operator = "<?",
1228 : .f_flags = TEST_NODE_IS_NAN,
1229 : .f_node_flags = g_flags_none
1230 : },
1231 : {
1232 : .f_type = as2js::node_t::NODE_NAME,
1233 : .f_name = "NAME",
1234 : .f_operator = nullptr,
1235 : .f_flags = TEST_NODE_IS_NAN | TEST_NODE_ACCEPT_STRING,
1236 : .f_node_flags = g_flags_none
1237 : },
1238 : {
1239 : .f_type = as2js::node_t::NODE_NAMESPACE,
1240 : .f_name = "NAMESPACE",
1241 : .f_operator = nullptr,
1242 : .f_flags = TEST_NODE_IS_NAN | TEST_NODE_ACCEPT_STRING,
1243 : .f_node_flags = g_flags_none
1244 : },
1245 : {
1246 : .f_type = as2js::node_t::NODE_NATIVE,
1247 : .f_name = "NATIVE",
1248 : .f_operator = nullptr,
1249 : .f_flags = TEST_NODE_IS_NAN,
1250 : .f_node_flags = g_flags_none
1251 : },
1252 : {
1253 : .f_type = as2js::node_t::NODE_NEGATE,
1254 : .f_name = "NEGATE",
1255 : .f_operator = nullptr,
1256 : .f_flags = TEST_NODE_IS_NAN,
1257 : .f_node_flags = g_flags_none
1258 : },
1259 : {
1260 : .f_type = as2js::node_t::NODE_NEW,
1261 : .f_name = "NEW",
1262 : .f_operator = nullptr,
1263 : .f_flags = TEST_NODE_IS_NAN | TEST_NODE_HAS_SIDE_EFFECTS,
1264 : .f_node_flags = g_flags_none
1265 : },
1266 : {
1267 : .f_type = as2js::node_t::NODE_NOT_EQUAL,
1268 : .f_name = "NOT_EQUAL",
1269 : .f_operator = "!=",
1270 : .f_flags = TEST_NODE_IS_NAN | TEST_NODE_IS_SWITCH_OPERATOR,
1271 : .f_node_flags = g_flags_none
1272 : },
1273 : {
1274 : .f_type = as2js::node_t::NODE_NOT_MATCH,
1275 : .f_name = "NOT_MATCH",
1276 : .f_operator = "~!",
1277 : .f_flags = TEST_NODE_IS_NAN,
1278 : .f_node_flags = g_flags_none
1279 : },
1280 : {
1281 : .f_type = as2js::node_t::NODE_NULL,
1282 : .f_name = "NULL",
1283 : .f_operator = nullptr,
1284 : .f_flags = TEST_NODE_IS_NULL | TEST_NODE_IS_BASIC,
1285 : .f_node_flags = g_flags_none
1286 : },
1287 : {
1288 : .f_type = as2js::node_t::NODE_OBJECT_LITERAL,
1289 : .f_name = "OBJECT_LITERAL",
1290 : .f_operator = nullptr,
1291 : .f_flags = TEST_NODE_IS_NAN,
1292 : .f_node_flags = g_flags_none
1293 : },
1294 : {
1295 : .f_type = as2js::node_t::NODE_PACKAGE,
1296 : .f_name = "PACKAGE",
1297 : .f_operator = nullptr,
1298 : .f_flags = TEST_NODE_IS_NAN | TEST_NODE_ACCEPT_STRING,
1299 : .f_node_flags = g_flags_package
1300 : },
1301 : {
1302 : .f_type = as2js::node_t::NODE_PARAM,
1303 : .f_name = "PARAM",
1304 : .f_operator = nullptr,
1305 : .f_flags = TEST_NODE_IS_NAN | TEST_NODE_ACCEPT_STRING,
1306 : .f_node_flags = g_flags_param
1307 : },
1308 : {
1309 : .f_type = as2js::node_t::NODE_PARAMETERS,
1310 : .f_name = "PARAMETERS",
1311 : .f_operator = nullptr,
1312 : .f_flags = TEST_NODE_IS_NAN,
1313 : .f_node_flags = g_flags_none
1314 : },
1315 : {
1316 : .f_type = as2js::node_t::NODE_PARAM_MATCH,
1317 : .f_name = "PARAM_MATCH",
1318 : .f_operator = nullptr,
1319 : .f_flags = TEST_NODE_IS_NAN | TEST_NODE_IS_PARAM_MATCH,
1320 : .f_node_flags = g_flags_param_match
1321 : },
1322 : {
1323 : .f_type = as2js::node_t::NODE_POST_DECREMENT,
1324 : .f_name = "POST_DECREMENT",
1325 : .f_operator = "x--",
1326 : .f_flags = TEST_NODE_IS_NAN | TEST_NODE_HAS_SIDE_EFFECTS,
1327 : .f_node_flags = g_flags_none
1328 : },
1329 : {
1330 : .f_type = as2js::node_t::NODE_POST_INCREMENT,
1331 : .f_name = "POST_INCREMENT",
1332 : .f_operator = "x++",
1333 : .f_flags = TEST_NODE_IS_NAN | TEST_NODE_HAS_SIDE_EFFECTS,
1334 : .f_node_flags = g_flags_none
1335 : },
1336 : {
1337 : .f_type = as2js::node_t::NODE_POWER,
1338 : .f_name = "POWER",
1339 : .f_operator = "**",
1340 : .f_flags = TEST_NODE_IS_NAN,
1341 : .f_node_flags = g_flags_none
1342 : },
1343 : {
1344 : .f_type = as2js::node_t::NODE_PRIVATE,
1345 : .f_name = "PRIVATE",
1346 : .f_operator = nullptr,
1347 : .f_flags = TEST_NODE_IS_NAN,
1348 : .f_node_flags = g_flags_none
1349 : },
1350 : {
1351 : .f_type = as2js::node_t::NODE_PROGRAM,
1352 : .f_name = "PROGRAM",
1353 : .f_operator = nullptr,
1354 : .f_flags = TEST_NODE_IS_NAN,
1355 : .f_node_flags = g_flags_none
1356 : },
1357 : {
1358 : .f_type = as2js::node_t::NODE_PROTECTED,
1359 : .f_name = "PROTECTED",
1360 : .f_operator = nullptr,
1361 : .f_flags = TEST_NODE_IS_NAN,
1362 : .f_node_flags = g_flags_none
1363 : },
1364 : {
1365 : .f_type = as2js::node_t::NODE_PUBLIC,
1366 : .f_name = "PUBLIC",
1367 : .f_operator = nullptr,
1368 : .f_flags = TEST_NODE_IS_NAN,
1369 : .f_node_flags = g_flags_none
1370 : },
1371 : {
1372 : .f_type = as2js::node_t::NODE_RANGE,
1373 : .f_name = "RANGE",
1374 : .f_operator = nullptr,
1375 : .f_flags = TEST_NODE_IS_NAN,
1376 : .f_node_flags = g_flags_none
1377 : },
1378 : {
1379 : .f_type = as2js::node_t::NODE_REGULAR_EXPRESSION,
1380 : .f_name = "REGULAR_EXPRESSION",
1381 : .f_operator = nullptr,
1382 : .f_flags = TEST_NODE_IS_NAN | TEST_NODE_ACCEPT_STRING | TEST_NODE_IS_BASIC,
1383 : .f_node_flags = g_flags_none
1384 : },
1385 : {
1386 : .f_type = as2js::node_t::NODE_REQUIRE,
1387 : .f_name = "REQUIRE",
1388 : .f_operator = nullptr,
1389 : .f_flags = TEST_NODE_IS_NAN,
1390 : .f_node_flags = g_flags_none
1391 : },
1392 : {
1393 : .f_type = as2js::node_t::NODE_REST,
1394 : .f_name = "REST",
1395 : .f_operator = nullptr,
1396 : .f_flags = TEST_NODE_IS_NAN,
1397 : .f_node_flags = g_flags_none
1398 : },
1399 : {
1400 : .f_type = as2js::node_t::NODE_RETURN,
1401 : .f_name = "RETURN",
1402 : .f_operator = nullptr,
1403 : .f_flags = TEST_NODE_IS_NAN,
1404 : .f_node_flags = g_flags_none
1405 : },
1406 : {
1407 : .f_type = as2js::node_t::NODE_ROOT,
1408 : .f_name = "ROOT",
1409 : .f_operator = nullptr,
1410 : .f_flags = TEST_NODE_IS_NAN,
1411 : .f_node_flags = g_flags_none
1412 : },
1413 : {
1414 : .f_type = as2js::node_t::NODE_ROTATE_LEFT,
1415 : .f_name = "ROTATE_LEFT",
1416 : .f_operator = "<%",
1417 : .f_flags = TEST_NODE_IS_NAN,
1418 : .f_node_flags = g_flags_none
1419 : },
1420 : {
1421 : .f_type = as2js::node_t::NODE_ROTATE_RIGHT,
1422 : .f_name = "ROTATE_RIGHT",
1423 : .f_operator = ">%",
1424 : .f_flags = TEST_NODE_IS_NAN,
1425 : .f_node_flags = g_flags_none
1426 : },
1427 : {
1428 : .f_type = as2js::node_t::NODE_SCOPE,
1429 : .f_name = "SCOPE",
1430 : .f_operator = nullptr,
1431 : .f_flags = TEST_NODE_IS_NAN,
1432 : .f_node_flags = g_flags_none
1433 : },
1434 : {
1435 : .f_type = as2js::node_t::NODE_SET,
1436 : .f_name = "SET",
1437 : .f_operator = nullptr,
1438 : .f_flags = TEST_NODE_IS_NAN,
1439 : .f_node_flags = g_flags_none
1440 : },
1441 : {
1442 : .f_type = as2js::node_t::NODE_SHIFT_LEFT,
1443 : .f_name = "SHIFT_LEFT",
1444 : .f_operator = "<<",
1445 : .f_flags = TEST_NODE_IS_NAN,
1446 : .f_node_flags = g_flags_none
1447 : },
1448 : {
1449 : .f_type = as2js::node_t::NODE_SHIFT_RIGHT,
1450 : .f_name = "SHIFT_RIGHT",
1451 : .f_operator = ">>",
1452 : .f_flags = TEST_NODE_IS_NAN,
1453 : .f_node_flags = g_flags_none
1454 : },
1455 : {
1456 : .f_type = as2js::node_t::NODE_SHIFT_RIGHT_UNSIGNED,
1457 : .f_name = "SHIFT_RIGHT_UNSIGNED",
1458 : .f_operator = ">>>",
1459 : .f_flags = TEST_NODE_IS_NAN,
1460 : .f_node_flags = g_flags_none
1461 : },
1462 : {
1463 : .f_type = as2js::node_t::NODE_SHORT,
1464 : .f_name = "SHORT",
1465 : .f_operator = nullptr,
1466 : .f_flags = TEST_NODE_IS_NAN,
1467 : .f_node_flags = g_flags_none
1468 : },
1469 : {
1470 : .f_type = as2js::node_t::NODE_SMART_MATCH,
1471 : .f_name = "SMART_MATCH",
1472 : .f_operator = "~~",
1473 : .f_flags = TEST_NODE_IS_NAN,
1474 : .f_node_flags = g_flags_none
1475 : },
1476 : {
1477 : .f_type = as2js::node_t::NODE_STATIC,
1478 : .f_name = "STATIC",
1479 : .f_operator = nullptr,
1480 : .f_flags = TEST_NODE_IS_NAN,
1481 : .f_node_flags = g_flags_none
1482 : },
1483 : {
1484 : .f_type = as2js::node_t::NODE_STRICTLY_EQUAL,
1485 : .f_name = "STRICTLY_EQUAL",
1486 : .f_operator = "===",
1487 : .f_flags = TEST_NODE_IS_NAN | TEST_NODE_IS_SWITCH_OPERATOR,
1488 : .f_node_flags = g_flags_none
1489 : },
1490 : {
1491 : .f_type = as2js::node_t::NODE_STRICTLY_NOT_EQUAL,
1492 : .f_name = "STRICTLY_NOT_EQUAL",
1493 : .f_operator = "!==",
1494 : .f_flags = TEST_NODE_IS_NAN | TEST_NODE_IS_SWITCH_OPERATOR,
1495 : .f_node_flags = g_flags_none
1496 : },
1497 : {
1498 : .f_type = as2js::node_t::NODE_STRING,
1499 : .f_name = "STRING",
1500 : .f_operator = nullptr,
1501 : .f_flags = TEST_NODE_IS_NAN | TEST_NODE_IS_STRING | TEST_NODE_ACCEPT_STRING | TEST_NODE_IS_BASIC,
1502 : .f_node_flags = g_flags_string
1503 : },
1504 : {
1505 : .f_type = as2js::node_t::NODE_SUPER,
1506 : .f_name = "SUPER",
1507 : .f_operator = nullptr,
1508 : .f_flags = TEST_NODE_IS_NAN,
1509 : .f_node_flags = g_flags_none
1510 : },
1511 : {
1512 : .f_type = as2js::node_t::NODE_SWITCH,
1513 : .f_name = "SWITCH",
1514 : .f_operator = nullptr,
1515 : .f_flags = TEST_NODE_IS_NAN,
1516 : .f_node_flags = g_flags_switch
1517 : },
1518 : {
1519 : .f_type = as2js::node_t::NODE_SYNCHRONIZED,
1520 : .f_name = "SYNCHRONIZED",
1521 : .f_operator = nullptr,
1522 : .f_flags = TEST_NODE_IS_NAN,
1523 : .f_node_flags = g_flags_none
1524 : },
1525 : {
1526 : .f_type = as2js::node_t::NODE_TEMPLATE,
1527 : .f_name = "TEMPLATE",
1528 : .f_operator = nullptr,
1529 : .f_flags = TEST_NODE_IS_NAN | TEST_NODE_ACCEPT_STRING,
1530 : .f_node_flags = g_flags_none
1531 : },
1532 : {
1533 : .f_type = as2js::node_t::NODE_TEMPLATE_HEAD,
1534 : .f_name = "TEMPLATE_HEAD",
1535 : .f_operator = nullptr,
1536 : .f_flags = TEST_NODE_IS_NAN | TEST_NODE_ACCEPT_STRING,
1537 : .f_node_flags = g_flags_none
1538 : },
1539 : {
1540 : .f_type = as2js::node_t::NODE_TEMPLATE_MIDDLE,
1541 : .f_name = "TEMPLATE_MIDDLE",
1542 : .f_operator = nullptr,
1543 : .f_flags = TEST_NODE_IS_NAN | TEST_NODE_ACCEPT_STRING,
1544 : .f_node_flags = g_flags_none
1545 : },
1546 : {
1547 : .f_type = as2js::node_t::NODE_TEMPLATE_TAIL,
1548 : .f_name = "TEMPLATE_TAIL",
1549 : .f_operator = nullptr,
1550 : .f_flags = TEST_NODE_IS_NAN | TEST_NODE_ACCEPT_STRING,
1551 : .f_node_flags = g_flags_none
1552 : },
1553 : {
1554 : .f_type = as2js::node_t::NODE_THEN,
1555 : .f_name = "THEN",
1556 : .f_operator = nullptr,
1557 : .f_flags = TEST_NODE_IS_NAN,
1558 : .f_node_flags = g_flags_none
1559 : },
1560 : {
1561 : .f_type = as2js::node_t::NODE_THIS,
1562 : .f_name = "THIS",
1563 : .f_operator = nullptr,
1564 : .f_flags = TEST_NODE_IS_NAN,
1565 : .f_node_flags = g_flags_none
1566 : },
1567 : {
1568 : .f_type = as2js::node_t::NODE_THROW,
1569 : .f_name = "THROW",
1570 : .f_operator = nullptr,
1571 : .f_flags = TEST_NODE_IS_NAN,
1572 : .f_node_flags = g_flags_none
1573 : },
1574 : {
1575 : .f_type = as2js::node_t::NODE_THROWS,
1576 : .f_name = "THROWS",
1577 : .f_operator = nullptr,
1578 : .f_flags = TEST_NODE_IS_NAN,
1579 : .f_node_flags = g_flags_none
1580 : },
1581 : {
1582 : .f_type = as2js::node_t::NODE_TRANSIENT,
1583 : .f_name = "TRANSIENT",
1584 : .f_operator = nullptr,
1585 : .f_flags = TEST_NODE_IS_NAN,
1586 : .f_node_flags = g_flags_none
1587 : },
1588 : {
1589 : .f_type = as2js::node_t::NODE_TRUE,
1590 : .f_name = "TRUE",
1591 : .f_operator = nullptr,
1592 : .f_flags = TEST_NODE_IS_BOOLEAN | TEST_NODE_IS_TRUE | TEST_NODE_IS_BASIC,
1593 : .f_node_flags = g_flags_none
1594 : },
1595 : {
1596 : .f_type = as2js::node_t::NODE_TRY,
1597 : .f_name = "TRY",
1598 : .f_operator = nullptr,
1599 : .f_flags = TEST_NODE_IS_NAN,
1600 : .f_node_flags = g_flags_none
1601 : },
1602 : {
1603 : .f_type = as2js::node_t::NODE_TYPE,
1604 : .f_name = "TYPE",
1605 : .f_operator = nullptr,
1606 : .f_flags = TEST_NODE_IS_NAN,
1607 : .f_node_flags = g_flags_type
1608 : },
1609 : {
1610 : .f_type = as2js::node_t::NODE_TYPEOF,
1611 : .f_name = "TYPEOF",
1612 : .f_operator = nullptr,
1613 : .f_flags = TEST_NODE_IS_NAN,
1614 : .f_node_flags = g_flags_none
1615 : },
1616 : {
1617 : .f_type = as2js::node_t::NODE_UNDEFINED,
1618 : .f_name = "UNDEFINED",
1619 : .f_operator = nullptr,
1620 : .f_flags = TEST_NODE_IS_NAN | TEST_NODE_IS_UNDEFINED | TEST_NODE_IS_BASIC,
1621 : .f_node_flags = g_flags_none
1622 : },
1623 : {
1624 : .f_type = as2js::node_t::NODE_USE,
1625 : .f_name = "USE",
1626 : .f_operator = nullptr,
1627 : .f_flags = TEST_NODE_IS_NAN,
1628 : .f_node_flags = g_flags_none
1629 : },
1630 : {
1631 : .f_type = as2js::node_t::NODE_VAR,
1632 : .f_name = "VAR",
1633 : .f_operator = nullptr,
1634 : .f_flags = TEST_NODE_IS_NAN,
1635 : .f_node_flags = g_flags_variable
1636 : },
1637 : {
1638 : .f_type = as2js::node_t::NODE_VARIABLE,
1639 : .f_name = "VARIABLE",
1640 : .f_operator = nullptr,
1641 : .f_flags = TEST_NODE_IS_NAN | TEST_NODE_ACCEPT_STRING,
1642 : .f_node_flags = g_flags_variable
1643 : },
1644 : {
1645 : .f_type = as2js::node_t::NODE_VAR_ATTRIBUTES,
1646 : .f_name = "VAR_ATTRIBUTES",
1647 : .f_operator = nullptr,
1648 : .f_flags = TEST_NODE_IS_NAN | TEST_NODE_ACCEPT_STRING,
1649 : .f_node_flags = g_flags_variable
1650 : },
1651 : {
1652 : .f_type = as2js::node_t::NODE_VIDENTIFIER,
1653 : .f_name = "VIDENTIFIER",
1654 : .f_operator = nullptr,
1655 : .f_flags = TEST_NODE_IS_NAN | TEST_NODE_IS_IDENTIFIER | TEST_NODE_ACCEPT_STRING,
1656 : .f_node_flags = g_flags_identifier
1657 : },
1658 : {
1659 : .f_type = as2js::node_t::NODE_VOID,
1660 : .f_name = "VOID",
1661 : .f_operator = nullptr,
1662 : .f_flags = TEST_NODE_IS_NAN,
1663 : .f_node_flags = g_flags_none
1664 : },
1665 : {
1666 : .f_type = as2js::node_t::NODE_VOLATILE,
1667 : .f_name = "VOLATILE",
1668 : .f_operator = nullptr,
1669 : .f_flags = TEST_NODE_IS_NAN,
1670 : .f_node_flags = g_flags_none
1671 : },
1672 : {
1673 : .f_type = as2js::node_t::NODE_WHILE,
1674 : .f_name = "WHILE",
1675 : .f_operator = nullptr,
1676 : .f_flags = TEST_NODE_IS_NAN,
1677 : .f_node_flags = g_flags_none
1678 : },
1679 : {
1680 : .f_type = as2js::node_t::NODE_WITH,
1681 : .f_name = "WITH",
1682 : .f_operator = nullptr,
1683 : .f_flags = TEST_NODE_IS_NAN,
1684 : .f_node_flags = g_flags_none
1685 : },
1686 : {
1687 : .f_type = as2js::node_t::NODE_YIELD,
1688 : .f_name = "YIELD",
1689 : .f_operator = nullptr,
1690 : .f_flags = TEST_NODE_IS_NAN,
1691 : .f_node_flags = g_flags_none
1692 : }
1693 : };
1694 : #pragma GCC diagnostic pop
1695 : size_t const g_node_types_size(sizeof(g_node_types) / sizeof(g_node_types[0]));
1696 :
1697 :
1698 :
1699 : char const *g_attribute_names[static_cast<int>(as2js::attribute_t::NODE_ATTR_max)] =
1700 : {
1701 : "PUBLIC",
1702 : "PRIVATE",
1703 : "PROTECTED",
1704 : "INTERNAL",
1705 : "TRANSIENT",
1706 : "VOLATILE",
1707 : "STATIC",
1708 : "ABSTRACT",
1709 : "VIRTUAL",
1710 : "ARRAY",
1711 : "INLINE",
1712 : "REQUIRE_ELSE",
1713 : "ENSURE_THEN",
1714 : "NATIVE",
1715 : "DEPRECATED",
1716 : "UNSAFE",
1717 : "EXTERN",
1718 : "CONSTRUCTOR",
1719 : "FINAL",
1720 : "ENUMERABLE",
1721 : "TRUE",
1722 : "FALSE",
1723 : "UNUSED",
1724 : "DYNAMIC",
1725 : "FOREACH",
1726 : "NOBREAK",
1727 : "AUTOBREAK",
1728 : "TYPE",
1729 : "DEFINED"
1730 : };
1731 :
1732 : as2js::attribute_t const g_group_member_visibility[] =
1733 : {
1734 : as2js::attribute_t::NODE_ATTR_PRIVATE,
1735 : as2js::attribute_t::NODE_ATTR_PROTECTED,
1736 : as2js::attribute_t::NODE_ATTR_PUBLIC,
1737 : as2js::attribute_t::NODE_ATTR_max // end the list
1738 : };
1739 :
1740 : as2js::attribute_t const g_group_function_type[] =
1741 : {
1742 : as2js::attribute_t::NODE_ATTR_ABSTRACT,
1743 : as2js::attribute_t::NODE_ATTR_CONSTRUCTOR,
1744 : as2js::attribute_t::NODE_ATTR_STATIC,
1745 : as2js::attribute_t::NODE_ATTR_VIRTUAL,
1746 : as2js::attribute_t::NODE_ATTR_max // end the list
1747 : };
1748 :
1749 : as2js::attribute_t const g_group_function_contract[] =
1750 : {
1751 : as2js::attribute_t::NODE_ATTR_REQUIRE_ELSE,
1752 : as2js::attribute_t::NODE_ATTR_ENSURE_THEN,
1753 : as2js::attribute_t::NODE_ATTR_max // end the list
1754 : };
1755 :
1756 : as2js::attribute_t const g_group_switch_type[] =
1757 : {
1758 : as2js::attribute_t::NODE_ATTR_FOREACH,
1759 : as2js::attribute_t::NODE_ATTR_NOBREAK,
1760 : as2js::attribute_t::NODE_ATTR_AUTOBREAK,
1761 : as2js::attribute_t::NODE_ATTR_max // end the list
1762 : };
1763 :
1764 : as2js::attribute_t const g_group_conditional_compilation[] =
1765 : {
1766 : as2js::attribute_t::NODE_ATTR_TRUE,
1767 : as2js::attribute_t::NODE_ATTR_FALSE,
1768 : as2js::attribute_t::NODE_ATTR_max // end the list
1769 : };
1770 :
1771 : struct groups_attributes_t
1772 : {
1773 : as2js::attribute_t const * f_attributes;
1774 : char const * f_names;
1775 : };
1776 :
1777 : groups_attributes_t const g_groups_of_attributes[] =
1778 : {
1779 : {
1780 : g_group_member_visibility,
1781 : "public, private, and protected"
1782 : },
1783 : {
1784 : g_group_function_type,
1785 : "abstract, constructor, inline, native, static, and virtual"
1786 : },
1787 : {
1788 : g_group_function_contract,
1789 : "require else and ensure then"
1790 : },
1791 : {
1792 : g_group_switch_type,
1793 : "foreach, nobreak, and autobreak"
1794 : },
1795 : {
1796 : g_group_conditional_compilation,
1797 : "true and false"
1798 : }
1799 : };
1800 : size_t const g_groups_of_attributes_size(sizeof(g_groups_of_attributes) / sizeof(g_groups_of_attributes[0]));
1801 :
1802 :
1803 :
1804 :
1805 : class test_callback : public as2js::message_callback
1806 : {
1807 : public:
1808 320 : test_callback()
1809 320 : {
1810 320 : as2js::set_message_callback(this);
1811 320 : g_warning_count = as2js::warning_count();
1812 320 : g_error_count = as2js::error_count();
1813 320 : }
1814 :
1815 320 : ~test_callback()
1816 320 : {
1817 : // make sure the pointer gets reset!
1818 320 : as2js::set_message_callback(nullptr);
1819 320 : }
1820 :
1821 : // implementation of the output
1822 320 : virtual void output(as2js::message_level_t message_level, as2js::err_code_t error_code, as2js::position const& pos, std::string const& message)
1823 : {
1824 :
1825 : //std::cerr<< "\nmsg = " << pos.get_filename() << " / " << f_expected_pos.get_filename() << "\n";
1826 :
1827 320 : CATCH_REQUIRE(f_expected_call);
1828 320 : CATCH_REQUIRE(message_level == f_expected_message_level);
1829 320 : CATCH_REQUIRE(error_code == f_expected_error_code);
1830 320 : CATCH_REQUIRE(pos.get_filename() == f_expected_pos.get_filename());
1831 320 : CATCH_REQUIRE(pos.get_function() == f_expected_pos.get_function());
1832 320 : CATCH_REQUIRE(pos.get_page() == f_expected_pos.get_page());
1833 320 : CATCH_REQUIRE(pos.get_page_line() == f_expected_pos.get_page_line());
1834 320 : CATCH_REQUIRE(pos.get_paragraph() == f_expected_pos.get_paragraph());
1835 320 : CATCH_REQUIRE(pos.get_line() == f_expected_pos.get_line());
1836 320 : CATCH_REQUIRE(message == f_expected_message);
1837 :
1838 320 : if(message_level == as2js::message_level_t::MESSAGE_LEVEL_WARNING)
1839 : {
1840 0 : ++g_warning_count;
1841 0 : CATCH_REQUIRE(g_warning_count == as2js::warning_count());
1842 : }
1843 :
1844 320 : if(message_level == as2js::message_level_t::MESSAGE_LEVEL_FATAL
1845 320 : || message_level == as2js::message_level_t::MESSAGE_LEVEL_ERROR)
1846 : {
1847 320 : ++g_error_count;
1848 : //std::cerr << "error: " << g_error_count << " / " << as2js::error_count() << "\n";
1849 320 : CATCH_REQUIRE(g_error_count == as2js::error_count());
1850 : }
1851 :
1852 320 : f_got_called = true;
1853 320 : }
1854 :
1855 : bool f_expected_call = true;
1856 : bool f_got_called = false;
1857 : as2js::message_level_t f_expected_message_level = as2js::message_level_t::MESSAGE_LEVEL_OFF;
1858 : as2js::err_code_t f_expected_error_code = as2js::err_code_t::AS_ERR_NONE;
1859 : as2js::position f_expected_pos = as2js::position();
1860 : std::string f_expected_message = std::string(); // UTF-8 string
1861 :
1862 : static int32_t g_warning_count;
1863 : static int32_t g_error_count;
1864 : };
1865 :
1866 : int32_t test_callback::g_warning_count = 0;
1867 : int32_t test_callback::g_error_count = 0;
1868 :
1869 :
1870 22964 : void output_str(std::ostream & out, std::string str)
1871 : {
1872 22964 : snapdev::safe_stream stream_flags(out);
1873 :
1874 22964 : out << ": '";
1875 :
1876 1401576 : for(libutf8::utf8_iterator it(str); it != str.end(); ++it)
1877 : {
1878 1378612 : char32_t const c(*it);
1879 1378612 : if(c < 0x20)
1880 : {
1881 : // show controls as ^<letter>
1882 40 : out << '^' << static_cast<char>(c + '@');
1883 : }
1884 1378572 : else if(c < 0x7f)
1885 : {
1886 107 : if(c == '\'')
1887 : {
1888 1 : out << "\\'";
1889 : }
1890 : else
1891 : {
1892 106 : out << static_cast<char>(c);
1893 : }
1894 : }
1895 1378465 : else if(c < 0x100)
1896 : {
1897 141 : out << "\\x" << std::hex << static_cast<std::int32_t>(c);
1898 : }
1899 1378324 : else if(c < 0x10000)
1900 : {
1901 81752 : out << "\\u" << std::hex << std::setfill('0') << std::setw(4) << static_cast<std::int32_t>(c);
1902 : }
1903 : else
1904 : {
1905 1296572 : out << "\\U" << std::hex << std::setfill('0') << std::setw(6) << static_cast<std::int32_t>(c);
1906 : }
1907 : }
1908 22964 : out << '\'';
1909 45928 : }
1910 :
1911 :
1912 : // is attribute 'a' in conflict with attribute '*attr_list'?
1913 7672 : bool in_conflict(size_t j, as2js::attribute_t attr, as2js::attribute_t a)
1914 : {
1915 29488 : for(as2js::attribute_t const *conflict_list(g_groups_of_attributes[j].f_attributes);
1916 29488 : *conflict_list != as2js::attribute_t::NODE_ATTR_max;
1917 : ++conflict_list)
1918 : {
1919 22376 : if(a == *conflict_list)
1920 : {
1921 560 : return true;
1922 : }
1923 : }
1924 :
1925 : // the following handles exceptions
1926 : //
1927 : // From the function type:
1928 : // . abstract, constructor, static, virtual
1929 : //
1930 : // We also get:
1931 : // . abstract / native
1932 : // . abstract / constructor / inline / virtual
1933 7112 : switch(attr)
1934 : {
1935 488 : case as2js::attribute_t::NODE_ATTR_ABSTRACT:
1936 : switch(a)
1937 : {
1938 40 : case as2js::attribute_t::NODE_ATTR_NATIVE:
1939 : case as2js::attribute_t::NODE_ATTR_INLINE:
1940 40 : return true;
1941 :
1942 448 : default:
1943 448 : break;
1944 :
1945 : }
1946 448 : break;
1947 :
1948 488 : case as2js::attribute_t::NODE_ATTR_CONSTRUCTOR:
1949 : switch(a)
1950 : {
1951 20 : case as2js::attribute_t::NODE_ATTR_INLINE:
1952 20 : return true;
1953 :
1954 468 : default:
1955 468 : break;
1956 :
1957 : }
1958 468 : break;
1959 :
1960 0 : case as2js::attribute_t::NODE_ATTR_INLINE:
1961 : switch(a)
1962 : {
1963 0 : case as2js::attribute_t::NODE_ATTR_ABSTRACT:
1964 : case as2js::attribute_t::NODE_ATTR_CONSTRUCTOR:
1965 : case as2js::attribute_t::NODE_ATTR_NATIVE:
1966 : case as2js::attribute_t::NODE_ATTR_VIRTUAL:
1967 0 : return true;
1968 :
1969 0 : default:
1970 0 : break;
1971 :
1972 : }
1973 0 : break;
1974 :
1975 0 : case as2js::attribute_t::NODE_ATTR_NATIVE:
1976 : switch(a)
1977 : {
1978 0 : case as2js::attribute_t::NODE_ATTR_ABSTRACT:
1979 : case as2js::attribute_t::NODE_ATTR_INLINE:
1980 0 : return true;
1981 :
1982 0 : default:
1983 0 : break;
1984 :
1985 : }
1986 0 : break;
1987 :
1988 :
1989 488 : case as2js::attribute_t::NODE_ATTR_VIRTUAL:
1990 : switch(a)
1991 : {
1992 20 : case as2js::attribute_t::NODE_ATTR_INLINE:
1993 20 : return true;
1994 :
1995 468 : default:
1996 468 : break;
1997 :
1998 : }
1999 468 : break;
2000 :
2001 5648 : default:
2002 5648 : break;
2003 :
2004 : }
2005 :
2006 7032 : return false;
2007 : }
2008 :
2009 :
2010 :
2011 : }
2012 : // no name namespace
2013 :
2014 :
2015 :
2016 :
2017 : // vim: ts=4 sw=4 et
|