LCOV - code coverage report
Current view: top level - tests - catch_node_data.ci (source / functions) Hit Total Coverage
Test: coverage.info Lines: 73 87 83.9 %
Date: 2023-07-29 22:00:24 Functions: 5 6 83.3 %
Legend: Lines: hit not hit

          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

Generated by: LCOV version 1.14