yarp 0.12.0 → 0.13.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (115) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +29 -8
  3. data/CONTRIBUTING.md +2 -2
  4. data/Makefile +5 -5
  5. data/README.md +11 -12
  6. data/config.yml +6 -2
  7. data/docs/build_system.md +21 -21
  8. data/docs/building.md +4 -4
  9. data/docs/configuration.md +25 -21
  10. data/docs/design.md +2 -2
  11. data/docs/encoding.md +17 -17
  12. data/docs/fuzzing.md +4 -4
  13. data/docs/heredocs.md +3 -3
  14. data/docs/mapping.md +94 -94
  15. data/docs/ripper.md +4 -4
  16. data/docs/ruby_api.md +11 -11
  17. data/docs/serialization.md +17 -16
  18. data/docs/testing.md +6 -6
  19. data/ext/prism/api_node.c +4725 -0
  20. data/ext/{yarp → prism}/api_pack.c +82 -82
  21. data/ext/{yarp → prism}/extconf.rb +13 -13
  22. data/ext/{yarp → prism}/extension.c +175 -168
  23. data/ext/prism/extension.h +18 -0
  24. data/include/prism/ast.h +1932 -0
  25. data/include/prism/defines.h +45 -0
  26. data/include/prism/diagnostic.h +231 -0
  27. data/include/{yarp/enc/yp_encoding.h → prism/enc/pm_encoding.h} +40 -40
  28. data/include/prism/node.h +41 -0
  29. data/include/prism/pack.h +141 -0
  30. data/include/{yarp → prism}/parser.h +143 -142
  31. data/include/prism/regexp.h +19 -0
  32. data/include/prism/unescape.h +48 -0
  33. data/include/prism/util/pm_buffer.h +51 -0
  34. data/include/{yarp/util/yp_char.h → prism/util/pm_char.h} +20 -20
  35. data/include/{yarp/util/yp_constant_pool.h → prism/util/pm_constant_pool.h} +26 -22
  36. data/include/{yarp/util/yp_list.h → prism/util/pm_list.h} +21 -21
  37. data/include/prism/util/pm_memchr.h +14 -0
  38. data/include/{yarp/util/yp_newline_list.h → prism/util/pm_newline_list.h} +11 -11
  39. data/include/prism/util/pm_state_stack.h +24 -0
  40. data/include/{yarp/util/yp_string.h → prism/util/pm_string.h} +20 -20
  41. data/include/prism/util/pm_string_list.h +25 -0
  42. data/include/{yarp/util/yp_strpbrk.h → prism/util/pm_strpbrk.h} +7 -7
  43. data/include/prism/version.h +4 -0
  44. data/include/prism.h +82 -0
  45. data/lib/prism/compiler.rb +465 -0
  46. data/lib/prism/debug.rb +157 -0
  47. data/lib/{yarp/desugar_visitor.rb → prism/desugar_compiler.rb} +4 -2
  48. data/lib/prism/dispatcher.rb +2051 -0
  49. data/lib/prism/dsl.rb +750 -0
  50. data/lib/{yarp → prism}/ffi.rb +66 -67
  51. data/lib/{yarp → prism}/lex_compat.rb +40 -43
  52. data/lib/{yarp/mutation_visitor.rb → prism/mutation_compiler.rb} +3 -3
  53. data/lib/{yarp → prism}/node.rb +2012 -2593
  54. data/lib/prism/node_ext.rb +55 -0
  55. data/lib/prism/node_inspector.rb +68 -0
  56. data/lib/{yarp → prism}/pack.rb +1 -1
  57. data/lib/{yarp → prism}/parse_result/comments.rb +1 -1
  58. data/lib/{yarp → prism}/parse_result/newlines.rb +1 -1
  59. data/lib/prism/parse_result.rb +266 -0
  60. data/lib/{yarp → prism}/pattern.rb +14 -14
  61. data/lib/{yarp → prism}/ripper_compat.rb +5 -5
  62. data/lib/{yarp → prism}/serialize.rb +12 -7
  63. data/lib/prism/visitor.rb +470 -0
  64. data/lib/prism.rb +64 -0
  65. data/lib/yarp.rb +2 -614
  66. data/src/diagnostic.c +213 -208
  67. data/src/enc/pm_big5.c +52 -0
  68. data/src/enc/pm_euc_jp.c +58 -0
  69. data/src/enc/{yp_gbk.c → pm_gbk.c} +16 -16
  70. data/src/enc/pm_shift_jis.c +56 -0
  71. data/src/enc/{yp_tables.c → pm_tables.c} +69 -69
  72. data/src/enc/{yp_unicode.c → pm_unicode.c} +40 -40
  73. data/src/enc/pm_windows_31j.c +56 -0
  74. data/src/node.c +1293 -1233
  75. data/src/pack.c +247 -247
  76. data/src/prettyprint.c +1479 -1479
  77. data/src/{yarp.c → prism.c} +5205 -5083
  78. data/src/regexp.c +132 -132
  79. data/src/serialize.c +1121 -1121
  80. data/src/token_type.c +169 -167
  81. data/src/unescape.c +106 -87
  82. data/src/util/pm_buffer.c +103 -0
  83. data/src/util/{yp_char.c → pm_char.c} +72 -72
  84. data/src/util/{yp_constant_pool.c → pm_constant_pool.c} +85 -64
  85. data/src/util/{yp_list.c → pm_list.c} +10 -10
  86. data/src/util/{yp_memchr.c → pm_memchr.c} +6 -4
  87. data/src/util/{yp_newline_list.c → pm_newline_list.c} +21 -21
  88. data/src/util/{yp_state_stack.c → pm_state_stack.c} +4 -4
  89. data/src/util/{yp_string.c → pm_string.c} +38 -38
  90. data/src/util/pm_string_list.c +29 -0
  91. data/src/util/{yp_strncasecmp.c → pm_strncasecmp.c} +1 -1
  92. data/src/util/{yp_strpbrk.c → pm_strpbrk.c} +8 -8
  93. data/yarp.gemspec +68 -59
  94. metadata +70 -61
  95. data/ext/yarp/api_node.c +0 -4728
  96. data/ext/yarp/extension.h +0 -18
  97. data/include/yarp/ast.h +0 -1929
  98. data/include/yarp/defines.h +0 -45
  99. data/include/yarp/diagnostic.h +0 -226
  100. data/include/yarp/node.h +0 -42
  101. data/include/yarp/pack.h +0 -141
  102. data/include/yarp/regexp.h +0 -19
  103. data/include/yarp/unescape.h +0 -44
  104. data/include/yarp/util/yp_buffer.h +0 -51
  105. data/include/yarp/util/yp_memchr.h +0 -14
  106. data/include/yarp/util/yp_state_stack.h +0 -24
  107. data/include/yarp/util/yp_string_list.h +0 -25
  108. data/include/yarp/version.h +0 -4
  109. data/include/yarp.h +0 -82
  110. data/src/enc/yp_big5.c +0 -52
  111. data/src/enc/yp_euc_jp.c +0 -58
  112. data/src/enc/yp_shift_jis.c +0 -56
  113. data/src/enc/yp_windows_31j.c +0 -56
  114. data/src/util/yp_buffer.c +0 -101
  115. data/src/util/yp_string_list.c +0 -29
