yarp 0.6.0 → 0.8.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (47) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +55 -0
  3. data/CONTRIBUTING.md +4 -0
  4. data/{Makefile.in → Makefile} +5 -4
  5. data/README.md +6 -3
  6. data/config.yml +83 -274
  7. data/docs/build_system.md +4 -15
  8. data/docs/building.md +1 -5
  9. data/docs/encoding.md +1 -0
  10. data/docs/{extension.md → ruby_api.md} +6 -3
  11. data/docs/serialization.md +71 -24
  12. data/ext/yarp/api_node.c +173 -585
  13. data/ext/yarp/extconf.rb +15 -10
  14. data/ext/yarp/extension.c +4 -2
  15. data/ext/yarp/extension.h +1 -1
  16. data/include/yarp/ast.h +167 -306
  17. data/include/yarp/defines.h +5 -15
  18. data/include/yarp/enc/yp_encoding.h +1 -0
  19. data/include/yarp/unescape.h +1 -1
  20. data/include/yarp/util/yp_buffer.h +9 -0
  21. data/include/yarp/util/yp_constant_pool.h +3 -0
  22. data/include/yarp/util/yp_list.h +7 -7
  23. data/include/yarp/util/yp_newline_list.h +4 -0
  24. data/include/yarp/util/yp_state_stack.h +1 -1
  25. data/include/yarp/util/yp_string.h +5 -1
  26. data/include/yarp/version.h +2 -3
  27. data/include/yarp.h +4 -2
  28. data/lib/yarp/ffi.rb +226 -0
  29. data/lib/yarp/lex_compat.rb +16 -2
  30. data/lib/yarp/node.rb +594 -1437
  31. data/lib/yarp/ripper_compat.rb +3 -3
  32. data/lib/yarp/serialize.rb +312 -149
  33. data/lib/yarp.rb +167 -2
  34. data/src/enc/yp_unicode.c +9 -0
  35. data/src/node.c +92 -250
  36. data/src/prettyprint.c +81 -206
  37. data/src/serialize.c +124 -149
  38. data/src/unescape.c +29 -35
  39. data/src/util/yp_buffer.c +18 -0
  40. data/src/util/yp_list.c +7 -16
  41. data/src/util/yp_state_stack.c +0 -6
  42. data/src/util/yp_string.c +8 -17
  43. data/src/yarp.c +444 -717
  44. data/yarp.gemspec +5 -5
  45. metadata +6 -6
  46. data/config.h.in +0 -25
  47. data/configure +0 -4487
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 51ee2a88319b74a9937ab37fbaa9bb71586caf26a8f31282c2d2431735a484b6
4
- data.tar.gz: efe7ac9662cd199e3ba0c8a00f913912a2830843bc0c87cdfc3b258d724eafd8
3
+ metadata.gz: ef0d177f2be8f0d5ecd0ba54901e3cdf17fd6ec6f44a1b04160082ae5a1cb519
4
+ data.tar.gz: 776a4c7b981d4d6f3848bef030a448ea7d402f6ea75c20fcd87d3cbf935ecfe5
5
5
  SHA512:
