prism 0.13.0 → 0.15.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +37 -1
- data/README.md +4 -1
- data/config.yml +96 -35
- data/docs/fuzzing.md +5 -10
- data/docs/prism.png +0 -0
- data/docs/serialization.md +10 -0
- data/ext/prism/api_node.c +239 -86
- data/ext/prism/extension.c +35 -48
- data/ext/prism/extension.h +1 -1
- data/include/prism/ast.h +170 -118
- data/include/prism/diagnostic.h +1 -0
- data/include/prism/node.h +8 -0
- data/include/prism/parser.h +26 -0
- data/include/prism/util/pm_buffer.h +3 -0
- data/include/prism/util/pm_constant_pool.h +21 -2
- data/include/prism/util/pm_string.h +2 -1
- data/include/prism/version.h +2 -2
- data/include/prism.h +1 -2
- data/lib/prism/compiler.rb +150 -141
- data/lib/prism/debug.rb +30 -26
- data/lib/prism/dispatcher.rb +42 -0
- data/lib/prism/dsl.rb +23 -8
- data/lib/prism/ffi.rb +4 -4
- data/lib/prism/lex_compat.rb +42 -8
- data/lib/prism/mutation_compiler.rb +18 -3
- data/lib/prism/node.rb +2061 -191
- data/lib/prism/node_ext.rb +44 -0
- data/lib/prism/parse_result.rb +32 -5
- data/lib/prism/pattern.rb +1 -1
- data/lib/prism/serialize.rb +95 -87
- data/lib/prism/visitor.rb +9 -0
- data/prism.gemspec +2 -3
- data/src/diagnostic.c +2 -1
- data/src/node.c +99 -32
- data/src/prettyprint.c +137 -80
- data/src/prism.c +1960 -843
- data/src/serialize.c +140 -79
- data/src/util/pm_buffer.c +9 -7
- data/src/util/pm_constant_pool.c +25 -11
- metadata +3 -4
- data/include/prism/unescape.h +0 -48
- data/src/unescape.c +0 -637
    
        data/ext/prism/api_node.c
    CHANGED
    
    | @@ -82,6 +82,9 @@ static VALUE rb_cPrismIfNode; | |
| 82 82 | 
             
            static VALUE rb_cPrismImaginaryNode;
         | 
| 83 83 | 
             
            static VALUE rb_cPrismImplicitNode;
         | 
| 84 84 | 
             
            static VALUE rb_cPrismInNode;
         | 
| 85 | 
            +
            static VALUE rb_cPrismIndexAndWriteNode;
         | 
| 86 | 
            +
            static VALUE rb_cPrismIndexOperatorWriteNode;
         | 
| 87 | 
            +
            static VALUE rb_cPrismIndexOrWriteNode;
         | 
| 85 88 | 
             
            static VALUE rb_cPrismInstanceVariableAndWriteNode;
         | 
| 86 89 | 
             
            static VALUE rb_cPrismInstanceVariableOperatorWriteNode;
         | 
| 87 90 | 
             
            static VALUE rb_cPrismInstanceVariableOrWriteNode;
         | 
