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

Generated by: LCOV version 1.14