yarp 0.8.0 → 0.9.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +34 -1
- data/README.md +4 -3
- data/config.yml +332 -52
- data/docs/configuration.md +1 -0
- data/docs/ruby_api.md +2 -0
- data/docs/serialization.md +1 -1
- data/docs/testing.md +2 -2
- data/ext/yarp/api_node.c +703 -136
- data/ext/yarp/extension.c +73 -24
- data/ext/yarp/extension.h +2 -2
- data/include/yarp/ast.h +331 -137
- data/include/yarp/node.h +10 -0
- data/include/yarp/unescape.h +4 -2
- data/include/yarp/util/yp_newline_list.h +3 -0
- data/include/yarp/version.h +2 -2
- data/include/yarp.h +10 -0
- data/lib/yarp/desugar_visitor.rb +267 -0
- data/lib/yarp/ffi.rb +27 -1
- data/lib/yarp/lex_compat.rb +93 -25
- data/lib/yarp/mutation_visitor.rb +683 -0
- data/lib/yarp/node.rb +3042 -508
- data/lib/yarp/serialize.rb +198 -126
- data/lib/yarp.rb +48 -2
- data/src/node.c +421 -185
- data/src/prettyprint.c +262 -80
- data/src/serialize.c +410 -270
- data/src/token_type.c +2 -2
- data/src/unescape.c +69 -51
- data/src/util/yp_newline_list.c +10 -0
- data/src/yarp.c +1208 -458
- data/yarp.gemspec +3 -1
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: '028bafce371c205e4f9a845aa0328a8911519b064ec92be9a970c0077088ca5c'
|
4
|
+
data.tar.gz: ed653e7a3734884de2f42d1df304be7eb1532b29d7acf63214c747ee84426ec0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e33c681424d19626c0ee1d5c21265bcdfce4ec56909a5707d4bf7025ea5356b5ac41b080a1e54a8490124065a1595bd5833af8e488558f0ff01c4f14a92d0430
|
7
|
+
data.tar.gz: d55c0483e944f9a33e76a2baeef11841da8f8bf8755512ff90497d07b0fedf2dc568f6ad8c384831b6b382b1482e34177c6dbd8314d6570542c59faca71ad23e
|
data/CHANGELOG.md
CHANGED
@@ -6,6 +6,38 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) a
|
|
6
6
|
|
7
7
|
## [Unreleased]
|
8
8
|
|
9
|
+
## [0.9.0] - 2023-08-25
|
10
|
+
|
11
|
+
### Added
|
12
|
+
|
13
|
+
- Regular expressions can now be bound by `\n`, `\r`, and a combination of `\r\n`.
|
14
|
+
- Strings delimited by `%`, `%q`, and `%Q` can now be bound by `\n`, `\r`, and a combination of `\r\n`.
|
15
|
+
- `IntegerNode#value` now returns the value of the integer as a Ruby `Integer`.
|
16
|
+
- `FloatNode#value` now returns the value of the float as a Ruby `Float`.
|
17
|
+
- `RationalNode#value` now returns the value of the rational as a Ruby `Rational`.
|
18
|
+
- `ImaginaryNode#value` now returns the value of the imaginary as a Ruby `Complex`.
|
19
|
+
- `ClassNode#name` is now a string that returns the name of just the class, without the namespace.
|
20
|
+
- `ModuleNode#name` is now a string that returns the name of just the module, without the namespace.
|
21
|
+
- Regular expressions and strings found after a heredoc declaration but before the heredoc body are now parsed correctly.
|
22
|
+
- The serialization API now supports shared strings, which should help reduce the size of the serialized AST.
|
23
|
+
- `*Node#copy` is introduced, which returns a copy of the node with the given overrides.
|
24
|
+
- `Location#copy` is introduced, which returns a copy of the location with the given overrides.
|
25
|
+
- `DesugarVisitor` is introduced, which provides a simpler AST for use in tools that want to process fewer node types.
|
26
|
+
- `{ClassVariable,Constant,ConstantPath,GlobalVariable,InstanceVariable,LocalVariable}TargetNode` are introduced. These nodes represent the target of writes in locations where a value cannot be provided, like a multi write or a rescue reference.
|
27
|
+
- `UntilNode#closing_loc` and `WhileNode#closing_loc` are now provided.
|
28
|
+
- `Location#join` is now provided, which joins two locations together.
|
29
|
+
- `YARP::parse_lex` and `YARP::parse_lex_file` are introduced to parse and lex in one result.
|
30
|
+
|
31
|
+
### Changed
|
32
|
+
|
33
|
+
- When there is a magic encoding comment, the encoding of the first token's source string is now properly reencoded.
|
34
|
+
- Constants followed by unary `&` are now properly parsed as a call with a passed block argument.
|
35
|
+
- Escaping multi-byte characters in a string literal will now properly escape the entire character.
|
36
|
+
- `YARP.lex_compat` now has more accurate behavior when a byte-order mark is present in the file.
|
37
|
+
- **BREAKING**: `AndWriteNode`, `OrWriteNode`, and `OperatorWriteNode` have been split back up into their `0.7.0` versions.
|
38
|
+
- We now properly support spaces between the `encoding` and `=`/`:` in a magic encoding comment.
|
39
|
+
- We now properly parse `-> foo: bar do end`.
|
40
|
+
|
9
41
|
## [0.8.0] - 2023-08-18
|
10
42
|
|
11
43
|
### Added
|
@@ -49,7 +81,8 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) a
|
|
49
81
|
|
50
82
|
- 🎉 Initial release! 🎉
|
51
83
|
|
52
|
-
[unreleased]: https://github.com/ruby/yarp/compare/v0.
|
84
|
+
[unreleased]: https://github.com/ruby/yarp/compare/v0.9.0...HEAD
|
85
|
+
[0.9.0]: https://github.com/ruby/yarp/compare/v0.8.0...v0.9.0
|
53
86
|
[0.8.0]: https://github.com/ruby/yarp/compare/v0.7.0...v0.8.0
|
54
87
|
[0.7.0]: https://github.com/ruby/yarp/compare/v0.6.0...v0.7.0
|
55
88
|
[0.6.0]: https://github.com/ruby/yarp/compare/d60531...v0.6.0
|
data/README.md
CHANGED
@@ -14,7 +14,6 @@ The repository contains the infrastructure for both a shared library (librubypar
|
|
14
14
|
│ ├── lex runs the lexer on a file or string, prints the tokens, and compares to ripper
|
15
15
|
│ └── parse runs the parser on a file or string and prints the syntax tree
|
16
16
|
├── config.yml specification for tokens and nodes in the tree
|
17
|
-
├── configure.ac configuration to generate the Makefile
|
18
17
|
├── docs documentation about the project
|
19
18
|
├── ext
|
20
19
|
│ └── yarp
|
@@ -30,6 +29,7 @@ The repository contains the infrastructure for both a shared library (librubypar
|
|
30
29
|
│ └── yarp.rb main entrypoint for the Ruby library
|
31
30
|
├── rakelib various Rake tasks for the project
|
32
31
|
├── rust
|
32
|
+
│ ├── yarp Rustified crate for the shared library
|
33
33
|
│ └── yarp-sys FFI binding for Rust
|
34
34
|
├── src
|
35
35
|
│ ├── enc various encoding files
|
@@ -38,8 +38,9 @@ The repository contains the infrastructure for both a shared library (librubypar
|
|
38
38
|
├── templates contains ERB templates generated by templates/template.rb
|
39
39
|
│ └── template.rb generates code from the nodes and tokens configured by config.yml
|
40
40
|
└── test
|
41
|
-
|
42
|
-
|
41
|
+
└── yarp
|
42
|
+
├── fixtures Ruby code used for testing
|
43
|
+
└── snapshots snapshots of generated syntax trees corresponding to fixtures
|
43
44
|
```
|
44
45
|
|
45
46
|
## Getting started
|
data/config.yml
CHANGED
@@ -399,19 +399,6 @@ 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
|
-
^^^^^^^^^^^^^^^^
|
415
402
|
- name: ArgumentsNode
|
416
403
|
child_nodes:
|
417
404
|
- name: arguments
|
@@ -731,17 +718,66 @@ nodes:
|
|
731
718
|
type: node?
|
732
719
|
- name: end_keyword_loc
|
733
720
|
type: location
|
721
|
+
- name: name
|
722
|
+
type: string
|
734
723
|
comment: |
|
735
724
|
Represents a class declaration involving the `class` keyword.
|
736
725
|
|
737
726
|
class Foo end
|
738
727
|
^^^^^^^^^^^^^
|
728
|
+
- name: ClassVariableAndWriteNode
|
729
|
+
child_nodes:
|
730
|
+
- name: name_loc
|
731
|
+
type: location
|
732
|
+
- name: operator_loc
|
733
|
+
type: location
|
734
|
+
- name: value
|
735
|
+
type: node
|
736
|
+
comment: |
|
737
|
+
Represents the use of the `&&=` operator for assignment to a class variable.
|
738
|
+
|
739
|
+
@@target &&= value
|
740
|
+
^^^^^^^^^^^^^^^^
|
741
|
+
- name: ClassVariableOperatorWriteNode
|
742
|
+
child_nodes:
|
743
|
+
- name: name_loc
|
744
|
+
type: location
|
745
|
+
- name: operator_loc
|
746
|
+
type: location
|
747
|
+
- name: value
|
748
|
+
type: node
|
749
|
+
- name: operator
|
750
|
+
type: constant
|
751
|
+
comment: |
|
752
|
+
Represents assigning to a class variable using an operator that isn't `=`.
|
753
|
+
|
754
|
+
@@target += value
|
755
|
+
^^^^^^^^^^^^^^^^^
|
756
|
+
- name: ClassVariableOrWriteNode
|
757
|
+
child_nodes:
|
758
|
+
- name: name_loc
|
759
|
+
type: location
|
760
|
+
- name: operator_loc
|
761
|
+
type: location
|
762
|
+
- name: value
|
763
|
+
type: node
|
764
|
+
comment: |
|
765
|
+
Represents the use of the `||=` operator for assignment to a class variable.
|
766
|
+
|
767
|
+
@@target ||= value
|
768
|
+
^^^^^^^^^^^^^^^^^^
|
739
769
|
- name: ClassVariableReadNode
|
740
770
|
comment: |
|
741
771
|
Represents referencing a class variable.
|
742
772
|
|
743
773
|
@@foo
|
744
774
|
^^^^^
|
775
|
+
- name: ClassVariableTargetNode
|
776
|
+
comment: |
|
777
|
+
Represents writing to a class variable in a context that doesn't have an explicit value.
|
778
|
+
|
779
|
+
@@foo, @@bar = baz
|
780
|
+
^^^^^ ^^^^^
|
745
781
|
- name: ClassVariableWriteNode
|
746
782
|
child_nodes:
|
747
783
|
- name: name_loc
|
@@ -755,6 +791,61 @@ nodes:
|
|
755
791
|
|
756
792
|
@@foo = 1
|
757
793
|
^^^^^^^^^
|
794
|
+
- name: ConstantAndWriteNode
|
795
|
+
child_nodes:
|
796
|
+
- name: name_loc
|
797
|
+
type: location
|
798
|
+
- name: operator_loc
|
799
|
+
type: location
|
800
|
+
- name: value
|
801
|
+
type: node
|
802
|
+
comment: |
|
803
|
+
Represents the use of the `&&=` operator for assignment to a constant.
|
804
|
+
|
805
|
+
Target &&= value
|
806
|
+
^^^^^^^^^^^^^^^^
|
807
|
+
- name: ConstantOperatorWriteNode
|
808
|
+
child_nodes:
|
809
|
+
- name: name_loc
|
810
|
+
type: location
|
811
|
+
- name: operator_loc
|
812
|
+
type: location
|
813
|
+
- name: value
|
814
|
+
type: node
|
815
|
+
- name: operator
|
816
|
+
type: constant
|
817
|
+
comment: |
|
818
|
+
Represents assigning to a constant using an operator that isn't `=`.
|
819
|
+
|
820
|
+
Target += value
|
821
|
+
^^^^^^^^^^^^^^^
|
822
|
+
- name: ConstantOrWriteNode
|
823
|
+
child_nodes:
|
824
|
+
- name: name_loc
|
825
|
+
type: location
|
826
|
+
- name: operator_loc
|
827
|
+
type: location
|
828
|
+
- name: value
|
829
|
+
type: node
|
830
|
+
comment: |
|
831
|
+
Represents the use of the `||=` operator for assignment to a constant.
|
832
|
+
|
833
|
+
Target ||= value
|
834
|
+
^^^^^^^^^^^^^^^^
|
835
|
+
- name: ConstantPathAndWriteNode
|
836
|
+
child_nodes:
|
837
|
+
- name: target
|
838
|
+
type: node
|
839
|
+
kind: ConstantPathNode
|
840
|
+
- name: operator_loc
|
841
|
+
type: location
|
842
|
+
- name: value
|
843
|
+
type: node
|
844
|
+
comment: |
|
845
|
+
Represents the use of the `&&=` operator for assignment to a constant path.
|
846
|
+
|
847
|
+
Parent::Child &&= value
|
848
|
+
^^^^^^^^^^^^^^^^^^^^^^^
|
758
849
|
- name: ConstantPathNode
|
759
850
|
child_nodes:
|
760
851
|
- name: parent
|
@@ -768,15 +859,58 @@ nodes:
|
|
768
859
|
|
769
860
|
Foo::Bar
|
770
861
|
^^^^^^^^
|
771
|
-
- name:
|
862
|
+
- name: ConstantPathOperatorWriteNode
|
772
863
|
child_nodes:
|
773
864
|
- name: target
|
774
865
|
type: node
|
775
866
|
kind: ConstantPathNode
|
776
867
|
- name: operator_loc
|
777
|
-
type: location
|
868
|
+
type: location
|
869
|
+
- name: value
|
870
|
+
type: node
|
871
|
+
- name: operator
|
872
|
+
type: constant
|
873
|
+
comment: |
|
874
|
+
Represents assigning to a constant path using an operator that isn't `=`.
|
875
|
+
|
876
|
+
Parent::Child += value
|
877
|
+
^^^^^^^^^^^^^^^^^^^^^^
|
878
|
+
- name: ConstantPathOrWriteNode
|
879
|
+
child_nodes:
|
880
|
+
- name: target
|
881
|
+
type: node
|
882
|
+
kind: ConstantPathNode
|
883
|
+
- name: operator_loc
|
884
|
+
type: location
|
778
885
|
- name: value
|
886
|
+
type: node
|
887
|
+
comment: |
|
888
|
+
Represents the use of the `||=` operator for assignment to a constant path.
|
889
|
+
|
890
|
+
Parent::Child ||= value
|
891
|
+
^^^^^^^^^^^^^^^^^^^^^^^
|
892
|
+
- name: ConstantPathTargetNode
|
893
|
+
child_nodes:
|
894
|
+
- name: parent
|
779
895
|
type: node?
|
896
|
+
- name: child
|
897
|
+
type: node
|
898
|
+
- name: delimiter_loc
|
899
|
+
type: location
|
900
|
+
comment: |
|
901
|
+
Represents writing to a constant path in a context that doesn't have an explicit value.
|
902
|
+
|
903
|
+
Foo::Foo, Bar::Bar = baz
|
904
|
+
^^^^^^^^ ^^^^^^^^
|
905
|
+
- name: ConstantPathWriteNode
|
906
|
+
child_nodes:
|
907
|
+
- name: target
|
908
|
+
type: node
|
909
|
+
kind: ConstantPathNode
|
910
|
+
- name: operator_loc
|
911
|
+
type: location
|
912
|
+
- name: value
|
913
|
+
type: node
|
780
914
|
comment: |
|
781
915
|
Represents writing to a constant path.
|
782
916
|
|
@@ -794,14 +928,20 @@ nodes:
|
|
794
928
|
|
795
929
|
Foo
|
796
930
|
^^^
|
931
|
+
- name: ConstantTargetNode
|
932
|
+
comment: |
|
933
|
+
Represents writing to a constant in a context that doesn't have an explicit value.
|
934
|
+
|
935
|
+
Foo, Bar = baz
|
936
|
+
^^^ ^^^
|
797
937
|
- name: ConstantWriteNode
|
798
938
|
child_nodes:
|
799
939
|
- name: name_loc
|
800
940
|
type: location
|
801
941
|
- name: value
|
802
|
-
type: node
|
942
|
+
type: node
|
803
943
|
- name: operator_loc
|
804
|
-
type: location
|
944
|
+
type: location
|
805
945
|
comment: |
|
806
946
|
Represents writing to a constant.
|
807
947
|
|
@@ -1010,20 +1150,67 @@ nodes:
|
|
1010
1150
|
|
1011
1151
|
super
|
1012
1152
|
^^^^^
|
1153
|
+
- name: GlobalVariableAndWriteNode
|
1154
|
+
child_nodes:
|
1155
|
+
- name: name_loc
|
1156
|
+
type: location
|
1157
|
+
- name: operator_loc
|
1158
|
+
type: location
|
1159
|
+
- name: value
|
1160
|
+
type: node
|
1161
|
+
comment: |
|
1162
|
+
Represents the use of the `&&=` operator for assignment to a global variable.
|
1163
|
+
|
1164
|
+
$target &&= value
|
1165
|
+
^^^^^^^^^^^^^^^^^
|
1166
|
+
- name: GlobalVariableOperatorWriteNode
|
1167
|
+
child_nodes:
|
1168
|
+
- name: name_loc
|
1169
|
+
type: location
|
1170
|
+
- name: operator_loc
|
1171
|
+
type: location
|
1172
|
+
- name: value
|
1173
|
+
type: node
|
1174
|
+
- name: operator
|
1175
|
+
type: constant
|
1176
|
+
comment: |
|
1177
|
+
Represents assigning to a global variable using an operator that isn't `=`.
|
1178
|
+
|
1179
|
+
$target += value
|
1180
|
+
^^^^^^^^^^^^^^^^
|
1181
|
+
- name: GlobalVariableOrWriteNode
|
1182
|
+
child_nodes:
|
1183
|
+
- name: name_loc
|
1184
|
+
type: location
|
1185
|
+
- name: operator_loc
|
1186
|
+
type: location
|
1187
|
+
- name: value
|
1188
|
+
type: node
|
1189
|
+
comment: |
|
1190
|
+
Represents the use of the `||=` operator for assignment to a global variable.
|
1191
|
+
|
1192
|
+
$target ||= value
|
1193
|
+
^^^^^^^^^^^^^^^^^
|
1013
1194
|
- name: GlobalVariableReadNode
|
1014
1195
|
comment: |
|
1015
1196
|
Represents referencing a global variable.
|
1016
1197
|
|
1017
1198
|
$foo
|
1018
1199
|
^^^^
|
1200
|
+
- name: GlobalVariableTargetNode
|
1201
|
+
comment: |
|
1202
|
+
Represents writing to a global variable in a context that doesn't have an explicit value.
|
1203
|
+
|
1204
|
+
$foo, $bar = baz
|
1205
|
+
^^^^ ^^^^
|
1019
1206
|
- name: GlobalVariableWriteNode
|
1020
1207
|
child_nodes:
|
1021
1208
|
- name: name_loc
|
1022
1209
|
type: location
|
1023
1210
|
- name: operator_loc
|
1024
|
-
type: location
|
1211
|
+
type: location
|
1025
1212
|
- name: value
|
1026
|
-
type: node
|
1213
|
+
type: node
|
1027
1214
|
comment: |
|
1028
1215
|
Represents writing to a global variable.
|
1029
1216
|
|
@@ -1109,20 +1296,67 @@ nodes:
|
|
1109
1296
|
|
1110
1297
|
case a; in b then c end
|
1111
1298
|
^^^^^^^^^^^
|
1299
|
+
- name: InstanceVariableAndWriteNode
|
1300
|
+
child_nodes:
|
1301
|
+
- name: name_loc
|
1302
|
+
type: location
|
1303
|
+
- name: operator_loc
|
1304
|
+
type: location
|
1305
|
+
- name: value
|
1306
|
+
type: node
|
1307
|
+
comment: |
|
1308
|
+
Represents the use of the `&&=` operator for assignment to an instance variable.
|
1309
|
+
|
1310
|
+
@target &&= value
|
1311
|
+
^^^^^^^^^^^^^^^^^
|
1312
|
+
- name: InstanceVariableOperatorWriteNode
|
1313
|
+
child_nodes:
|
1314
|
+
- name: name_loc
|
1315
|
+
type: location
|
1316
|
+
- name: operator_loc
|
1317
|
+
type: location
|
1318
|
+
- name: value
|
1319
|
+
type: node
|
1320
|
+
- name: operator
|
1321
|
+
type: constant
|
1322
|
+
comment: |
|
1323
|
+
Represents assigning to an instance variable using an operator that isn't `=`.
|
1324
|
+
|
1325
|
+
@target += value
|
1326
|
+
^^^^^^^^^^^^^^^^
|
1327
|
+
- name: InstanceVariableOrWriteNode
|
1328
|
+
child_nodes:
|
1329
|
+
- name: name_loc
|
1330
|
+
type: location
|
1331
|
+
- name: operator_loc
|
1332
|
+
type: location
|
1333
|
+
- name: value
|
1334
|
+
type: node
|
1335
|
+
comment: |
|
1336
|
+
Represents the use of the `||=` operator for assignment to an instance variable.
|
1337
|
+
|
1338
|
+
@target ||= value
|
1339
|
+
^^^^^^^^^^^^^^^^^
|
1112
1340
|
- name: InstanceVariableReadNode
|
1113
1341
|
comment: |
|
1114
1342
|
Represents referencing an instance variable.
|
1115
1343
|
|
1116
1344
|
@foo
|
1117
1345
|
^^^^
|
1346
|
+
- name: InstanceVariableTargetNode
|
1347
|
+
comment: |
|
1348
|
+
Represents writing to an instance variable in a context that doesn't have an explicit value.
|
1349
|
+
|
1350
|
+
@foo, @bar = baz
|
1351
|
+
^^^^ ^^^^
|
1118
1352
|
- name: InstanceVariableWriteNode
|
1119
1353
|
child_nodes:
|
1120
1354
|
- name: name_loc
|
1121
1355
|
type: location
|
1122
1356
|
- name: value
|
1123
|
-
type: node
|
1357
|
+
type: node
|
1124
1358
|
- name: operator_loc
|
1125
|
-
type: location
|
1359
|
+
type: location
|
1126
1360
|
comment: |
|
1127
1361
|
Represents writing to an instance variable.
|
1128
1362
|
|
@@ -1234,8 +1468,12 @@ nodes:
|
|
1234
1468
|
child_nodes:
|
1235
1469
|
- name: locals
|
1236
1470
|
type: constant[]
|
1471
|
+
- name: operator_loc
|
1472
|
+
type: location
|
1237
1473
|
- name: opening_loc
|
1238
1474
|
type: location
|
1475
|
+
- name: closing_loc
|
1476
|
+
type: location
|
1239
1477
|
- name: parameters
|
1240
1478
|
type: node?
|
1241
1479
|
kind: BlockParametersNode
|
@@ -1246,6 +1484,59 @@ nodes:
|
|
1246
1484
|
|
1247
1485
|
->(value) { value * 2 }
|
1248
1486
|
^^^^^^^^^^^^^^^^^^^^^^^
|
1487
|
+
- name: LocalVariableAndWriteNode
|
1488
|
+
child_nodes:
|
1489
|
+
- name: name_loc
|
1490
|
+
type: location
|
1491
|
+
- name: operator_loc
|
1492
|
+
type: location
|
1493
|
+
- name: value
|
1494
|
+
type: node
|
1495
|
+
- name: constant_id
|
1496
|
+
type: constant
|
1497
|
+
- name: depth
|
1498
|
+
type: uint32
|
1499
|
+
comment: |
|
1500
|
+
Represents the use of the `&&=` operator for assignment to a local variable.
|
1501
|
+
|
1502
|
+
target &&= value
|
1503
|
+
^^^^^^^^^^^^^^^^
|
1504
|
+
- name: LocalVariableOperatorWriteNode
|
1505
|
+
child_nodes:
|
1506
|
+
- name: name_loc
|
1507
|
+
type: location
|
1508
|
+
- name: operator_loc
|
1509
|
+
type: location
|
1510
|
+
- name: value
|
1511
|
+
type: node
|
1512
|
+
- name: constant_id
|
1513
|
+
type: constant
|
1514
|
+
- name: operator_id
|
1515
|
+
type: constant
|
1516
|
+
- name: depth
|
1517
|
+
type: uint32
|
1518
|
+
comment: |
|
1519
|
+
Represents assigning to a local variable using an operator that isn't `=`.
|
1520
|
+
|
1521
|
+
target += value
|
1522
|
+
^^^^^^^^^^^^^^^
|
1523
|
+
- name: LocalVariableOrWriteNode
|
1524
|
+
child_nodes:
|
1525
|
+
- name: name_loc
|
1526
|
+
type: location
|
1527
|
+
- name: operator_loc
|
1528
|
+
type: location
|
1529
|
+
- name: value
|
1530
|
+
type: node
|
1531
|
+
- name: constant_id
|
1532
|
+
type: constant
|
1533
|
+
- name: depth
|
1534
|
+
type: uint32
|
1535
|
+
comment: |
|
1536
|
+
Represents the use of the `||=` operator for assignment to a local variable.
|
1537
|
+
|
1538
|
+
target ||= value
|
1539
|
+
^^^^^^^^^^^^^^^^
|
1249
1540
|
- name: LocalVariableReadNode
|
1250
1541
|
child_nodes:
|
1251
1542
|
- name: constant_id
|
@@ -1259,6 +1550,17 @@ nodes:
|
|
1259
1550
|
|
1260
1551
|
foo
|
1261
1552
|
^^^
|
1553
|
+
- name: LocalVariableTargetNode
|
1554
|
+
child_nodes:
|
1555
|
+
- name: constant_id
|
1556
|
+
type: constant
|
1557
|
+
- name: depth
|
1558
|
+
type: uint32
|
1559
|
+
comment: |
|
1560
|
+
Represents writing to a local variable in a context that doesn't have an explicit value.
|
1561
|
+
|
1562
|
+
foo, bar = baz
|
1563
|
+
^^^ ^^^
|
1262
1564
|
- name: LocalVariableWriteNode
|
1263
1565
|
child_nodes:
|
1264
1566
|
- name: constant_id
|
@@ -1266,11 +1568,11 @@ nodes:
|
|
1266
1568
|
- name: depth
|
1267
1569
|
type: uint32
|
1268
1570
|
- name: value
|
1269
|
-
type: node
|
1571
|
+
type: node
|
1270
1572
|
- name: name_loc
|
1271
1573
|
type: location
|
1272
1574
|
- name: operator_loc
|
1273
|
-
type: location
|
1575
|
+
type: location
|
1274
1576
|
comment: |
|
1275
1577
|
Represents writing to a local variable.
|
1276
1578
|
|
@@ -1318,6 +1620,8 @@ nodes:
|
|
1318
1620
|
type: node?
|
1319
1621
|
- name: end_keyword_loc
|
1320
1622
|
type: location
|
1623
|
+
- name: name
|
1624
|
+
type: string
|
1321
1625
|
comment: |
|
1322
1626
|
Represents a module declaration involving the `module` keyword.
|
1323
1627
|
|
@@ -1376,21 +1680,6 @@ nodes:
|
|
1376
1680
|
|
1377
1681
|
$1
|
1378
1682
|
^^
|
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
|
-
^^^^^^^^^^^^^^^
|
1394
1683
|
- name: OptionalParameterNode
|
1395
1684
|
child_nodes:
|
1396
1685
|
- name: constant_id
|
@@ -1420,19 +1709,6 @@ nodes:
|
|
1420
1709
|
|
1421
1710
|
left or right
|
1422
1711
|
^^^^^^^^^^^^^
|
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
|
-
^^^^^^^^^^^^^^^^
|
1436
1712
|
- name: ParametersNode
|
1437
1713
|
child_nodes:
|
1438
1714
|
- name: requireds
|
@@ -1812,7 +2088,7 @@ nodes:
|
|
1812
2088
|
- name: opening_loc
|
1813
2089
|
type: location?
|
1814
2090
|
- name: value_loc
|
1815
|
-
type: location
|
2091
|
+
type: location?
|
1816
2092
|
- name: closing_loc
|
1817
2093
|
type: location?
|
1818
2094
|
- name: unescaped
|
@@ -1869,6 +2145,8 @@ nodes:
|
|
1869
2145
|
child_nodes:
|
1870
2146
|
- name: keyword_loc
|
1871
2147
|
type: location
|
2148
|
+
- name: closing_loc
|
2149
|
+
type: location?
|
1872
2150
|
- name: predicate
|
1873
2151
|
type: node
|
1874
2152
|
- name: statements
|
@@ -1906,6 +2184,8 @@ nodes:
|
|
1906
2184
|
child_nodes:
|
1907
2185
|
- name: keyword_loc
|
1908
2186
|
type: location
|
2187
|
+
- name: closing_loc
|
2188
|
+
type: location?
|
1909
2189
|
- name: predicate
|
1910
2190
|
type: node
|
1911
2191
|
- name: statements
|
data/docs/configuration.md
CHANGED
@@ -7,6 +7,7 @@ A lot of code in YARP's repository is templated from a single configuration file
|
|
7
7
|
* `java/org/yarp/AbstractNodeVisitor.java` - for defining the visitor interface for the nodes in Java
|
8
8
|
* `java/org/yarp/Loader.java` - for defining how to deserialize the nodes in Java
|
9
9
|
* `java/org/yarp/Nodes.java` - for defining the nodes in Java
|
10
|
+
* `lib/yarp/mutation_visitor.rb` - for defining the mutation visitor for the nodes in Ruby
|
10
11
|
* `lib/yarp/node.rb` - for defining the nodes in Ruby
|
11
12
|
* `lib/yarp/serialize.rb` - for defining how to deserialize the nodes in Ruby
|
12
13
|
* `src/node.c` - for defining how to free the nodes in C and calculate the size in memory in C
|
data/docs/ruby_api.md
CHANGED
@@ -20,4 +20,6 @@ The full API is documented below.
|
|
20
20
|
* `YARP.lex_file(filepath)` - parse the tokens corresponding to the given source file and return them as an array within a parse result
|
21
21
|
* `YARP.parse(source)` - parse the syntax tree corresponding to the given source string and return it within a parse result
|
22
22
|
* `YARP.parse_file(filepath)` - parse the syntax tree corresponding to the given source file and return it within a parse result
|
23
|
+
* `YARP.parse_lex(source)` - parse the syntax tree corresponding to the given source string and return it within a parse result, along with the tokens
|
24
|
+
* `YARP.parse_lex_file(filepath)` - parse the syntax tree corresponding to the given source file and return it within a parse result, along with the tokens
|
23
25
|
* `YARP.load(source, serialized)` - load the serialized syntax tree using the source as a reference into a syntax tree
|
data/docs/serialization.md
CHANGED
@@ -73,7 +73,7 @@ The header is structured like the following table:
|
|
73
73
|
| varint | content pool size |
|
74
74
|
|
75
75
|
After the header comes the body of the serialized string.
|
76
|
-
The body
|
76
|
+
The body consists of a sequence of nodes that is built using a prefix traversal order of the syntax tree.
|
77
77
|
Each node is structured like the following table:
|
78
78
|
|
79
79
|
| # bytes | field |
|
data/docs/testing.md
CHANGED
@@ -12,9 +12,9 @@ These test specific YARP implementation details like comments, errors, and regul
|
|
12
12
|
|
13
13
|
### Snapshot tests
|
14
14
|
|
15
|
-
Snapshot tests ensure that parsed output is equivalent to previous parsed output. There are many categorized examples of valid syntax within the `test/fixtures/` directory. When the test suite runs, it will parse all of this syntax, and compare it against corresponding files in the `test/snapshots/` directory. For example, `test/fixtures/strings.txt` has a corresponding `test/snapshots/strings.txt`.
|
15
|
+
Snapshot tests ensure that parsed output is equivalent to previous parsed output. There are many categorized examples of valid syntax within the `test/yarp/fixtures/` directory. When the test suite runs, it will parse all of this syntax, and compare it against corresponding files in the `test/yarp/snapshots/` directory. For example, `test/yarp/fixtures/strings.txt` has a corresponding `test/yarp/snapshots/strings.txt`.
|
16
16
|
|
17
|
-
If the parsed files do not match, it will raise an error. If there is not a corresponding file in the `test/snapshots/` directory, one will be created so that it exists for the next test run.
|
17
|
+
If the parsed files do not match, it will raise an error. If there is not a corresponding file in the `test/yarp/snapshots/` directory, one will be created so that it exists for the next test run.
|
18
18
|
|
19
19
|
### Testing against repositories
|
20
20
|
|