yarp 0.10.0 → 0.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +25 -1
- data/CONTRIBUTING.md +7 -0
- data/config.yml +154 -43
- data/docs/configuration.md +0 -1
- data/docs/mapping.md +91 -91
- data/docs/serialization.md +23 -20
- data/ext/yarp/api_node.c +1074 -391
- data/ext/yarp/extension.c +1 -1
- data/ext/yarp/extension.h +2 -2
- data/include/yarp/ast.h +501 -301
- data/include/yarp/diagnostic.h +198 -1
- data/include/yarp/node.h +0 -4
- data/include/yarp/util/yp_char.h +1 -1
- data/include/yarp/util/yp_constant_pool.h +11 -4
- data/include/yarp/version.h +2 -2
- data/lib/yarp/desugar_visitor.rb +19 -19
- data/lib/yarp/mutation_visitor.rb +22 -12
- data/lib/yarp/node.rb +2883 -293
- data/lib/yarp/parse_result/comments.rb +172 -0
- data/lib/yarp/parse_result/newlines.rb +60 -0
- data/lib/yarp/pattern.rb +239 -0
- data/lib/yarp/serialize.rb +152 -129
- data/lib/yarp.rb +104 -44
- data/src/diagnostic.c +254 -2
- data/src/node.c +901 -868
- data/src/prettyprint.c +380 -186
- data/src/serialize.c +325 -170
- data/src/unescape.c +20 -20
- data/src/util/yp_char.c +2 -7
- data/src/util/yp_constant_pool.c +41 -8
- data/src/util/yp_newline_list.c +5 -1
- data/src/util/yp_string_list.c +4 -1
- data/src/yarp.c +946 -818
- data/yarp.gemspec +4 -1
- metadata +6 -3
data/include/yarp/diagnostic.h
CHANGED
@@ -6,6 +6,7 @@
|
|
6
6
|
|
7
7
|
#include <stdbool.h>
|
8
8
|
#include <stdlib.h>
|
9
|
+
#include <assert.h>
|
9
10
|
|
10
11
|
// This struct represents a diagnostic found during parsing.
|
11
12
|
typedef struct {
|
@@ -15,8 +16,204 @@ typedef struct {
|
|
15
16
|
const char *message;
|
16
17
|
} yp_diagnostic_t;
|
17
18
|
|
19
|
+
typedef enum {
|
20
|
+
YP_ERR_ALIAS_ARGUMENT,
|
21
|
+
YP_ERR_AMPAMPEQ_MULTI_ASSIGN,
|
22
|
+
YP_ERR_ARGUMENT_AFTER_BLOCK,
|
23
|
+
YP_ERR_ARGUMENT_BARE_HASH,
|
24
|
+
YP_ERR_ARGUMENT_BLOCK_MULTI,
|
25
|
+
YP_ERR_ARGUMENT_FORMAL_CLASS,
|
26
|
+
YP_ERR_ARGUMENT_FORMAL_CONSTANT,
|
27
|
+
YP_ERR_ARGUMENT_FORMAL_GLOBAL,
|
28
|
+
YP_ERR_ARGUMENT_FORMAL_IVAR,
|
29
|
+
YP_ERR_ARGUMENT_NO_FORWARDING_AMP,
|
30
|
+
YP_ERR_ARGUMENT_NO_FORWARDING_ELLIPSES,
|
31
|
+
YP_ERR_ARGUMENT_NO_FORWARDING_STAR,
|
32
|
+
YP_ERR_ARGUMENT_SPLAT_AFTER_ASSOC_SPLAT,
|
33
|
+
YP_ERR_ARGUMENT_SPLAT_AFTER_SPLAT,
|
34
|
+
YP_ERR_ARGUMENT_TERM_PAREN,
|
35
|
+
YP_ERR_ARRAY_ELEMENT,
|
36
|
+
YP_ERR_ARRAY_EXPRESSION,
|
37
|
+
YP_ERR_ARRAY_EXPRESSION_AFTER_STAR,
|
38
|
+
YP_ERR_ARRAY_SEPARATOR,
|
39
|
+
YP_ERR_ARRAY_TERM,
|
40
|
+
YP_ERR_BEGIN_LONELY_ELSE,
|
41
|
+
YP_ERR_BEGIN_TERM,
|
42
|
+
YP_ERR_BEGIN_UPCASE_BRACE,
|
43
|
+
YP_ERR_BEGIN_UPCASE_TERM,
|
44
|
+
YP_ERR_BLOCK_PARAM_LOCAL_VARIABLE,
|
45
|
+
YP_ERR_BLOCK_PARAM_PIPE_TERM,
|
46
|
+
YP_ERR_BLOCK_TERM_BRACE,
|
47
|
+
YP_ERR_BLOCK_TERM_END,
|
48
|
+
YP_ERR_CANNOT_PARSE_EXPRESSION,
|
49
|
+
YP_ERR_CANNOT_PARSE_STRING_PART,
|
50
|
+
YP_ERR_CASE_EXPRESSION_AFTER_CASE,
|
51
|
+
YP_ERR_CASE_EXPRESSION_AFTER_WHEN,
|
52
|
+
YP_ERR_CASE_LONELY_ELSE,
|
53
|
+
YP_ERR_CASE_TERM,
|
54
|
+
YP_ERR_CLASS_IN_METHOD,
|
55
|
+
YP_ERR_CLASS_NAME,
|
56
|
+
YP_ERR_CLASS_SUPERCLASS,
|
57
|
+
YP_ERR_CLASS_TERM,
|
58
|
+
YP_ERR_CONDITIONAL_ELSIF_PREDICATE,
|
59
|
+
YP_ERR_CONDITIONAL_IF_PREDICATE,
|
60
|
+
YP_ERR_CONDITIONAL_TERM,
|
61
|
+
YP_ERR_CONDITIONAL_TERM_ELSE,
|
62
|
+
YP_ERR_CONDITIONAL_UNLESS_PREDICATE,
|
63
|
+
YP_ERR_CONDITIONAL_UNTIL_PREDICATE,
|
64
|
+
YP_ERR_CONDITIONAL_WHILE_PREDICATE,
|
65
|
+
YP_ERR_CONSTANT_PATH_COLON_COLON_CONSTANT,
|
66
|
+
YP_ERR_DEF_ENDLESS,
|
67
|
+
YP_ERR_DEF_ENDLESS_SETTER,
|
68
|
+
YP_ERR_DEF_NAME,
|
69
|
+
YP_ERR_DEF_NAME_AFTER_RECEIVER,
|
70
|
+
YP_ERR_DEF_PARAMS_TERM,
|
71
|
+
YP_ERR_DEF_PARAMS_TERM_PAREN,
|
72
|
+
YP_ERR_DEF_RECEIVER,
|
73
|
+
YP_ERR_DEF_RECEIVER_TERM,
|
74
|
+
YP_ERR_DEF_TERM,
|
75
|
+
YP_ERR_DEFINED_EXPRESSION,
|
76
|
+
YP_ERR_EMBDOC_TERM,
|
77
|
+
YP_ERR_EMBEXPR_END,
|
78
|
+
YP_ERR_EMBVAR_INVALID,
|
79
|
+
YP_ERR_END_UPCASE_BRACE,
|
80
|
+
YP_ERR_END_UPCASE_TERM,
|
81
|
+
YP_ERR_ESCAPE_INVALID_CONTROL,
|
82
|
+
YP_ERR_ESCAPE_INVALID_CONTROL_REPEAT,
|
83
|
+
YP_ERR_ESCAPE_INVALID_HEXADECIMAL,
|
84
|
+
YP_ERR_ESCAPE_INVALID_META,
|
85
|
+
YP_ERR_ESCAPE_INVALID_META_REPEAT,
|
86
|
+
YP_ERR_ESCAPE_INVALID_UNICODE,
|
87
|
+
YP_ERR_ESCAPE_INVALID_UNICODE_CM_FLAGS,
|
88
|
+
YP_ERR_ESCAPE_INVALID_UNICODE_LITERAL,
|
89
|
+
YP_ERR_ESCAPE_INVALID_UNICODE_LONG,
|
90
|
+
YP_ERR_ESCAPE_INVALID_UNICODE_TERM,
|
91
|
+
YP_ERR_EXPECT_ARGUMENT,
|
92
|
+
YP_ERR_EXPECT_EOL_AFTER_STATEMENT,
|
93
|
+
YP_ERR_EXPECT_EXPRESSION_AFTER_AMPAMPEQ,
|
94
|
+
YP_ERR_EXPECT_EXPRESSION_AFTER_PIPEPIPEEQ,
|
95
|
+
YP_ERR_EXPECT_EXPRESSION_AFTER_COMMA,
|
96
|
+
YP_ERR_EXPECT_EXPRESSION_AFTER_EQUAL,
|
97
|
+
YP_ERR_EXPECT_EXPRESSION_AFTER_LESS_LESS,
|
98
|
+
YP_ERR_EXPECT_EXPRESSION_AFTER_LPAREN,
|
99
|
+
YP_ERR_EXPECT_EXPRESSION_AFTER_QUESTION,
|
100
|
+
YP_ERR_EXPECT_EXPRESSION_AFTER_OPERATOR,
|
101
|
+
YP_ERR_EXPECT_EXPRESSION_AFTER_SPLAT,
|
102
|
+
YP_ERR_EXPECT_EXPRESSION_AFTER_SPLAT_HASH,
|
103
|
+
YP_ERR_EXPECT_EXPRESSION_AFTER_STAR,
|
104
|
+
YP_ERR_EXPECT_IDENT_REQ_PARAMETER,
|
105
|
+
YP_ERR_EXPECT_LPAREN_REQ_PARAMETER,
|
106
|
+
YP_ERR_EXPECT_RBRACKET,
|
107
|
+
YP_ERR_EXPECT_RPAREN,
|
108
|
+
YP_ERR_EXPECT_RPAREN_AFTER_MULTI,
|
109
|
+
YP_ERR_EXPECT_RPAREN_REQ_PARAMETER,
|
110
|
+
YP_ERR_EXPECT_STRING_CONTENT,
|
111
|
+
YP_ERR_EXPECT_WHEN_DELIMITER,
|
112
|
+
YP_ERR_EXPRESSION_BARE_HASH,
|
113
|
+
YP_ERR_FOR_COLLECTION,
|
114
|
+
YP_ERR_FOR_IN,
|
115
|
+
YP_ERR_FOR_INDEX,
|
116
|
+
YP_ERR_FOR_TERM,
|
117
|
+
YP_ERR_HASH_EXPRESSION_AFTER_LABEL,
|
118
|
+
YP_ERR_HASH_KEY,
|
119
|
+
YP_ERR_HASH_ROCKET,
|
120
|
+
YP_ERR_HASH_TERM,
|
121
|
+
YP_ERR_HASH_VALUE,
|
122
|
+
YP_ERR_HEREDOC_TERM,
|
123
|
+
YP_ERR_INCOMPLETE_QUESTION_MARK,
|
124
|
+
YP_ERR_INCOMPLETE_VARIABLE_CLASS,
|
125
|
+
YP_ERR_INCOMPLETE_VARIABLE_INSTANCE,
|
126
|
+
YP_ERR_INVALID_ENCODING_MAGIC_COMMENT,
|
127
|
+
YP_ERR_INVALID_FLOAT_EXPONENT,
|
128
|
+
YP_ERR_INVALID_NUMBER_BINARY,
|
129
|
+
YP_ERR_INVALID_NUMBER_DECIMAL,
|
130
|
+
YP_ERR_INVALID_NUMBER_HEXADECIMAL,
|
131
|
+
YP_ERR_INVALID_NUMBER_OCTAL,
|
132
|
+
YP_ERR_INVALID_PERCENT,
|
133
|
+
YP_ERR_INVALID_TOKEN,
|
134
|
+
YP_ERR_INVALID_VARIABLE_GLOBAL,
|
135
|
+
YP_ERR_LAMBDA_OPEN,
|
136
|
+
YP_ERR_LAMBDA_TERM_BRACE,
|
137
|
+
YP_ERR_LAMBDA_TERM_END,
|
138
|
+
YP_ERR_LIST_I_LOWER_ELEMENT,
|
139
|
+
YP_ERR_LIST_I_LOWER_TERM,
|
140
|
+
YP_ERR_LIST_I_UPPER_ELEMENT,
|
141
|
+
YP_ERR_LIST_I_UPPER_TERM,
|
142
|
+
YP_ERR_LIST_W_LOWER_ELEMENT,
|
143
|
+
YP_ERR_LIST_W_LOWER_TERM,
|
144
|
+
YP_ERR_LIST_W_UPPER_ELEMENT,
|
145
|
+
YP_ERR_LIST_W_UPPER_TERM,
|
146
|
+
YP_ERR_MALLOC_FAILED,
|
147
|
+
YP_ERR_MODULE_IN_METHOD,
|
148
|
+
YP_ERR_MODULE_NAME,
|
149
|
+
YP_ERR_MODULE_TERM,
|
150
|
+
YP_ERR_MULTI_ASSIGN_MULTI_SPLATS,
|
151
|
+
YP_ERR_NOT_EXPRESSION,
|
152
|
+
YP_ERR_NUMBER_LITERAL_UNDERSCORE,
|
153
|
+
YP_ERR_OPERATOR_MULTI_ASSIGN,
|
154
|
+
YP_ERR_PARAMETER_ASSOC_SPLAT_MULTI,
|
155
|
+
YP_ERR_PARAMETER_BLOCK_MULTI,
|
156
|
+
YP_ERR_PARAMETER_NAME_REPEAT,
|
157
|
+
YP_ERR_PARAMETER_NO_DEFAULT,
|
158
|
+
YP_ERR_PARAMETER_NO_DEFAULT_KW,
|
159
|
+
YP_ERR_PARAMETER_NUMBERED_RESERVED,
|
160
|
+
YP_ERR_PARAMETER_ORDER,
|
161
|
+
YP_ERR_PARAMETER_SPLAT_MULTI,
|
162
|
+
YP_ERR_PARAMETER_STAR,
|
163
|
+
YP_ERR_PARAMETER_WILD_LOOSE_COMMA,
|
164
|
+
YP_ERR_PATTERN_EXPRESSION_AFTER_BRACKET,
|
165
|
+
YP_ERR_PATTERN_EXPRESSION_AFTER_HROCKET,
|
166
|
+
YP_ERR_PATTERN_EXPRESSION_AFTER_COMMA,
|
167
|
+
YP_ERR_PATTERN_EXPRESSION_AFTER_IN,
|
168
|
+
YP_ERR_PATTERN_EXPRESSION_AFTER_KEY,
|
169
|
+
YP_ERR_PATTERN_EXPRESSION_AFTER_PAREN,
|
170
|
+
YP_ERR_PATTERN_EXPRESSION_AFTER_PIN,
|
171
|
+
YP_ERR_PATTERN_EXPRESSION_AFTER_PIPE,
|
172
|
+
YP_ERR_PATTERN_EXPRESSION_AFTER_RANGE,
|
173
|
+
YP_ERR_PATTERN_HASH_KEY,
|
174
|
+
YP_ERR_PATTERN_HASH_KEY_LABEL,
|
175
|
+
YP_ERR_PATTERN_IDENT_AFTER_HROCKET,
|
176
|
+
YP_ERR_PATTERN_LABEL_AFTER_COMMA,
|
177
|
+
YP_ERR_PATTERN_REST,
|
178
|
+
YP_ERR_PATTERN_TERM_BRACE,
|
179
|
+
YP_ERR_PATTERN_TERM_BRACKET,
|
180
|
+
YP_ERR_PATTERN_TERM_PAREN,
|
181
|
+
YP_ERR_PIPEPIPEEQ_MULTI_ASSIGN,
|
182
|
+
YP_ERR_REGEXP_TERM,
|
183
|
+
YP_ERR_RESCUE_EXPRESSION,
|
184
|
+
YP_ERR_RESCUE_MODIFIER_VALUE,
|
185
|
+
YP_ERR_RESCUE_TERM,
|
186
|
+
YP_ERR_RESCUE_VARIABLE,
|
187
|
+
YP_ERR_RETURN_INVALID,
|
188
|
+
YP_ERR_STRING_CONCATENATION,
|
189
|
+
YP_ERR_STRING_INTERPOLATED_TERM,
|
190
|
+
YP_ERR_STRING_LITERAL_TERM,
|
191
|
+
YP_ERR_SYMBOL_INVALID,
|
192
|
+
YP_ERR_SYMBOL_TERM_DYNAMIC,
|
193
|
+
YP_ERR_SYMBOL_TERM_INTERPOLATED,
|
194
|
+
YP_ERR_TERNARY_COLON,
|
195
|
+
YP_ERR_TERNARY_EXPRESSION_FALSE,
|
196
|
+
YP_ERR_TERNARY_EXPRESSION_TRUE,
|
197
|
+
YP_ERR_UNDEF_ARGUMENT,
|
198
|
+
YP_ERR_UNARY_RECEIVER_BANG,
|
199
|
+
YP_ERR_UNARY_RECEIVER_MINUS,
|
200
|
+
YP_ERR_UNARY_RECEIVER_PLUS,
|
201
|
+
YP_ERR_UNARY_RECEIVER_TILDE,
|
202
|
+
YP_ERR_UNTIL_TERM,
|
203
|
+
YP_ERR_WHILE_TERM,
|
204
|
+
YP_ERR_WRITE_TARGET_READONLY,
|
205
|
+
YP_ERR_WRITE_TARGET_UNEXPECTED,
|
206
|
+
YP_ERR_XSTRING_TERM,
|
207
|
+
YP_WARN_AMBIGUOUS_FIRST_ARGUMENT_MINUS,
|
208
|
+
YP_WARN_AMBIGUOUS_FIRST_ARGUMENT_PLUS,
|
209
|
+
YP_WARN_AMBIGUOUS_PREFIX_STAR,
|
210
|
+
YP_WARN_AMBIGUOUS_SLASH,
|
211
|
+
/* This must be the last member. */
|
212
|
+
YP_DIAGNOSTIC_ID_LEN,
|
213
|
+
} yp_diagnostic_id_t;
|
214
|
+
|
18
215
|
// Append a diagnostic to the given list of diagnostics.
|
19
|
-
bool yp_diagnostic_list_append(yp_list_t *list, const uint8_t *start, const uint8_t *end,
|
216
|
+
bool yp_diagnostic_list_append(yp_list_t *list, const uint8_t *start, const uint8_t *end, yp_diagnostic_id_t diag_id);
|
20
217
|
|
21
218
|
// Deallocate the internal state of the given diagnostic list.
|
22
219
|
void yp_diagnostic_list_free(yp_list_t *list);
|
data/include/yarp/node.h
CHANGED
@@ -4,9 +4,6 @@
|
|
4
4
|
#include "yarp/defines.h"
|
5
5
|
#include "yarp/parser.h"
|
6
6
|
|
7
|
-
// Append a token to the given list.
|
8
|
-
void yp_location_list_append(yp_location_list_t *list, const yp_token_t *token);
|
9
|
-
|
10
7
|
// Append a new node onto the end of the node list.
|
11
8
|
void yp_node_list_append(yp_node_list_t *list, yp_node_t *node);
|
12
9
|
|
@@ -31,7 +28,6 @@ YP_EXPORTED_FUNCTION void yp_node_memsize(yp_node_t *node, yp_memsize_t *memsize
|
|
31
28
|
YP_EXPORTED_FUNCTION const char * yp_node_type_to_str(yp_node_type_t node_type);
|
32
29
|
|
33
30
|
#define YP_EMPTY_NODE_LIST ((yp_node_list_t) { .nodes = NULL, .size = 0, .capacity = 0 })
|
34
|
-
#define YP_EMPTY_LOCATION_LIST ((yp_location_list_t) { .locations = NULL, .size = 0, .capacity = 0 })
|
35
31
|
|
36
32
|
#endif // YARP_NODE_H
|
37
33
|
|
data/include/yarp/util/yp_char.h
CHANGED
@@ -15,7 +15,7 @@ size_t yp_strspn_whitespace(const uint8_t *string, ptrdiff_t length);
|
|
15
15
|
// whitespace while also tracking the location of each newline. Disallows
|
16
16
|
// searching past the given maximum number of characters.
|
17
17
|
size_t
|
18
|
-
yp_strspn_whitespace_newlines(const uint8_t *string, ptrdiff_t length, yp_newline_list_t *newline_list
|
18
|
+
yp_strspn_whitespace_newlines(const uint8_t *string, ptrdiff_t length, yp_newline_list_t *newline_list);
|
19
19
|
|
20
20
|
// Returns the number of characters at the start of the string that are inline
|
21
21
|
// whitespace. Disallows searching past the given maximum number of characters.
|
@@ -8,6 +8,7 @@
|
|
8
8
|
|
9
9
|
#include "yarp/defines.h"
|
10
10
|
|
11
|
+
#include <assert.h>
|
11
12
|
#include <stdbool.h>
|
12
13
|
#include <stdint.h>
|
13
14
|
#include <stdlib.h>
|
@@ -39,7 +40,8 @@ size_t yp_constant_id_list_memsize(yp_constant_id_list_t *list);
|
|
39
40
|
void yp_constant_id_list_free(yp_constant_id_list_t *list);
|
40
41
|
|
41
42
|
typedef struct {
|
42
|
-
|
43
|
+
unsigned int id: 31;
|
44
|
+
bool owned: 1;
|
43
45
|
const uint8_t *start;
|
44
46
|
size_t length;
|
45
47
|
size_t hash;
|
@@ -57,9 +59,14 @@ typedef struct {
|
|
57
59
|
// Initialize a new constant pool with a given capacity.
|
58
60
|
bool yp_constant_pool_init(yp_constant_pool_t *pool, size_t capacity);
|
59
61
|
|
60
|
-
// Insert a constant into a constant pool
|
61
|
-
// if any potential calls to resize fail.
|
62
|
-
yp_constant_id_t
|
62
|
+
// Insert a constant into a constant pool that is a slice of a source string.
|
63
|
+
// Returns the id of the constant, or 0 if any potential calls to resize fail.
|
64
|
+
yp_constant_id_t yp_constant_pool_insert_shared(yp_constant_pool_t *pool, const uint8_t *start, size_t length);
|
65
|
+
|
66
|
+
// Insert a constant into a constant pool from memory that is now owned by the
|
67
|
+
// constant pool. Returns the id of the constant, or 0 if any potential calls to
|
68
|
+
// resize fail.
|
69
|
+
yp_constant_id_t yp_constant_pool_insert_owned(yp_constant_pool_t *pool, const uint8_t *start, size_t length);
|
63
70
|
|
64
71
|
// Free the memory associated with a constant pool.
|
65
72
|
void yp_constant_pool_free(yp_constant_pool_t *pool);
|
data/include/yarp/version.h
CHANGED
data/lib/yarp/desugar_visitor.rb
CHANGED
@@ -8,7 +8,7 @@ module YARP
|
|
8
8
|
#
|
9
9
|
# @@foo && @@foo = bar
|
10
10
|
def visit_class_variable_and_write_node(node)
|
11
|
-
desugar_and_write_node(node, ClassVariableReadNode, ClassVariableWriteNode,
|
11
|
+
desugar_and_write_node(node, ClassVariableReadNode, ClassVariableWriteNode, node.name)
|
12
12
|
end
|
13
13
|
|
14
14
|
# @@foo ||= bar
|
@@ -17,7 +17,7 @@ module YARP
|
|
17
17
|
#
|
18
18
|
# defined?(@@foo) ? @@foo : @@foo = bar
|
19
19
|
def visit_class_variable_or_write_node(node)
|
20
|
-
desugar_or_write_defined_node(node, ClassVariableReadNode, ClassVariableWriteNode,
|
20
|
+
desugar_or_write_defined_node(node, ClassVariableReadNode, ClassVariableWriteNode, node.name)
|
21
21
|
end
|
22
22
|
|
23
23
|
# @@foo += bar
|
@@ -26,7 +26,7 @@ module YARP
|
|
26
26
|
#
|
27
27
|
# @@foo = @@foo + bar
|
28
28
|
def visit_class_variable_operator_write_node(node)
|
29
|
-
desugar_operator_write_node(node, ClassVariableReadNode, ClassVariableWriteNode,
|
29
|
+
desugar_operator_write_node(node, ClassVariableReadNode, ClassVariableWriteNode, node.name)
|
30
30
|
end
|
31
31
|
|
32
32
|
# Foo &&= bar
|
@@ -35,7 +35,7 @@ module YARP
|
|
35
35
|
#
|
36
36
|
# Foo && Foo = bar
|
37
37
|
def visit_constant_and_write_node(node)
|
38
|
-
desugar_and_write_node(node, ConstantReadNode, ConstantWriteNode)
|
38
|
+
desugar_and_write_node(node, ConstantReadNode, ConstantWriteNode, node.name)
|
39
39
|
end
|
40
40
|
|
41
41
|
# Foo ||= bar
|
@@ -44,7 +44,7 @@ module YARP
|
|
44
44
|
#
|
45
45
|
# defined?(Foo) ? Foo : Foo = bar
|
46
46
|
def visit_constant_or_write_node(node)
|
47
|
-
desugar_or_write_defined_node(node, ConstantReadNode, ConstantWriteNode)
|
47
|
+
desugar_or_write_defined_node(node, ConstantReadNode, ConstantWriteNode, node.name)
|
48
48
|
end
|
49
49
|
|
50
50
|
# Foo += bar
|
@@ -53,7 +53,7 @@ module YARP
|
|
53
53
|
#
|
54
54
|
# Foo = Foo + bar
|
55
55
|
def visit_constant_operator_write_node(node)
|
56
|
-
desugar_operator_write_node(node, ConstantReadNode, ConstantWriteNode)
|
56
|
+
desugar_operator_write_node(node, ConstantReadNode, ConstantWriteNode, node.name)
|
57
57
|
end
|
58
58
|
|
59
59
|
# $foo &&= bar
|
@@ -62,7 +62,7 @@ module YARP
|
|
62
62
|
#
|
63
63
|
# $foo && $foo = bar
|
64
64
|
def visit_global_variable_and_write_node(node)
|
65
|
-
desugar_and_write_node(node, GlobalVariableReadNode, GlobalVariableWriteNode)
|
65
|
+
desugar_and_write_node(node, GlobalVariableReadNode, GlobalVariableWriteNode, node.name)
|
66
66
|
end
|
67
67
|
|
68
68
|
# $foo ||= bar
|
@@ -71,7 +71,7 @@ module YARP
|
|
71
71
|
#
|
72
72
|
# defined?($foo) ? $foo : $foo = bar
|
73
73
|
def visit_global_variable_or_write_node(node)
|
74
|
-
desugar_or_write_defined_node(node, GlobalVariableReadNode, GlobalVariableWriteNode)
|
74
|
+
desugar_or_write_defined_node(node, GlobalVariableReadNode, GlobalVariableWriteNode, node.name)
|
75
75
|
end
|
76
76
|
|
77
77
|
# $foo += bar
|
@@ -80,7 +80,7 @@ module YARP
|
|
80
80
|
#
|
81
81
|
# $foo = $foo + bar
|
82
82
|
def visit_global_variable_operator_write_node(node)
|
83
|
-
desugar_operator_write_node(node, GlobalVariableReadNode, GlobalVariableWriteNode)
|
83
|
+
desugar_operator_write_node(node, GlobalVariableReadNode, GlobalVariableWriteNode, node.name)
|
84
84
|
end
|
85
85
|
|
86
86
|
# @foo &&= bar
|
@@ -89,7 +89,7 @@ module YARP
|
|
89
89
|
#
|
90
90
|
# @foo && @foo = bar
|
91
91
|
def visit_instance_variable_and_write_node(node)
|
92
|
-
desugar_and_write_node(node, InstanceVariableReadNode, InstanceVariableWriteNode,
|
92
|
+
desugar_and_write_node(node, InstanceVariableReadNode, InstanceVariableWriteNode, node.name)
|
93
93
|
end
|
94
94
|
|
95
95
|
# @foo ||= bar
|
@@ -98,7 +98,7 @@ module YARP
|
|
98
98
|
#
|
99
99
|
# @foo || @foo = bar
|
100
100
|
def visit_instance_variable_or_write_node(node)
|
101
|
-
desugar_or_write_node(node, InstanceVariableReadNode, InstanceVariableWriteNode,
|
101
|
+
desugar_or_write_node(node, InstanceVariableReadNode, InstanceVariableWriteNode, node.name)
|
102
102
|
end
|
103
103
|
|
104
104
|
# @foo += bar
|
@@ -107,7 +107,7 @@ module YARP
|
|
107
107
|
#
|
108
108
|
# @foo = @foo + bar
|
109
109
|
def visit_instance_variable_operator_write_node(node)
|
110
|
-
desugar_operator_write_node(node, InstanceVariableReadNode, InstanceVariableWriteNode,
|
110
|
+
desugar_operator_write_node(node, InstanceVariableReadNode, InstanceVariableWriteNode, node.name)
|
111
111
|
end
|
112
112
|
|
113
113
|
# foo &&= bar
|
@@ -116,7 +116,7 @@ module YARP
|
|
116
116
|
#
|
117
117
|
# foo && foo = bar
|
118
118
|
def visit_local_variable_and_write_node(node)
|
119
|
-
desugar_and_write_node(node, LocalVariableReadNode, LocalVariableWriteNode,
|
119
|
+
desugar_and_write_node(node, LocalVariableReadNode, LocalVariableWriteNode, node.name, node.depth)
|
120
120
|
end
|
121
121
|
|
122
122
|
# foo ||= bar
|
@@ -125,7 +125,7 @@ module YARP
|
|
125
125
|
#
|
126
126
|
# foo || foo = bar
|
127
127
|
def visit_local_variable_or_write_node(node)
|
128
|
-
desugar_or_write_node(node, LocalVariableReadNode, LocalVariableWriteNode,
|
128
|
+
desugar_or_write_node(node, LocalVariableReadNode, LocalVariableWriteNode, node.name, node.depth)
|
129
129
|
end
|
130
130
|
|
131
131
|
# foo += bar
|
@@ -134,13 +134,13 @@ module YARP
|
|
134
134
|
#
|
135
135
|
# foo = foo + bar
|
136
136
|
def visit_local_variable_operator_write_node(node)
|
137
|
-
desugar_operator_write_node(node, LocalVariableReadNode, LocalVariableWriteNode,
|
137
|
+
desugar_operator_write_node(node, LocalVariableReadNode, LocalVariableWriteNode, node.name, node.depth)
|
138
138
|
end
|
139
139
|
|
140
140
|
private
|
141
141
|
|
142
142
|
# Desugar `x &&= y` to `x && x = y`
|
143
|
-
def desugar_and_write_node(node, read_class, write_class, arguments
|
143
|
+
def desugar_and_write_node(node, read_class, write_class, *arguments)
|
144
144
|
AndNode.new(
|
145
145
|
read_class.new(*arguments, node.name_loc),
|
146
146
|
write_class.new(*arguments, node.name_loc, node.value, node.operator_loc, node.location),
|
@@ -150,7 +150,7 @@ module YARP
|
|
150
150
|
end
|
151
151
|
|
152
152
|
# Desugar `x += y` to `x = x + y`
|
153
|
-
def desugar_operator_write_node(node, read_class, write_class, arguments
|
153
|
+
def desugar_operator_write_node(node, read_class, write_class, *arguments)
|
154
154
|
write_class.new(
|
155
155
|
*arguments,
|
156
156
|
node.name_loc,
|
@@ -172,7 +172,7 @@ module YARP
|
|
172
172
|
end
|
173
173
|
|
174
174
|
# Desugar `x ||= y` to `x || x = y`
|
175
|
-
def desugar_or_write_node(node, read_class, write_class, arguments
|
175
|
+
def desugar_or_write_node(node, read_class, write_class, *arguments)
|
176
176
|
OrNode.new(
|
177
177
|
read_class.new(*arguments, node.name_loc),
|
178
178
|
write_class.new(*arguments, node.name_loc, node.value, node.operator_loc, node.location),
|
@@ -182,7 +182,7 @@ module YARP
|
|
182
182
|
end
|
183
183
|
|
184
184
|
# Desugar `x ||= y` to `defined?(x) ? x : x = y`
|
185
|
-
def desugar_or_write_defined_node(node, read_class, write_class, arguments
|
185
|
+
def desugar_or_write_defined_node(node, read_class, write_class, *arguments)
|
186
186
|
IfNode.new(
|
187
187
|
node.operator_loc,
|
188
188
|
DefinedNode.new(nil, read_class.new(*arguments, node.name_loc), nil, node.operator_loc, node.name_loc),
|
@@ -65,6 +65,11 @@ module YARP
|
|
65
65
|
node.copy(expression: visit(node.expression))
|
66
66
|
end
|
67
67
|
|
68
|
+
# Copy a BlockLocalVariableNode node
|
69
|
+
def visit_block_local_variable_node(node)
|
70
|
+
node.copy
|
71
|
+
end
|
72
|
+
|
68
73
|
# Copy a BlockNode node
|
69
74
|
def visit_block_node(node)
|
70
75
|
node.copy(parameters: visit(node.parameters), body: visit(node.body))
|
@@ -77,7 +82,7 @@ module YARP
|
|
77
82
|
|
78
83
|
# Copy a BlockParametersNode node
|
79
84
|
def visit_block_parameters_node(node)
|
80
|
-
node.copy(parameters: visit(node.parameters))
|
85
|
+
node.copy(parameters: visit(node.parameters), locals: visit_all(node.locals))
|
81
86
|
end
|
82
87
|
|
83
88
|
# Copy a BreakNode node
|
@@ -85,24 +90,24 @@ module YARP
|
|
85
90
|
node.copy(arguments: visit(node.arguments))
|
86
91
|
end
|
87
92
|
|
93
|
+
# Copy a CallAndWriteNode node
|
94
|
+
def visit_call_and_write_node(node)
|
95
|
+
node.copy(receiver: visit(node.receiver), arguments: visit(node.arguments), value: visit(node.value))
|
96
|
+
end
|
97
|
+
|
88
98
|
# Copy a CallNode node
|
89
99
|
def visit_call_node(node)
|
90
100
|
node.copy(receiver: visit(node.receiver), arguments: visit(node.arguments), block: visit(node.block))
|
91
101
|
end
|
92
102
|
|
93
|
-
# Copy a CallOperatorAndWriteNode node
|
94
|
-
def visit_call_operator_and_write_node(node)
|
95
|
-
node.copy(target: visit(node.target), value: visit(node.value))
|
96
|
-
end
|
97
|
-
|
98
|
-
# Copy a CallOperatorOrWriteNode node
|
99
|
-
def visit_call_operator_or_write_node(node)
|
100
|
-
node.copy(target: visit(node.target), value: visit(node.value))
|
101
|
-
end
|
102
|
-
|
103
103
|
# Copy a CallOperatorWriteNode node
|
104
104
|
def visit_call_operator_write_node(node)
|
105
|
-
node.copy(
|
105
|
+
node.copy(receiver: visit(node.receiver), arguments: visit(node.arguments), value: visit(node.value))
|
106
|
+
end
|
107
|
+
|
108
|
+
# Copy a CallOrWriteNode node
|
109
|
+
def visit_call_or_write_node(node)
|
110
|
+
node.copy(receiver: visit(node.receiver), arguments: visit(node.arguments), value: visit(node.value))
|
106
111
|
end
|
107
112
|
|
108
113
|
# Copy a CapturePatternNode node
|
@@ -460,6 +465,11 @@ module YARP
|
|
460
465
|
node.copy(constant_path: visit(node.constant_path), body: visit(node.body))
|
461
466
|
end
|
462
467
|
|
468
|
+
# Copy a MultiTargetNode node
|
469
|
+
def visit_multi_target_node(node)
|
470
|
+
node.copy(targets: visit_all(node.targets))
|
471
|
+
end
|
472
|
+
|
463
473
|
# Copy a MultiWriteNode node
|
464
474
|
def visit_multi_write_node(node)
|
465
475
|
node.copy(targets: visit_all(node.targets), value: visit(node.value))
|