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.
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
- VALUE argv[1];
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[0] = pm_location_new(parser, node->location.start, node->location.end, source);
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(1, argv, rb_cPrismBackReferenceReadNode));
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[12];
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[6] = ULONG2NUM(node->flags >> 2);
1461
+ argv[3] = ULONG2NUM(node->flags & ~PM_NODE_FLAG_COMMON_MASK);
1441
1462
 
1442
1463
  // read_name
1443
- #line 154 "api_node.c.erb"
1444
- argv[7] = pm_string_new(&cast->read_name, encoding);
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 154 "api_node.c.erb"
1448
- argv[8] = pm_string_new(&cast->write_name, encoding);
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[9] = pm_location_new(parser, cast->operator_loc.start, cast->operator_loc.end, source);
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[10] = rb_ary_pop(value_stack);
1479
+ argv[7] = rb_ary_pop(value_stack);
1457
1480
 
1458
1481
  // location
1459
- argv[11] = pm_location_new(parser, node->location.start, node->location.end, source);
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(12, argv, rb_cPrismCallAndWriteNode));
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 >> 2);
1522
+ argv[7] = ULONG2NUM(node->flags & ~PM_NODE_FLAG_COMMON_MASK);
1500
1523
 
1501
1524
  // name
1502
- #line 154 "api_node.c.erb"
1503
- argv[8] = pm_string_new(&cast->name, encoding);
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[13];
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[6] = ULONG2NUM(node->flags >> 2);
1554
+ argv[3] = ULONG2NUM(node->flags & ~PM_NODE_FLAG_COMMON_MASK);
1543
1555
 
1544
1556
  // read_name
1545
- #line 154 "api_node.c.erb"
1546
- argv[7] = pm_string_new(&cast->read_name, encoding);
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 154 "api_node.c.erb"
1550
- argv[8] = pm_string_new(&cast->write_name, encoding);
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[9] = rb_id2sym(constants[cast->operator - 1]);
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[10] = pm_location_new(parser, cast->operator_loc.start, cast->operator_loc.end, source);
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[11] = rb_ary_pop(value_stack);
1577
+ argv[8] = rb_ary_pop(value_stack);
1564
1578
 
1565
1579
  // location
1566
- argv[12] = pm_location_new(parser, node->location.start, node->location.end, source);
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(13, argv, rb_cPrismCallOperatorWriteNode));
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[12];
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[6] = ULONG2NUM(node->flags >> 2);
1604
+ argv[3] = ULONG2NUM(node->flags & ~PM_NODE_FLAG_COMMON_MASK);
1603
1605
 
1604
1606
  // read_name
1605
- #line 154 "api_node.c.erb"
1606
- argv[7] = pm_string_new(&cast->read_name, encoding);
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 154 "api_node.c.erb"
1610
- argv[8] = pm_string_new(&cast->write_name, encoding);
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[9] = pm_location_new(parser, cast->operator_loc.start, cast->operator_loc.end, source);
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[10] = rb_ary_pop(value_stack);
1622
+ argv[7] = rb_ary_pop(value_stack);
1619
1623
 
1620
1624
  // location
1621
- argv[11] = pm_location_new(parser, node->location.start, node->location.end, source);
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(12, argv, rb_cPrismCallOrWriteNode));
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 >> 2);
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 >> 2);
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 >> 2);
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 >> 2);
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 >> 2);
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 >> 2);
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 >> 2);
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 >> 2);
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 >> 2);
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 >> 2);
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);