prism 0.15.1 → 0.16.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 +20 -1
- data/Makefile +6 -0
- data/README.md +2 -0
- data/config.yml +21 -20
- data/docs/configuration.md +2 -0
- data/docs/javascript.md +90 -0
- data/docs/releasing.md +27 -0
- data/docs/ruby_api.md +2 -0
- data/ext/prism/api_node.c +66 -68
- data/ext/prism/extension.c +73 -0
- data/ext/prism/extension.h +1 -1
- data/include/prism/ast.h +40 -40
- data/include/prism/defines.h +9 -0
- data/include/prism/enc/pm_encoding.h +1 -0
- data/include/prism/node.h +0 -17
- data/include/prism/parser.h +1 -0
- data/include/prism/prettyprint.h +15 -0
- data/include/prism/util/pm_buffer.h +10 -4
- data/include/prism/util/pm_constant_pool.h +1 -1
- data/include/prism/util/pm_newline_list.h +1 -1
- data/include/prism/version.h +3 -3
- data/include/prism.h +11 -11
- data/lib/prism/compiler.rb +0 -3
- data/lib/prism/debug.rb +20 -6
- data/lib/prism/desugar_compiler.rb +1 -1
- data/lib/prism/dispatcher.rb +0 -14
- data/lib/prism/dsl.rb +8 -13
- data/lib/prism/ffi.rb +25 -0
- data/lib/prism/lex_compat.rb +1 -1
- data/lib/prism/mutation_compiler.rb +3 -8
- data/lib/prism/node.rb +123 -159
- data/lib/prism/node_ext.rb +23 -16
- data/lib/prism/parse_result.rb +21 -5
- data/lib/prism/pattern.rb +3 -3
- data/lib/prism/serialize.rb +901 -305
- data/lib/prism/visitor.rb +0 -3
- data/prism.gemspec +8 -1
- data/rbi/prism.rbi +7261 -0
- data/rbi/prism_static.rbi +182 -0
- data/sig/prism.rbs +4439 -0
- data/sig/prism_static.rbs +110 -0
- data/src/enc/pm_unicode.c +1 -1
- data/src/node.c +28 -29
- data/src/prettyprint.c +7674 -1647
- data/src/prism.c +353 -300
- data/src/regexp.c +2 -0
- data/src/serialize.c +392 -381
- data/src/util/pm_buffer.c +47 -12
- data/src/util/pm_constant_pool.c +1 -1
- data/src/util/pm_newline_list.c +8 -54
- metadata +9 -2
data/ext/prism/extension.h
CHANGED
data/include/prism/ast.h
CHANGED
@@ -327,32 +327,31 @@ enum pm_node_type {
|
|
327
327
|
PM_RATIONAL_NODE = 116,
|
328
328
|
PM_REDO_NODE = 117,
|
329
329
|
PM_REGULAR_EXPRESSION_NODE = 118,
|
330
|
-
|
331
|
-
|
332
|
-
|
333
|
-
|
334
|
-
|
335
|
-
|
336
|
-
|
337
|
-
|
338
|
-
|
339
|
-
|
340
|
-
|
341
|
-
|
342
|
-
|
343
|
-
|
344
|
-
|
345
|
-
|
346
|
-
|
347
|
-
|
348
|
-
|
349
|
-
|
350
|
-
|
351
|
-
|
352
|
-
|
353
|
-
|
354
|
-
|
355
|
-
PM_YIELD_NODE = 144,
|
330
|
+
PM_REQUIRED_PARAMETER_NODE = 119,
|
331
|
+
PM_RESCUE_MODIFIER_NODE = 120,
|
332
|
+
PM_RESCUE_NODE = 121,
|
333
|
+
PM_REST_PARAMETER_NODE = 122,
|
334
|
+
PM_RETRY_NODE = 123,
|
335
|
+
PM_RETURN_NODE = 124,
|
336
|
+
PM_SELF_NODE = 125,
|
337
|
+
PM_SINGLETON_CLASS_NODE = 126,
|
338
|
+
PM_SOURCE_ENCODING_NODE = 127,
|
339
|
+
PM_SOURCE_FILE_NODE = 128,
|
340
|
+
PM_SOURCE_LINE_NODE = 129,
|
341
|
+
PM_SPLAT_NODE = 130,
|
342
|
+
PM_STATEMENTS_NODE = 131,
|
343
|
+
PM_STRING_CONCAT_NODE = 132,
|
344
|
+
PM_STRING_NODE = 133,
|
345
|
+
PM_SUPER_NODE = 134,
|
346
|
+
PM_SYMBOL_NODE = 135,
|
347
|
+
PM_TRUE_NODE = 136,
|
348
|
+
PM_UNDEF_NODE = 137,
|
349
|
+
PM_UNLESS_NODE = 138,
|
350
|
+
PM_UNTIL_NODE = 139,
|
351
|
+
PM_WHEN_NODE = 140,
|
352
|
+
PM_WHILE_NODE = 141,
|
353
|
+
PM_X_STRING_NODE = 142,
|
354
|
+
PM_YIELD_NODE = 143,
|
356
355
|
PM_SCOPE_NODE
|
357
356
|
};
|
358
357
|
|
@@ -427,6 +426,8 @@ typedef struct pm_and_node {
|
|
427
426
|
// ArgumentsNode
|
428
427
|
//
|
429
428
|
// Type: PM_ARGUMENTS_NODE
|
429
|
+
// Flags:
|
430
|
+
// PM_ARGUMENTS_NODE_FLAGS_KEYWORD_SPLAT
|
430
431
|
typedef struct pm_arguments_node {
|
431
432
|
pm_node_t base;
|
432
433
|
struct pm_node_list arguments;
|
@@ -1065,8 +1066,8 @@ typedef struct pm_hash_node {
|
|
1065
1066
|
typedef struct pm_hash_pattern_node {
|
1066
1067
|
pm_node_t base;
|
1067
1068
|
struct pm_node *constant;
|
1068
|
-
struct pm_node_list
|
1069
|
-
struct pm_node *
|
1069
|
+
struct pm_node_list elements;
|
1070
|
+
struct pm_node *rest;
|
1070
1071
|
pm_location_t opening_loc;
|
1071
1072
|
pm_location_t closing_loc;
|
1072
1073
|
} pm_hash_pattern_node_t;
|
@@ -1488,7 +1489,9 @@ typedef struct pm_module_node {
|
|
1488
1489
|
// Type: PM_MULTI_TARGET_NODE
|
1489
1490
|
typedef struct pm_multi_target_node {
|
1490
1491
|
pm_node_t base;
|
1491
|
-
struct pm_node_list
|
1492
|
+
struct pm_node_list lefts;
|
1493
|
+
struct pm_node *rest;
|
1494
|
+
struct pm_node_list rights;
|
1492
1495
|
pm_location_t lparen_loc;
|
1493
1496
|
pm_location_t rparen_loc;
|
1494
1497
|
} pm_multi_target_node_t;
|
@@ -1498,7 +1501,9 @@ typedef struct pm_multi_target_node {
|
|
1498
1501
|
// Type: PM_MULTI_WRITE_NODE
|
1499
1502
|
typedef struct pm_multi_write_node {
|
1500
1503
|
pm_node_t base;
|
1501
|
-
struct pm_node_list
|
1504
|
+
struct pm_node_list lefts;
|
1505
|
+
struct pm_node *rest;
|
1506
|
+
struct pm_node_list rights;
|
1502
1507
|
pm_location_t lparen_loc;
|
1503
1508
|
pm_location_t rparen_loc;
|
1504
1509
|
pm_location_t operator_loc;
|
@@ -1681,16 +1686,6 @@ typedef struct pm_regular_expression_node {
|
|
1681
1686
|
pm_string_t unescaped;
|
1682
1687
|
} pm_regular_expression_node_t;
|
1683
1688
|
|
1684
|
-
// RequiredDestructuredParameterNode
|
1685
|
-
//
|
1686
|
-
// Type: PM_REQUIRED_DESTRUCTURED_PARAMETER_NODE
|
1687
|
-
typedef struct pm_required_destructured_parameter_node {
|
1688
|
-
pm_node_t base;
|
1689
|
-
struct pm_node_list parameters;
|
1690
|
-
pm_location_t opening_loc;
|
1691
|
-
pm_location_t closing_loc;
|
1692
|
-
} pm_required_destructured_parameter_node_t;
|
1693
|
-
|
1694
1689
|
// RequiredParameterNode
|
1695
1690
|
//
|
1696
1691
|
// Type: PM_REQUIRED_PARAMETER_NODE
|
@@ -1938,6 +1933,11 @@ typedef struct pm_yield_node {
|
|
1938
1933
|
pm_location_t rparen_loc;
|
1939
1934
|
} pm_yield_node_t;
|
1940
1935
|
|
1936
|
+
// ArgumentsNodeFlags
|
1937
|
+
typedef enum pm_arguments_node_flags {
|
1938
|
+
PM_ARGUMENTS_NODE_FLAGS_KEYWORD_SPLAT = 1 << 0,
|
1939
|
+
} pm_arguments_node_flags_t;
|
1940
|
+
|
1941
1941
|
// CallNodeFlags
|
1942
1942
|
typedef enum pm_call_node_flags {
|
1943
1943
|
PM_CALL_NODE_FLAGS_SAFE_NAVIGATION = 1 << 0,
|
data/include/prism/defines.h
CHANGED
@@ -23,6 +23,15 @@
|
|
23
23
|
# endif
|
24
24
|
#endif
|
25
25
|
|
26
|
+
// PRISM_ATTRIBUTE_FORMAT
|
27
|
+
#if defined(__GNUC__)
|
28
|
+
# define PRISM_ATTRIBUTE_FORMAT(string_index, argument_index) __attribute__((format(printf, string_index, argument_index)))
|
29
|
+
#elif defined(__clang__)
|
30
|
+
# define PRISM_ATTRIBUTE_FORMAT(string_index, argument_index) __attribute__((__format__(__printf__, string_index, argument_index)))
|
31
|
+
#else
|
32
|
+
# define PRISM_ATTRIBUTE_FORMAT(string_index, argument_index)
|
33
|
+
#endif
|
34
|
+
|
26
35
|
// PRISM_ATTRIBUTE_UNUSED
|
27
36
|
#if defined(__GNUC__)
|
28
37
|
# define PRISM_ATTRIBUTE_UNUSED __attribute__((unused))
|
@@ -57,6 +57,7 @@ bool pm_encoding_ascii_isupper_char(const uint8_t *b, PRISM_ATTRIBUTE_UNUSED ptr
|
|
57
57
|
// the parser so they need to be internally visible.
|
58
58
|
size_t pm_encoding_utf_8_alpha_char(const uint8_t *b, ptrdiff_t n);
|
59
59
|
size_t pm_encoding_utf_8_alnum_char(const uint8_t *b, ptrdiff_t n);
|
60
|
+
bool pm_encoding_utf_8_isupper_char(const uint8_t *b, ptrdiff_t n);
|
60
61
|
|
61
62
|
// This lookup table is referenced in both the UTF-8 encoding file and the
|
62
63
|
// parser directly in order to speed up the default encoding processing.
|
data/include/prism/node.h
CHANGED
@@ -29,21 +29,4 @@ PRISM_EXPORTED_FUNCTION const char * pm_node_type_to_str(pm_node_type_t node_typ
|
|
29
29
|
|
30
30
|
#define PM_EMPTY_NODE_LIST ((pm_node_list_t) { .nodes = NULL, .size = 0, .capacity = 0 })
|
31
31
|
|
32
|
-
// ScopeNodes are helper nodes, and will never be part of the AST. We manually
|
33
|
-
// declare them here to avoid generating them.
|
34
|
-
typedef struct pm_scope_node {
|
35
|
-
pm_node_t base;
|
36
|
-
struct pm_scope_node *previous;
|
37
|
-
pm_node_t *ast_node;
|
38
|
-
struct pm_parameters_node *parameters;
|
39
|
-
pm_node_t *body;
|
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
|
47
|
-
} pm_scope_node_t;
|
48
|
-
|
49
32
|
#endif // PRISM_NODE_H
|
data/include/prism/parser.h
CHANGED
@@ -212,6 +212,7 @@ typedef enum {
|
|
212
212
|
PM_CONTEXT_EMBEXPR, // an interpolated expression
|
213
213
|
PM_CONTEXT_ENSURE, // an ensure statement
|
214
214
|
PM_CONTEXT_FOR, // a for loop
|
215
|
+
PM_CONTEXT_FOR_INDEX, // a for loop's index
|
215
216
|
PM_CONTEXT_IF, // an if statement
|
216
217
|
PM_CONTEXT_LAMBDA_BRACES, // a lambda expression with braces
|
217
218
|
PM_CONTEXT_LAMBDA_DO_END, // a lambda expression with do..end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
#ifndef PRISM_PRETTYPRINT_H
|
2
|
+
#define PRISM_PRETTYPRINT_H
|
3
|
+
|
4
|
+
#include "prism/defines.h"
|
5
|
+
|
6
|
+
#include <stdio.h>
|
7
|
+
|
8
|
+
#include "prism/ast.h"
|
9
|
+
#include "prism/parser.h"
|
10
|
+
#include "prism/util/pm_buffer.h"
|
11
|
+
|
12
|
+
// Pretty-prints the AST represented by the given node to the given buffer.
|
13
|
+
PRISM_EXPORTED_FUNCTION void pm_prettyprint(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm_node_t *node);
|
14
|
+
|
15
|
+
#endif
|
@@ -13,9 +13,9 @@
|
|
13
13
|
// block of memory. It is used to store the serialized representation of a
|
14
14
|
// prism tree.
|
15
15
|
typedef struct {
|
16
|
-
char *value;
|
17
16
|
size_t length;
|
18
17
|
size_t capacity;
|
18
|
+
char *value;
|
19
19
|
} pm_buffer_t;
|
20
20
|
|
21
21
|
// Return the size of the pm_buffer_t struct.
|
@@ -36,17 +36,23 @@ PRISM_EXPORTED_FUNCTION size_t pm_buffer_length(pm_buffer_t *buffer);
|
|
36
36
|
// Append the given amount of space as zeroes to the buffer.
|
37
37
|
void pm_buffer_append_zeroes(pm_buffer_t *buffer, size_t length);
|
38
38
|
|
39
|
+
// Append a formatted string to the buffer.
|
40
|
+
void pm_buffer_append_format(pm_buffer_t *buffer, const char *format, ...) PRISM_ATTRIBUTE_FORMAT(2, 3);
|
41
|
+
|
39
42
|
// Append a string to the buffer.
|
40
|
-
void
|
43
|
+
void pm_buffer_append_string(pm_buffer_t *buffer, const char *value, size_t length);
|
41
44
|
|
42
45
|
// Append a list of bytes to the buffer.
|
43
46
|
void pm_buffer_append_bytes(pm_buffer_t *buffer, const uint8_t *value, size_t length);
|
44
47
|
|
45
48
|
// Append a single byte to the buffer.
|
46
|
-
void
|
49
|
+
void pm_buffer_append_byte(pm_buffer_t *buffer, uint8_t value);
|
47
50
|
|
48
51
|
// Append a 32-bit unsigned integer to the buffer.
|
49
|
-
void
|
52
|
+
void pm_buffer_append_varint(pm_buffer_t *buffer, uint32_t value);
|
53
|
+
|
54
|
+
// Append one buffer onto another.
|
55
|
+
void pm_buffer_concat(pm_buffer_t *destination, const pm_buffer_t *source);
|
50
56
|
|
51
57
|
// Free the memory associated with the buffer.
|
52
58
|
PRISM_EXPORTED_FUNCTION void pm_buffer_free(pm_buffer_t *buffer);
|
@@ -76,7 +76,7 @@ typedef struct {
|
|
76
76
|
bool pm_constant_pool_init(pm_constant_pool_t *pool, uint32_t capacity);
|
77
77
|
|
78
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);
|
79
|
+
pm_constant_t * pm_constant_pool_id_to_constant(const pm_constant_pool_t *pool, pm_constant_id_t constant_id);
|
80
80
|
|
81
81
|
// Insert a constant into a constant pool that is a slice of a source string.
|
82
82
|
// Returns the id of the constant, or 0 if any potential calls to resize fail.
|
@@ -53,7 +53,7 @@ bool pm_newline_list_check_append(pm_newline_list_t *list, const uint8_t *cursor
|
|
53
53
|
// Returns the line and column of the given offset. If the offset is not in the
|
54
54
|
// list, the line and column of the closest offset less than the given offset
|
55
55
|
// are returned.
|
56
|
-
pm_line_column_t pm_newline_list_line_column(pm_newline_list_t *list, const uint8_t *cursor);
|
56
|
+
pm_line_column_t pm_newline_list_line_column(const pm_newline_list_t *list, const uint8_t *cursor);
|
57
57
|
|
58
58
|
// Free the internal memory allocated for the newline list.
|
59
59
|
void pm_newline_list_free(pm_newline_list_t *list);
|
data/include/prism/version.h
CHANGED
@@ -1,4 +1,4 @@
|
|
1
1
|
#define PRISM_VERSION_MAJOR 0
|
2
|
-
#define PRISM_VERSION_MINOR
|
3
|
-
#define PRISM_VERSION_PATCH
|
4
|
-
#define PRISM_VERSION "0.
|
2
|
+
#define PRISM_VERSION_MINOR 16
|
3
|
+
#define PRISM_VERSION_PATCH 0
|
4
|
+
#define PRISM_VERSION "0.16.0"
|
data/include/prism.h
CHANGED
@@ -2,16 +2,17 @@
|
|
2
2
|
#define PRISM_H
|
3
3
|
|
4
4
|
#include "prism/defines.h"
|
5
|
+
#include "prism/util/pm_buffer.h"
|
6
|
+
#include "prism/util/pm_char.h"
|
7
|
+
#include "prism/util/pm_memchr.h"
|
8
|
+
#include "prism/util/pm_strpbrk.h"
|
5
9
|
#include "prism/ast.h"
|
6
10
|
#include "prism/diagnostic.h"
|
7
11
|
#include "prism/node.h"
|
8
12
|
#include "prism/pack.h"
|
9
13
|
#include "prism/parser.h"
|
14
|
+
#include "prism/prettyprint.h"
|
10
15
|
#include "prism/regexp.h"
|
11
|
-
#include "prism/util/pm_buffer.h"
|
12
|
-
#include "prism/util/pm_char.h"
|
13
|
-
#include "prism/util/pm_memchr.h"
|
14
|
-
#include "prism/util/pm_strpbrk.h"
|
15
16
|
#include "prism/version.h"
|
16
17
|
|
17
18
|
#include <assert.h>
|
@@ -29,12 +30,11 @@
|
|
29
30
|
|
30
31
|
void pm_serialize_content(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer);
|
31
32
|
|
32
|
-
void
|
33
|
+
void pm_serialize_encoding(pm_encoding_t *encoding, pm_buffer_t *buffer);
|
33
34
|
|
34
|
-
void
|
35
|
+
void pm_serialize_comment_list(pm_parser_t *parser, pm_list_t *list, pm_buffer_t *buffer);
|
35
36
|
|
36
|
-
|
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);
|
37
|
+
void pm_parser_metadata(pm_parser_t *parser, const char *metadata);
|
38
38
|
|
39
39
|
// The prism version and the serialization format.
|
40
40
|
PRISM_EXPORTED_FUNCTION const char * pm_version(void);
|
@@ -59,15 +59,15 @@ PRISM_EXPORTED_FUNCTION void pm_parser_free(pm_parser_t *parser);
|
|
59
59
|
// Parse the Ruby source associated with the given parser and return the tree.
|
60
60
|
PRISM_EXPORTED_FUNCTION pm_node_t * pm_parse(pm_parser_t *parser);
|
61
61
|
|
62
|
-
// Pretty-prints the AST represented by the given node to the given buffer.
|
63
|
-
PRISM_EXPORTED_FUNCTION void pm_prettyprint(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer);
|
64
|
-
|
65
62
|
// Serialize the AST represented by the given node to the given buffer.
|
66
63
|
PRISM_EXPORTED_FUNCTION void pm_serialize(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer);
|
67
64
|
|
68
65
|
// Parse the given source to the AST and serialize the AST to the given buffer.
|
69
66
|
PRISM_EXPORTED_FUNCTION void pm_parse_serialize(const uint8_t *source, size_t size, pm_buffer_t *buffer, const char *metadata);
|
70
67
|
|
68
|
+
// Parse and serialize the comments in the given source to the given buffer.
|
69
|
+
PRISM_EXPORTED_FUNCTION void pm_parse_serialize_comments(const uint8_t *source, size_t size, pm_buffer_t *buffer, const char *metadata);
|
70
|
+
|
71
71
|
// Lex the given source and serialize to the given buffer.
|
72
72
|
PRISM_EXPORTED_FUNCTION void pm_lex_serialize(const uint8_t *source, size_t size, const char *filepath, pm_buffer_t *buffer);
|
73
73
|
|
data/lib/prism/compiler.rb
CHANGED
@@ -393,9 +393,6 @@ module Prism
|
|
393
393
|
# Compile a RegularExpressionNode node
|
394
394
|
alias visit_regular_expression_node visit_child_nodes
|
395
395
|
|
396
|
-
# Compile a RequiredDestructuredParameterNode node
|
397
|
-
alias visit_required_destructured_parameter_node visit_child_nodes
|
398
|
-
|
399
396
|
# Compile a RequiredParameterNode node
|
400
397
|
alias visit_required_parameter_node visit_child_nodes
|
401
398
|
|
data/lib/prism/debug.rb
CHANGED
@@ -52,9 +52,21 @@ module Prism
|
|
52
52
|
stack = [ISeq.new(RubyVM::InstructionSequence.compile(source).to_a)]
|
53
53
|
|
54
54
|
while (iseq = stack.pop)
|
55
|
-
|
56
|
-
|
57
|
-
|
55
|
+
names = [*iseq.local_table]
|
56
|
+
names.map!.with_index do |name, index|
|
57
|
+
# When an anonymous local variable is present in the iseq's local
|
58
|
+
# table, it is represented as the stack offset from the top.
|
59
|
+
# However, when these are dumped to binary and read back in, they
|
60
|
+
# are replaced with the symbol :#arg_rest. To consistently handle
|
61
|
+
# this, we replace them here with their index.
|
62
|
+
if name == :"#arg_rest"
|
63
|
+
names.length - index + 1
|
64
|
+
else
|
65
|
+
name
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
locals << names
|
58
70
|
iseq.each_child { |child| stack << child }
|
59
71
|
end
|
60
72
|
|
@@ -110,11 +122,13 @@ module Prism
|
|
110
122
|
|
111
123
|
# Recurse down the parameter tree to find any destructured
|
112
124
|
# parameters and add them after the other parameters.
|
113
|
-
param_stack = params.requireds.concat(params.posts).grep(
|
125
|
+
param_stack = params.requireds.concat(params.posts).grep(MultiTargetNode).reverse
|
114
126
|
while (param = param_stack.pop)
|
115
127
|
case param
|
116
|
-
when
|
117
|
-
param_stack.concat(param.
|
128
|
+
when MultiTargetNode
|
129
|
+
param_stack.concat(param.rights.reverse)
|
130
|
+
param_stack << param.rest
|
131
|
+
param_stack.concat(param.lefts.reverse)
|
118
132
|
when RequiredParameterNode
|
119
133
|
sorted << param.name
|
120
134
|
when SplatNode
|
data/lib/prism/dispatcher.rb
CHANGED
@@ -1008,14 +1008,6 @@ module Prism
|
|
1008
1008
|
listeners[:on_regular_expression_node_leave]&.each { |listener| listener.on_regular_expression_node_leave(node) }
|
1009
1009
|
end
|
1010
1010
|
|
1011
|
-
# Dispatch enter and leave events for RequiredDestructuredParameterNode nodes and continue
|
1012
|
-
# walking the tree.
|
1013
|
-
def visit_required_destructured_parameter_node(node)
|
1014
|
-
listeners[:on_required_destructured_parameter_node_enter]&.each { |listener| listener.on_required_destructured_parameter_node_enter(node) }
|
1015
|
-
super
|
1016
|
-
listeners[:on_required_destructured_parameter_node_leave]&.each { |listener| listener.on_required_destructured_parameter_node_leave(node) }
|
1017
|
-
end
|
1018
|
-
|
1019
1011
|
# Dispatch enter and leave events for RequiredParameterNode nodes and continue
|
1020
1012
|
# walking the tree.
|
1021
1013
|
def visit_required_parameter_node(node)
|
@@ -1931,12 +1923,6 @@ module Prism
|
|
1931
1923
|
listeners[:on_regular_expression_node_leave]&.each { |listener| listener.on_regular_expression_node_leave(node) }
|
1932
1924
|
end
|
1933
1925
|
|
1934
|
-
# Dispatch enter and leave events for RequiredDestructuredParameterNode nodes.
|
1935
|
-
def visit_required_destructured_parameter_node(node)
|
1936
|
-
listeners[:on_required_destructured_parameter_node_enter]&.each { |listener| listener.on_required_destructured_parameter_node_enter(node) }
|
1937
|
-
listeners[:on_required_destructured_parameter_node_leave]&.each { |listener| listener.on_required_destructured_parameter_node_leave(node) }
|
1938
|
-
end
|
1939
|
-
|
1940
1926
|
# Dispatch enter and leave events for RequiredParameterNode nodes.
|
1941
1927
|
def visit_required_parameter_node(node)
|
1942
1928
|
listeners[:on_required_parameter_node_enter]&.each { |listener| listener.on_required_parameter_node_enter(node) }
|
data/lib/prism/dsl.rb
CHANGED
@@ -63,8 +63,8 @@ module Prism
|
|
63
63
|
end
|
64
64
|
|
65
65
|
# Create a new ArgumentsNode node
|
66
|
-
def ArgumentsNode(arguments, location = Location())
|
67
|
-
ArgumentsNode.new(arguments, location)
|
66
|
+
def ArgumentsNode(arguments, flags, location = Location())
|
67
|
+
ArgumentsNode.new(arguments, flags, location)
|
68
68
|
end
|
69
69
|
|
70
70
|
# Create a new ArrayNode node
|
@@ -358,8 +358,8 @@ module Prism
|
|
358
358
|
end
|
359
359
|
|
360
360
|
# Create a new HashPatternNode node
|
361
|
-
def HashPatternNode(constant,
|
362
|
-
HashPatternNode.new(constant,
|
361
|
+
def HashPatternNode(constant, elements, rest, opening_loc, closing_loc, location = Location())
|
362
|
+
HashPatternNode.new(constant, elements, rest, opening_loc, closing_loc, location)
|
363
363
|
end
|
364
364
|
|
365
365
|
# Create a new IfNode node
|
@@ -538,13 +538,13 @@ module Prism
|
|
538
538
|
end
|
539
539
|
|
540
540
|
# Create a new MultiTargetNode node
|
541
|
-
def MultiTargetNode(
|
542
|
-
MultiTargetNode.new(
|
541
|
+
def MultiTargetNode(lefts, rest, rights, lparen_loc, rparen_loc, location = Location())
|
542
|
+
MultiTargetNode.new(lefts, rest, rights, lparen_loc, rparen_loc, location)
|
543
543
|
end
|
544
544
|
|
545
545
|
# Create a new MultiWriteNode node
|
546
|
-
def MultiWriteNode(
|
547
|
-
MultiWriteNode.new(
|
546
|
+
def MultiWriteNode(lefts, rest, rights, lparen_loc, rparen_loc, operator_loc, value, location = Location())
|
547
|
+
MultiWriteNode.new(lefts, rest, rights, lparen_loc, rparen_loc, operator_loc, value, location)
|
548
548
|
end
|
549
549
|
|
550
550
|
# Create a new NextNode node
|
@@ -632,11 +632,6 @@ module Prism
|
|
632
632
|
RegularExpressionNode.new(opening_loc, content_loc, closing_loc, unescaped, flags, location)
|
633
633
|
end
|
634
634
|
|
635
|
-
# Create a new RequiredDestructuredParameterNode node
|
636
|
-
def RequiredDestructuredParameterNode(parameters, opening_loc, closing_loc, location = Location())
|
637
|
-
RequiredDestructuredParameterNode.new(parameters, opening_loc, closing_loc, location)
|
638
|
-
end
|
639
|
-
|
640
635
|
# Create a new RequiredParameterNode node
|
641
636
|
def RequiredParameterNode(name, location = Location())
|
642
637
|
RequiredParameterNode.new(name, location)
|
data/lib/prism/ffi.rb
CHANGED
@@ -70,6 +70,7 @@ module Prism
|
|
70
70
|
"prism.h",
|
71
71
|
"pm_version",
|
72
72
|
"pm_parse_serialize",
|
73
|
+
"pm_parse_serialize_comments",
|
73
74
|
"pm_lex_serialize",
|
74
75
|
"pm_parse_lex_serialize"
|
75
76
|
)
|
@@ -224,6 +225,30 @@ module Prism
|
|
224
225
|
end
|
225
226
|
end
|
226
227
|
|
228
|
+
# Mirror the Prism.parse_comments API by using the serialization API.
|
229
|
+
def self.parse_comments(code, filepath = nil)
|
230
|
+
LibRubyParser::PrismBuffer.with do |buffer|
|
231
|
+
metadata = [filepath.bytesize, filepath.b, 0].pack("LA*L") if filepath
|
232
|
+
LibRubyParser.pm_parse_serialize_comments(code, code.bytesize, buffer.pointer, metadata)
|
233
|
+
|
234
|
+
source = Source.new(code)
|
235
|
+
loader = Serialize::Loader.new(source, buffer.read)
|
236
|
+
|
237
|
+
loader.load_header
|
238
|
+
loader.load_force_encoding
|
239
|
+
loader.load_comments
|
240
|
+
end
|
241
|
+
end
|
242
|
+
|
243
|
+
# Mirror the Prism.parse_file_comments API by using the serialization
|
244
|
+
# API. This uses native strings instead of Ruby strings because it allows us
|
245
|
+
# to use mmap when it is available.
|
246
|
+
def self.parse_file_comments(filepath)
|
247
|
+
LibRubyParser::PrismString.with(filepath) do |string|
|
248
|
+
parse_comments(string.read, filepath)
|
249
|
+
end
|
250
|
+
end
|
251
|
+
|
227
252
|
# Mirror the Prism.parse_lex API by using the serialization API.
|
228
253
|
def self.parse_lex(code, filepath = nil)
|
229
254
|
LibRubyParser::PrismBuffer.with do |buffer|
|
data/lib/prism/lex_compat.rb
CHANGED
@@ -327,7 +327,7 @@ module Prism
|
|
327
327
|
|
328
328
|
# Copy a HashPatternNode node
|
329
329
|
def visit_hash_pattern_node(node)
|
330
|
-
node.copy(constant: visit(node.constant),
|
330
|
+
node.copy(constant: visit(node.constant), elements: visit_all(node.elements), rest: visit(node.rest))
|
331
331
|
end
|
332
332
|
|
333
333
|
# Copy a IfNode node
|
@@ -507,12 +507,12 @@ module Prism
|
|
507
507
|
|
508
508
|
# Copy a MultiTargetNode node
|
509
509
|
def visit_multi_target_node(node)
|
510
|
-
node.copy(
|
510
|
+
node.copy(lefts: visit_all(node.lefts), rest: visit(node.rest), rights: visit_all(node.rights))
|
511
511
|
end
|
512
512
|
|
513
513
|
# Copy a MultiWriteNode node
|
514
514
|
def visit_multi_write_node(node)
|
515
|
-
node.copy(
|
515
|
+
node.copy(lefts: visit_all(node.lefts), rest: visit(node.rest), rights: visit_all(node.rights), value: visit(node.value))
|
516
516
|
end
|
517
517
|
|
518
518
|
# Copy a NextNode node
|
@@ -600,11 +600,6 @@ module Prism
|
|
600
600
|
node.copy
|
601
601
|
end
|
602
602
|
|
603
|
-
# Copy a RequiredDestructuredParameterNode node
|
604
|
-
def visit_required_destructured_parameter_node(node)
|
605
|
-
node.copy(parameters: visit_all(node.parameters))
|
606
|
-
end
|
607
|
-
|
608
603
|
# Copy a RequiredParameterNode node
|
609
604
|
def visit_required_parameter_node(node)
|
610
605
|
node.copy
|