6
- metadata.gz: 535d2f88c7ff324dbbc0e94dce1e4356125e1b08367c247c48cb083a00dccd997bf3bb73f4534effd8c6797373a588c0e76f6782e60afc36933c21a50b8f9900
7
- data.tar.gz: 1e9f92c56e9863d076b0ade0e82917a0e8df50063337d51cda1b9a8df1ea5bdc858b1b153179fd189eaabe313cff8e34213b68daad4488658316cd1dc077eedc
6
+ metadata.gz: 2e462ba8f51d24c8164ca67804a372d1bea6f6706828801cb2404af02ee183c301e221fef21725d59e013a64652eab06eae84b3e10a427f58ee7e0eed35c3950
7
+ data.tar.gz: 9594d53c55fc434c92c0601db17c548f473ca62812a0ab57b229d5b9753315198742c83f57a44744b6572def60b4b9659cfa1f93e4d86d66fd6b2f73e0db5234
data/CHANGELOG.md ADDED
@@ -0,0 +1,55 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project will be documented in this file.
4
+
5
+ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
6
+
7
+ ## [Unreleased]
8
+
9
+ ## [0.8.0] - 2023-08-18
10
+
11
+ ### Added
12
+
13
+ - Some performance improvements when converting from the C AST to the Ruby AST.
14
+ - Two rust crates have been added: `yarp-sys` and `yarp`. They are as yet unpublished.
15
+
16
+ ### Changed
17
+
18
+ - Escaped newlines in strings and heredocs are now handled more correctly.
19
+ - Dedenting heredocs that result in empty string nodes will now drop those string nodes from the list.
20
+ - Beginless and endless ranges in conditional expressions now properly form a flip flop node.
21
+ - `%` at the end of files no longer crashes.
22
+ - Location information has been corrected for `if/elsif` chains that have no `else`.
23
+ - `__END__` at the very end of the file was previously parsed as an identifier, but is now correct.
24
+ - **BREAKING**: Nodes that reference `&&=`, `||=`, and other writing operators have been consolidated. Previously, they were separate individual nodes. Now they are a tree with the target being the left-hand side and the value being the right-hand side with a joining `AndWriteNode`, `OrWriteNode`, or `OperatorWriteNode` in the middle. This impacts all of the nodes that match this pattern: `{ClassVariable,Constant,ConstantPath,GlobalVariable,InstanceVariable,LocalVariable}Operator{And,Or,}WriteNode`.
25
+ - **BREAKING**: `BlockParametersNode`, `ClassNode`, `DefNode`, `LambdaNode`, `ModuleNode`, `ParenthesesNode`, and `SingletonClassNode` have had their `statements` field renamed to `body` to give a hint that it might not be a `StatementsNode` (it could also be a `BeginNode`).
26
+
27
+ ## [0.7.0] - 2023-08-14
28
+
29
+ ### Added
30
+
31
+ - We now have an explicit `FlipFlopNode`. It has the same flags as `RangeNode`.
32
+ - We now have a syntax error when implicit and explicit blocks are passed to a method call.
33
+ - `Node#slice` is now implemented, for retrieving the slice of the source code corresponding to a node.
34
+ - We now support the `utf8-mac` encoding.
35
+ - Predicate methods have been added for nodes that have flags. For example `CallNode#safe_navigation?` and `RangeNode#exclude_end?`.
36
+ - The gem now functions on JRuby and TruffleRuby, thanks to a new FFI backend.
37
+ - Comments are now part of the serialization API.
38
+
39
+ ### Changed
40
+
41
+ - Autotools has been removed from the build system, so when the gem is installed it will no longer need to go through a configure step.
42
+ - The AST for `foo = *bar` has changed to have an explicit array on the right hand side, rather than a splat node. This is more consistent with how other parsers handle this.
43
+ - **BREAKING**: `RangeNodeFlags` has been renamed to `RangeFlags`.
44
+ - Unary minus on number literals is now parsed as part of the literal, rather than a call to a unary operator. This is more consistent with how other parsers handle this.
45
+
46
+ ## [0.6.0] - 2023-08-09
47
+
48
+ ### Added
49
+
50
+ - 🎉 Initial release! 🎉
51
+
52
+ [unreleased]: https://github.com/ruby/yarp/compare/v0.8.0...HEAD
53
+ [0.8.0]: https://github.com/ruby/yarp/compare/v0.7.0...v0.8.0
54
+ [0.7.0]: https://github.com/ruby/yarp/compare/v0.6.0...v0.7.0
55
+ [0.6.0]: https://github.com/ruby/yarp/compare/d60531...v0.6.0
data/CONTRIBUTING.md CHANGED
@@ -10,6 +10,10 @@ The discussions page on the GitHub repository are open. If you have a question o
10
10
 
11
11
  If you want to contribute code, please first open or contribute to a discussion. A lot of the project is in flux, and we want to make sure that you are contributing to the right place. Once you have a discussion going, you can open a pull request with your changes. We will review your code and get it merged in.
12
12
 
13
+ ### Ruby Features
14
+
15
+ Pattern matching and endless method definitions should be avoided as long as the latest TruffleRuby release does not support it.
16
+
13
17
  ## Tests
14
18
 
15
19
  We could always use more tests! One of the biggest challenges of this project is building up a big test suite. If you want to contribute tests, feel free to open a pull request. These will get merged in as soon as possible.
@@ -10,10 +10,9 @@ FUZZ_OUTPUT_DIR = $(shell pwd)/fuzz/output
10
10
 
