yarp 0.6.0 → 0.8.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.
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.