@@ -0,0 +1,1932 @@
1
+ /******************************************************************************/
2
+ /* This file is generated by the templates/template.rb script and should not */
3
+ /* be modified manually. See */
4
+ /* templates/include/prism/ast.h.erb */
5
+ /* if you are looking to modify the */
6
+ /* template */
7
+ /******************************************************************************/
8
+ #ifndef PRISM_AST_H
9
+ #define PRISM_AST_H
10
+
11
+ #include "prism/defines.h"
12
+ #include "prism/util/pm_constant_pool.h"
13
+ #include "prism/util/pm_string.h"
14
+
15
+ #include <assert.h>
16
+ #include <stddef.h>
17
+ #include <stdint.h>
18
+
19
+ // This enum represents every type of token in the Ruby source.
20
+ typedef enum pm_token_type {
21
+ PM_TOKEN_EOF = 1, // final token in the file
22
+ PM_TOKEN_MISSING, // a token that was expected but not found
23
+ PM_TOKEN_NOT_PROVIDED, // a token that was not present but it is okay
24
+ PM_TOKEN_AMPERSAND, // &
25
+ PM_TOKEN_AMPERSAND_AMPERSAND, // &&
26
+ PM_TOKEN_AMPERSAND_AMPERSAND_EQUAL, // &&=
27
+ PM_TOKEN_AMPERSAND_DOT, // &.
28
+ PM_TOKEN_AMPERSAND_EQUAL, // &=
29
+ PM_TOKEN_BACKTICK, // `
30
+ PM_TOKEN_BACK_REFERENCE, // a back reference
31
+ PM_TOKEN_BANG, // ! or !@
32
+ PM_TOKEN_BANG_EQUAL, // !=
33
+ PM_TOKEN_BANG_TILDE, // !~
34
+ PM_TOKEN_BRACE_LEFT, // {
35
+ PM_TOKEN_BRACE_RIGHT, // }
36
+ PM_TOKEN_BRACKET_LEFT, // [
37
+ PM_TOKEN_BRACKET_LEFT_ARRAY, // [ for the beginning of an array
38
+ PM_TOKEN_BRACKET_LEFT_RIGHT, // []
39
+ PM_TOKEN_BRACKET_LEFT_RIGHT_EQUAL, // []=
40
+ PM_TOKEN_BRACKET_RIGHT, // ]
41
+ PM_TOKEN_CARET, // ^
42
+ PM_TOKEN_CARET_EQUAL, // ^=
43
+ PM_TOKEN_CHARACTER_LITERAL, // a character literal
44
+ PM_TOKEN_CLASS_VARIABLE, // a class variable
45
+ PM_TOKEN_COLON, // :
46
+ PM_TOKEN_COLON_COLON, // ::
47
+ PM_TOKEN_COMMA, // ,
48
+ PM_TOKEN_COMMENT, // a comment
49
+ PM_TOKEN_CONSTANT, // a constant
50
+ PM_TOKEN_DOT, // .
51
+ PM_TOKEN_DOT_DOT, // ..
52
+ PM_TOKEN_DOT_DOT_DOT, // ...
53
+ PM_TOKEN_EMBDOC_BEGIN, // =begin
54
+ PM_TOKEN_EMBDOC_END, // =end
55
+ PM_TOKEN_EMBDOC_LINE, // a line inside of embedded documentation
56
+ PM_TOKEN_EMBEXPR_BEGIN, // #{
57
+ PM_TOKEN_EMBEXPR_END, // }
58
+ PM_TOKEN_EMBVAR, // #
59
+ PM_TOKEN_EQUAL, // =
60
+ PM_TOKEN_EQUAL_EQUAL, // ==
61
+ PM_TOKEN_EQUAL_EQUAL_EQUAL, // ===
62
+ PM_TOKEN_EQUAL_GREATER, // =>
63
+ PM_TOKEN_EQUAL_TILDE, // =~
64
+ PM_TOKEN_FLOAT, // a floating point number
65
+ PM_TOKEN_FLOAT_IMAGINARY, // a floating pointer number with an imaginary suffix
66
+ PM_TOKEN_FLOAT_RATIONAL, // a floating pointer number with a rational suffix
67
+ PM_TOKEN_FLOAT_RATIONAL_IMAGINARY, // a floating pointer number with a rational and imaginary suffix
68
+ PM_TOKEN_GLOBAL_VARIABLE, // a global variable
69
+ PM_TOKEN_GREATER, // >
70
+ PM_TOKEN_GREATER_EQUAL, // >=
71
+ PM_TOKEN_GREATER_GREATER, // >>
72
+ PM_TOKEN_GREATER_GREATER_EQUAL, // >>=
73
+ PM_TOKEN_HEREDOC_END, // the end of a heredoc
74
+ PM_TOKEN_HEREDOC_START, // the start of a heredoc
75
+ PM_TOKEN_IDENTIFIER, // an identifier
76
+ PM_TOKEN_IGNORED_NEWLINE, // an ignored newline
77
+ PM_TOKEN_INSTANCE_VARIABLE, // an instance variable
78
+ PM_TOKEN_INTEGER, // an integer (any base)
79
+ PM_TOKEN_INTEGER_IMAGINARY, // an integer with an imaginary suffix
80
+ PM_TOKEN_INTEGER_RATIONAL, // an integer with a rational suffix
81
+ PM_TOKEN_INTEGER_RATIONAL_IMAGINARY, // an integer with a rational and imaginary suffix
82
+ PM_TOKEN_KEYWORD_ALIAS, // alias
83
+ PM_TOKEN_KEYWORD_AND, // and
84
+ PM_TOKEN_KEYWORD_BEGIN, // begin
85
+ PM_TOKEN_KEYWORD_BEGIN_UPCASE, // BEGIN
86
+ PM_TOKEN_KEYWORD_BREAK, // break
87
+ PM_TOKEN_KEYWORD_CASE, // case
88
+ PM_TOKEN_KEYWORD_CLASS, // class
89
+ PM_TOKEN_KEYWORD_DEF, // def
90
+ PM_TOKEN_KEYWORD_DEFINED, // defined?
91
+ PM_TOKEN_KEYWORD_DO, // do
92
+ PM_TOKEN_KEYWORD_DO_LOOP, // do keyword for a predicate in a while, until, or for loop
93
+ PM_TOKEN_KEYWORD_ELSE, // else
94
+ PM_TOKEN_KEYWORD_ELSIF, // elsif
95
+ PM_TOKEN_KEYWORD_END, // end
96
+ PM_TOKEN_KEYWORD_END_UPCASE, // END
97
+ PM_TOKEN_KEYWORD_ENSURE, // ensure
98
+ PM_TOKEN_KEYWORD_FALSE, // false
99
+ PM_TOKEN_KEYWORD_FOR, // for
100
+ PM_TOKEN_KEYWORD_IF, // if
101
+ PM_TOKEN_KEYWORD_IF_MODIFIER, // if in the modifier form
102
+ PM_TOKEN_KEYWORD_IN, // in
103
+ PM_TOKEN_KEYWORD_MODULE, // module
104
+ PM_TOKEN_KEYWORD_NEXT, // next
105
+ PM_TOKEN_KEYWORD_NIL, // nil
106
+ PM_TOKEN_KEYWORD_NOT, // not
107
+ PM_TOKEN_KEYWORD_OR, // or
108
+ PM_TOKEN_KEYWORD_REDO, // redo
109
+ PM_TOKEN_KEYWORD_RESCUE, // rescue
110
+ PM_TOKEN_KEYWORD_RESCUE_MODIFIER, // rescue in the modifier form
111
+ PM_TOKEN_KEYWORD_RETRY, // retry
112
+ PM_TOKEN_KEYWORD_RETURN, // return
113
+ PM_TOKEN_KEYWORD_SELF, // self
114
+ PM_TOKEN_KEYWORD_SUPER, // super
115
+ PM_TOKEN_KEYWORD_THEN, // then
116
+ PM_TOKEN_KEYWORD_TRUE, // true
117
+ PM_TOKEN_KEYWORD_UNDEF, // undef
118
+ PM_TOKEN_KEYWORD_UNLESS, // unless
119
+ PM_TOKEN_KEYWORD_UNLESS_MODIFIER, // unless in the modifier form
120
+ PM_TOKEN_KEYWORD_UNTIL, // until
121
+ PM_TOKEN_KEYWORD_UNTIL_MODIFIER, // until in the modifier form
122
+ PM_TOKEN_KEYWORD_WHEN, // when
123
+ PM_TOKEN_KEYWORD_WHILE, // while
124
+ PM_TOKEN_KEYWORD_WHILE_MODIFIER, // while in the modifier form
125
+ PM_TOKEN_KEYWORD_YIELD, // yield
126
+ PM_TOKEN_KEYWORD___ENCODING__, // __ENCODING__
127
+ PM_TOKEN_KEYWORD___FILE__, // __FILE__
128
+ PM_TOKEN_KEYWORD___LINE__, // __LINE__
129
+ PM_TOKEN_LABEL, // a label
130
+ PM_TOKEN_LABEL_END, // the end of a label
131
+ PM_TOKEN_LAMBDA_BEGIN, // {
132
+ PM_TOKEN_LESS, // <
133
+ PM_TOKEN_LESS_EQUAL, // <=
134
+ PM_TOKEN_LESS_EQUAL_GREATER, // <=>
135
+ PM_TOKEN_LESS_LESS, // <<
136
+ PM_TOKEN_LESS_LESS_EQUAL, // <<=
137
+ PM_TOKEN_METHOD_NAME, // a method name
138
+ PM_TOKEN_MINUS, // -
139
+ PM_TOKEN_MINUS_EQUAL, // -=
140
+ PM_TOKEN_MINUS_GREATER, // ->
141
+ PM_TOKEN_NEWLINE, // a newline character outside of other tokens
142
+ PM_TOKEN_NUMBERED_REFERENCE, // a numbered reference to a capture group in the previous regular expression match
143
+ PM_TOKEN_PARENTHESIS_LEFT, // (
144
+ PM_TOKEN_PARENTHESIS_LEFT_PARENTHESES, // ( for a parentheses node
145
+ PM_TOKEN_PARENTHESIS_RIGHT, // )
146
+ PM_TOKEN_PERCENT, // %
147
+ PM_TOKEN_PERCENT_EQUAL, // %=
148
+ PM_TOKEN_PERCENT_LOWER_I, // %i
149
+ PM_TOKEN_PERCENT_LOWER_W, // %w
150
+ PM_TOKEN_PERCENT_LOWER_X, // %x
151
+ PM_TOKEN_PERCENT_UPPER_I, // %I
152
+ PM_TOKEN_PERCENT_UPPER_W, // %W
153
+ PM_TOKEN_PIPE, // |
154
+ PM_TOKEN_PIPE_EQUAL, // |=
155
+ PM_TOKEN_PIPE_PIPE, // ||
156
+ PM_TOKEN_PIPE_PIPE_EQUAL, // ||=
157
+ PM_TOKEN_PLUS, // +
158
+ PM_TOKEN_PLUS_EQUAL, // +=
159
+ PM_TOKEN_QUESTION_MARK, // ?
160
+ PM_TOKEN_REGEXP_BEGIN, // the beginning of a regular expression
161
+ PM_TOKEN_REGEXP_END, // the end of a regular expression
162
+ PM_TOKEN_SEMICOLON, // ;
163
+ PM_TOKEN_SLASH, // /
164
+ PM_TOKEN_SLASH_EQUAL, // /=
165
+ PM_TOKEN_STAR, // *
166
+ PM_TOKEN_STAR_EQUAL, // *=
167
+ PM_TOKEN_STAR_STAR, // **
168
+ PM_TOKEN_STAR_STAR_EQUAL, // **=
169
+ PM_TOKEN_STRING_BEGIN, // the beginning of a string
170
+ PM_TOKEN_STRING_CONTENT, // the contents of a string
171
+ PM_TOKEN_STRING_END, // the end of a string
172
+ PM_TOKEN_SYMBOL_BEGIN, // the beginning of a symbol
173
+ PM_TOKEN_TILDE, // ~ or ~@
174
+ PM_TOKEN_UAMPERSAND, // unary &
175
+ PM_TOKEN_UCOLON_COLON, // unary ::
176
+ PM_TOKEN_UDOT_DOT, // unary ..
177
+ PM_TOKEN_UDOT_DOT_DOT, // unary ...
178
+ PM_TOKEN_UMINUS, // -@
179
+ PM_TOKEN_UMINUS_NUM, // -@ for a number
180
+ PM_TOKEN_UPLUS, // +@
181
+ PM_TOKEN_USTAR, // unary *
182
+ PM_TOKEN_USTAR_STAR, // unary **
183
+ PM_TOKEN_WORDS_SEP, // a separator between words in a list
184
+ PM_TOKEN___END__, // marker for the point in the file at which the parser should stop
185
+ PM_TOKEN_MAXIMUM, // the maximum token value
186
+ } pm_token_type_t;
187
+
188
+ // This struct represents a token in the Ruby source. We use it to track both
189
+ // type and location information.
190
+ typedef struct {
191
+ pm_token_type_t type;
192
+ const uint8_t *start;
193
+ const uint8_t *end;
194
+ } pm_token_t;
195
+
196
+ // This represents a range of bytes in the source string to which a node or
197
+ // token corresponds.
198
+ typedef struct {
199
+ const uint8_t *start;
200
+ const uint8_t *end;
201
+ } pm_location_t;
202
+
203
+ struct pm_node;
204
+
205
+ typedef struct pm_node_list {
206
+ struct pm_node **nodes;
207
+ size_t size;
208
+ size_t capacity;
209
+ } pm_node_list_t;
210
+
211
+ enum pm_node_type {
212
+ PM_ALIAS_GLOBAL_VARIABLE_NODE = 1,
213
+ PM_ALIAS_METHOD_NODE = 2,
214
+ PM_ALTERNATION_PATTERN_NODE = 3,
215
+ PM_AND_NODE = 4,
216
+ PM_ARGUMENTS_NODE = 5,
217
+ PM_ARRAY_NODE = 6,
218
+ PM_ARRAY_PATTERN_NODE = 7,
219
+ PM_ASSOC_NODE = 8,
220
+ PM_ASSOC_SPLAT_NODE = 9,
221
+ PM_BACK_REFERENCE_READ_NODE = 10,
222
+ PM_BEGIN_NODE = 11,
223
+ PM_BLOCK_ARGUMENT_NODE = 12,
224
+ PM_BLOCK_LOCAL_VARIABLE_NODE = 13,
225
+ PM_BLOCK_NODE = 14,
226
+ PM_BLOCK_PARAMETER_NODE = 15,
227
+ PM_BLOCK_PARAMETERS_NODE = 16,
228
+ PM_BREAK_NODE = 17,
229
+ PM_CALL_AND_WRITE_NODE = 18,
230
+ PM_CALL_NODE = 19,
231
+ PM_CALL_OPERATOR_WRITE_NODE = 20,
232
+ PM_CALL_OR_WRITE_NODE = 21,
233
+ PM_CAPTURE_PATTERN_NODE = 22,
234
+ PM_CASE_NODE = 23,
235
+ PM_CLASS_NODE = 24,
236
+ PM_CLASS_VARIABLE_AND_WRITE_NODE = 25,
237
+ PM_CLASS_VARIABLE_OPERATOR_WRITE_NODE = 26,
238
+ PM_CLASS_VARIABLE_OR_WRITE_NODE = 27,
239
+ PM_CLASS_VARIABLE_READ_NODE = 28,
240
+ PM_CLASS_VARIABLE_TARGET_NODE = 29,
241
+ PM_CLASS_VARIABLE_WRITE_NODE = 30,
242
+ PM_CONSTANT_AND_WRITE_NODE = 31,
243
+ PM_CONSTANT_OPERATOR_WRITE_NODE = 32,
244
+ PM_CONSTANT_OR_WRITE_NODE = 33,
245
+ PM_CONSTANT_PATH_AND_WRITE_NODE = 34,
246
+ PM_CONSTANT_PATH_NODE = 35,
247
+ PM_CONSTANT_PATH_OPERATOR_WRITE_NODE = 36,
248
+ PM_CONSTANT_PATH_OR_WRITE_NODE = 37,
249
+ PM_CONSTANT_PATH_TARGET_NODE = 38,
250
+ PM_CONSTANT_PATH_WRITE_NODE = 39,
251
+ PM_CONSTANT_READ_NODE = 40,
252
+ PM_CONSTANT_TARGET_NODE = 41,
253
+ PM_CONSTANT_WRITE_NODE = 42,
254
+ PM_DEF_NODE = 43,
255
+ PM_DEFINED_NODE = 44,
256
+ PM_ELSE_NODE = 45,
257
+ PM_EMBEDDED_STATEMENTS_NODE = 46,
258
+ PM_EMBEDDED_VARIABLE_NODE = 47,
259
+ PM_ENSURE_NODE = 48,
260
+ PM_FALSE_NODE = 49,
261
+ PM_FIND_PATTERN_NODE = 50,
262
+ PM_FLIP_FLOP_NODE = 51,
263
+ PM_FLOAT_NODE = 52,
264
+ PM_FOR_NODE = 53,
265
+ PM_FORWARDING_ARGUMENTS_NODE = 54,
266
+ PM_FORWARDING_PARAMETER_NODE = 55,
267
+ PM_FORWARDING_SUPER_NODE = 56,
268
+ PM_GLOBAL_VARIABLE_AND_WRITE_NODE = 57,
269
+ PM_GLOBAL_VARIABLE_OPERATOR_WRITE_NODE = 58,
270
+ PM_GLOBAL_VARIABLE_OR_WRITE_NODE = 59,
271
+ PM_GLOBAL_VARIABLE_READ_NODE = 60,
272
+ PM_GLOBAL_VARIABLE_TARGET_NODE = 61,
273
+ PM_GLOBAL_VARIABLE_WRITE_NODE = 62,
274
+ PM_HASH_NODE = 63,
275
+ PM_HASH_PATTERN_NODE = 64,
276
+ PM_IF_NODE = 65,
277
+ PM_IMAGINARY_NODE = 66,
278
+ PM_IMPLICIT_NODE = 67,
279
+ PM_IN_NODE = 68,
280
+ PM_INSTANCE_VARIABLE_AND_WRITE_NODE = 69,
281
+ PM_INSTANCE_VARIABLE_OPERATOR_WRITE_NODE = 70,
282
+ PM_INSTANCE_VARIABLE_OR_WRITE_NODE = 71,
283
+ PM_INSTANCE_VARIABLE_READ_NODE = 72,
284
+ PM_INSTANCE_VARIABLE_TARGET_NODE = 73,
285
+ PM_INSTANCE_VARIABLE_WRITE_NODE = 74,
286
+ PM_INTEGER_NODE = 75,
287
+ PM_INTERPOLATED_MATCH_LAST_LINE_NODE = 76,
288
+ PM_INTERPOLATED_REGULAR_EXPRESSION_NODE = 77,
289
+ PM_INTERPOLATED_STRING_NODE = 78,
290
+ PM_INTERPOLATED_SYMBOL_NODE = 79,
291
+ PM_INTERPOLATED_X_STRING_NODE = 80,
292
+ PM_KEYWORD_HASH_NODE = 81,
293
+ PM_KEYWORD_PARAMETER_NODE = 82,
294
+ PM_KEYWORD_REST_PARAMETER_NODE = 83,
295
+ PM_LAMBDA_NODE = 84,
296
+ PM_LOCAL_VARIABLE_AND_WRITE_NODE = 85,
297
+ PM_LOCAL_VARIABLE_OPERATOR_WRITE_NODE = 86,
298
+ PM_LOCAL_VARIABLE_OR_WRITE_NODE = 87,
299
+ PM_LOCAL_VARIABLE_READ_NODE = 88,
300
+ PM_LOCAL_VARIABLE_TARGET_NODE = 89,
301
+ PM_LOCAL_VARIABLE_WRITE_NODE = 90,
302
+ PM_MATCH_LAST_LINE_NODE = 91,
303
+ PM_MATCH_PREDICATE_NODE = 92,
304
+ PM_MATCH_REQUIRED_NODE = 93,
305
+ PM_MATCH_WRITE_NODE = 94,
306
+ PM_MISSING_NODE = 95,
307
+ PM_MODULE_NODE = 96,
308
+ PM_MULTI_TARGET_NODE = 97,
309
+ PM_MULTI_WRITE_NODE = 98,
310
+ PM_NEXT_NODE = 99,
311
+ PM_NIL_NODE = 100,
312
+ PM_NO_KEYWORDS_PARAMETER_NODE = 101,
313
+ PM_NUMBERED_REFERENCE_READ_NODE = 102,
314
+ PM_OPTIONAL_PARAMETER_NODE = 103,
315
+ PM_OR_NODE = 104,
316
+ PM_PARAMETERS_NODE = 105,
317
+ PM_PARENTHESES_NODE = 106,
318
+ PM_PINNED_EXPRESSION_NODE = 107,
319
+ PM_PINNED_VARIABLE_NODE = 108,
320
+ PM_POST_EXECUTION_NODE = 109,
321
+ PM_PRE_EXECUTION_NODE = 110,
322
+ PM_PROGRAM_NODE = 111,
323
+ PM_RANGE_NODE = 112,
324
+ PM_RATIONAL_NODE = 113,
325
+ PM_REDO_NODE = 114,
326
+ PM_REGULAR_EXPRESSION_NODE = 115,
327
+ PM_REQUIRED_DESTRUCTURED_PARAMETER_NODE = 116,
328
+ PM_REQUIRED_PARAMETER_NODE = 117,
329
+ PM_RESCUE_MODIFIER_NODE = 118,
330
+ PM_RESCUE_NODE = 119,
331
+ PM_REST_PARAMETER_NODE = 120,
332
+ PM_RETRY_NODE = 121,
333
+ PM_RETURN_NODE = 122,
334
+ PM_SELF_NODE = 123,
335
+ PM_SINGLETON_CLASS_NODE = 124,
336
+ PM_SOURCE_ENCODING_NODE = 125,
337
+ PM_SOURCE_FILE_NODE = 126,
338
+ PM_SOURCE_LINE_NODE = 127,
339
+ PM_SPLAT_NODE = 128,
340
+ PM_STATEMENTS_NODE = 129,
341
+ PM_STRING_CONCAT_NODE = 130,
342
+ PM_STRING_NODE = 131,
343
+ PM_SUPER_NODE = 132,
344
+ PM_SYMBOL_NODE = 133,
345
+ PM_TRUE_NODE = 134,
346
+ PM_UNDEF_NODE = 135,
347
+ PM_UNLESS_NODE = 136,
348
+ PM_UNTIL_NODE = 137,
349
+ PM_WHEN_NODE = 138,
350
+ PM_WHILE_NODE = 139,
351
+ PM_X_STRING_NODE = 140,
352
+ PM_YIELD_NODE = 141,
353
+ PM_SCOPE_NODE
354
+ };
355
+
356
+ typedef uint16_t pm_node_type_t;
357
+ typedef uint16_t pm_node_flags_t;
358
+
359
+ // We store the flags enum in every node in the tree. Some flags are common to
360
+ // all nodes (the ones listed below). Others are specific to certain node types.
361
+ static const pm_node_flags_t PM_NODE_FLAG_NEWLINE = 0x1;
362
+ static const pm_node_flags_t PM_NODE_FLAG_STATIC_LITERAL = 0x2;
363
+
364
+ // For easy access, we define some macros to check node type
365
+ #define PM_NODE_TYPE(node) ((enum pm_node_type)node->type)
366
+ #define PM_NODE_TYPE_P(node, type) (PM_NODE_TYPE(node) == (type))
367
+
368
+ // This is the overall tagged union representing a node in the syntax tree.
369
+ typedef struct pm_node {
370
+ // This represents the type of the node. It somewhat maps to the nodes that
371
+ // existed in the original grammar and ripper, but it's not a 1:1 mapping.
372
+ pm_node_type_t type;
373
+
374
+ // This represents any flags on the node
375
+ pm_node_flags_t flags;
376
+
377
+ // This is the location of the node in the source. It's a range of bytes
378
+ // containing a start and an end.
379
+ pm_location_t location;
380
+ } pm_node_t;
381
+
382
+ // AliasGlobalVariableNode
383
+ //
384
+ // Type: PM_ALIAS_GLOBAL_VARIABLE_NODE
385
+ typedef struct pm_alias_global_variable_node {
386
+ pm_node_t base;
387
+ struct pm_node *new_name;
388
+ struct pm_node *old_name;
389
+ pm_location_t keyword_loc;
390
+ } pm_alias_global_variable_node_t;
391
+
392
+ // AliasMethodNode
393
+ //
394
+ // Type: PM_ALIAS_METHOD_NODE
395
+ typedef struct pm_alias_method_node {
396
+ pm_node_t base;
397
+ struct pm_node *new_name;
398
+ struct pm_node *old_name;
399
+ pm_location_t keyword_loc;
400
+ } pm_alias_method_node_t;
401
+
402
+ // AlternationPatternNode
403
+ //
404
+ // Type: PM_ALTERNATION_PATTERN_NODE
405
+ typedef struct pm_alternation_pattern_node {
406
+ pm_node_t base;
407
+ struct pm_node *left;
408
+ struct pm_node *right;
409
+ pm_location_t operator_loc;
410
+ } pm_alternation_pattern_node_t;
411
+
412
+ // AndNode
413
+ //
414
+ // Type: PM_AND_NODE
415
+ typedef struct pm_and_node {
416
+ pm_node_t base;
417
+ struct pm_node *left;
418
+ struct pm_node *right;
419
+ pm_location_t operator_loc;
420
+ } pm_and_node_t;
421
+
422
+ // ArgumentsNode
423
+ //
424
+ // Type: PM_ARGUMENTS_NODE
425
+ typedef struct pm_arguments_node {
426
+ pm_node_t base;
427
+ struct pm_node_list arguments;
428
+ } pm_arguments_node_t;
429
+
430
+ // ArrayNode
431
+ //
432
+ // Type: PM_ARRAY_NODE
433
+ typedef struct pm_array_node {
434
+ pm_node_t base;
435
+ struct pm_node_list elements;
436
+ pm_location_t opening_loc;
437
+ pm_location_t closing_loc;
438
+ } pm_array_node_t;
439
+
440
+ // ArrayPatternNode
441
+ //
442
+ // Type: PM_ARRAY_PATTERN_NODE
443
+ typedef struct pm_array_pattern_node {
444
+ pm_node_t base;
445
+ struct pm_node *constant;
446
+ struct pm_node_list requireds;
447
+ struct pm_node *rest;
448
+ struct pm_node_list posts;
449
+ pm_location_t opening_loc;
450
+ pm_location_t closing_loc;
451
+ } pm_array_pattern_node_t;
452
+
453
+ // AssocNode
454
+ //
455
+ // Type: PM_ASSOC_NODE
456
+ typedef struct pm_assoc_node {
457
+ pm_node_t base;
458
+ struct pm_node *key;
459
+ struct pm_node *value;
460
+ pm_location_t operator_loc;
461
+ } pm_assoc_node_t;
462
+
463
+ // AssocSplatNode
464
+ //
465
+ // Type: PM_ASSOC_SPLAT_NODE
466
+ typedef struct pm_assoc_splat_node {
467
+ pm_node_t base;
468
+ struct pm_node *value;
469
+ pm_location_t operator_loc;
470
+ } pm_assoc_splat_node_t;
471
+
472
+ // BackReferenceReadNode
473
+ //
474
+ // Type: PM_BACK_REFERENCE_READ_NODE
475
+ typedef struct pm_back_reference_read_node {
476
+ pm_node_t base;
477
+ } pm_back_reference_read_node_t;
478
+
479
+ // BeginNode
480
+ //
481
+ // Type: PM_BEGIN_NODE
482
+ typedef struct pm_begin_node {
483
+ pm_node_t base;
484
+ pm_location_t begin_keyword_loc;
485
+ struct pm_statements_node *statements;
486
+ struct pm_rescue_node *rescue_clause;
487
+ struct pm_else_node *else_clause;
488
+ struct pm_ensure_node *ensure_clause;
489
+ pm_location_t end_keyword_loc;
490
+ } pm_begin_node_t;
491
+
492
+ // BlockArgumentNode
493
+ //
494
+ // Type: PM_BLOCK_ARGUMENT_NODE
495
+ typedef struct pm_block_argument_node {
496
+ pm_node_t base;
497
+ struct pm_node *expression;
498
+ pm_location_t operator_loc;
499
+ } pm_block_argument_node_t;
500
+
501
+ // BlockLocalVariableNode
502
+ //
503
+ // Type: PM_BLOCK_LOCAL_VARIABLE_NODE
504
+ typedef struct pm_block_local_variable_node {
505
+ pm_node_t base;
506
+ pm_constant_id_t name;
507
+ } pm_block_local_variable_node_t;
508
+
509
+ // BlockNode
510
+ //
511
+ // Type: PM_BLOCK_NODE
512
+ typedef struct pm_block_node {
513
+ pm_node_t base;
514
+ pm_constant_id_list_t locals;
515
+ struct pm_block_parameters_node *parameters;
516
+ struct pm_node *body;
517
+ pm_location_t opening_loc;
518
+ pm_location_t closing_loc;
519
+ } pm_block_node_t;
520
+
521
+ // BlockParameterNode
522
+ //
523
+ // Type: PM_BLOCK_PARAMETER_NODE
524
+ typedef struct pm_block_parameter_node {
525
+ pm_node_t base;
526
+ pm_constant_id_t name;
527
+ pm_location_t name_loc;
528
+ pm_location_t operator_loc;
529
+ } pm_block_parameter_node_t;
530
+
531
+ // BlockParametersNode
532
+ //
533
+ // Type: PM_BLOCK_PARAMETERS_NODE
534
+ typedef struct pm_block_parameters_node {
535
+ pm_node_t base;
536
+ struct pm_parameters_node *parameters;
537
+ struct pm_node_list locals;
538
+ pm_location_t opening_loc;
539
+ pm_location_t closing_loc;
540
+ } pm_block_parameters_node_t;
541
+
542
+ // BreakNode
543
+ //
544
+ // Type: PM_BREAK_NODE
545
+ typedef struct pm_break_node {
546
+ pm_node_t base;
547
+ struct pm_arguments_node *arguments;
548
+ pm_location_t keyword_loc;
549
+ } pm_break_node_t;
550
+
551
+ // CallAndWriteNode
552
+ //
553
+ // Type: PM_CALL_AND_WRITE_NODE
554
+ // Flags:
555
+ // PM_CALL_NODE_FLAGS_SAFE_NAVIGATION
556
+ // PM_CALL_NODE_FLAGS_VARIABLE_CALL
557
+ typedef struct pm_call_and_write_node {
558
+ pm_node_t base;
559
+ struct pm_node *receiver;
560
+ pm_location_t call_operator_loc;
561
+ pm_location_t message_loc;
562
+ pm_location_t opening_loc;
563
+ struct pm_arguments_node *arguments;
564
+ pm_location_t closing_loc;
565
+ pm_string_t read_name;
566
+ pm_string_t write_name;
567
+ pm_location_t operator_loc;
568
+ struct pm_node *value;
569
+ } pm_call_and_write_node_t;
570
+
571
+ // CallNode
572
+ //
573
+ // Type: PM_CALL_NODE
574
+ // Flags:
575
+ // PM_CALL_NODE_FLAGS_SAFE_NAVIGATION
576
+ // PM_CALL_NODE_FLAGS_VARIABLE_CALL
577
+ typedef struct pm_call_node {
578
+ pm_node_t base;
579
+ struct pm_node *receiver;
580
+ pm_location_t call_operator_loc;
581
+ pm_location_t message_loc;
582
+ pm_location_t opening_loc;
583
+ struct pm_arguments_node *arguments;
584
+ pm_location_t closing_loc;
585
+ struct pm_node *block;
586
+ pm_string_t name;
587
+ } pm_call_node_t;
588
+
589
+ // CallOperatorWriteNode
590
+ //
591
+ // Type: PM_CALL_OPERATOR_WRITE_NODE
592
+ // Flags:
593
+ // PM_CALL_NODE_FLAGS_SAFE_NAVIGATION
594
+ // PM_CALL_NODE_FLAGS_VARIABLE_CALL
595
+ typedef struct pm_call_operator_write_node {
596
+ pm_node_t base;
597
+ struct pm_node *receiver;
598
+ pm_location_t call_operator_loc;
599
+ pm_location_t message_loc;
600
+ pm_location_t opening_loc;
601
+ struct pm_arguments_node *arguments;
602
+ pm_location_t closing_loc;
603
+ pm_string_t read_name;
604
+ pm_string_t write_name;
605
+ pm_constant_id_t operator;
606
+ pm_location_t operator_loc;
607
+ struct pm_node *value;
608
+ } pm_call_operator_write_node_t;
609
+
610
+ // CallOrWriteNode
611
+ //
612
+ // Type: PM_CALL_OR_WRITE_NODE
613
+ // Flags:
614
+ // PM_CALL_NODE_FLAGS_SAFE_NAVIGATION
615
+ // PM_CALL_NODE_FLAGS_VARIABLE_CALL
616
+ typedef struct pm_call_or_write_node {
617
+ pm_node_t base;
618
+ struct pm_node *receiver;
619
+ pm_location_t call_operator_loc;
620
+ pm_location_t message_loc;
621
+ pm_location_t opening_loc;
622
+ struct pm_arguments_node *arguments;
623
+ pm_location_t closing_loc;
624
+ pm_string_t read_name;
625
+ pm_string_t write_name;
626
+ pm_location_t operator_loc;
627
+ struct pm_node *value;
628
+ } pm_call_or_write_node_t;
629
+
630
+ // CapturePatternNode
631
+ //
632
+ // Type: PM_CAPTURE_PATTERN_NODE
633
+ typedef struct pm_capture_pattern_node {
634
+ pm_node_t base;
635
+ struct pm_node *value;
636
+ struct pm_node *target;
637
+ pm_location_t operator_loc;
638
+ } pm_capture_pattern_node_t;
639
+
640
+ // CaseNode
641
+ //
642
+ // Type: PM_CASE_NODE
643
+ typedef struct pm_case_node {
644
+ pm_node_t base;
645
+ struct pm_node *predicate;
646
+ struct pm_node_list conditions;
647
+ struct pm_else_node *consequent;
648
+ pm_location_t case_keyword_loc;
649
+ pm_location_t end_keyword_loc;
650
+ } pm_case_node_t;
651
+
652
+ // ClassNode
653
+ //
654
+ // Type: PM_CLASS_NODE
655
+ typedef struct pm_class_node {
656
+ pm_node_t base;
657
+ pm_constant_id_list_t locals;
658
+ pm_location_t class_keyword_loc;
659
+ struct pm_node *constant_path;
660
+ pm_location_t inheritance_operator_loc;
661
+ struct pm_node *superclass;
662
+ struct pm_node *body;
663
+ pm_location_t end_keyword_loc;
664
+ pm_constant_id_t name;
665
+ } pm_class_node_t;
666
+
667
+ // ClassVariableAndWriteNode
668
+ //
669
+ // Type: PM_CLASS_VARIABLE_AND_WRITE_NODE
670
+ typedef struct pm_class_variable_and_write_node {
671
+ pm_node_t base;
672
+ pm_constant_id_t name;
673
+ pm_location_t name_loc;
674
+ pm_location_t operator_loc;
675
+ struct pm_node *value;
676
+ } pm_class_variable_and_write_node_t;
677
+
678
+ // ClassVariableOperatorWriteNode
679
+ //
680
+ // Type: PM_CLASS_VARIABLE_OPERATOR_WRITE_NODE
681
+ typedef struct pm_class_variable_operator_write_node {
682
+ pm_node_t base;
683
+ pm_constant_id_t name;
684
+ pm_location_t name_loc;
685
+ pm_location_t operator_loc;
686
+ struct pm_node *value;
687
+ pm_constant_id_t operator;
688
+ } pm_class_variable_operator_write_node_t;
689
+
690
+ // ClassVariableOrWriteNode
691
+ //
692
+ // Type: PM_CLASS_VARIABLE_OR_WRITE_NODE
693
+ typedef struct pm_class_variable_or_write_node {
694
+ pm_node_t base;
695
+ pm_constant_id_t name;
696
+ pm_location_t name_loc;
697
+ pm_location_t operator_loc;
698
+ struct pm_node *value;
699
+ } pm_class_variable_or_write_node_t;
700
+
701
+ // ClassVariableReadNode
702
+ //
703
+ // Type: PM_CLASS_VARIABLE_READ_NODE
704
+ typedef struct pm_class_variable_read_node {
705
+ pm_node_t base;
706
+ pm_constant_id_t name;
707
+ } pm_class_variable_read_node_t;
708
+
709
+ // ClassVariableTargetNode
710
+ //
711
+ // Type: PM_CLASS_VARIABLE_TARGET_NODE
712
+ typedef struct pm_class_variable_target_node {
713
+ pm_node_t base;
714
+ pm_constant_id_t name;
715
+ } pm_class_variable_target_node_t;
716
+
717
+ // ClassVariableWriteNode
718
+ //
719
+ // Type: PM_CLASS_VARIABLE_WRITE_NODE
720
+ typedef struct pm_class_variable_write_node {
721
+ pm_node_t base;
722
+ pm_constant_id_t name;
723
+ pm_location_t name_loc;
724
+ struct pm_node *value;
725
+ pm_location_t operator_loc;
726
+ } pm_class_variable_write_node_t;
727
+
728
+ // ConstantAndWriteNode
729
+ //
730
+ // Type: PM_CONSTANT_AND_WRITE_NODE
731
+ typedef struct pm_constant_and_write_node {
732
+ pm_node_t base;
733
+ pm_constant_id_t name;
734
+ pm_location_t name_loc;
735
+ pm_location_t operator_loc;
736
+ struct pm_node *value;
737
+ } pm_constant_and_write_node_t;
738
+
739
+ // ConstantOperatorWriteNode
740
+ //
741
+ // Type: PM_CONSTANT_OPERATOR_WRITE_NODE
742
+ typedef struct pm_constant_operator_write_node {
743
+ pm_node_t base;
744
+ pm_constant_id_t name;
745
+ pm_location_t name_loc;
746
+ pm_location_t operator_loc;
747
+ struct pm_node *value;
748
+ pm_constant_id_t operator;
749
+ } pm_constant_operator_write_node_t;
750
+
751
+ // ConstantOrWriteNode
752
+ //
753
+ // Type: PM_CONSTANT_OR_WRITE_NODE
754
+ typedef struct pm_constant_or_write_node {
755
+ pm_node_t base;
756
+ pm_constant_id_t name;
757
+ pm_location_t name_loc;
758
+ pm_location_t operator_loc;
759
+ struct pm_node *value;
760
+ } pm_constant_or_write_node_t;
761
+
762
+ // ConstantPathAndWriteNode
763
+ //
764
+ // Type: PM_CONSTANT_PATH_AND_WRITE_NODE
765
+ typedef struct pm_constant_path_and_write_node {
766
+ pm_node_t base;
767
+ struct pm_constant_path_node *target;
768
+ pm_location_t operator_loc;
769
+ struct pm_node *value;
770
+ } pm_constant_path_and_write_node_t;
771
+
772
+ // ConstantPathNode
773
+ //
774
+ // Type: PM_CONSTANT_PATH_NODE
775
+ typedef struct pm_constant_path_node {
776
+ pm_node_t base;
777
+ struct pm_node *parent;
778
+ struct pm_node *child;
779
+ pm_location_t delimiter_loc;
780
+ } pm_constant_path_node_t;
781
+
782
+ // ConstantPathOperatorWriteNode
783
+ //
784
+ // Type: PM_CONSTANT_PATH_OPERATOR_WRITE_NODE
785
+ typedef struct pm_constant_path_operator_write_node {
786
+ pm_node_t base;
787
+ struct pm_constant_path_node *target;
788
+ pm_location_t operator_loc;
789
+ struct pm_node *value;
790
+ pm_constant_id_t operator;
791
+ } pm_constant_path_operator_write_node_t;
792
+
793
+ // ConstantPathOrWriteNode
794
+ //
795
+ // Type: PM_CONSTANT_PATH_OR_WRITE_NODE
796
+ typedef struct pm_constant_path_or_write_node {
797
+ pm_node_t base;
798
+ struct pm_constant_path_node *target;
799
+ pm_location_t operator_loc;
800
+ struct pm_node *value;
801
+ } pm_constant_path_or_write_node_t;
802
+
803
+ // ConstantPathTargetNode
804
+ //
805
+ // Type: PM_CONSTANT_PATH_TARGET_NODE
806
+ typedef struct pm_constant_path_target_node {
807
+ pm_node_t base;
808
+ struct pm_node *parent;
809
+ struct pm_node *child;
810
+ pm_location_t delimiter_loc;
811
+ } pm_constant_path_target_node_t;
812
+
813
+ // ConstantPathWriteNode
814
+ //
815
+ // Type: PM_CONSTANT_PATH_WRITE_NODE
816
+ typedef struct pm_constant_path_write_node {
817
+ pm_node_t base;
818
+ struct pm_constant_path_node *target;
819
+ pm_location_t operator_loc;
820
+ struct pm_node *value;
821
+ } pm_constant_path_write_node_t;
822
+
823
+ // ConstantReadNode
824
+ //
825
+ // Type: PM_CONSTANT_READ_NODE
826
+ typedef struct pm_constant_read_node {
827
+ pm_node_t base;
828
+ pm_constant_id_t name;
829
+ } pm_constant_read_node_t;
830
+
831
+ // ConstantTargetNode
832
+ //
833
+ // Type: PM_CONSTANT_TARGET_NODE
834
+ typedef struct pm_constant_target_node {
835
+ pm_node_t base;
836
+ pm_constant_id_t name;
837
+ } pm_constant_target_node_t;
838
+
839
+ // ConstantWriteNode
840
+ //
841
+ // Type: PM_CONSTANT_WRITE_NODE
842
+ typedef struct pm_constant_write_node {
843
+ pm_node_t base;
844
+ pm_constant_id_t name;
845
+ pm_location_t name_loc;
846
+ struct pm_node *value;
847
+ pm_location_t operator_loc;
848
+ } pm_constant_write_node_t;
849
+
850
+ // DefNode
851
+ //
852
+ // Type: PM_DEF_NODE
853
+ typedef struct pm_def_node {
854
+ pm_node_t base;
855
+ pm_constant_id_t name;
856
+ pm_location_t name_loc;
857
+ struct pm_node *receiver;
858
+ struct pm_parameters_node *parameters;
859
+ struct pm_node *body;
860
+ pm_constant_id_list_t locals;
861
+ pm_location_t def_keyword_loc;
862
+ pm_location_t operator_loc;
863
+ pm_location_t lparen_loc;
864
+ pm_location_t rparen_loc;
865
+ pm_location_t equal_loc;
866
+ pm_location_t end_keyword_loc;
867
+ } pm_def_node_t;
868
+
869
+ // DefinedNode
870
+ //
871
+ // Type: PM_DEFINED_NODE
872
+ typedef struct pm_defined_node {
873
+ pm_node_t base;
874
+ pm_location_t lparen_loc;
875
+ struct pm_node *value;
876
+ pm_location_t rparen_loc;
877
+ pm_location_t keyword_loc;
878
+ } pm_defined_node_t;
879
+
880
+ // ElseNode
881
+ //
882
+ // Type: PM_ELSE_NODE
883
+ typedef struct pm_else_node {
884
+ pm_node_t base;
885
+ pm_location_t else_keyword_loc;
886
+ struct pm_statements_node *statements;
887
+ pm_location_t end_keyword_loc;
888
+ } pm_else_node_t;
889
+
890
+ // EmbeddedStatementsNode
891
+ //
892
+ // Type: PM_EMBEDDED_STATEMENTS_NODE
893
+ typedef struct pm_embedded_statements_node {
894
+ pm_node_t base;
895
+ pm_location_t opening_loc;
896
+ struct pm_statements_node *statements;
897
+ pm_location_t closing_loc;
898
+ } pm_embedded_statements_node_t;
899
+
900
+ // EmbeddedVariableNode
901
+ //
902
+ // Type: PM_EMBEDDED_VARIABLE_NODE
903
+ typedef struct pm_embedded_variable_node {
904
+ pm_node_t base;
905
+ pm_location_t operator_loc;
906
+ struct pm_node *variable;
907
+ } pm_embedded_variable_node_t;
908
+
909
+ // EnsureNode
910
+ //
911
+ // Type: PM_ENSURE_NODE
912
+ typedef struct pm_ensure_node {
913
+ pm_node_t base;
914
+ pm_location_t ensure_keyword_loc;
915
+ struct pm_statements_node *statements;
916
+ pm_location_t end_keyword_loc;
917
+ } pm_ensure_node_t;
918
+
919
+ // FalseNode
920
+ //
921
+ // Type: PM_FALSE_NODE
922
+ typedef struct pm_false_node {
923
+ pm_node_t base;
924
+ } pm_false_node_t;
925
+
926
+ // FindPatternNode
927
+ //
928
+ // Type: PM_FIND_PATTERN_NODE
929
+ typedef struct pm_find_pattern_node {
930
+ pm_node_t base;
931
+ struct pm_node *constant;
932
+ struct pm_node *left;
933
+ struct pm_node_list requireds;
934
+ struct pm_node *right;
935
+ pm_location_t opening_loc;
936
+ pm_location_t closing_loc;
937
+ } pm_find_pattern_node_t;
938
+
939
+ // FlipFlopNode
940
+ //
941
+ // Type: PM_FLIP_FLOP_NODE
942
+ // Flags:
943
+ // PM_RANGE_FLAGS_EXCLUDE_END
944
+ typedef struct pm_flip_flop_node {
945
+ pm_node_t base;
946
+ struct pm_node *left;
947
+ struct pm_node *right;
948
+ pm_location_t operator_loc;
949
+ } pm_flip_flop_node_t;
950
+
951
+ // FloatNode
952
+ //
953
+ // Type: PM_FLOAT_NODE
954
+ typedef struct pm_float_node {
955
+ pm_node_t base;
956
+ } pm_float_node_t;
957
+
958
+ // ForNode
959
+ //
960
+ // Type: PM_FOR_NODE
961
+ typedef struct pm_for_node {
962
+ pm_node_t base;
963
+ struct pm_node *index;
964
+ struct pm_node *collection;
965
+ struct pm_statements_node *statements;
966
+ pm_location_t for_keyword_loc;
967
+ pm_location_t in_keyword_loc;
968
+ pm_location_t do_keyword_loc;
969
+ pm_location_t end_keyword_loc;
970
+ } pm_for_node_t;
971
+
972
+ // ForwardingArgumentsNode
973
+ //
974
+ // Type: PM_FORWARDING_ARGUMENTS_NODE
975
+ typedef struct pm_forwarding_arguments_node {
976
+ pm_node_t base;
977
+ } pm_forwarding_arguments_node_t;
978
+
979
+ // ForwardingParameterNode
980
+ //
981
+ // Type: PM_FORWARDING_PARAMETER_NODE
982
+ typedef struct pm_forwarding_parameter_node {
983
+ pm_node_t base;
984
+ } pm_forwarding_parameter_node_t;
985
+
986
+ // ForwardingSuperNode
987
+ //
988
+ // Type: PM_FORWARDING_SUPER_NODE
989
+ typedef struct pm_forwarding_super_node {
990
+ pm_node_t base;
991
+ struct pm_block_node *block;
992
+ } pm_forwarding_super_node_t;
993
+
994
+ // GlobalVariableAndWriteNode
995
+ //
996
+ // Type: PM_GLOBAL_VARIABLE_AND_WRITE_NODE
997
+ typedef struct pm_global_variable_and_write_node {
998
+ pm_node_t base;
999
+ pm_constant_id_t name;
1000
+ pm_location_t name_loc;
1001
+ pm_location_t operator_loc;
1002
+ struct pm_node *value;
1003
+ } pm_global_variable_and_write_node_t;
1004
+
1005
+ // GlobalVariableOperatorWriteNode
1006
+ //
1007
+ // Type: PM_GLOBAL_VARIABLE_OPERATOR_WRITE_NODE
1008
+ typedef struct pm_global_variable_operator_write_node {
1009
+ pm_node_t base;
1010
+ pm_constant_id_t name;
1011
+ pm_location_t name_loc;
1012
+ pm_location_t operator_loc;
1013
+ struct pm_node *value;
1014
+ pm_constant_id_t operator;
1015
+ } pm_global_variable_operator_write_node_t;
1016
+
1017
+ // GlobalVariableOrWriteNode
1018
+ //
1019
+ // Type: PM_GLOBAL_VARIABLE_OR_WRITE_NODE
1020
+ typedef struct pm_global_variable_or_write_node {
1021
+ pm_node_t base;
1022
+ pm_constant_id_t name;
1023
+ pm_location_t name_loc;
1024
+ pm_location_t operator_loc;
1025
+ struct pm_node *value;
1026
+ } pm_global_variable_or_write_node_t;
1027
+
1028
+ // GlobalVariableReadNode
1029
+ //
1030
+ // Type: PM_GLOBAL_VARIABLE_READ_NODE
1031
+ typedef struct pm_global_variable_read_node {
1032
+ pm_node_t base;
1033
+ pm_constant_id_t name;
1034
+ } pm_global_variable_read_node_t;
1035
+
1036
+ // GlobalVariableTargetNode
1037
+ //
1038
+ // Type: PM_GLOBAL_VARIABLE_TARGET_NODE
1039
+ typedef struct pm_global_variable_target_node {
1040
+ pm_node_t base;
1041
+ pm_constant_id_t name;
1042
+ } pm_global_variable_target_node_t;
1043
+
1044
+ // GlobalVariableWriteNode
1045
+ //
1046
+ // Type: PM_GLOBAL_VARIABLE_WRITE_NODE
1047
+ typedef struct pm_global_variable_write_node {
1048
+ pm_node_t base;
1049
+ pm_constant_id_t name;
1050
+ pm_location_t name_loc;
1051
+ struct pm_node *value;
1052
+ pm_location_t operator_loc;
1053
+ } pm_global_variable_write_node_t;
1054
+
1055
+ // HashNode
1056
+ //
1057
+ // Type: PM_HASH_NODE
1058
+ typedef struct pm_hash_node {
1059
+ pm_node_t base;
1060
+ pm_location_t opening_loc;
1061
+ struct pm_node_list elements;
1062
+ pm_location_t closing_loc;
1063
+ } pm_hash_node_t;
1064
+
1065
+ // HashPatternNode
1066
+ //
1067
+ // Type: PM_HASH_PATTERN_NODE
1068
+ typedef struct pm_hash_pattern_node {
1069
+ pm_node_t base;
1070
+ struct pm_node *constant;
1071
+ struct pm_node_list assocs;
1072
+ struct pm_node *kwrest;
1073
+ pm_location_t opening_loc;
1074
+ pm_location_t closing_loc;
1075
+ } pm_hash_pattern_node_t;
1076
+
1077
+ // IfNode
1078
+ //
1079
+ // Type: PM_IF_NODE
1080
+ typedef struct pm_if_node {
1081
+ pm_node_t base;
1082
+ pm_location_t if_keyword_loc;
1083
+ struct pm_node *predicate;
1084
+ struct pm_statements_node *statements;
1085
+ struct pm_node *consequent;
1086
+ pm_location_t end_keyword_loc;
1087
+ } pm_if_node_t;
1088
+
1089
+ // ImaginaryNode
1090
+ //
1091
+ // Type: PM_IMAGINARY_NODE
1092
+ typedef struct pm_imaginary_node {
1093
+ pm_node_t base;
1094
+ struct pm_node *numeric;
1095
+ } pm_imaginary_node_t;
1096
+
1097
+ // ImplicitNode
1098
+ //
1099
+ // Type: PM_IMPLICIT_NODE
1100
+ typedef struct pm_implicit_node {
1101
+ pm_node_t base;
1102
+ struct pm_node *value;
1103
+ } pm_implicit_node_t;
1104
+
1105
+ // InNode
1106
+ //
1107
+ // Type: PM_IN_NODE
1108
+ typedef struct pm_in_node {
1109
+ pm_node_t base;
1110
+ struct pm_node *pattern;
1111
+ struct pm_statements_node *statements;
1112
+ pm_location_t in_loc;
1113
+ pm_location_t then_loc;
1114
+ } pm_in_node_t;
1115
+
1116
+ // InstanceVariableAndWriteNode
1117
+ //
1118
+ // Type: PM_INSTANCE_VARIABLE_AND_WRITE_NODE
1119
+ typedef struct pm_instance_variable_and_write_node {
1120
+ pm_node_t base;
1121
+ pm_constant_id_t name;
1122
+ pm_location_t name_loc;
1123
+ pm_location_t operator_loc;
1124
+ struct pm_node *value;
1125
+ } pm_instance_variable_and_write_node_t;
1126
+
1127
+ // InstanceVariableOperatorWriteNode
1128
+ //
1129
+ // Type: PM_INSTANCE_VARIABLE_OPERATOR_WRITE_NODE
1130
+ typedef struct pm_instance_variable_operator_write_node {
1131
+ pm_node_t base;
1132
+ pm_constant_id_t name;
1133
+ pm_location_t name_loc;
1134
+ pm_location_t operator_loc;
1135
+ struct pm_node *value;
1136
+ pm_constant_id_t operator;
1137
+ } pm_instance_variable_operator_write_node_t;
1138
+
1139
+ // InstanceVariableOrWriteNode
1140
+ //
1141
+ // Type: PM_INSTANCE_VARIABLE_OR_WRITE_NODE
1142
+ typedef struct pm_instance_variable_or_write_node {
1143
+ pm_node_t base;
1144
+ pm_constant_id_t name;
1145
+ pm_location_t name_loc;
1146
+ pm_location_t operator_loc;
1147
+ struct pm_node *value;
1148
+ } pm_instance_variable_or_write_node_t;
1149
+
1150
+ // InstanceVariableReadNode
1151
+ //
1152
+ // Type: PM_INSTANCE_VARIABLE_READ_NODE
1153
+ typedef struct pm_instance_variable_read_node {
1154
+ pm_node_t base;
1155
+ pm_constant_id_t name;
1156
+ } pm_instance_variable_read_node_t;
1157
+
1158
+ // InstanceVariableTargetNode
1159
+ //
1160
+ // Type: PM_INSTANCE_VARIABLE_TARGET_NODE
1161
+ typedef struct pm_instance_variable_target_node {
1162
+ pm_node_t base;
1163
+ pm_constant_id_t name;
1164
+ } pm_instance_variable_target_node_t;
1165
+
1166
+ // InstanceVariableWriteNode
1167
+ //
1168
+ // Type: PM_INSTANCE_VARIABLE_WRITE_NODE
1169
+ typedef struct pm_instance_variable_write_node {
1170
+ pm_node_t base;
1171
+ pm_constant_id_t name;
1172
+ pm_location_t name_loc;
1173
+ struct pm_node *value;
1174
+ pm_location_t operator_loc;
1175
+ } pm_instance_variable_write_node_t;
1176
+
1177
+ // IntegerNode
1178
+ //
1179
+ // Type: PM_INTEGER_NODE
1180
+ // Flags:
1181
+ // PM_INTEGER_BASE_FLAGS_BINARY
1182
+ // PM_INTEGER_BASE_FLAGS_OCTAL
1183
+ // PM_INTEGER_BASE_FLAGS_DECIMAL
1184
+ // PM_INTEGER_BASE_FLAGS_HEXADECIMAL
1185
+ typedef struct pm_integer_node {
1186
+ pm_node_t base;
1187
+ } pm_integer_node_t;
1188
+
1189
+ // InterpolatedMatchLastLineNode
1190
+ //
1191
+ // Type: PM_INTERPOLATED_MATCH_LAST_LINE_NODE
1192
+ // Flags:
1193
+ // PM_REGULAR_EXPRESSION_FLAGS_IGNORE_CASE
1194
+ // PM_REGULAR_EXPRESSION_FLAGS_EXTENDED
1195
+ // PM_REGULAR_EXPRESSION_FLAGS_MULTI_LINE
1196
+ // PM_REGULAR_EXPRESSION_FLAGS_EUC_JP
1197
+ // PM_REGULAR_EXPRESSION_FLAGS_ASCII_8BIT
1198
+ // PM_REGULAR_EXPRESSION_FLAGS_WINDOWS_31J
1199
+ // PM_REGULAR_EXPRESSION_FLAGS_UTF_8
1200
+ // PM_REGULAR_EXPRESSION_FLAGS_ONCE
1201
+ typedef struct pm_interpolated_match_last_line_node {
1202
+ pm_node_t base;
1203
+ pm_location_t opening_loc;
1204
+ struct pm_node_list parts;
1205
+ pm_location_t closing_loc;
1206
+ } pm_interpolated_match_last_line_node_t;
1207
+
1208
+ // InterpolatedRegularExpressionNode
1209
+ //
1210
+ // Type: PM_INTERPOLATED_REGULAR_EXPRESSION_NODE
1211
+ // Flags:
1212
+ // PM_REGULAR_EXPRESSION_FLAGS_IGNORE_CASE
1213
+ // PM_REGULAR_EXPRESSION_FLAGS_EXTENDED
1214
+ // PM_REGULAR_EXPRESSION_FLAGS_MULTI_LINE
1215
+ // PM_REGULAR_EXPRESSION_FLAGS_EUC_JP
1216
+ // PM_REGULAR_EXPRESSION_FLAGS_ASCII_8BIT
1217
+ // PM_REGULAR_EXPRESSION_FLAGS_WINDOWS_31J
1218
+ // PM_REGULAR_EXPRESSION_FLAGS_UTF_8
1219
+ // PM_REGULAR_EXPRESSION_FLAGS_ONCE
1220
+ typedef struct pm_interpolated_regular_expression_node {
1221
+ pm_node_t base;
1222
+ pm_location_t opening_loc;
1223
+ struct pm_node_list parts;
1224
+ pm_location_t closing_loc;
1225
+ } pm_interpolated_regular_expression_node_t;
1226
+
1227
+ // InterpolatedStringNode
1228
+ //
1229
+ // Type: PM_INTERPOLATED_STRING_NODE
1230
+ typedef struct pm_interpolated_string_node {
1231
+ pm_node_t base;
1232
+ pm_location_t opening_loc;
1233
+ struct pm_node_list parts;
1234
+ pm_location_t closing_loc;
1235
+ } pm_interpolated_string_node_t;
1236
+
1237
+ // InterpolatedSymbolNode
1238
+ //
1239
+ // Type: PM_INTERPOLATED_SYMBOL_NODE
1240
+ typedef struct pm_interpolated_symbol_node {
1241
+ pm_node_t base;
1242
+ pm_location_t opening_loc;
1243
+ struct pm_node_list parts;
1244
+ pm_location_t closing_loc;
1245
+ } pm_interpolated_symbol_node_t;
1246
+
1247
+ // InterpolatedXStringNode
1248
+ //
1249
+ // Type: PM_INTERPOLATED_X_STRING_NODE
1250
+ typedef struct pm_interpolated_x_string_node {
1251
+ pm_node_t base;
1252
+ pm_location_t opening_loc;
1253
+ struct pm_node_list parts;
1254
+ pm_location_t closing_loc;
1255
+ } pm_interpolated_x_string_node_t;
1256
+
1257
+ // KeywordHashNode
1258
+ //
1259
+ // Type: PM_KEYWORD_HASH_NODE
1260
+ typedef struct pm_keyword_hash_node {
1261
+ pm_node_t base;
1262
+ struct pm_node_list elements;
1263
+ } pm_keyword_hash_node_t;
1264
+
1265
+ // KeywordParameterNode
1266
+ //
1267
+ // Type: PM_KEYWORD_PARAMETER_NODE
1268
+ typedef struct pm_keyword_parameter_node {
1269
+ pm_node_t base;
1270
+ pm_constant_id_t name;
1271
+ pm_location_t name_loc;
1272
+ struct pm_node *value;
1273
+ } pm_keyword_parameter_node_t;
1274
+
1275
+ // KeywordRestParameterNode
1276
+ //
1277
+ // Type: PM_KEYWORD_REST_PARAMETER_NODE
1278
+ typedef struct pm_keyword_rest_parameter_node {
1279
+ pm_node_t base;
1280
+ pm_constant_id_t name;
1281
+ pm_location_t name_loc;
1282
+ pm_location_t operator_loc;
1283
+ } pm_keyword_rest_parameter_node_t;
1284
+
1285
+ // LambdaNode
1286
+ //
1287
+ // Type: PM_LAMBDA_NODE
1288
+ typedef struct pm_lambda_node {
1289
+ pm_node_t base;
1290
+ pm_constant_id_list_t locals;
1291
+ pm_location_t operator_loc;
1292
+ pm_location_t opening_loc;
1293
+ pm_location_t closing_loc;
1294
+ struct pm_block_parameters_node *parameters;
1295
+ struct pm_node *body;
1296
+ } pm_lambda_node_t;
1297
+
1298
+ // LocalVariableAndWriteNode
1299
+ //
1300
+ // Type: PM_LOCAL_VARIABLE_AND_WRITE_NODE
1301
+ typedef struct pm_local_variable_and_write_node {
1302
+ pm_node_t base;
1303
+ pm_location_t name_loc;
1304
+ pm_location_t operator_loc;
1305
+ struct pm_node *value;
1306
+ pm_constant_id_t name;
1307
+ uint32_t depth;
1308
+ } pm_local_variable_and_write_node_t;
1309
+
1310
+ // LocalVariableOperatorWriteNode
1311
+ //
1312
+ // Type: PM_LOCAL_VARIABLE_OPERATOR_WRITE_NODE
1313
+ typedef struct pm_local_variable_operator_write_node {
1314
+ pm_node_t base;
1315
+ pm_location_t name_loc;
1316
+ pm_location_t operator_loc;
1317
+ struct pm_node *value;
1318
+ pm_constant_id_t name;
1319
+ pm_constant_id_t operator;
1320
+ uint32_t depth;
1321
+ } pm_local_variable_operator_write_node_t;
1322
+
1323
+ // LocalVariableOrWriteNode
1324
+ //
1325
+ // Type: PM_LOCAL_VARIABLE_OR_WRITE_NODE
1326
+ typedef struct pm_local_variable_or_write_node {
1327
+ pm_node_t base;
1328
+ pm_location_t name_loc;
1329
+ pm_location_t operator_loc;
1330
+ struct pm_node *value;
1331
+ pm_constant_id_t name;
1332
+ uint32_t depth;
1333
+ } pm_local_variable_or_write_node_t;
1334
+
1335
+ // LocalVariableReadNode
1336
+ //
1337
+ // Type: PM_LOCAL_VARIABLE_READ_NODE
1338
+ typedef struct pm_local_variable_read_node {
1339
+ pm_node_t base;
1340
+ pm_constant_id_t name;
1341
+ uint32_t depth;
1342
+ } pm_local_variable_read_node_t;
1343
+
1344
+ // LocalVariableTargetNode
1345
+ //
1346
+ // Type: PM_LOCAL_VARIABLE_TARGET_NODE
1347
+ typedef struct pm_local_variable_target_node {
1348
+ pm_node_t base;
1349
+ pm_constant_id_t name;
1350
+ uint32_t depth;
1351
+ } pm_local_variable_target_node_t;
1352
+
1353
+ // LocalVariableWriteNode
1354
+ //
1355
+ // Type: PM_LOCAL_VARIABLE_WRITE_NODE
1356
+ typedef struct pm_local_variable_write_node {
1357
+ pm_node_t base;
1358
+ pm_constant_id_t name;
1359
+ uint32_t depth;
1360
+ pm_location_t name_loc;
1361
+ struct pm_node *value;
1362
+ pm_location_t operator_loc;
1363
+ } pm_local_variable_write_node_t;
1364
+
1365
+ // MatchLastLineNode
1366
+ //
1367
+ // Type: PM_MATCH_LAST_LINE_NODE
1368
+ // Flags:
1369
+ // PM_REGULAR_EXPRESSION_FLAGS_IGNORE_CASE
1370
+ // PM_REGULAR_EXPRESSION_FLAGS_EXTENDED
1371
+ // PM_REGULAR_EXPRESSION_FLAGS_MULTI_LINE
1372
+ // PM_REGULAR_EXPRESSION_FLAGS_EUC_JP
1373
+ // PM_REGULAR_EXPRESSION_FLAGS_ASCII_8BIT
1374
+ // PM_REGULAR_EXPRESSION_FLAGS_WINDOWS_31J
1375
+ // PM_REGULAR_EXPRESSION_FLAGS_UTF_8
1376
+ // PM_REGULAR_EXPRESSION_FLAGS_ONCE
1377
+ typedef struct pm_match_last_line_node {
1378
+ pm_node_t base;
1379
+ pm_location_t opening_loc;
1380
+ pm_location_t content_loc;
1381
+ pm_location_t closing_loc;
1382
+ pm_string_t unescaped;
1383
+ } pm_match_last_line_node_t;
1384
+
1385
+ // MatchPredicateNode
1386
+ //
1387
+ // Type: PM_MATCH_PREDICATE_NODE
1388
+ typedef struct pm_match_predicate_node {
1389
+ pm_node_t base;
1390
+ struct pm_node *value;
1391
+ struct pm_node *pattern;
1392
+ pm_location_t operator_loc;
1393
+ } pm_match_predicate_node_t;
1394
+
1395
+ // MatchRequiredNode
1396
+ //
1397
+ // Type: PM_MATCH_REQUIRED_NODE
1398
+ typedef struct pm_match_required_node {
1399
+ pm_node_t base;
1400
+ struct pm_node *value;
1401
+ struct pm_node *pattern;
1402
+ pm_location_t operator_loc;
1403
+ } pm_match_required_node_t;
1404
+
1405
+ // MatchWriteNode
1406
+ //
1407
+ // Type: PM_MATCH_WRITE_NODE
1408
+ typedef struct pm_match_write_node {
1409
+ pm_node_t base;
1410
+ struct pm_call_node *call;
1411
+ pm_constant_id_list_t locals;
1412
+ } pm_match_write_node_t;
1413
+
1414
+ // MissingNode
1415
+ //
1416
+ // Type: PM_MISSING_NODE
1417
+ typedef struct pm_missing_node {
1418
+ pm_node_t base;
1419
+ } pm_missing_node_t;
1420
+
1421
+ // ModuleNode
1422
+ //
1423
+ // Type: PM_MODULE_NODE
1424
+ typedef struct pm_module_node {
1425
+ pm_node_t base;
1426
+ pm_constant_id_list_t locals;
1427
+ pm_location_t module_keyword_loc;
1428
+ struct pm_node *constant_path;
1429
+ struct pm_node *body;
1430
+ pm_location_t end_keyword_loc;
1431
+ pm_constant_id_t name;
1432
+ } pm_module_node_t;
1433
+
1434
+ // MultiTargetNode
1435
+ //
1436
+ // Type: PM_MULTI_TARGET_NODE
1437
+ typedef struct pm_multi_target_node {
1438
+ pm_node_t base;
1439
+ struct pm_node_list targets;
1440
+ pm_location_t lparen_loc;
1441
+ pm_location_t rparen_loc;
1442
+ } pm_multi_target_node_t;
1443
+
1444
+ // MultiWriteNode
1445
+ //
1446
+ // Type: PM_MULTI_WRITE_NODE
1447
+ typedef struct pm_multi_write_node {
1448
+ pm_node_t base;
1449
+ struct pm_node_list targets;
1450
+ pm_location_t lparen_loc;
1451
+ pm_location_t rparen_loc;
1452
+ pm_location_t operator_loc;
1453
+ struct pm_node *value;
1454
+ } pm_multi_write_node_t;
1455
+
1456
+ // NextNode
1457
+ //
1458
+ // Type: PM_NEXT_NODE
1459
+ typedef struct pm_next_node {
1460
+ pm_node_t base;
1461
+ struct pm_arguments_node *arguments;
1462
+ pm_location_t keyword_loc;
1463
+ } pm_next_node_t;
1464
+
1465
+ // NilNode
1466
+ //
1467
+ // Type: PM_NIL_NODE
1468
+ typedef struct pm_nil_node {
1469
+ pm_node_t base;
1470
+ } pm_nil_node_t;
1471
+
1472
+ // NoKeywordsParameterNode
1473
+ //
1474
+ // Type: PM_NO_KEYWORDS_PARAMETER_NODE
1475
+ typedef struct pm_no_keywords_parameter_node {
1476
+ pm_node_t base;
1477
+ pm_location_t operator_loc;
1478
+ pm_location_t keyword_loc;
1479
+ } pm_no_keywords_parameter_node_t;
1480
+
1481
+ // NumberedReferenceReadNode
1482
+ //
1483
+ // Type: PM_NUMBERED_REFERENCE_READ_NODE
1484
+ typedef struct pm_numbered_reference_read_node {
1485
+ pm_node_t base;
1486
+ uint32_t number;
1487
+ } pm_numbered_reference_read_node_t;
1488
+
1489
+ // OptionalParameterNode
1490
+ //
1491
+ // Type: PM_OPTIONAL_PARAMETER_NODE
1492
+ typedef struct pm_optional_parameter_node {
1493
+ pm_node_t base;
1494
+ pm_constant_id_t name;
1495
+ pm_location_t name_loc;
1496
+ pm_location_t operator_loc;
1497
+ struct pm_node *value;
1498
+ } pm_optional_parameter_node_t;
1499
+
1500
+ // OrNode
1501
+ //
1502
+ // Type: PM_OR_NODE
1503
+ typedef struct pm_or_node {
1504
+ pm_node_t base;
1505
+ struct pm_node *left;
1506
+ struct pm_node *right;
1507
+ pm_location_t operator_loc;
1508
+ } pm_or_node_t;
1509
+
1510
+ // ParametersNode
1511
+ //
1512
+ // Type: PM_PARAMETERS_NODE
1513
+ typedef struct pm_parameters_node {
1514
+ pm_node_t base;
1515
+ struct pm_node_list requireds;
1516
+ struct pm_node_list optionals;
1517
+ struct pm_rest_parameter_node *rest;
1518
+ struct pm_node_list posts;
1519
+ struct pm_node_list keywords;
1520
+ struct pm_node *keyword_rest;
1521
+ struct pm_block_parameter_node *block;
1522
+ } pm_parameters_node_t;
1523
+
1524
+ // ParenthesesNode
1525
+ //
1526
+ // Type: PM_PARENTHESES_NODE
1527
+ typedef struct pm_parentheses_node {
1528
+ pm_node_t base;
1529
+ struct pm_node *body;
1530
+ pm_location_t opening_loc;
1531
+ pm_location_t closing_loc;
1532
+ } pm_parentheses_node_t;
1533
+
1534
+ // PinnedExpressionNode
1535
+ //
1536
+ // Type: PM_PINNED_EXPRESSION_NODE
1537
+ typedef struct pm_pinned_expression_node {
1538
+ pm_node_t base;
1539
+ struct pm_node *expression;
1540
+ pm_location_t operator_loc;
1541
+ pm_location_t lparen_loc;
1542
+ pm_location_t rparen_loc;
1543
+ } pm_pinned_expression_node_t;
1544
+
1545
+ // PinnedVariableNode
1546
+ //
1547
+ // Type: PM_PINNED_VARIABLE_NODE
1548
+ typedef struct pm_pinned_variable_node {
1549
+ pm_node_t base;
1550
+ struct pm_node *variable;
1551
+ pm_location_t operator_loc;
1552
+ } pm_pinned_variable_node_t;
1553
+
1554
+ // PostExecutionNode
1555
+ //
1556
+ // Type: PM_POST_EXECUTION_NODE
1557
+ typedef struct pm_post_execution_node {
1558
+ pm_node_t base;
1559
+ struct pm_statements_node *statements;
1560
+ pm_location_t keyword_loc;
1561
+ pm_location_t opening_loc;
1562
+ pm_location_t closing_loc;
1563
+ } pm_post_execution_node_t;
1564
+
1565
+ // PreExecutionNode
1566
+ //
1567
+ // Type: PM_PRE_EXECUTION_NODE
1568
+ typedef struct pm_pre_execution_node {
1569
+ pm_node_t base;
1570
+ struct pm_statements_node *statements;
1571
+ pm_location_t keyword_loc;
1572
+ pm_location_t opening_loc;
1573
+ pm_location_t closing_loc;
1574
+ } pm_pre_execution_node_t;
1575
+
1576
+ // ProgramNode
1577
+ //
1578
+ // Type: PM_PROGRAM_NODE
1579
+ typedef struct pm_program_node {
1580
+ pm_node_t base;
1581
+ pm_constant_id_list_t locals;
1582
+ struct pm_statements_node *statements;
1583
+ } pm_program_node_t;
1584
+
1585
+ // RangeNode
1586
+ //
1587
+ // Type: PM_RANGE_NODE
1588
+ // Flags:
1589
+ // PM_RANGE_FLAGS_EXCLUDE_END
1590
+ typedef struct pm_range_node {
1591
+ pm_node_t base;
1592
+ struct pm_node *left;
1593
+ struct pm_node *right;
1594
+ pm_location_t operator_loc;
1595
+ } pm_range_node_t;
1596
+
1597
+ // RationalNode
1598
+ //
1599
+ // Type: PM_RATIONAL_NODE
1600
+ typedef struct pm_rational_node {
1601
+ pm_node_t base;
1602
+ struct pm_node *numeric;
1603
+ } pm_rational_node_t;
1604
+
1605
+ // RedoNode
1606
+ //
1607
+ // Type: PM_REDO_NODE
1608
+ typedef struct pm_redo_node {
1609
+ pm_node_t base;
1610
+ } pm_redo_node_t;
1611
+
1612
+ // RegularExpressionNode
1613
+ //
1614
+ // Type: PM_REGULAR_EXPRESSION_NODE
1615
+ // Flags:
1616
+ // PM_REGULAR_EXPRESSION_FLAGS_IGNORE_CASE
1617
+ // PM_REGULAR_EXPRESSION_FLAGS_EXTENDED
1618
+ // PM_REGULAR_EXPRESSION_FLAGS_MULTI_LINE
1619
+ // PM_REGULAR_EXPRESSION_FLAGS_EUC_JP
1620
+ // PM_REGULAR_EXPRESSION_FLAGS_ASCII_8BIT
1621
+ // PM_REGULAR_EXPRESSION_FLAGS_WINDOWS_31J
1622
+ // PM_REGULAR_EXPRESSION_FLAGS_UTF_8
1623
+ // PM_REGULAR_EXPRESSION_FLAGS_ONCE
1624
+ typedef struct pm_regular_expression_node {
1625
+ pm_node_t base;
1626
+ pm_location_t opening_loc;
1627
+ pm_location_t content_loc;
1628
+ pm_location_t closing_loc;
1629
+ pm_string_t unescaped;
1630
+ } pm_regular_expression_node_t;
1631
+
1632
+ // RequiredDestructuredParameterNode
1633
+ //
1634
+ // Type: PM_REQUIRED_DESTRUCTURED_PARAMETER_NODE
1635
+ typedef struct pm_required_destructured_parameter_node {
1636
+ pm_node_t base;
1637
+ struct pm_node_list parameters;
1638
+ pm_location_t opening_loc;
1639
+ pm_location_t closing_loc;
1640
+ } pm_required_destructured_parameter_node_t;
1641
+
1642
+ // RequiredParameterNode
1643
+ //
1644
+ // Type: PM_REQUIRED_PARAMETER_NODE
1645
+ typedef struct pm_required_parameter_node {
1646
+ pm_node_t base;
1647
+ pm_constant_id_t name;
1648
+ } pm_required_parameter_node_t;
1649
+
1650
+ // RescueModifierNode
1651
+ //
1652
+ // Type: PM_RESCUE_MODIFIER_NODE
1653
+ typedef struct pm_rescue_modifier_node {
1654
+ pm_node_t base;
1655
+ struct pm_node *expression;
1656
+ pm_location_t keyword_loc;
1657
+ struct pm_node *rescue_expression;
1658
+ } pm_rescue_modifier_node_t;
1659
+
1660
+ // RescueNode
1661
+ //
1662
+ // Type: PM_RESCUE_NODE
1663
+ typedef struct pm_rescue_node {
1664
+ pm_node_t base;
1665
+ pm_location_t keyword_loc;
1666
+ struct pm_node_list exceptions;
1667
+ pm_location_t operator_loc;
1668
+ struct pm_node *reference;
1669
+ struct pm_statements_node *statements;
1670
+ struct pm_rescue_node *consequent;
1671
+ } pm_rescue_node_t;
1672
+
1673
+ // RestParameterNode
1674
+ //
1675
+ // Type: PM_REST_PARAMETER_NODE
1676
+ typedef struct pm_rest_parameter_node {
1677
+ pm_node_t base;
1678
+ pm_constant_id_t name;
1679
+ pm_location_t name_loc;
1680
+ pm_location_t operator_loc;
1681
+ } pm_rest_parameter_node_t;
1682
+
1683
+ // RetryNode
1684
+ //
1685
+ // Type: PM_RETRY_NODE
1686
+ typedef struct pm_retry_node {
1687
+ pm_node_t base;
1688
+ } pm_retry_node_t;
1689
+
1690
+ // ReturnNode
1691
+ //
1692
+ // Type: PM_RETURN_NODE
1693
+ typedef struct pm_return_node {
1694
+ pm_node_t base;
1695
+ pm_location_t keyword_loc;
1696
+ struct pm_arguments_node *arguments;
1697
+ } pm_return_node_t;
1698
+
1699
+ // SelfNode
1700
+ //
1701
+ // Type: PM_SELF_NODE
1702
+ typedef struct pm_self_node {
1703
+ pm_node_t base;
1704
+ } pm_self_node_t;
1705
+
1706
+ // SingletonClassNode
1707
+ //
1708
+ // Type: PM_SINGLETON_CLASS_NODE
1709
+ typedef struct pm_singleton_class_node {
1710
+ pm_node_t base;
1711
+ pm_constant_id_list_t locals;
1712
+ pm_location_t class_keyword_loc;
1713
+ pm_location_t operator_loc;
1714
+ struct pm_node *expression;
1715
+ struct pm_node *body;
1716
+ pm_location_t end_keyword_loc;
1717
+ } pm_singleton_class_node_t;
1718
+
1719
+ // SourceEncodingNode
1720
+ //
1721
+ // Type: PM_SOURCE_ENCODING_NODE
1722
+ typedef struct pm_source_encoding_node {
1723
+ pm_node_t base;
1724
+ } pm_source_encoding_node_t;
1725
+
1726
+ // SourceFileNode
1727
+ //
1728
+ // Type: PM_SOURCE_FILE_NODE
1729
+ typedef struct pm_source_file_node {
1730
+ pm_node_t base;
1731
+ pm_string_t filepath;
1732
+ } pm_source_file_node_t;
1733
+
1734
+ // SourceLineNode
1735
+ //
1736
+ // Type: PM_SOURCE_LINE_NODE
1737
+ typedef struct pm_source_line_node {
1738
+ pm_node_t base;
1739
+ } pm_source_line_node_t;
1740
+
1741
+ // SplatNode
1742
+ //
1743
+ // Type: PM_SPLAT_NODE
1744
+ typedef struct pm_splat_node {
1745
+ pm_node_t base;
1746
+ pm_location_t operator_loc;
1747
+ struct pm_node *expression;
1748
+ } pm_splat_node_t;
1749
+
1750
+ // StatementsNode
1751
+ //
1752
+ // Type: PM_STATEMENTS_NODE
1753
+ typedef struct pm_statements_node {
1754
+ pm_node_t base;
1755
+ struct pm_node_list body;
1756
+ } pm_statements_node_t;
1757
+
1758
+ // StringConcatNode
1759
+ //
1760
+ // Type: PM_STRING_CONCAT_NODE
1761
+ typedef struct pm_string_concat_node {
1762
+ pm_node_t base;
1763
+ struct pm_node *left;
1764
+ struct pm_node *right;
1765
+ } pm_string_concat_node_t;
1766
+
1767
+ // StringNode
1768
+ //
1769
+ // Type: PM_STRING_NODE
1770
+ // Flags:
1771
+ // PM_STRING_FLAGS_FROZEN
1772
+ typedef struct pm_string_node {
1773
+ pm_node_t base;
1774
+ pm_location_t opening_loc;
1775
+ pm_location_t content_loc;
1776
+ pm_location_t closing_loc;
1777
+ pm_string_t unescaped;
1778
+ } pm_string_node_t;
1779
+
1780
+ // SuperNode
1781
+ //
1782
+ // Type: PM_SUPER_NODE
1783
+ typedef struct pm_super_node {
1784
+ pm_node_t base;
1785
+ pm_location_t keyword_loc;
1786
+ pm_location_t lparen_loc;
1787
+ struct pm_arguments_node *arguments;
1788
+ pm_location_t rparen_loc;
1789
+ struct pm_node *block;
1790
+ } pm_super_node_t;
1791
+
1792
+ // SymbolNode
1793
+ //
1794
+ // Type: PM_SYMBOL_NODE
1795
+ typedef struct pm_symbol_node {
1796
+ pm_node_t base;
1797
+ pm_location_t opening_loc;
1798
+ pm_location_t value_loc;
1799
+ pm_location_t closing_loc;
1800
+ pm_string_t unescaped;
1801
+ } pm_symbol_node_t;
1802
+
1803
+ // TrueNode
1804
+ //
1805
+ // Type: PM_TRUE_NODE
1806
+ typedef struct pm_true_node {
1807
+ pm_node_t base;
1808
+ } pm_true_node_t;
1809
+
1810
+ // UndefNode
1811
+ //
1812
+ // Type: PM_UNDEF_NODE
1813
+ typedef struct pm_undef_node {
1814
+ pm_node_t base;
1815
+ struct pm_node_list names;
1816
+ pm_location_t keyword_loc;
1817
+ } pm_undef_node_t;
1818
+
1819
+ // UnlessNode
1820
+ //
1821
+ // Type: PM_UNLESS_NODE
1822
+ typedef struct pm_unless_node {
1823
+ pm_node_t base;
1824
+ pm_location_t keyword_loc;
1825
+ struct pm_node *predicate;
1826
+ struct pm_statements_node *statements;
1827
+ struct pm_else_node *consequent;
1828
+ pm_location_t end_keyword_loc;
1829
+ } pm_unless_node_t;
1830
+
1831
+ // UntilNode
1832
+ //
1833
+ // Type: PM_UNTIL_NODE
1834
+ // Flags:
1835
+ // PM_LOOP_FLAGS_BEGIN_MODIFIER
1836
+ typedef struct pm_until_node {
1837
+ pm_node_t base;
1838
+ pm_location_t keyword_loc;
1839
+ pm_location_t closing_loc;
1840
+ struct pm_node *predicate;
1841
+ struct pm_statements_node *statements;
1842
+ } pm_until_node_t;
1843
+
1844
+ // WhenNode
1845
+ //
1846
+ // Type: PM_WHEN_NODE
1847
+ typedef struct pm_when_node {
1848
+ pm_node_t base;
1849
+ pm_location_t keyword_loc;
1850
+ struct pm_node_list conditions;
1851
+ struct pm_statements_node *statements;
1852
+ } pm_when_node_t;
1853
+
1854
+ // WhileNode
1855
+ //
1856
+ // Type: PM_WHILE_NODE
1857
+ // Flags:
1858
+ // PM_LOOP_FLAGS_BEGIN_MODIFIER
1859
+ typedef struct pm_while_node {
1860
+ pm_node_t base;
1861
+ pm_location_t keyword_loc;
1862
+ pm_location_t closing_loc;
1863
+ struct pm_node *predicate;
1864
+ struct pm_statements_node *statements;
1865
+ } pm_while_node_t;
1866
+
1867
+ // XStringNode
1868
+ //
1869
+ // Type: PM_X_STRING_NODE
1870
+ typedef struct pm_x_string_node {
1871
+ pm_node_t base;
1872
+ pm_location_t opening_loc;
1873
+ pm_location_t content_loc;
1874
+ pm_location_t closing_loc;
1875
+ pm_string_t unescaped;
1876
+ } pm_x_string_node_t;
1877
+
1878
+ // YieldNode
1879
+ //
1880
+ // Type: PM_YIELD_NODE
1881
+ typedef struct pm_yield_node {
1882
+ pm_node_t base;
1883
+ pm_location_t keyword_loc;
1884
+ pm_location_t lparen_loc;
1885
+ struct pm_arguments_node *arguments;
1886
+ pm_location_t rparen_loc;
1887
+ } pm_yield_node_t;
1888
+
1889
+ // CallNodeFlags
1890
+ typedef enum {
1891
+ PM_CALL_NODE_FLAGS_SAFE_NAVIGATION = 1 << 2,
1892
+ PM_CALL_NODE_FLAGS_VARIABLE_CALL = 1 << 3,
1893
+ } pm_call_node_flags_t;
1894
+
1895
+ // IntegerBaseFlags
1896
+ typedef enum {
1897
+ PM_INTEGER_BASE_FLAGS_BINARY = 1 << 2,
1898
+ PM_INTEGER_BASE_FLAGS_OCTAL = 1 << 3,
1899
+ PM_INTEGER_BASE_FLAGS_DECIMAL = 1 << 4,
1900
+ PM_INTEGER_BASE_FLAGS_HEXADECIMAL = 1 << 5,
1901
+ } pm_integer_base_flags_t;
1902
+
1903
+ // LoopFlags
1904
+ typedef enum {
1905
+ PM_LOOP_FLAGS_BEGIN_MODIFIER = 1 << 2,
1906
+ } pm_loop_flags_t;
1907
+
1908
+ // RangeFlags
1909
+ typedef enum {
1910
+ PM_RANGE_FLAGS_EXCLUDE_END = 1 << 2,
1911
+ } pm_range_flags_t;
1912
+
1913
+ // RegularExpressionFlags
1914
+ typedef enum {
1915
+ PM_REGULAR_EXPRESSION_FLAGS_IGNORE_CASE = 1 << 2,
1916
+ PM_REGULAR_EXPRESSION_FLAGS_EXTENDED = 1 << 3,
1917
+ PM_REGULAR_EXPRESSION_FLAGS_MULTI_LINE = 1 << 4,
1918
+ PM_REGULAR_EXPRESSION_FLAGS_EUC_JP = 1 << 5,
1919
+ PM_REGULAR_EXPRESSION_FLAGS_ASCII_8BIT = 1 << 6,
1920
+ PM_REGULAR_EXPRESSION_FLAGS_WINDOWS_31J = 1 << 7,
1921
+ PM_REGULAR_EXPRESSION_FLAGS_UTF_8 = 1 << 8,
1922
+ PM_REGULAR_EXPRESSION_FLAGS_ONCE = 1 << 9,
1923
+ } pm_regular_expression_flags_t;
1924
+
1925
+ // StringFlags
1926
+ typedef enum {
1927
+ PM_STRING_FLAGS_FROZEN = 1 << 2,
1928
+ } pm_string_flags_t;
1929
+
1930
+ #define PRISM_SERIALIZE_ONLY_SEMANTICS_FIELDS false
1931
+
1932
+ #endif // PRISM_AST_H