11
11
  SOEXT := $(shell ruby -e 'puts RbConfig::CONFIG["SOEXT"]')
12
12
 
13
- DEFS := @DEFS@
14
- CPPFLAGS := @DEFS@ -Iinclude
15
- CFLAGS := @CFLAGS@ -std=c99 -Wall -Werror -Wextra -Wpedantic -Wundef -Wconversion -fPIC -fvisibility=hidden
16
- CC := @CC@
13
+ CPPFLAGS := -Iinclude
14
+ CFLAGS := -g -O2 -std=c99 -Wall -Werror -Wextra -Wpedantic -Wundef -Wconversion -fPIC -fvisibility=hidden
15
+ CC := cc
17
16
 
18
17
  HEADERS := $(shell find include -name '*.h')
19
18
  SOURCES := $(shell find src -name '*.c')
@@ -62,6 +61,8 @@ fuzz-docker-build: fuzz/docker/Dockerfile
62
61
  $(Q) docker build -t yarp/fuzz fuzz/docker/
63
62
 
64
63
  fuzz-run-%: FORCE fuzz-docker-build
64
+ $(ECHO) "generating templates"
65
+ $(Q) bundle exec rake templates
65
66
  $(ECHO) "running $* fuzzer"
66
67
  $(Q) docker run --rm -v $(shell pwd):/yarp yarp/fuzz /bin/bash -c "FUZZ_FLAGS=\"$(FUZZ_FLAGS)\" make build/fuzz.$*"
67
68
  $(ECHO) "starting AFL++ run"