| @@ -358,7 +361,6 @@ pm_ast_new(pm_parser_t *parser, pm_node_t *node, rb_encoding *encoding) { | |
| 358 361 | 
             
                            case PM_CALL_AND_WRITE_NODE: {
         | 
| 359 362 | 
             
                                pm_call_and_write_node_t *cast = (pm_call_and_write_node_t *) node;
         | 
| 360 363 | 
             
                                pm_node_stack_push(&node_stack, (pm_node_t *) cast->receiver);
         | 
| 361 | 
            -
                                pm_node_stack_push(&node_stack, (pm_node_t *) cast->arguments);
         | 
| 362 364 | 
             
                                pm_node_stack_push(&node_stack, (pm_node_t *) cast->value);
         | 
| 363 365 | 
             
                                break;
         | 
| 364 366 | 
             
                            }
         | 
| @@ -374,7 +376,6 @@ pm_ast_new(pm_parser_t *parser, pm_node_t *node, rb_encoding *encoding) { | |
| 374 376 | 
             
                            case PM_CALL_OPERATOR_WRITE_NODE: {
         | 
| 375 377 | 
             
                                pm_call_operator_write_node_t *cast = (pm_call_operator_write_node_t *) node;
         | 
| 376 378 | 
             
                                pm_node_stack_push(&node_stack, (pm_node_t *) cast->receiver);
         | 
| 377 | 
            -
                                pm_node_stack_push(&node_stack, (pm_node_t *) cast->arguments);
         | 
| 378 379 | 
             
                                pm_node_stack_push(&node_stack, (pm_node_t *) cast->value);
         | 
| 379 380 | 
             
                                break;
         | 
| 380 381 | 
             
                            }
         | 
| @@ -382,7 +383,6 @@ pm_ast_new(pm_parser_t *parser, pm_node_t *node, rb_encoding *encoding) { | |
| 382 383 | 
             
                            case PM_CALL_OR_WRITE_NODE: {
         | 
| 383 384 | 
             
                                pm_call_or_write_node_t *cast = (pm_call_or_write_node_t *) node;
         | 
| 384 385 | 
             
                                pm_node_stack_push(&node_stack, (pm_node_t *) cast->receiver);
         | 
| 385 | 
            -
                                pm_node_stack_push(&node_stack, (pm_node_t *) cast->arguments);
         | 
| 386 386 | 
             
                                pm_node_stack_push(&node_stack, (pm_node_t *) cast->value);
         | 
| 387 387 | 
             
                                break;
         | 
| 388 388 | 
             
                            }
         | 
| @@ -640,6 +640,33 @@ pm_ast_new(pm_parser_t *parser, pm_node_t *node, rb_encoding *encoding) { | |
| 640 640 | 
             
                                pm_node_stack_push(&node_stack, (pm_node_t *) cast->statements);
         | 
| 641 641 | 
             
                                break;
         | 
| 642 642 | 
             
                            }
         | 
| 643 | 
            +
            #line 108 "api_node.c.erb"
         | 
| 644 | 
            +
                            case PM_INDEX_AND_WRITE_NODE: {
         | 
| 645 | 
            +
                                pm_index_and_write_node_t *cast = (pm_index_and_write_node_t *) node;
         | 
| 646 | 
            +
                                pm_node_stack_push(&node_stack, (pm_node_t *) cast->receiver);
         | 
| 647 | 
            +
                                pm_node_stack_push(&node_stack, (pm_node_t *) cast->arguments);
         | 
| 648 | 
            +
                                pm_node_stack_push(&node_stack, (pm_node_t *) cast->block);
         | 
| 649 | 
            +
                                pm_node_stack_push(&node_stack, (pm_node_t *) cast->value);
         | 
| 650 | 
            +
                                break;
         | 
| 651 | 
            +
                            }
         | 
| 652 | 
            +
            #line 108 "api_node.c.erb"
         | 
| 653 | 
            +
                            case PM_INDEX_OPERATOR_WRITE_NODE: {
         | 
| 654 | 
            +
                                pm_index_operator_write_node_t *cast = (pm_index_operator_write_node_t *) node;
         | 
| 655 | 
            +
                                pm_node_stack_push(&node_stack, (pm_node_t *) cast->receiver);
         | 
| 656 | 
            +
                                pm_node_stack_push(&node_stack, (pm_node_t *) cast->arguments);
         | 
| 657 | 
            +
                                pm_node_stack_push(&node_stack, (pm_node_t *) cast->block);
         | 
| 658 | 
            +
                                pm_node_stack_push(&node_stack, (pm_node_t *) cast->value);
         | 
| 659 | 
            +
                                break;
         | 
| 660 | 
            +
                            }
         | 
| 661 | 
            +
            #line 108 "api_node.c.erb"
         | 
| 662 | 
            +
                            case PM_INDEX_OR_WRITE_NODE: {
         | 
| 663 | 
            +
                                pm_index_or_write_node_t *cast = (pm_index_or_write_node_t *) node;
         | 
| 664 | 
            +
                                pm_node_stack_push(&node_stack, (pm_node_t *) cast->receiver);
         | 
| 665 | 
            +
                                pm_node_stack_push(&node_stack, (pm_node_t *) cast->arguments);
         | 
| 666 | 
            +
                                pm_node_stack_push(&node_stack, (pm_node_t *) cast->block);
         | 
| 667 | 
            +
                                pm_node_stack_push(&node_stack, (pm_node_t *) cast->value);
         | 
| 668 | 
            +
                                break;
         | 
| 669 | 
            +
                            }
         | 
| 643 670 | 
             
            #line 108 "api_node.c.erb"
         | 
| 644 671 | 
             
                            case PM_INSTANCE_VARIABLE_AND_WRITE_NODE: {
         | 
| 645 672 | 
             
                                pm_instance_variable_and_write_node_t *cast = (pm_instance_variable_and_write_node_t *) node;
         | 
| @@ -1222,12 +1249,18 @@ pm_ast_new(pm_parser_t *parser, pm_node_t *node, rb_encoding *encoding) { | |
| 1222 1249 | 
             
                            }
         | 
| 1223 1250 | 
             
            #line 134 "api_node.c.erb"
         | 
| 1224 1251 | 
             
                            case PM_BACK_REFERENCE_READ_NODE: {
         | 
| 1225 | 
            -
                                 | 
| 1252 | 
            +
                                pm_back_reference_read_node_t *cast = (pm_back_reference_read_node_t *) node;
         | 
| 1253 | 
            +
                                VALUE argv[2];
         | 
| 1254 | 
            +
             | 
| 1255 | 
            +
                                // name
         | 
| 1256 | 
            +
            #line 157 "api_node.c.erb"
         | 
| 1257 | 
            +
                                assert(cast->name != 0);
         | 
| 1258 | 
            +
                                argv[0] = rb_id2sym(constants[cast->name - 1]);
         | 
| 1226 1259 |  | 
| 1227 1260 | 
             
                                // location
         | 
| 1228 | 
            -
                                argv[ | 
| 1261 | 
            +
                                argv[1] = pm_location_new(parser, node->location.start, node->location.end, source);
         | 
| 1229 1262 |  | 
| 1230 | 
            -
                                rb_ary_push(value_stack, rb_class_new_instance( | 
| 1263 | 
            +
                                rb_ary_push(value_stack, rb_class_new_instance(2, argv, rb_cPrismBackReferenceReadNode));
         | 
| 1231 1264 | 
             
                                break;
         | 
| 1232 1265 | 
             
                            }
         | 
| 1233 1266 | 
             
            #line 134 "api_node.c.erb"
         | 
| @@ -1409,7 +1442,7 @@ pm_ast_new(pm_parser_t *parser, pm_node_t *node, rb_encoding *encoding) { | |
| 1409 1442 | 
             
            #line 134 "api_node.c.erb"
         | 
| 1410 1443 | 
             
                            case PM_CALL_AND_WRITE_NODE: {
         | 
| 1411 1444 | 
             
                                pm_call_and_write_node_t *cast = (pm_call_and_write_node_t *) node;
         | 
| 1412 | 
            -
                                VALUE argv[ | 
| 1445 | 
            +
                                VALUE argv[9];
         | 
| 1413 1446 |  | 
| 1414 1447 | 
             
                                // receiver
         | 
| 1415 1448 | 
             
            #line 145 "api_node.c.erb"
         | 
| @@ -1423,42 +1456,32 @@ pm_ast_new(pm_parser_t *parser, pm_node_t *node, rb_encoding *encoding) { | |
| 1423 1456 | 
             
            #line 173 "api_node.c.erb"
         | 
| 1424 1457 | 
             
                                argv[2] = cast->message_loc.start == NULL ? Qnil : pm_location_new(parser, cast->message_loc.start, cast->message_loc.end, source);
         | 
| 1425 1458 |  | 
| 1426 | 
            -
                                // opening_loc
         | 
| 1427 | 
            -
            #line 173 "api_node.c.erb"
         | 
| 1428 | 
            -
                                argv[3] = cast->opening_loc.start == NULL ? Qnil : pm_location_new(parser, cast->opening_loc.start, cast->opening_loc.end, source);
         | 
| 1429 | 
            -
             | 
| 1430 | 
            -
                                // arguments
         | 
| 1431 | 
            -
            #line 145 "api_node.c.erb"
         | 
| 1432 | 
            -
                                argv[4] = rb_ary_pop(value_stack);
         | 
| 1433 | 
            -
             | 
| 1434 | 
            -
                                // closing_loc
         | 
| 1435 | 
            -
            #line 173 "api_node.c.erb"
         | 
| 1436 | 
            -
                                argv[5] = cast->closing_loc.start == NULL ? Qnil : pm_location_new(parser, cast->closing_loc.start, cast->closing_loc.end, source);
         | 
| 1437 | 
            -
             | 
| 1438 1459 | 
             
                                // flags
         | 
| 1439 1460 | 
             
            #line 179 "api_node.c.erb"
         | 
| 1440 | 
            -
                                argv[ | 
| 1461 | 
            +
                                argv[3] = ULONG2NUM(node->flags & ~PM_NODE_FLAG_COMMON_MASK);
         | 
| 1441 1462 |  | 
| 1442 1463 | 
             
                                // read_name
         | 
| 1443 | 
            -
            #line  | 
| 1444 | 
            -
                                 | 
| 1464 | 
            +
            #line 157 "api_node.c.erb"
         | 
| 1465 | 
            +
                                assert(cast->read_name != 0);
         | 
| 1466 | 
            +
                                argv[4] = rb_id2sym(constants[cast->read_name - 1]);
         | 
| 1445 1467 |  | 
| 1446 1468 | 
             
                                // write_name
         | 
| 1447 | 
            -
            #line  | 
| 1448 | 
            -
                                 | 
| 1469 | 
            +
            #line 157 "api_node.c.erb"
         | 
| 1470 | 
            +
                                assert(cast->write_name != 0);
         | 
| 1471 | 
            +
                                argv[5] = rb_id2sym(constants[cast->write_name - 1]);
         | 
| 1449 1472 |  | 
| 1450 1473 | 
             
                                // operator_loc
         | 
| 1451 1474 | 
             
            #line 170 "api_node.c.erb"
         | 
| 1452 | 
            -
                                argv[ | 
| 1475 | 
            +
                                argv[6] = pm_location_new(parser, cast->operator_loc.start, cast->operator_loc.end, source);
         | 
| 1453 1476 |  | 
| 1454 1477 | 
             
                                // value
         | 
| 1455 1478 | 
             
            #line 145 "api_node.c.erb"
         | 
| 1456 | 
            -
                                argv[ | 
| 1479 | 
            +
                                argv[7] = rb_ary_pop(value_stack);
         | 
| 1457 1480 |  | 
| 1458 1481 | 
             
                                // location
         | 
| 1459 | 
            -
                                argv[ | 
| 1482 | 
            +
                                argv[8] = pm_location_new(parser, node->location.start, node->location.end, source);
         | 
| 1460 1483 |  | 
| 1461 | 
            -
                                rb_ary_push(value_stack, rb_class_new_instance( | 
| 1484 | 
            +
                                rb_ary_push(value_stack, rb_class_new_instance(9, argv, rb_cPrismCallAndWriteNode));
         | 
| 1462 1485 | 
             
                                break;
         | 
| 1463 1486 | 
             
                            }
         | 
| 1464 1487 | 
             
            #line 134 "api_node.c.erb"
         | 
| @@ -1496,11 +1519,12 @@ pm_ast_new(pm_parser_t *parser, pm_node_t *node, rb_encoding *encoding) { | |
| 1496 1519 |  | 
| 1497 1520 | 
             
                                // flags
         | 
| 1498 1521 | 
             
            #line 179 "api_node.c.erb"
         | 
| 1499 | 
            -
                                argv[7] = ULONG2NUM(node->flags  | 
| 1522 | 
            +
                                argv[7] = ULONG2NUM(node->flags & ~PM_NODE_FLAG_COMMON_MASK);
         | 
| 1500 1523 |  | 
| 1501 1524 | 
             
                                // name
         | 
| 1502 | 
            -
            #line  | 
| 1503 | 
            -
                                 | 
| 1525 | 
            +
            #line 157 "api_node.c.erb"
         | 
| 1526 | 
            +
                                assert(cast->name != 0);
         | 
| 1527 | 
            +
                                argv[8] = rb_id2sym(constants[cast->name - 1]);
         | 
| 1504 1528 |  | 
| 1505 1529 | 
             
                                // location
         | 
| 1506 1530 | 
             
                                argv[9] = pm_location_new(parser, node->location.start, node->location.end, source);
         | 
| @@ -1511,7 +1535,7 @@ pm_ast_new(pm_parser_t *parser, pm_node_t *node, rb_encoding *encoding) { | |
| 1511 1535 | 
             
            #line 134 "api_node.c.erb"
         | 
| 1512 1536 | 
             
                            case PM_CALL_OPERATOR_WRITE_NODE: {
         | 
| 1513 1537 | 
             
                                pm_call_operator_write_node_t *cast = (pm_call_operator_write_node_t *) node;
         | 
| 1514 | 
            -
                                VALUE argv[ | 
| 1538 | 
            +
                                VALUE argv[10];
         | 
| 1515 1539 |  | 
| 1516 1540 | 
             
                                // receiver
         | 
| 1517 1541 | 
             
            #line 145 "api_node.c.erb"
         | 
| @@ -1525,53 +1549,43 @@ pm_ast_new(pm_parser_t *parser, pm_node_t *node, rb_encoding *encoding) { | |
| 1525 1549 | 
             
            #line 173 "api_node.c.erb"
         | 
| 1526 1550 | 
             
                                argv[2] = cast->message_loc.start == NULL ? Qnil : pm_location_new(parser, cast->message_loc.start, cast->message_loc.end, source);
         | 
| 1527 1551 |  | 
| 1528 | 
            -
                                // opening_loc
         | 
| 1529 | 
            -
            #line 173 "api_node.c.erb"
         | 
| 1530 | 
            -
                                argv[3] = cast->opening_loc.start == NULL ? Qnil : pm_location_new(parser, cast->opening_loc.start, cast->opening_loc.end, source);
         | 
| 1531 | 
            -
             | 
| 1532 | 
            -
                                // arguments
         | 
| 1533 | 
            -
            #line 145 "api_node.c.erb"
         | 
| 1534 | 
            -
                                argv[4] = rb_ary_pop(value_stack);
         | 
| 1535 | 
            -
             | 
| 1536 | 
            -
                                // closing_loc
         | 
| 1537 | 
            -
            #line 173 "api_node.c.erb"
         | 
| 1538 | 
            -
                                argv[5] = cast->closing_loc.start == NULL ? Qnil : pm_location_new(parser, cast->closing_loc.start, cast->closing_loc.end, source);
         | 
| 1539 | 
            -
             | 
| 1540 1552 | 
             
                                // flags
         | 
| 1541 1553 | 
             
            #line 179 "api_node.c.erb"
         | 
| 1542 | 
            -
                                argv[ | 
| 1554 | 
            +
                                argv[3] = ULONG2NUM(node->flags & ~PM_NODE_FLAG_COMMON_MASK);
         | 
| 1543 1555 |  | 
| 1544 1556 | 
             
                                // read_name
         | 
| 1545 | 
            -
            #line  | 
| 1546 | 
            -
                                 | 
| 1557 | 
            +
            #line 157 "api_node.c.erb"
         | 
| 1558 | 
            +
                                assert(cast->read_name != 0);
         | 
| 1559 | 
            +
                                argv[4] = rb_id2sym(constants[cast->read_name - 1]);
         | 
| 1547 1560 |  | 
| 1548 1561 | 
             
                                // write_name
         | 
| 1549 | 
            -
            #line  | 
| 1550 | 
            -
                                 | 
| 1562 | 
            +
            #line 157 "api_node.c.erb"
         | 
| 1563 | 
            +
                                assert(cast->write_name != 0);
         | 
| 1564 | 
            +
                                argv[5] = rb_id2sym(constants[cast->write_name - 1]);
         | 
| 1551 1565 |  | 
| 1552 1566 | 
             
                                // operator
         | 
| 1553 1567 | 
             
            #line 157 "api_node.c.erb"
         | 
| 1554 1568 | 
             
                                assert(cast->operator != 0);
         | 
| 1555 | 
            -
                                argv[ | 
| 1569 | 
            +
                                argv[6] = rb_id2sym(constants[cast->operator - 1]);
         | 
| 1556 1570 |  | 
| 1557 1571 | 
             
                                // operator_loc
         | 
| 1558 1572 | 
             
            #line 170 "api_node.c.erb"
         | 
| 1559 | 
            -
                                argv[ | 
| 1573 | 
            +
                                argv[7] = pm_location_new(parser, cast->operator_loc.start, cast->operator_loc.end, source);
         | 
| 1560 1574 |  | 
| 1561 1575 | 
             
                                // value
         | 
| 1562 1576 | 
             
            #line 145 "api_node.c.erb"
         | 
| 1563 | 
            -
                                argv[ | 
| 1577 | 
            +
                                argv[8] = rb_ary_pop(value_stack);
         | 
| 1564 1578 |  | 
| 1565 1579 | 
             
                                // location
         | 
| 1566 | 
            -
                                argv[ | 
| 1580 | 
            +
                                argv[9] = pm_location_new(parser, node->location.start, node->location.end, source);
         | 
| 1567 1581 |  | 
| 1568 | 
            -
                                rb_ary_push(value_stack, rb_class_new_instance( | 
| 1582 | 
            +
                                rb_ary_push(value_stack, rb_class_new_instance(10, argv, rb_cPrismCallOperatorWriteNode));
         | 
| 1569 1583 | 
             
                                break;
         | 
| 1570 1584 | 
             
                            }
         | 
| 1571 1585 | 
             
            #line 134 "api_node.c.erb"
         | 
| 1572 1586 | 
             
                            case PM_CALL_OR_WRITE_NODE: {
         | 
| 1573 1587 | 
             
                                pm_call_or_write_node_t *cast = (pm_call_or_write_node_t *) node;
         | 
| 1574 | 
            -
                                VALUE argv[ | 
| 1588 | 
            +
                                VALUE argv[9];
         | 
| 1575 1589 |  | 
| 1576 1590 | 
             
                                // receiver
         | 
| 1577 1591 | 
             
            #line 145 "api_node.c.erb"
         | 
| @@ -1585,42 +1599,32 @@ pm_ast_new(pm_parser_t *parser, pm_node_t *node, rb_encoding *encoding) { | |
| 1585 1599 | 
             
            #line 173 "api_node.c.erb"
         | 
| 1586 1600 | 
             
                                argv[2] = cast->message_loc.start == NULL ? Qnil : pm_location_new(parser, cast->message_loc.start, cast->message_loc.end, source);
         | 
| 1587 1601 |  | 
| 1588 | 
            -
                                // opening_loc
         | 
| 1589 | 
            -
            #line 173 "api_node.c.erb"
         | 
| 1590 | 
            -
                                argv[3] = cast->opening_loc.start == NULL ? Qnil : pm_location_new(parser, cast->opening_loc.start, cast->opening_loc.end, source);
         | 
| 1591 | 
            -
             | 
| 1592 | 
            -
                                // arguments
         | 
| 1593 | 
            -
            #line 145 "api_node.c.erb"
         | 
| 1594 | 
            -
                                argv[4] = rb_ary_pop(value_stack);
         | 
| 1595 | 
            -
             | 
| 1596 | 
            -
                                // closing_loc
         | 
| 1597 | 
            -
            #line 173 "api_node.c.erb"
         | 
| 1598 | 
            -
                                argv[5] = cast->closing_loc.start == NULL ? Qnil : pm_location_new(parser, cast->closing_loc.start, cast->closing_loc.end, source);
         | 
| 1599 | 
            -
             | 
| 1600 1602 | 
             
                                // flags
         | 
| 1601 1603 | 
             
            #line 179 "api_node.c.erb"
         | 
| 1602 | 
            -
                                argv[ | 
| 1604 | 
            +
                                argv[3] = ULONG2NUM(node->flags & ~PM_NODE_FLAG_COMMON_MASK);
         | 
| 1603 1605 |  | 
| 1604 1606 | 
             
                                // read_name
         | 
| 1605 | 
            -
            #line  | 
| 1606 | 
            -
                                 | 
| 1607 | 
            +
            #line 157 "api_node.c.erb"
         | 
| 1608 | 
            +
                                assert(cast->read_name != 0);
         | 
| 1609 | 
            +
                                argv[4] = rb_id2sym(constants[cast->read_name - 1]);
         | 
| 1607 1610 |  | 
| 1608 1611 | 
             
                                // write_name
         | 
| 1609 | 
            -
            #line  | 
| 1610 | 
            -
                                 | 
| 1612 | 
            +
            #line 157 "api_node.c.erb"
         | 
| 1613 | 
            +
                                assert(cast->write_name != 0);
         | 
| 1614 | 
            +
                                argv[5] = rb_id2sym(constants[cast->write_name - 1]);
         | 
| 1611 1615 |  | 
| 1612 1616 | 
             
                                // operator_loc
         | 
| 1613 1617 | 
             
            #line 170 "api_node.c.erb"
         | 
| 1614 | 
            -
                                argv[ | 
| 1618 | 
            +
                                argv[6] = pm_location_new(parser, cast->operator_loc.start, cast->operator_loc.end, source);
         | 
| 1615 1619 |  | 
| 1616 1620 | 
             
                                // value
         | 
| 1617 1621 | 
             
            #line 145 "api_node.c.erb"
         | 
| 1618 | 
            -
                                argv[ | 
| 1622 | 
            +
                                argv[7] = rb_ary_pop(value_stack);
         | 
| 1619 1623 |  | 
| 1620 1624 | 
             
                                // location
         | 
| 1621 | 
            -
                                argv[ | 
| 1625 | 
            +
                                argv[8] = pm_location_new(parser, node->location.start, node->location.end, source);
         | 
| 1622 1626 |  | 
| 1623 | 
            -
                                rb_ary_push(value_stack, rb_class_new_instance( | 
| 1627 | 
            +
                                rb_ary_push(value_stack, rb_class_new_instance(9, argv, rb_cPrismCallOrWriteNode));
         | 
| 1624 1628 | 
             
                                break;
         | 
| 1625 1629 | 
             
                            }
         | 
| 1626 1630 | 
             
            #line 134 "api_node.c.erb"
         | 
| @@ -2415,7 +2419,7 @@ pm_ast_new(pm_parser_t *parser, pm_node_t *node, rb_encoding *encoding) { | |
| 2415 2419 |  | 
| 2416 2420 | 
             
                                // flags
         | 
| 2417 2421 | 
             
            #line 179 "api_node.c.erb"
         | 
| 2418 | 
            -
                                argv[3] = ULONG2NUM(node->flags  | 
| 2422 | 
            +
                                argv[3] = ULONG2NUM(node->flags & ~PM_NODE_FLAG_COMMON_MASK);
         | 
| 2419 2423 |  | 
| 2420 2424 | 
             
                                // location
         | 
| 2421 2425 | 
             
                                argv[4] = pm_location_new(parser, node->location.start, node->location.end, source);
         | 
| @@ -2801,6 +2805,152 @@ pm_ast_new(pm_parser_t *parser, pm_node_t *node, rb_encoding *encoding) { | |
| 2801 2805 | 
             
                                rb_ary_push(value_stack, rb_class_new_instance(5, argv, rb_cPrismInNode));
         | 
| 2802 2806 | 
             
                                break;
         | 
| 2803 2807 | 
             
                            }
         | 
| 2808 | 
            +
            #line 134 "api_node.c.erb"
         | 
| 2809 | 
            +
                            case PM_INDEX_AND_WRITE_NODE: {
         | 
| 2810 | 
            +
                                pm_index_and_write_node_t *cast = (pm_index_and_write_node_t *) node;
         | 
| 2811 | 
            +
                                VALUE argv[10];
         | 
| 2812 | 
            +
             | 
| 2813 | 
            +
                                // receiver
         | 
| 2814 | 
            +
            #line 145 "api_node.c.erb"
         | 
| 2815 | 
            +
                                argv[0] = rb_ary_pop(value_stack);
         | 
| 2816 | 
            +
             | 
| 2817 | 
            +
                                // call_operator_loc
         | 
| 2818 | 
            +
            #line 173 "api_node.c.erb"
         | 
| 2819 | 
            +
                                argv[1] = cast->call_operator_loc.start == NULL ? Qnil : pm_location_new(parser, cast->call_operator_loc.start, cast->call_operator_loc.end, source);
         | 
| 2820 | 
            +
             | 
| 2821 | 
            +
                                // opening_loc
         | 
| 2822 | 
            +
            #line 170 "api_node.c.erb"
         | 
| 2823 | 
            +
                                argv[2] = pm_location_new(parser, cast->opening_loc.start, cast->opening_loc.end, source);
         | 
| 2824 | 
            +
             | 
| 2825 | 
            +
                                // arguments
         | 
| 2826 | 
            +
            #line 145 "api_node.c.erb"
         | 
| 2827 | 
            +
                                argv[3] = rb_ary_pop(value_stack);
         | 
| 2828 | 
            +
             | 
| 2829 | 
            +
                                // closing_loc
         | 
| 2830 | 
            +
            #line 170 "api_node.c.erb"
         | 
| 2831 | 
            +
                                argv[4] = pm_location_new(parser, cast->closing_loc.start, cast->closing_loc.end, source);
         | 
| 2832 | 
            +
             | 
| 2833 | 
            +
                                // block
         | 
| 2834 | 
            +
            #line 145 "api_node.c.erb"
         | 
| 2835 | 
            +
                                argv[5] = rb_ary_pop(value_stack);
         | 
| 2836 | 
            +
             | 
| 2837 | 
            +
                                // flags
         | 
| 2838 | 
            +
            #line 179 "api_node.c.erb"
         | 
| 2839 | 
            +
                                argv[6] = ULONG2NUM(node->flags & ~PM_NODE_FLAG_COMMON_MASK);
         | 
| 2840 | 
            +
             | 
| 2841 | 
            +
                                // operator_loc
         | 
| 2842 | 
            +
            #line 170 "api_node.c.erb"
         | 
| 2843 | 
            +
                                argv[7] = pm_location_new(parser, cast->operator_loc.start, cast->operator_loc.end, source);
         | 
| 2844 | 
            +
             | 
| 2845 | 
            +
                                // value
         | 
| 2846 | 
            +
            #line 145 "api_node.c.erb"
         | 
| 2847 | 
            +
                                argv[8] = rb_ary_pop(value_stack);
         | 
| 2848 | 
            +
             | 
| 2849 | 
            +
                                // location
         | 
| 2850 | 
            +
                                argv[9] = pm_location_new(parser, node->location.start, node->location.end, source);
         | 
| 2851 | 
            +
             | 
| 2852 | 
            +
                                rb_ary_push(value_stack, rb_class_new_instance(10, argv, rb_cPrismIndexAndWriteNode));
         | 
| 2853 | 
            +
                                break;
         | 
| 2854 | 
            +
                            }
         | 
| 2855 | 
            +
            #line 134 "api_node.c.erb"
         | 
| 2856 | 
            +
                            case PM_INDEX_OPERATOR_WRITE_NODE: {
         | 
| 2857 | 
            +
                                pm_index_operator_write_node_t *cast = (pm_index_operator_write_node_t *) node;
         | 
| 2858 | 
            +
                                VALUE argv[11];
         | 
| 2859 | 
            +
             | 
| 2860 | 
            +
                                // receiver
         | 
| 2861 | 
            +
            #line 145 "api_node.c.erb"
         | 
| 2862 | 
            +
                                argv[0] = rb_ary_pop(value_stack);
         | 
| 2863 | 
            +
             | 
| 2864 | 
            +
                                // call_operator_loc
         | 
| 2865 | 
            +
            #line 173 "api_node.c.erb"
         | 
| 2866 | 
            +
                                argv[1] = cast->call_operator_loc.start == NULL ? Qnil : pm_location_new(parser, cast->call_operator_loc.start, cast->call_operator_loc.end, source);
         | 
| 2867 | 
            +
             | 
| 2868 | 
            +
                                // opening_loc
         | 
| 2869 | 
            +
            #line 170 "api_node.c.erb"
         | 
| 2870 | 
            +
                                argv[2] = pm_location_new(parser, cast->opening_loc.start, cast->opening_loc.end, source);
         | 
| 2871 | 
            +
             | 
| 2872 | 
            +
                                // arguments
         | 
| 2873 | 
            +
            #line 145 "api_node.c.erb"
         | 
| 2874 | 
            +
                                argv[3] = rb_ary_pop(value_stack);
         | 
| 2875 | 
            +
             | 
| 2876 | 
            +
                                // closing_loc
         | 
| 2877 | 
            +
            #line 170 "api_node.c.erb"
         | 
| 2878 | 
            +
                                argv[4] = pm_location_new(parser, cast->closing_loc.start, cast->closing_loc.end, source);
         | 
| 2879 | 
            +
             | 
| 2880 | 
            +
                                // block
         | 
| 2881 | 
            +
            #line 145 "api_node.c.erb"
         | 
| 2882 | 
            +
                                argv[5] = rb_ary_pop(value_stack);
         | 
| 2883 | 
            +
             | 
| 2884 | 
            +
                                // flags
         | 
| 2885 | 
            +
            #line 179 "api_node.c.erb"
         | 
| 2886 | 
            +
                                argv[6] = ULONG2NUM(node->flags & ~PM_NODE_FLAG_COMMON_MASK);
         | 
| 2887 | 
            +
             | 
| 2888 | 
            +
                                // operator
         | 
| 2889 | 
            +
            #line 157 "api_node.c.erb"
         | 
| 2890 | 
            +
                                assert(cast->operator != 0);
         | 
| 2891 | 
            +
                                argv[7] = rb_id2sym(constants[cast->operator - 1]);
         | 
| 2892 | 
            +
             | 
| 2893 | 
            +
                                // operator_loc
         | 
| 2894 | 
            +
            #line 170 "api_node.c.erb"
         | 
| 2895 | 
            +
                                argv[8] = pm_location_new(parser, cast->operator_loc.start, cast->operator_loc.end, source);
         | 
| 2896 | 
            +
             | 
| 2897 | 
            +
                                // value
         | 
| 2898 | 
            +
            #line 145 "api_node.c.erb"
         | 
| 2899 | 
            +
                                argv[9] = rb_ary_pop(value_stack);
         | 
| 2900 | 
            +
             | 
| 2901 | 
            +
                                // location
         | 
| 2902 | 
            +
                                argv[10] = pm_location_new(parser, node->location.start, node->location.end, source);
         | 
| 2903 | 
            +
             | 
| 2904 | 
            +
                                rb_ary_push(value_stack, rb_class_new_instance(11, argv, rb_cPrismIndexOperatorWriteNode));
         | 
| 2905 | 
            +
                                break;
         | 
| 2906 | 
            +
                            }
         | 
| 2907 | 
            +
            #line 134 "api_node.c.erb"
         | 
| 2908 | 
            +
                            case PM_INDEX_OR_WRITE_NODE: {
         | 
| 2909 | 
            +
                                pm_index_or_write_node_t *cast = (pm_index_or_write_node_t *) node;
         | 
| 2910 | 
            +
                                VALUE argv[10];
         | 
| 2911 | 
            +
             | 
| 2912 | 
            +
                                // receiver
         | 
| 2913 | 
            +
            #line 145 "api_node.c.erb"
         | 
| 2914 | 
            +
                                argv[0] = rb_ary_pop(value_stack);
         | 
| 2915 | 
            +
             | 
| 2916 | 
            +
                                // call_operator_loc
         | 
| 2917 | 
            +
            #line 173 "api_node.c.erb"
         | 
| 2918 | 
            +
                                argv[1] = cast->call_operator_loc.start == NULL ? Qnil : pm_location_new(parser, cast->call_operator_loc.start, cast->call_operator_loc.end, source);
         | 
| 2919 | 
            +
             | 
| 2920 | 
            +
                                // opening_loc
         | 
| 2921 | 
            +
            #line 170 "api_node.c.erb"
         | 
| 2922 | 
            +
                                argv[2] = pm_location_new(parser, cast->opening_loc.start, cast->opening_loc.end, source);
         | 
| 2923 | 
            +
             | 
| 2924 | 
            +
                                // arguments
         | 
| 2925 | 
            +
            #line 145 "api_node.c.erb"
         | 
| 2926 | 
            +
                                argv[3] = rb_ary_pop(value_stack);
         | 
| 2927 | 
            +
             | 
| 2928 | 
            +
                                // closing_loc
         | 
| 2929 | 
            +
            #line 170 "api_node.c.erb"
         | 
| 2930 | 
            +
                                argv[4] = pm_location_new(parser, cast->closing_loc.start, cast->closing_loc.end, source);
         | 
| 2931 | 
            +
             | 
| 2932 | 
            +
                                // block
         | 
| 2933 | 
            +
            #line 145 "api_node.c.erb"
         | 
| 2934 | 
            +
                                argv[5] = rb_ary_pop(value_stack);
         | 
| 2935 | 
            +
             | 
| 2936 | 
            +
                                // flags
         | 
| 2937 | 
            +
            #line 179 "api_node.c.erb"
         | 
| 2938 | 
            +
                                argv[6] = ULONG2NUM(node->flags & ~PM_NODE_FLAG_COMMON_MASK);
         | 
| 2939 | 
            +
             | 
| 2940 | 
            +
                                // operator_loc
         | 
| 2941 | 
            +
            #line 170 "api_node.c.erb"
         | 
| 2942 | 
            +
                                argv[7] = pm_location_new(parser, cast->operator_loc.start, cast->operator_loc.end, source);
         | 
| 2943 | 
            +
             | 
| 2944 | 
            +
                                // value
         | 
| 2945 | 
            +
            #line 145 "api_node.c.erb"
         | 
| 2946 | 
            +
                                argv[8] = rb_ary_pop(value_stack);
         | 
| 2947 | 
            +
             | 
| 2948 | 
            +
                                // location
         | 
| 2949 | 
            +
                                argv[9] = pm_location_new(parser, node->location.start, node->location.end, source);
         | 
| 2950 | 
            +
             | 
| 2951 | 
            +
                                rb_ary_push(value_stack, rb_class_new_instance(10, argv, rb_cPrismIndexOrWriteNode));
         | 
| 2952 | 
            +
                                break;
         | 
| 2953 | 
            +
                            }
         | 
| 2804 2954 | 
             
            #line 134 "api_node.c.erb"
         | 
| 2805 2955 | 
             
                            case PM_INSTANCE_VARIABLE_AND_WRITE_NODE: {
         | 
| 2806 2956 | 
             
                                pm_instance_variable_and_write_node_t *cast = (pm_instance_variable_and_write_node_t *) node;
         | 
| @@ -2956,7 +3106,7 @@ pm_ast_new(pm_parser_t *parser, pm_node_t *node, rb_encoding *encoding) { | |
| 2956 3106 |  | 
| 2957 3107 | 
             
                                // flags
         | 
| 2958 3108 | 
             
            #line 179 "api_node.c.erb"
         | 
| 2959 | 
            -
                                argv[0] = ULONG2NUM(node->flags  | 
| 3109 | 
            +
                                argv[0] = ULONG2NUM(node->flags & ~PM_NODE_FLAG_COMMON_MASK);
         | 
| 2960 3110 |  | 
| 2961 3111 | 
             
                                // location
         | 
| 2962 3112 | 
             
                                argv[1] = pm_location_new(parser, node->location.start, node->location.end, source);
         | 
| @@ -2986,7 +3136,7 @@ pm_ast_new(pm_parser_t *parser, pm_node_t *node, rb_encoding *encoding) { | |
| 2986 3136 |  | 
| 2987 3137 | 
             
                                // flags
         | 
| 2988 3138 | 
             
            #line 179 "api_node.c.erb"
         | 
| 2989 | 
            -
                                argv[3] = ULONG2NUM(node->flags  | 
| 3139 | 
            +
                                argv[3] = ULONG2NUM(node->flags & ~PM_NODE_FLAG_COMMON_MASK);
         | 
| 2990 3140 |  | 
| 2991 3141 | 
             
                                // location
         | 
| 2992 3142 | 
             
                                argv[4] = pm_location_new(parser, node->location.start, node->location.end, source);
         | 
| @@ -3016,7 +3166,7 @@ pm_ast_new(pm_parser_t *parser, pm_node_t *node, rb_encoding *encoding) { | |
| 3016 3166 |  | 
| 3017 3167 | 
             
                                // flags
         | 
| 3018 3168 | 
             
            #line 179 "api_node.c.erb"
         | 
| 3019 | 
            -
                                argv[3] = ULONG2NUM(node->flags  | 
| 3169 | 
            +
                                argv[3] = ULONG2NUM(node->flags & ~PM_NODE_FLAG_COMMON_MASK);
         | 
| 3020 3170 |  | 
| 3021 3171 | 
             
                                // location
         | 
| 3022 3172 | 
             
                                argv[4] = pm_location_new(parser, node->location.start, node->location.end, source);
         | 
| @@ -3401,7 +3551,7 @@ pm_ast_new(pm_parser_t *parser, pm_node_t *node, rb_encoding *encoding) { | |
| 3401 3551 |  | 
| 3402 3552 | 
             
                                // flags
         | 
| 3403 3553 | 
             
            #line 179 "api_node.c.erb"
         | 
| 3404 | 
            -
                                argv[4] = ULONG2NUM(node->flags  | 
| 3554 | 
            +
                                argv[4] = ULONG2NUM(node->flags & ~PM_NODE_FLAG_COMMON_MASK);
         | 
| 3405 3555 |  | 
| 3406 3556 | 
             
                                // location
         | 
| 3407 3557 | 
             
                                argv[5] = pm_location_new(parser, node->location.start, node->location.end, source);
         | 
| @@ -3918,7 +4068,7 @@ pm_ast_new(pm_parser_t *parser, pm_node_t *node, rb_encoding *encoding) { | |
| 3918 4068 |  | 
| 3919 4069 | 
             
                                // flags
         | 
| 3920 4070 | 
             
            #line 179 "api_node.c.erb"
         | 
| 3921 | 
            -
                                argv[3] = ULONG2NUM(node->flags  | 
| 4071 | 
            +
                                argv[3] = ULONG2NUM(node->flags & ~PM_NODE_FLAG_COMMON_MASK);
         | 
| 3922 4072 |  | 
| 3923 4073 | 
             
                                // location
         | 
| 3924 4074 | 
             
                                argv[4] = pm_location_new(parser, node->location.start, node->location.end, source);
         | 
| @@ -3973,7 +4123,7 @@ pm_ast_new(pm_parser_t *parser, pm_node_t *node, rb_encoding *encoding) { | |
| 3973 4123 |  | 
| 3974 4124 | 
             
                                // flags
         | 
| 3975 4125 | 
             
            #line 179 "api_node.c.erb"
         | 
| 3976 | 
            -
                                argv[4] = ULONG2NUM(node->flags  | 
| 4126 | 
            +
                                argv[4] = ULONG2NUM(node->flags & ~PM_NODE_FLAG_COMMON_MASK);
         | 
| 3977 4127 |  | 
| 3978 4128 | 
             
                                // location
         | 
| 3979 4129 | 
             
                                argv[5] = pm_location_new(parser, node->location.start, node->location.end, source);
         | 
| @@ -4281,7 +4431,7 @@ pm_ast_new(pm_parser_t *parser, pm_node_t *node, rb_encoding *encoding) { | |
| 4281 4431 |  | 
| 4282 4432 | 
             
                                // flags
         | 
| 4283 4433 | 
             
            #line 179 "api_node.c.erb"
         | 
| 4284 | 
            -
                                argv[0] = ULONG2NUM(node->flags  | 
| 4434 | 
            +
                                argv[0] = ULONG2NUM(node->flags & ~PM_NODE_FLAG_COMMON_MASK);
         | 
| 4285 4435 |  | 
| 4286 4436 | 
             
                                // opening_loc
         | 
| 4287 4437 | 
             
            #line 173 "api_node.c.erb"
         | 
| @@ -4449,7 +4599,7 @@ pm_ast_new(pm_parser_t *parser, pm_node_t *node, rb_encoding *encoding) { | |
| 4449 4599 |  | 
| 4450 4600 | 
             
                                // flags
         | 
| 4451 4601 | 
             
            #line 179 "api_node.c.erb"
         | 
| 4452 | 
            -
                                argv[4] = ULONG2NUM(node->flags  | 
| 4602 | 
            +
                                argv[4] = ULONG2NUM(node->flags & ~PM_NODE_FLAG_COMMON_MASK);
         | 
| 4453 4603 |  | 
| 4454 4604 | 
             
                                // location
         | 
| 4455 4605 | 
             
                                argv[5] = pm_location_new(parser, node->location.start, node->location.end, source);
         | 
| @@ -4506,7 +4656,7 @@ pm_ast_new(pm_parser_t *parser, pm_node_t *node, rb_encoding *encoding) { | |
| 4506 4656 |  | 
| 4507 4657 | 
             
                                // flags
         | 
| 4508 4658 | 
             
            #line 179 "api_node.c.erb"
         | 
| 4509 | 
            -
                                argv[4] = ULONG2NUM(node->flags  | 
| 4659 | 
            +
                                argv[4] = ULONG2NUM(node->flags & ~PM_NODE_FLAG_COMMON_MASK);
         | 
| 4510 4660 |  | 
| 4511 4661 | 
             
                                // location
         | 
| 4512 4662 | 
             
                                argv[5] = pm_location_new(parser, node->location.start, node->location.end, source);
         | 
| @@ -4649,6 +4799,9 @@ Init_prism_api_node(void) { | |
| 4649 4799 | 
             
                rb_cPrismImaginaryNode = rb_define_class_under(rb_cPrism, "ImaginaryNode", rb_cPrismNode);
         | 
| 4650 4800 | 
             
                rb_cPrismImplicitNode = rb_define_class_under(rb_cPrism, "ImplicitNode", rb_cPrismNode);
         | 
| 4651 4801 | 
             
                rb_cPrismInNode = rb_define_class_under(rb_cPrism, "InNode", rb_cPrismNode);
         | 
| 4802 | 
            +
                rb_cPrismIndexAndWriteNode = rb_define_class_under(rb_cPrism, "IndexAndWriteNode", rb_cPrismNode);
         | 
| 4803 | 
            +
                rb_cPrismIndexOperatorWriteNode = rb_define_class_under(rb_cPrism, "IndexOperatorWriteNode", rb_cPrismNode);
         | 
| 4804 | 
            +
                rb_cPrismIndexOrWriteNode = rb_define_class_under(rb_cPrism, "IndexOrWriteNode", rb_cPrismNode);
         | 
| 4652 4805 | 
             
                rb_cPrismInstanceVariableAndWriteNode = rb_define_class_under(rb_cPrism, "InstanceVariableAndWriteNode", rb_cPrismNode);
         | 
| 4653 4806 | 
             
                rb_cPrismInstanceVariableOperatorWriteNode = rb_define_class_under(rb_cPrism, "InstanceVariableOperatorWriteNode", rb_cPrismNode);
         | 
| 4654 4807 | 
             
                rb_cPrismInstanceVariableOrWriteNode = rb_define_class_under(rb_cPrism, "InstanceVariableOrWriteNode", rb_cPrismNode);
         |