prism 0.14.0 → 0.15.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 +18 -1
- data/README.md +1 -1
- data/config.yml +86 -21
- data/ext/prism/api_node.c +213 -67
- data/ext/prism/extension.h +1 -1
- data/include/prism/ast.h +133 -83
- data/include/prism/diagnostic.h +1 -0
- data/include/prism/node.h +7 -0
- data/include/prism/util/pm_constant_pool.h +20 -6
- data/include/prism/version.h +2 -2
- data/include/prism.h +1 -1
- data/lib/prism/compiler.rb +9 -0
- data/lib/prism/debug.rb +30 -26
- data/lib/prism/dispatcher.rb +42 -0
- data/lib/prism/dsl.rb +23 -8
- data/lib/prism/ffi.rb +2 -2
- data/lib/prism/lex_compat.rb +9 -9
- data/lib/prism/mutation_compiler.rb +18 -3
- data/lib/prism/node.rb +580 -120
- data/lib/prism/serialize.rb +83 -77
- data/lib/prism/visitor.rb +9 -0
- data/prism.gemspec +1 -1
- data/src/diagnostic.c +1 -0
- data/src/node.c +99 -18
- data/src/prettyprint.c +102 -45
- data/src/prism.c +288 -88
- data/src/serialize.c +95 -57
- data/src/util/pm_constant_pool.c +25 -11
- metadata +2 -2
data/include/prism/ast.h
CHANGED
@@ -277,79 +277,82 @@ enum pm_node_type {
|
|
277
277
|
PM_IMAGINARY_NODE = 66,
|
278
278
|
PM_IMPLICIT_NODE = 67,
|
279
279
|
PM_IN_NODE = 68,
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
|
291
|
-
|
292
|
-
|
293
|
-
|
294
|
-
|
295
|
-
|
296
|
-
|
297
|
-
|
298
|
-
|
299
|
-
|
300
|
-
|
301
|
-
|
302
|
-
|
303
|
-
|
304
|
-
|
305
|
-
|
306
|
-
|
307
|
-
|
308
|
-
|
309
|
-
|
310
|
-
|
311
|
-
|
312
|
-
|
313
|
-
|
314
|
-
|
315
|
-
|
316
|
-
|
317
|
-
|
318
|
-
|
319
|
-
|
320
|
-
|
321
|
-
|
322
|
-
|
323
|
-
|
324
|
-
|
325
|
-
|
326
|
-
|
327
|
-
|
328
|
-
|
329
|
-
|
330
|
-
|
331
|
-
|
332
|
-
|
333
|
-
|
334
|
-
|
335
|
-
|
336
|
-
|
337
|
-
|
338
|
-
|
339
|
-
|
340
|
-
|
341
|
-
|
342
|
-
|
343
|
-
|
344
|
-
|
345
|
-
|
346
|
-
|
347
|
-
|
348
|
-
|
349
|
-
|
350
|
-
|
351
|
-
|
352
|
-
|
280
|
+
PM_INDEX_AND_WRITE_NODE = 69,
|
281
|
+
PM_INDEX_OPERATOR_WRITE_NODE = 70,
|
282
|
+
PM_INDEX_OR_WRITE_NODE = 71,
|
283
|
+
PM_INSTANCE_VARIABLE_AND_WRITE_NODE = 72,
|
284
|
+
PM_INSTANCE_VARIABLE_OPERATOR_WRITE_NODE = 73,
|
285
|
+
PM_INSTANCE_VARIABLE_OR_WRITE_NODE = 74,
|
286
|
+
PM_INSTANCE_VARIABLE_READ_NODE = 75,
|
287
|
+
PM_INSTANCE_VARIABLE_TARGET_NODE = 76,
|
288
|
+
PM_INSTANCE_VARIABLE_WRITE_NODE = 77,
|
289
|
+
PM_INTEGER_NODE = 78,
|
290
|
+
PM_INTERPOLATED_MATCH_LAST_LINE_NODE = 79,
|
291
|
+
PM_INTERPOLATED_REGULAR_EXPRESSION_NODE = 80,
|
292
|
+
PM_INTERPOLATED_STRING_NODE = 81,
|
293
|
+
PM_INTERPOLATED_SYMBOL_NODE = 82,
|
294
|
+
PM_INTERPOLATED_X_STRING_NODE = 83,
|
295
|
+
PM_KEYWORD_HASH_NODE = 84,
|
296
|
+
PM_KEYWORD_PARAMETER_NODE = 85,
|
297
|
+
PM_KEYWORD_REST_PARAMETER_NODE = 86,
|
298
|
+
PM_LAMBDA_NODE = 87,
|
299
|
+
PM_LOCAL_VARIABLE_AND_WRITE_NODE = 88,
|
300
|
+
PM_LOCAL_VARIABLE_OPERATOR_WRITE_NODE = 89,
|
301
|
+
PM_LOCAL_VARIABLE_OR_WRITE_NODE = 90,
|
302
|
+
PM_LOCAL_VARIABLE_READ_NODE = 91,
|
303
|
+
PM_LOCAL_VARIABLE_TARGET_NODE = 92,
|
304
|
+
PM_LOCAL_VARIABLE_WRITE_NODE = 93,
|
305
|
+
PM_MATCH_LAST_LINE_NODE = 94,
|
306
|
+
PM_MATCH_PREDICATE_NODE = 95,
|
307
|
+
PM_MATCH_REQUIRED_NODE = 96,
|
308
|
+
PM_MATCH_WRITE_NODE = 97,
|
309
|
+
PM_MISSING_NODE = 98,
|
310
|
+
PM_MODULE_NODE = 99,
|
311
|
+
PM_MULTI_TARGET_NODE = 100,
|
312
|
+
PM_MULTI_WRITE_NODE = 101,
|
313
|
+
PM_NEXT_NODE = 102,
|
314
|
+
PM_NIL_NODE = 103,
|
315
|
+
PM_NO_KEYWORDS_PARAMETER_NODE = 104,
|
316
|
+
PM_NUMBERED_REFERENCE_READ_NODE = 105,
|
317
|
+
PM_OPTIONAL_PARAMETER_NODE = 106,
|
318
|
+
PM_OR_NODE = 107,
|
319
|
+
PM_PARAMETERS_NODE = 108,
|
320
|
+
PM_PARENTHESES_NODE = 109,
|
321
|
+
PM_PINNED_EXPRESSION_NODE = 110,
|
322
|
+
PM_PINNED_VARIABLE_NODE = 111,
|
323
|
+
PM_POST_EXECUTION_NODE = 112,
|
324
|
+
PM_PRE_EXECUTION_NODE = 113,
|
325
|
+
PM_PROGRAM_NODE = 114,
|
326
|
+
PM_RANGE_NODE = 115,
|
327
|
+
PM_RATIONAL_NODE = 116,
|
328
|
+
PM_REDO_NODE = 117,
|
329
|
+
PM_REGULAR_EXPRESSION_NODE = 118,
|
330
|
+
PM_REQUIRED_DESTRUCTURED_PARAMETER_NODE = 119,
|
331
|
+
PM_REQUIRED_PARAMETER_NODE = 120,
|
332
|
+
PM_RESCUE_MODIFIER_NODE = 121,
|
333
|
+
PM_RESCUE_NODE = 122,
|
334
|
+
PM_REST_PARAMETER_NODE = 123,
|
335
|
+
PM_RETRY_NODE = 124,
|
336
|
+
PM_RETURN_NODE = 125,
|
337
|
+
PM_SELF_NODE = 126,
|
338
|
+
PM_SINGLETON_CLASS_NODE = 127,
|
339
|
+
PM_SOURCE_ENCODING_NODE = 128,
|
340
|
+
PM_SOURCE_FILE_NODE = 129,
|
341
|
+
PM_SOURCE_LINE_NODE = 130,
|
342
|
+
PM_SPLAT_NODE = 131,
|
343
|
+
PM_STATEMENTS_NODE = 132,
|
344
|
+
PM_STRING_CONCAT_NODE = 133,
|
345
|
+
PM_STRING_NODE = 134,
|
346
|
+
PM_SUPER_NODE = 135,
|
347
|
+
PM_SYMBOL_NODE = 136,
|
348
|
+
PM_TRUE_NODE = 137,
|
349
|
+
PM_UNDEF_NODE = 138,
|
350
|
+
PM_UNLESS_NODE = 139,
|
351
|
+
PM_UNTIL_NODE = 140,
|
352
|
+
PM_WHEN_NODE = 141,
|
353
|
+
PM_WHILE_NODE = 142,
|
354
|
+
PM_X_STRING_NODE = 143,
|
355
|
+
PM_YIELD_NODE = 144,
|
353
356
|
PM_SCOPE_NODE
|
354
357
|
};
|
355
358
|
|
@@ -361,7 +364,7 @@ typedef uint16_t pm_node_flags_t;
|
|
361
364
|
#define PM_NODE_FLAG_BITS (sizeof(pm_node_flags_t) * 8)
|
362
365
|
static const pm_node_flags_t PM_NODE_FLAG_NEWLINE = (1 << (PM_NODE_FLAG_BITS - 1));
|
363
366
|
static const pm_node_flags_t PM_NODE_FLAG_STATIC_LITERAL = (1 << (PM_NODE_FLAG_BITS - 2));
|
364
|
-
static const pm_node_flags_t PM_NODE_FLAG_COMMON_MASK =
|
367
|
+
static const pm_node_flags_t PM_NODE_FLAG_COMMON_MASK = (1 << (PM_NODE_FLAG_BITS - 1)) | (1 << (PM_NODE_FLAG_BITS - 2));
|
365
368
|
|
366
369
|
// For easy access, we define some macros to check node type
|
367
370
|
#define PM_NODE_TYPE(node) ((enum pm_node_type)node->type)
|
@@ -476,6 +479,7 @@ typedef struct pm_assoc_splat_node {
|
|
476
479
|
// Type: PM_BACK_REFERENCE_READ_NODE
|
477
480
|
typedef struct pm_back_reference_read_node {
|
478
481
|
pm_node_t base;
|
482
|
+
pm_constant_id_t name;
|
479
483
|
} pm_back_reference_read_node_t;
|
480
484
|
|
481
485
|
// BeginNode
|
@@ -561,9 +565,6 @@ typedef struct pm_call_and_write_node {
|
|
561
565
|
struct pm_node *receiver;
|
562
566
|
pm_location_t call_operator_loc;
|
563
567
|
pm_location_t message_loc;
|
564
|
-
pm_location_t opening_loc;
|
565
|
-
struct pm_arguments_node *arguments;
|
566
|
-
pm_location_t closing_loc;
|
567
568
|
pm_constant_id_t read_name;
|
568
569
|
pm_constant_id_t write_name;
|
569
570
|
pm_location_t operator_loc;
|
@@ -599,9 +600,6 @@ typedef struct pm_call_operator_write_node {
|
|
599
600
|
struct pm_node *receiver;
|
600
601
|
pm_location_t call_operator_loc;
|
601
602
|
pm_location_t message_loc;
|
602
|
-
pm_location_t opening_loc;
|
603
|
-
struct pm_arguments_node *arguments;
|
604
|
-
pm_location_t closing_loc;
|
605
603
|
pm_constant_id_t read_name;
|
606
604
|
pm_constant_id_t write_name;
|
607
605
|
pm_constant_id_t operator;
|
@@ -620,9 +618,6 @@ typedef struct pm_call_or_write_node {
|
|
620
618
|
struct pm_node *receiver;
|
621
619
|
pm_location_t call_operator_loc;
|
622
620
|
pm_location_t message_loc;
|
623
|
-
pm_location_t opening_loc;
|
624
|
-
struct pm_arguments_node *arguments;
|
625
|
-
pm_location_t closing_loc;
|
626
621
|
pm_constant_id_t read_name;
|
627
622
|
pm_constant_id_t write_name;
|
628
623
|
pm_location_t operator_loc;
|
@@ -1115,6 +1110,61 @@ typedef struct pm_in_node {
|
|
1115
1110
|
pm_location_t then_loc;
|
1116
1111
|
} pm_in_node_t;
|
1117
1112
|
|
1113
|
+
// IndexAndWriteNode
|
1114
|
+
//
|
1115
|
+
// Type: PM_INDEX_AND_WRITE_NODE
|
1116
|
+
// Flags:
|
1117
|
+
// PM_CALL_NODE_FLAGS_SAFE_NAVIGATION
|
1118
|
+
// PM_CALL_NODE_FLAGS_VARIABLE_CALL
|
1119
|
+
typedef struct pm_index_and_write_node {
|
1120
|
+
pm_node_t base;
|
1121
|
+
struct pm_node *receiver;
|
1122
|
+
pm_location_t call_operator_loc;
|
1123
|
+
pm_location_t opening_loc;
|
1124
|
+
struct pm_arguments_node *arguments;
|
1125
|
+
pm_location_t closing_loc;
|
1126
|
+
struct pm_node *block;
|
1127
|
+
pm_location_t operator_loc;
|
1128
|
+
struct pm_node *value;
|
1129
|
+
} pm_index_and_write_node_t;
|
1130
|
+
|
1131
|
+
// IndexOperatorWriteNode
|
1132
|
+
//
|
1133
|
+
// Type: PM_INDEX_OPERATOR_WRITE_NODE
|
1134
|
+
// Flags:
|
1135
|
+
// PM_CALL_NODE_FLAGS_SAFE_NAVIGATION
|
1136
|
+
// PM_CALL_NODE_FLAGS_VARIABLE_CALL
|
1137
|
+
typedef struct pm_index_operator_write_node {
|
1138
|
+
pm_node_t base;
|
1139
|
+
struct pm_node *receiver;
|
1140
|
+
pm_location_t call_operator_loc;
|
1141
|
+
pm_location_t opening_loc;
|
1142
|
+
struct pm_arguments_node *arguments;
|
1143
|
+
pm_location_t closing_loc;
|
1144
|
+
struct pm_node *block;
|
1145
|
+
pm_constant_id_t operator;
|
1146
|
+
pm_location_t operator_loc;
|
1147
|
+
struct pm_node *value;
|
1148
|
+
} pm_index_operator_write_node_t;
|
1149
|
+
|
1150
|
+
// IndexOrWriteNode
|
1151
|
+
//
|
1152
|
+
// Type: PM_INDEX_OR_WRITE_NODE
|
1153
|
+
// Flags:
|
1154
|
+
// PM_CALL_NODE_FLAGS_SAFE_NAVIGATION
|
1155
|
+
// PM_CALL_NODE_FLAGS_VARIABLE_CALL
|
1156
|
+
typedef struct pm_index_or_write_node {
|
1157
|
+
pm_node_t base;
|
1158
|
+
struct pm_node *receiver;
|
1159
|
+
pm_location_t call_operator_loc;
|
1160
|
+
pm_location_t opening_loc;
|
1161
|
+
struct pm_arguments_node *arguments;
|
1162
|
+
pm_location_t closing_loc;
|
1163
|
+
struct pm_node *block;
|
1164
|
+
pm_location_t operator_loc;
|
1165
|
+
struct pm_node *value;
|
1166
|
+
} pm_index_or_write_node_t;
|
1167
|
+
|
1118
1168
|
// InstanceVariableAndWriteNode
|
1119
1169
|
//
|
1120
1170
|
// Type: PM_INSTANCE_VARIABLE_AND_WRITE_NODE
|
data/include/prism/diagnostic.h
CHANGED
@@ -158,6 +158,7 @@ typedef enum {
|
|
158
158
|
PM_ERR_NUMBERED_PARAMETER_NOT_ALLOWED,
|
159
159
|
PM_ERR_NUMBERED_PARAMETER_OUTER_SCOPE,
|
160
160
|
PM_ERR_OPERATOR_MULTI_ASSIGN,
|
161
|
+
PM_ERR_OPERATOR_WRITE_ARGUMENTS,
|
161
162
|
PM_ERR_OPERATOR_WRITE_BLOCK,
|
162
163
|
PM_ERR_PARAMETER_ASSOC_SPLAT_MULTI,
|
163
164
|
PM_ERR_PARAMETER_BLOCK_MULTI,
|
data/include/prism/node.h
CHANGED
@@ -33,10 +33,17 @@ PRISM_EXPORTED_FUNCTION const char * pm_node_type_to_str(pm_node_type_t node_typ
|
|
33
33
|
// declare them here to avoid generating them.
|
34
34
|
typedef struct pm_scope_node {
|
35
35
|
pm_node_t base;
|
36
|
+
struct pm_scope_node *previous;
|
36
37
|
pm_node_t *ast_node;
|
37
38
|
struct pm_parameters_node *parameters;
|
38
39
|
pm_node_t *body;
|
39
40
|
pm_constant_id_list_t locals;
|
41
|
+
pm_parser_t *parser;
|
42
|
+
|
43
|
+
// We don't have the CRuby types ID and st_table within Prism
|
44
|
+
// so we use void *
|
45
|
+
void *constants; // ID *constants
|
46
|
+
void *index_lookup_table; // st_table *index_lookup_table
|
40
47
|
} pm_scope_node_t;
|
41
48
|
|
42
49
|
#endif // PRISM_NODE_H
|
@@ -39,9 +39,21 @@ size_t pm_constant_id_list_memsize(pm_constant_id_list_t *list);
|
|
39
39
|
// Free the memory associated with a list of constant ids.
|
40
40
|
void pm_constant_id_list_free(pm_constant_id_list_t *list);
|
41
41
|
|
42
|
+
// Constant pool buckets can have a couple of different types.
|
43
|
+
typedef unsigned int pm_constant_pool_bucket_type_t;
|
44
|
+
|
45
|
+
// By default, each constant is a slice of the source.
|
46
|
+
static const pm_constant_pool_bucket_type_t PM_CONSTANT_POOL_BUCKET_DEFAULT = 0;
|
47
|
+
|
48
|
+
// An owned constant is one for which memory has been allocated.
|
49
|
+
static const pm_constant_pool_bucket_type_t PM_CONSTANT_POOL_BUCKET_OWNED = 1;
|
50
|
+
|
51
|
+
// A constant constant is known at compile time.
|
52
|
+
static const pm_constant_pool_bucket_type_t PM_CONSTANT_POOL_BUCKET_CONSTANT = 2;
|
53
|
+
|
42
54
|
typedef struct {
|
43
|
-
unsigned int id:
|
44
|
-
|
55
|
+
unsigned int id: 30;
|
56
|
+
pm_constant_pool_bucket_type_t type: 2;
|
45
57
|
uint32_t hash;
|
46
58
|
} pm_constant_pool_bucket_t;
|
47
59
|
|
@@ -63,10 +75,8 @@ typedef struct {
|
|
63
75
|
// Initialize a new constant pool with a given capacity.
|
64
76
|
bool pm_constant_pool_init(pm_constant_pool_t *pool, uint32_t capacity);
|
65
77
|
|
66
|
-
|
67
|
-
|
68
|
-
return &pool->constants[constant_id - 1];
|
69
|
-
}
|
78
|
+
// Return a pointer to the constant indicated by the given constant id.
|
79
|
+
pm_constant_t * pm_constant_pool_id_to_constant(pm_constant_pool_t *pool, pm_constant_id_t constant_id);
|
70
80
|
|
71
81
|
// Insert a constant into a constant pool that is a slice of a source string.
|
72
82
|
// Returns the id of the constant, or 0 if any potential calls to resize fail.
|
@@ -77,6 +87,10 @@ pm_constant_id_t pm_constant_pool_insert_shared(pm_constant_pool_t *pool, const
|
|
77
87
|
// resize fail.
|
78
88
|
pm_constant_id_t pm_constant_pool_insert_owned(pm_constant_pool_t *pool, const uint8_t *start, size_t length);
|
79
89
|
|
90
|
+
// Insert a constant into a constant pool from memory that is constant. Returns
|
91
|
+
// the id of the constant, or 0 if any potential calls to resize fail.
|
92
|
+
pm_constant_id_t pm_constant_pool_insert_constant(pm_constant_pool_t *pool, const uint8_t *start, size_t length);
|
93
|
+
|
80
94
|
// Free the memory associated with a constant pool.
|
81
95
|
void pm_constant_pool_free(pm_constant_pool_t *pool);
|
82
96
|
|
data/include/prism/version.h
CHANGED
data/include/prism.h
CHANGED
@@ -34,7 +34,7 @@ void pm_print_node(pm_parser_t *parser, pm_node_t *node);
|
|
34
34
|
void pm_parser_metadata(pm_parser_t *parser, const char *metadata);
|
35
35
|
|
36
36
|
// Generate a scope node from the given node.
|
37
|
-
void pm_scope_node_init(pm_node_t *node, pm_scope_node_t *
|
37
|
+
void pm_scope_node_init(const pm_node_t *node, pm_scope_node_t *scope, pm_scope_node_t *previous, pm_parser_t *parser);
|
38
38
|
|
39
39
|
// The prism version and the serialization format.
|
40
40
|
PRISM_EXPORTED_FUNCTION const char * pm_version(void);
|
data/lib/prism/compiler.rb
CHANGED
@@ -243,6 +243,15 @@ module Prism
|
|
243
243
|
# Compile a InNode node
|
244
244
|
alias visit_in_node visit_child_nodes
|
245
245
|
|
246
|
+
# Compile a IndexAndWriteNode node
|
247
|
+
alias visit_index_and_write_node visit_child_nodes
|
248
|
+
|
249
|
+
# Compile a IndexOperatorWriteNode node
|
250
|
+
alias visit_index_operator_write_node visit_child_nodes
|
251
|
+
|
252
|
+
# Compile a IndexOrWriteNode node
|
253
|
+
alias visit_index_or_write_node visit_child_nodes
|
254
|
+
|
246
255
|
# Compile a InstanceVariableAndWriteNode node
|
247
256
|
alias visit_instance_variable_and_write_node visit_child_nodes
|
248
257
|
|
data/lib/prism/debug.rb
CHANGED
@@ -45,29 +45,16 @@ module Prism
|
|
45
45
|
# For the given source, compiles with CRuby and returns a list of all of the
|
46
46
|
# sets of local variables that were encountered.
|
47
47
|
def self.cruby_locals(source)
|
48
|
-
verbose = $VERBOSE
|
49
|
-
$VERBOSE = nil
|
48
|
+
verbose, $VERBOSE = $VERBOSE, nil
|
50
49
|
|
51
50
|
begin
|
52
51
|
locals = []
|
53
52
|
stack = [ISeq.new(RubyVM::InstructionSequence.compile(source).to_a)]
|
54
53
|
|
55
54
|
while (iseq = stack.pop)
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
# CRuby will push on a special local variable when there are keyword
|
60
|
-
# arguments. We get rid of that here.
|
61
|
-
names = names.grep_v(Integer)
|
62
|
-
|
63
|
-
# For some reason, CRuby occasionally pushes this special local
|
64
|
-
# variable when there are splat arguments. We get rid of that here.
|
65
|
-
names = names.grep_v(:"#arg_rest")
|
66
|
-
|
67
|
-
# Now push them onto the list of locals.
|
68
|
-
locals << names
|
69
|
-
end
|
70
|
-
|
55
|
+
# For some reason, CRuby occasionally pushes this special local
|
56
|
+
# variable when there are splat arguments. We get rid of that here.
|
57
|
+
locals << (iseq.local_table - [:"#arg_rest"])
|
71
58
|
iseq.each_child { |child| stack << child }
|
72
59
|
end
|
73
60
|
|
@@ -77,6 +64,8 @@ module Prism
|
|
77
64
|
end
|
78
65
|
end
|
79
66
|
|
67
|
+
AnonymousLocal = Object.new
|
68
|
+
|
80
69
|
# For the given source, parses with prism and returns a list of all of the
|
81
70
|
# sets of local variables that were encountered.
|
82
71
|
def self.prism_locals(source)
|
@@ -97,20 +86,27 @@ module Prism
|
|
97
86
|
# order here so that we can compare properly.
|
98
87
|
if params
|
99
88
|
sorted = [
|
100
|
-
*params.requireds.
|
89
|
+
*params.requireds.map do |required|
|
90
|
+
if required.is_a?(RequiredParameterNode)
|
91
|
+
required.name
|
92
|
+
else
|
93
|
+
AnonymousLocal
|
94
|
+
end
|
95
|
+
end,
|
101
96
|
*params.optionals.map(&:name),
|
102
97
|
*((params.rest.name || :*) if params.rest && params.rest.operator != ","),
|
103
|
-
*params.posts.
|
98
|
+
*params.posts.map do |post|
|
99
|
+
if post.is_a?(RequiredParameterNode)
|
100
|
+
post.name
|
101
|
+
else
|
102
|
+
AnonymousLocal
|
103
|
+
end
|
104
|
+
end,
|
104
105
|
*params.keywords.reject(&:value).map(&:name),
|
105
106
|
*params.keywords.select(&:value).map(&:name)
|
106
107
|
]
|
107
108
|
|
108
|
-
|
109
|
-
# onto the local list. We don't do that yet, so we need to add them
|
110
|
-
# in here.
|
111
|
-
if params.keyword_rest.is_a?(ForwardingParameterNode)
|
112
|
-
sorted.push(:*, :&, :"...")
|
113
|
-
end
|
109
|
+
sorted << AnonymousLocal if params.keywords.any?
|
114
110
|
|
115
111
|
# Recurse down the parameter tree to find any destructured
|
116
112
|
# parameters and add them after the other parameters.
|
@@ -129,11 +125,19 @@ module Prism
|
|
129
125
|
names = sorted.concat(names - sorted)
|
130
126
|
end
|
131
127
|
|
128
|
+
names.map!.with_index do |name, index|
|
129
|
+
if name == AnonymousLocal
|
130
|
+
names.length - index + 1
|
131
|
+
else
|
132
|
+
name
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
132
136
|
locals << names
|
133
137
|
when ClassNode, ModuleNode, ProgramNode, SingletonClassNode
|
134
138
|
locals << node.locals
|
135
139
|
when ForNode
|
136
|
-
locals << []
|
140
|
+
locals << [2]
|
137
141
|
when PostExecutionNode
|
138
142
|
locals.push([], [])
|
139
143
|
when InterpolatedRegularExpressionNode
|
data/lib/prism/dispatcher.rb
CHANGED
@@ -608,6 +608,30 @@ module Prism
|
|
608
608
|
listeners[:on_in_node_leave]&.each { |listener| listener.on_in_node_leave(node) }
|
609
609
|
end
|
610
610
|
|
611
|
+
# Dispatch enter and leave events for IndexAndWriteNode nodes and continue
|
612
|
+
# walking the tree.
|
613
|
+
def visit_index_and_write_node(node)
|
614
|
+
listeners[:on_index_and_write_node_enter]&.each { |listener| listener.on_index_and_write_node_enter(node) }
|
615
|
+
super
|
616
|
+
listeners[:on_index_and_write_node_leave]&.each { |listener| listener.on_index_and_write_node_leave(node) }
|
617
|
+
end
|
618
|
+
|
619
|
+
# Dispatch enter and leave events for IndexOperatorWriteNode nodes and continue
|
620
|
+
# walking the tree.
|
621
|
+
def visit_index_operator_write_node(node)
|
622
|
+
listeners[:on_index_operator_write_node_enter]&.each { |listener| listener.on_index_operator_write_node_enter(node) }
|
623
|
+
super
|
624
|
+
listeners[:on_index_operator_write_node_leave]&.each { |listener| listener.on_index_operator_write_node_leave(node) }
|
625
|
+
end
|
626
|
+
|
627
|
+
# Dispatch enter and leave events for IndexOrWriteNode nodes and continue
|
628
|
+
# walking the tree.
|
629
|
+
def visit_index_or_write_node(node)
|
630
|
+
listeners[:on_index_or_write_node_enter]&.each { |listener| listener.on_index_or_write_node_enter(node) }
|
631
|
+
super
|
632
|
+
listeners[:on_index_or_write_node_leave]&.each { |listener| listener.on_index_or_write_node_leave(node) }
|
633
|
+
end
|
634
|
+
|
611
635
|
# Dispatch enter and leave events for InstanceVariableAndWriteNode nodes and continue
|
612
636
|
# walking the tree.
|
613
637
|
def visit_instance_variable_and_write_node(node)
|
@@ -1607,6 +1631,24 @@ module Prism
|
|
1607
1631
|
listeners[:on_in_node_leave]&.each { |listener| listener.on_in_node_leave(node) }
|
1608
1632
|
end
|
1609
1633
|
|
1634
|
+
# Dispatch enter and leave events for IndexAndWriteNode nodes.
|
1635
|
+
def visit_index_and_write_node(node)
|
1636
|
+
listeners[:on_index_and_write_node_enter]&.each { |listener| listener.on_index_and_write_node_enter(node) }
|
1637
|
+
listeners[:on_index_and_write_node_leave]&.each { |listener| listener.on_index_and_write_node_leave(node) }
|
1638
|
+
end
|
1639
|
+
|
1640
|
+
# Dispatch enter and leave events for IndexOperatorWriteNode nodes.
|
1641
|
+
def visit_index_operator_write_node(node)
|
1642
|
+
listeners[:on_index_operator_write_node_enter]&.each { |listener| listener.on_index_operator_write_node_enter(node) }
|
1643
|
+
listeners[:on_index_operator_write_node_leave]&.each { |listener| listener.on_index_operator_write_node_leave(node) }
|
1644
|
+
end
|
1645
|
+
|
1646
|
+
# Dispatch enter and leave events for IndexOrWriteNode nodes.
|
1647
|
+
def visit_index_or_write_node(node)
|
1648
|
+
listeners[:on_index_or_write_node_enter]&.each { |listener| listener.on_index_or_write_node_enter(node) }
|
1649
|
+
listeners[:on_index_or_write_node_leave]&.each { |listener| listener.on_index_or_write_node_leave(node) }
|
1650
|
+
end
|
1651
|
+
|
1610
1652
|
# Dispatch enter and leave events for InstanceVariableAndWriteNode nodes.
|
1611
1653
|
def visit_instance_variable_and_write_node(node)
|
1612
1654
|
listeners[:on_instance_variable_and_write_node_enter]&.each { |listener| listener.on_instance_variable_and_write_node_enter(node) }
|
data/lib/prism/dsl.rb
CHANGED
@@ -88,8 +88,8 @@ module Prism
|
|
88
88
|
end
|
89
89
|
|
90
90
|
# Create a new BackReferenceReadNode node
|
91
|
-
def BackReferenceReadNode(location = Location())
|
92
|
-
BackReferenceReadNode.new(location)
|
91
|
+
def BackReferenceReadNode(name, location = Location())
|
92
|
+
BackReferenceReadNode.new(name, location)
|
93
93
|
end
|
94
94
|
|
95
95
|
# Create a new BeginNode node
|
@@ -128,8 +128,8 @@ module Prism
|
|
128
128
|
end
|
129
129
|
|
130
130
|
# Create a new CallAndWriteNode node
|
131
|
-
def CallAndWriteNode(receiver, call_operator_loc, message_loc,
|
132
|
-
CallAndWriteNode.new(receiver, call_operator_loc, message_loc,
|
131
|
+
def CallAndWriteNode(receiver, call_operator_loc, message_loc, flags, read_name, write_name, operator_loc, value, location = Location())
|
132
|
+
CallAndWriteNode.new(receiver, call_operator_loc, message_loc, flags, read_name, write_name, operator_loc, value, location)
|
133
133
|
end
|
134
134
|
|
135
135
|
# Create a new CallNode node
|
@@ -138,13 +138,13 @@ module Prism
|
|
138
138
|
end
|
139
139
|
|
140
140
|
# Create a new CallOperatorWriteNode node
|
141
|
-
def CallOperatorWriteNode(receiver, call_operator_loc, message_loc,
|
142
|
-
CallOperatorWriteNode.new(receiver, call_operator_loc, message_loc,
|
141
|
+
def CallOperatorWriteNode(receiver, call_operator_loc, message_loc, flags, read_name, write_name, operator, operator_loc, value, location = Location())
|
142
|
+
CallOperatorWriteNode.new(receiver, call_operator_loc, message_loc, flags, read_name, write_name, operator, operator_loc, value, location)
|
143
143
|
end
|
144
144
|
|
145
145
|
# Create a new CallOrWriteNode node
|
146
|
-
def CallOrWriteNode(receiver, call_operator_loc, message_loc,
|
147
|
-
CallOrWriteNode.new(receiver, call_operator_loc, message_loc,
|
146
|
+
def CallOrWriteNode(receiver, call_operator_loc, message_loc, flags, read_name, write_name, operator_loc, value, location = Location())
|
147
|
+
CallOrWriteNode.new(receiver, call_operator_loc, message_loc, flags, read_name, write_name, operator_loc, value, location)
|
148
148
|
end
|
149
149
|
|
150
150
|
# Create a new CapturePatternNode node
|
@@ -382,6 +382,21 @@ module Prism
|
|
382
382
|
InNode.new(pattern, statements, in_loc, then_loc, location)
|
383
383
|
end
|
384
384
|
|
385
|
+
# Create a new IndexAndWriteNode node
|
386
|
+
def IndexAndWriteNode(receiver, call_operator_loc, opening_loc, arguments, closing_loc, block, flags, operator_loc, value, location = Location())
|
387
|
+
IndexAndWriteNode.new(receiver, call_operator_loc, opening_loc, arguments, closing_loc, block, flags, operator_loc, value, location)
|
388
|
+
end
|
389
|
+
|
390
|
+
# Create a new IndexOperatorWriteNode node
|
391
|
+
def IndexOperatorWriteNode(receiver, call_operator_loc, opening_loc, arguments, closing_loc, block, flags, operator, operator_loc, value, location = Location())
|
392
|
+
IndexOperatorWriteNode.new(receiver, call_operator_loc, opening_loc, arguments, closing_loc, block, flags, operator, operator_loc, value, location)
|
393
|
+
end
|
394
|
+
|
395
|
+
# Create a new IndexOrWriteNode node
|
396
|
+
def IndexOrWriteNode(receiver, call_operator_loc, opening_loc, arguments, closing_loc, block, flags, operator_loc, value, location = Location())
|
397
|
+
IndexOrWriteNode.new(receiver, call_operator_loc, opening_loc, arguments, closing_loc, block, flags, operator_loc, value, location)
|
398
|
+
end
|
399
|
+
|
385
400
|
# Create a new InstanceVariableAndWriteNode node
|
386
401
|
def InstanceVariableAndWriteNode(name, name_loc, operator_loc, value, location = Location())
|
387
402
|
InstanceVariableAndWriteNode.new(name, name_loc, operator_loc, value, location)
|
data/lib/prism/ffi.rb
CHANGED
@@ -25,8 +25,8 @@ module Prism
|
|
25
25
|
# void -> :void
|
26
26
|
#
|
27
27
|
def self.resolve_type(type)
|
28
|
-
type = type.strip
|
29
|
-
type.end_with?("*") ? :pointer : type.to_sym
|
28
|
+
type = type.strip
|
29
|
+
type.end_with?("*") ? :pointer : type.delete_prefix("const ").to_sym
|
30
30
|
end
|
31
31
|
|
32
32
|
# Read through the given header file and find the declaration of each of the
|