data/README.md CHANGED
@@ -8,7 +8,7 @@ The repository contains the infrastructure for both a shared library (librubypar
8
8
 
9
9
  ```
10
10
  .
11
- ├── Makefile.in configuration to compile the shared library and native tests
11
+ ├── Makefile configuration to compile the shared library and native tests
12
12
  ├── Rakefile configuration to compile the native extension and run the Ruby tests
13
13
  ├── bin
14
14
  │   ├── lex runs the lexer on a file or string, prints the tokens, and compares to ripper
@@ -29,6 +29,8 @@ The repository contains the infrastructure for both a shared library (librubypar
29
29
  │   ├── yarp Ruby library files
30
30
  │   └── yarp.rb main entrypoint for the Ruby library
31
31
  ├── rakelib various Rake tasks for the project
32
+ ├── rust
33
+ │   └── yarp-sys FFI binding for Rust
32
34
  ├── src
33
35
  │   ├── enc various encoding files
34
36
  │   ├── util various utility files
@@ -45,7 +47,7 @@ The repository contains the infrastructure for both a shared library (librubypar
45
47
  To compile the shared library, you will need:
46
48
 
47
49
  * A C99 compiler
48
- * autotools (autoconf, automake, libtool)
50
+ * autotools autoconf, automake, libtool)
49
51
  * make
50
52
  * Ruby 3.3.0-preview1 or later
51
53
 
@@ -77,10 +79,11 @@ See the [CONTRIBUTING.md](CONTRIBUTING.md) file for more information. We additio
77
79
  * [Configuration](docs/configuration.md)
78
80
  * [Design](docs/design.md)
79
81
  * [Encoding](docs/encoding.md)
80
- * [Extension](docs/extension.md)
81
82
  * [Fuzzing](docs/fuzzing.md)
82
83
  * [Heredocs](docs/heredocs.md)
83
84
  * [Mapping](docs/mapping.md)
84
85
  * [Ripper](docs/ripper.md)
86
+ * [Ruby API](docs/ruby_api.md)
85
87
  * [Serialization](docs/serialization.md)
86
88
  * [Testing](docs/testing.md)
89
+
data/config.yml CHANGED
@@ -337,7 +337,7 @@ flags:
337
337
  values:
338
338
  - name: BEGIN_MODIFIER
339
339
  comment: "a loop after a begin statement, so the body is executed first before the condition"
340
- - name: RangeNodeFlags
340
+ - name: RangeFlags
341
341
  values:
342
342
  - name: EXCLUDE_END
343
343
  comment: "... operator"
@@ -399,6 +399,19 @@ nodes:
399
399
 
400
400
  left and right
401
401
  ^^^^^^^^^^^^^^
402
+ - name: AndWriteNode
403
+ child_nodes:
404
+ - name: target
405
+ type: node
406
+ - name: value
407
+ type: node
408
+ - name: operator_loc
409
+ type: location
410
+ comment: |
411
+ Represents the use of the `&&=` operator.
412
+
413
+ target &&= value
414
+ ^^^^^^^^^^^^^^^^
402
415
  - name: ArgumentsNode
403
416
  child_nodes:
404
417
  - name: arguments
@@ -527,7 +540,7 @@ nodes:
527
540
  - name: parameters
528
541
  type: node?
529
542
  kind: BlockParametersNode
530
- - name: statements
543
+ - name: body
531
544
  type: node?
532
545
  - name: opening_loc
533
546
  type: location
@@ -601,7 +614,8 @@ nodes:
601
614
  type: node?
602
615
  kind: BlockNode
603
616
  - name: flags
604
- type: uint32
617
+ type: flags
618
+ kind: CallNodeFlags
605
619
  - name: name
606
620
  type: string
607
621
  comment: |
@@ -713,7 +727,7 @@ nodes:
713
727
  type: location?
714
728
  - name: superclass
715
729
  type: node?
716
- - name: statements
730
+ - name: body
717
731
  type: node?
718
732
  - name: end_keyword_loc
719
733
  type: location
@@ -722,47 +736,6 @@ nodes:
722
736
 
723
737
  class Foo end
724
738
  ^^^^^^^^^^^^^
725
- - name: ClassVariableOperatorAndWriteNode
726
- child_nodes:
727
- - name: name_loc
728
- type: location
729
- - name: operator_loc
730
- type: location
731
- - name: value
732
- type: node
733
- comment: |
734
- Represents the use of the `&&=` operator for assignment to a class variable.
735
-
736
- @@target &&= value
737
- ^^^^^^^^^^^^^^^^
738
- - name: ClassVariableOperatorOrWriteNode
739
- child_nodes:
740
- - name: name_loc
741
- type: location
742
- - name: operator_loc
743
- type: location
744
- - name: value
745
- type: node
746
- comment: |
747
- Represents the use of the `||=` operator for assignment to a class variable.
748
-
749
- @@target ||= value
750
- ^^^^^^^^^^^^^^^^^^
751
- - name: ClassVariableOperatorWriteNode
752
- child_nodes:
753
- - name: name_loc
754
- type: location
755
- - name: operator_loc
756
- type: location
757
- - name: value
758
- type: node
759
- - name: operator
760
- type: constant
761
- comment: |
762
- Represents assigning to a class variable using an operator that isn't `=`.
763
-
764
- @@target += value
765
- ^^^^^^^^^^^^^^^^^
766
739
  - name: ClassVariableReadNode
767
740
  comment: |
768
741
  Represents referencing a class variable.
@@ -782,47 +755,6 @@ nodes:
782
755
 
783
756
  @@foo = 1
784
757
  ^^^^^^^^^
785
- - name: ConstantOperatorAndWriteNode
786
- child_nodes:
787
- - name: name_loc
788
- type: location
789
- - name: operator_loc
790
- type: location
791
- - name: value
792
- type: node
793
- comment: |
794
- Represents the use of the `&&=` operator for assignment to a constant.
795
-
796
- Target &&= value
797
- ^^^^^^^^^^^^^^^^
798
- - name: ConstantOperatorOrWriteNode
799
- child_nodes:
800
- - name: name_loc
801
- type: location
802
- - name: operator_loc
803
- type: location
804
- - name: value
805
- type: node
806
- comment: |
807
- Represents the use of the `||=` operator for assignment to a constant.
808
-
809
- Target ||= value
810
- ^^^^^^^^^^^^^^^^
811
- - name: ConstantOperatorWriteNode
812
- child_nodes:
813
- - name: name_loc
814
- type: location
815
- - name: operator_loc
816
- type: location
817
- - name: value
818
- type: node
819
- - name: operator
820
- type: constant
821
- comment: |
822
- Represents assigning to a constant using an operator that isn't `=`.
823
-
824
- Target += value
825
- ^^^^^^^^^^^^^^^
826
758
  - name: ConstantPathNode
827
759
  child_nodes:
828
760
  - name: parent
@@ -836,50 +768,6 @@ nodes:
836
768
 
837
769
  Foo::Bar
838
770
  ^^^^^^^^
839
- - name: ConstantPathOperatorAndWriteNode
840
- child_nodes:
841
- - name: target
842
- type: node
843
- kind: ConstantPathNode
844
- - name: operator_loc
845
- type: location
846
- - name: value
847
- type: node
848
- comment: |
849
- Represents the use of the `&&=` operator for assignment to a constant path.
850
-
851
- Parent::Child &&= value
852
- ^^^^^^^^^^^^^^^^^^^^^^^
853
- - name: ConstantPathOperatorOrWriteNode
854
- child_nodes:
855
- - name: target
856
- type: node
857
- kind: ConstantPathNode
858
- - name: operator_loc
859
- type: location
860
- - name: value
861
- type: node
862
- comment: |
863
- Represents the use of the `||=` operator for assignment to a constant path.
864
-
865
- Parent::Child ||= value
866
- ^^^^^^^^^^^^^^^^^^^^^^^
867
- - name: ConstantPathOperatorWriteNode
868
- child_nodes:
869
- - name: target
870
- type: node
871
- kind: ConstantPathNode
872
- - name: operator_loc
873
- type: location
874
- - name: value
875
- type: node
876
- - name: operator
877
- type: constant
878
- comment: |
879
- Represents assigning to a constant path using an operator that isn't `=`.
880
-
881
- Parent::Child += value
882
- ^^^^^^^^^^^^^^^^^^^^^^
883
771
  - name: ConstantPathWriteNode
884
772
  child_nodes:
885
773
  - name: target
@@ -928,7 +816,7 @@ nodes:
928
816
  - name: parameters
929
817
  type: node?
930
818
  kind: ParametersNode
931
- - name: statements
819
+ - name: body
932
820
  type: node?
933
821
  - name: locals
934
822
  type: constant[]
@@ -1053,6 +941,22 @@ nodes:
1053
941
 
1054
942
  foo in Foo(*bar, baz, *qux)
1055
943
  ^^^^^^^^^^^^^^^^^^^^^^^^^^^
944
+ - name: FlipFlopNode
945
+ child_nodes:
946
+ - name: left
947
+ type: node?
948
+ - name: right
949
+ type: node?
950
+ - name: operator_loc
951
+ type: location
952
+ - name: flags
953
+ type: flags
954
+ kind: RangeFlags
955
+ comment: |
956
+ Represents the use of the `..` or `...` operators to create flip flops.
957
+
958
+ baz if foo .. bar
959
+ ^^^^^^^^^^
1056
960
  - name: FloatNode
1057
961
  comment: |
1058
962
  Represents a floating point number literal.
@@ -1106,47 +1010,6 @@ nodes:
1106
1010
 
1107
1011
  super
1108
1012
  ^^^^^
1109
- - name: GlobalVariableOperatorAndWriteNode
1110
- child_nodes:
1111
- - name: name_loc
1112
- type: location
1113
- - name: operator_loc
1114
- type: location
1115
- - name: value
1116
- type: node
1117
- comment: |
1118
- Represents the use of the `&&=` operator for assignment to a global variable.
1119
-
1120
- $target &&= value
1121
- ^^^^^^^^^^^^^^^^^
1122
- - name: GlobalVariableOperatorOrWriteNode
1123
- child_nodes:
1124
- - name: name_loc
1125
- type: location
1126
- - name: operator_loc
1127
- type: location
1128
- - name: value
1129
- type: node
1130
- comment: |
1131
- Represents the use of the `||=` operator for assignment to a global variable.
1132
-
1133
- $target ||= value
1134
- ^^^^^^^^^^^^^^^^^
1135
- - name: GlobalVariableOperatorWriteNode
1136
- child_nodes:
1137
- - name: name_loc
1138
- type: location
1139
- - name: operator_loc
1140
- type: location
1141
- - name: value
1142
- type: node
1143
- - name: operator
1144
- type: constant
1145
- comment: |
1146
- Represents assigning to a global variable using an operator that isn't `=`.
1147
-
1148
- $target += value
1149
- ^^^^^^^^^^^^^^^^
1150
1013
  - name: GlobalVariableReadNode
1151
1014
  comment: |
1152
1015
  Represents referencing a global variable.
@@ -1246,47 +1109,6 @@ nodes:
1246
1109
 
1247
1110
  case a; in b then c end
1248
1111
  ^^^^^^^^^^^
1249
- - name: InstanceVariableOperatorAndWriteNode
1250
- child_nodes:
1251
- - name: name_loc
1252
- type: location
1253
- - name: operator_loc
1254
- type: location
1255
- - name: value
1256
- type: node
1257
- comment: |
1258
- Represents the use of the `&&=` operator for assignment to an instance variable.
1259
-
1260
- @target &&= value
1261
- ^^^^^^^^^^^^^^^^^
1262
- - name: InstanceVariableOperatorOrWriteNode
1263
- child_nodes:
1264
- - name: name_loc
1265
- type: location
1266
- - name: operator_loc
1267
- type: location
1268
- - name: value
1269
- type: node
1270
- comment: |
1271
- Represents the use of the `||=` operator for assignment to an instance variable.
1272
-
1273
- @target ||= value
1274
- ^^^^^^^^^^^^^^^^^
1275
- - name: InstanceVariableOperatorWriteNode
1276
- child_nodes:
1277
- - name: name_loc
1278
- type: location
1279
- - name: operator_loc
1280
- type: location
1281
- - name: value
1282
- type: node
1283
- - name: operator
1284
- type: constant
1285
- comment: |
1286
- Represents assigning to an instance variable using an operator that isn't `=`.
1287
-
1288
- @target += value
1289
- ^^^^^^^^^^^^^^^^
1290
1112
  - name: InstanceVariableReadNode
1291
1113
  comment: |
1292
1114
  Represents referencing an instance variable.
@@ -1321,7 +1143,8 @@ nodes:
1321
1143
  - name: closing_loc
1322
1144
  type: location
1323
1145
  - name: flags
1324
- type: uint32
1146
+ type: flags
1147
+ kind: RegularExpressionFlags
1325
1148
  newline: parts
1326
1149
  comment: |
1327
1150
  Represents a regular expression literal that contains interpolation.
@@ -1416,60 +1239,13 @@ nodes:
1416
1239
  - name: parameters
1417
1240
  type: node?
1418
1241
  kind: BlockParametersNode
1419
- - name: statements
1242
+ - name: body
1420
1243
  type: node?
1421
1244
  comment: |
1422
1245
  Represents using a lambda literal (not the lambda method call).
1423
1246
 
1424
1247
  ->(value) { value * 2 }
1425
1248
  ^^^^^^^^^^^^^^^^^^^^^^^
1426
- - name: LocalVariableOperatorAndWriteNode
1427
- child_nodes:
1428
- - name: name_loc
1429
- type: location
1430
- - name: operator_loc
1431
- type: location
1432
- - name: value
1433
- type: node
1434
- - name: constant_id
1435
- type: constant
1436
- comment: |
1437
- Represents the use of the `&&=` operator for assignment to a local variable.
1438
-
1439
- target &&= value
1440
- ^^^^^^^^^^^^^^^^
1441
- - name: LocalVariableOperatorOrWriteNode
1442
- child_nodes:
1443
- - name: name_loc
1444
- type: location
1445
- - name: operator_loc
1446
- type: location
1447
- - name: value
1448
- type: node
1449
- - name: constant_id
1450
- type: constant
1451
- comment: |
1452
- Represents the use of the `||=` operator for assignment to a local variable.
1453
-
1454
- target ||= value
1455
- ^^^^^^^^^^^^^^^^
1456
- - name: LocalVariableOperatorWriteNode
1457
- child_nodes:
1458
- - name: name_loc
1459
- type: location
1460
- - name: operator_loc
1461
- type: location
1462
- - name: value
1463
- type: node
1464
- - name: constant_id
1465
- type: constant
1466
- - name: operator_id
1467
- type: constant
1468
- comment: |
1469
- Represents assigning to a local variable using an operator that isn't `=`.
1470
-
1471
- target += value
1472
- ^^^^^^^^^^^^^^^
1473
1249
  - name: LocalVariableReadNode
1474
1250
  child_nodes:
1475
1251
  - name: constant_id
@@ -1538,7 +1314,7 @@ nodes:
1538
1314
  type: location
1539
1315
  - name: constant_path
1540
1316
  type: node
1541
- - name: statements
1317
+ - name: body
1542
1318
  type: node?
1543
1319
  - name: end_keyword_loc
1544
1320
  type: location
@@ -1600,6 +1376,21 @@ nodes:
1600
1376
 
1601
1377
  $1
1602
1378
  ^^
1379
+ - name: OperatorWriteNode
1380
+ child_nodes:
1381
+ - name: target
1382
+ type: node
1383
+ - name: operator_loc
1384
+ type: location
1385
+ - name: operator
1386
+ type: constant
1387
+ - name: value
1388
+ type: node
1389
+ comment: |
1390
+ Represents the use of an operator on a write.
1391
+
1392
+ target += value
1393
+ ^^^^^^^^^^^^^^^
1603
1394
  - name: OptionalParameterNode
1604
1395
  child_nodes:
1605
1396
  - name: constant_id
@@ -1629,6 +1420,19 @@ nodes:
1629
1420
 
1630
1421
  left or right
1631
1422
  ^^^^^^^^^^^^^
1423
+ - name: OrWriteNode
1424
+ child_nodes:
1425
+ - name: target
1426
+ type: node
1427
+ - name: value
1428
+ type: node
1429
+ - name: operator_loc
1430
+ type: location
1431
+ comment: |
1432
+ Represents the use of the `||=` operator.
1433
+
1434
+ target ||= value
1435
+ ^^^^^^^^^^^^^^^^
1632
1436
  - name: ParametersNode
1633
1437
  child_nodes:
1634
1438
  - name: requireds
@@ -1655,7 +1459,7 @@ nodes:
1655
1459
  end
1656
1460
  - name: ParenthesesNode
1657
1461
  child_nodes:
1658
- - name: statements
1462
+ - name: body
1659
1463
  type: node?
1660
1464
  - name: opening_loc
1661
1465
  type: location
@@ -1744,7 +1548,8 @@ nodes:
1744
1548
  - name: operator_loc
1745
1549
  type: location
1746
1550
  - name: flags
1747
- type: uint32
1551
+ type: flags
1552
+ kind: RangeFlags
1748
1553
  comment: |
1749
1554
  Represents the use of the `..` or `...` operators.
1750
1555
 
@@ -1779,7 +1584,8 @@ nodes:
1779
1584
  - name: unescaped
1780
1585
  type: string
1781
1586
  - name: flags
1782
- type: uint32
1587
+ type: flags
1588
+ kind: RegularExpressionFlags
1783
1589
  comment: |
1784
1590
  Represents a regular expression literal with no interpolation.
1785
1591
 
@@ -1896,7 +1702,7 @@ nodes:
1896
1702
  type: location
1897
1703
  - name: expression
1898
1704
  type: node
1899
- - name: statements
1705
+ - name: body
1900
1706
  type: node?
1901
1707
  - name: end_keyword_loc
1902
1708
  type: location
@@ -1912,7 +1718,6 @@ nodes:
1912
1718
  __ENCODING__
1913
1719
  ^^^^^^^^^^^^
1914
1720
  - name: SourceFileNode
1915
- is_migrated: true
1916
1721
  child_nodes:
1917
1722
  - name: filepath
1918
1723
  type: string
@@ -2070,7 +1875,8 @@ nodes:
2070
1875
  type: node?
2071
1876
  kind: StatementsNode
2072
1877
  - name: flags
2073
- type: uint32
1878
+ type: flags
1879
+ kind: LoopFlags
2074
1880
  newline: predicate
2075
1881
  comment: |
2076
1882
  Represents the use of the `until` keyword, either in the block form or the modifier form.
@@ -2090,10 +1896,12 @@ nodes:
2090
1896
  type: node?
2091
1897
  kind: StatementsNode
2092
1898
  comment: |
2093
- case true
2094
- when true
2095
- ^^^^^^^^^
2096
- end
1899
+ Represents the use of the `when` keyword within a case statement.
1900
+
1901
+ case true
1902
+ when true
1903
+ ^^^^^^^^^
1904
+ end
2097
1905
  - name: WhileNode
2098
1906
  child_nodes:
2099
1907
  - name: keyword_loc
@@ -2104,7 +1912,8 @@ nodes:
2104
1912
  type: node?
2105
1913
  kind: StatementsNode
2106
1914
  - name: flags
2107
- type: uint32
1915
+ type: flags
1916
+ kind: LoopFlags
2108
1917
  newline: predicate
2109
1918
  comment: |
2110
1919
  Represents the use of the `while` keyword, either in the block form or the modifier form.