prism 0.16.0 → 0.17.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +16 -1
- data/Makefile +6 -0
- data/README.md +1 -1
- data/config.yml +50 -35
- data/docs/fuzzing.md +1 -1
- data/docs/serialization.md +28 -29
- data/ext/prism/api_node.c +802 -770
- data/ext/prism/api_pack.c +20 -9
- data/ext/prism/extension.c +464 -162
- data/ext/prism/extension.h +1 -1
- data/include/prism/ast.h +3173 -763
- data/include/prism/defines.h +32 -9
- data/include/prism/diagnostic.h +36 -3
- data/include/prism/enc/pm_encoding.h +118 -28
- data/include/prism/node.h +38 -13
- data/include/prism/options.h +204 -0
- data/include/prism/pack.h +44 -33
- data/include/prism/parser.h +445 -200
- data/include/prism/prettyprint.h +12 -1
- data/include/prism/regexp.h +16 -2
- data/include/prism/util/pm_buffer.h +94 -16
- data/include/prism/util/pm_char.h +162 -48
- data/include/prism/util/pm_constant_pool.h +126 -32
- data/include/prism/util/pm_list.h +68 -38
- data/include/prism/util/pm_memchr.h +18 -3
- data/include/prism/util/pm_newline_list.h +70 -27
- data/include/prism/util/pm_state_stack.h +25 -7
- data/include/prism/util/pm_string.h +115 -27
- data/include/prism/util/pm_string_list.h +25 -6
- data/include/prism/util/pm_strncasecmp.h +32 -0
- data/include/prism/util/pm_strpbrk.h +31 -17
- data/include/prism/version.h +27 -2
- data/include/prism.h +224 -31
- data/lib/prism/compiler.rb +6 -3
- data/lib/prism/debug.rb +23 -7
- data/lib/prism/dispatcher.rb +33 -18
- data/lib/prism/dsl.rb +10 -5
- data/lib/prism/ffi.rb +132 -80
- data/lib/prism/lex_compat.rb +25 -15
- data/lib/prism/mutation_compiler.rb +10 -5
- data/lib/prism/node.rb +370 -135
- data/lib/prism/node_ext.rb +1 -1
- data/lib/prism/node_inspector.rb +1 -1
- data/lib/prism/pack.rb +79 -40
- data/lib/prism/parse_result/comments.rb +7 -2
- data/lib/prism/parse_result/newlines.rb +4 -0
- data/lib/prism/parse_result.rb +150 -30
- data/lib/prism/pattern.rb +11 -0
- data/lib/prism/ripper_compat.rb +28 -10
- data/lib/prism/serialize.rb +86 -54
- data/lib/prism/visitor.rb +10 -3
- data/lib/prism.rb +20 -2
- data/prism.gemspec +4 -2
- data/rbi/prism.rbi +104 -60
- data/rbi/prism_static.rbi +16 -2
- data/sig/prism.rbs +72 -43
- data/sig/prism_static.rbs +14 -1
- data/src/diagnostic.c +56 -53
- data/src/enc/pm_big5.c +1 -0
- data/src/enc/pm_euc_jp.c +1 -0
- data/src/enc/pm_gbk.c +1 -0
- data/src/enc/pm_shift_jis.c +1 -0
- data/src/enc/pm_tables.c +316 -80
- data/src/enc/pm_unicode.c +53 -8
- data/src/enc/pm_windows_31j.c +1 -0
- data/src/node.c +334 -321
- data/src/options.c +170 -0
- data/src/prettyprint.c +74 -47
- data/src/prism.c +1642 -856
- data/src/regexp.c +151 -95
- data/src/serialize.c +44 -20
- data/src/token_type.c +3 -1
- data/src/util/pm_buffer.c +45 -15
- data/src/util/pm_char.c +103 -57
- data/src/util/pm_constant_pool.c +51 -21
- data/src/util/pm_list.c +12 -4
- data/src/util/pm_memchr.c +5 -3
- data/src/util/pm_newline_list.c +20 -12
- data/src/util/pm_state_stack.c +9 -3
- data/src/util/pm_string.c +95 -85
- data/src/util/pm_string_list.c +14 -15
- data/src/util/pm_strncasecmp.c +10 -3
- data/src/util/pm_strpbrk.c +25 -19
- metadata +5 -3
- data/docs/prism.png +0 -0
data/lib/prism/ripper_compat.rb
CHANGED
@@ -35,11 +35,11 @@ module Prism
|
|
35
35
|
class SexpBuilderPP < SexpBuilder
|
36
36
|
private
|
37
37
|
|
38
|
-
def _dispatch_event_new
|
38
|
+
def _dispatch_event_new # :nodoc:
|
39
39
|
[]
|
40
40
|
end
|
41
41
|
|
42
|
-
def _dispatch_event_push(list, item)
|
42
|
+
def _dispatch_event_push(list, item) # :nodoc:
|
43
43
|
list << item
|
44
44
|
list
|
45
45
|
end
|
@@ -54,8 +54,16 @@ module Prism
|
|
54
54
|
end
|
55
55
|
end
|
56
56
|
|
57
|
-
|
57
|
+
# The source that is being parsed.
|
58
|
+
attr_reader :source
|
58
59
|
|
60
|
+
# The current line number of the parser.
|
61
|
+
attr_reader :lineno
|
62
|
+
|
63
|
+
# The current column number of the parser.
|
64
|
+
attr_reader :column
|
65
|
+
|
66
|
+
# Create a new RipperCompat object with the given source.
|
59
67
|
def initialize(source)
|
60
68
|
@source = source
|
61
69
|
@result = nil
|
@@ -67,10 +75,12 @@ module Prism
|
|
67
75
|
# Public interface
|
68
76
|
############################################################################
|
69
77
|
|
78
|
+
# True if the parser encountered an error during parsing.
|
70
79
|
def error?
|
71
80
|
result.errors.any?
|
72
81
|
end
|
73
82
|
|
83
|
+
# Parse the source and return the result.
|
74
84
|
def parse
|
75
85
|
result.value.accept(self) unless error?
|
76
86
|
end
|
@@ -79,10 +89,13 @@ module Prism
|
|
79
89
|
# Visitor methods
|
80
90
|
############################################################################
|
81
91
|
|
92
|
+
# This method is responsible for dispatching to the correct visitor method
|
93
|
+
# based on the type of the node.
|
82
94
|
def visit(node)
|
83
95
|
node&.accept(self)
|
84
96
|
end
|
85
97
|
|
98
|
+
# Visit a CallNode node.
|
86
99
|
def visit_call_node(node)
|
87
100
|
if !node.opening_loc && node.arguments.arguments.length == 1
|
88
101
|
bounds(node.receiver.location)
|
@@ -97,11 +110,13 @@ module Prism
|
|
97
110
|
end
|
98
111
|
end
|
99
112
|
|
113
|
+
# Visit an IntegerNode node.
|
100
114
|
def visit_integer_node(node)
|
101
115
|
bounds(node.location)
|
102
116
|
on_int(source[node.location.start_offset...node.location.end_offset])
|
103
117
|
end
|
104
118
|
|
119
|
+
# Visit a StatementsNode node.
|
105
120
|
def visit_statements_node(node)
|
106
121
|
bounds(node.location)
|
107
122
|
node.body.inject(on_stmts_new) do |stmts, stmt|
|
@@ -109,6 +124,7 @@ module Prism
|
|
109
124
|
end
|
110
125
|
end
|
111
126
|
|
127
|
+
# Visit a token found during parsing.
|
112
128
|
def visit_token(node)
|
113
129
|
bounds(node.location)
|
114
130
|
|
@@ -122,6 +138,7 @@ module Prism
|
|
122
138
|
end
|
123
139
|
end
|
124
140
|
|
141
|
+
# Visit a ProgramNode node.
|
125
142
|
def visit_program_node(node)
|
126
143
|
bounds(node.location)
|
127
144
|
on_program(visit(node.statements))
|
@@ -155,17 +172,18 @@ module Prism
|
|
155
172
|
@column = start_offset - (source.rindex("\n", start_offset) || 0)
|
156
173
|
end
|
157
174
|
|
175
|
+
# Lazily initialize the parse result.
|
158
176
|
def result
|
159
177
|
@result ||= Prism.parse(source)
|
160
178
|
end
|
161
179
|
|
162
|
-
def _dispatch0; end
|
163
|
-
def _dispatch1(_); end
|
164
|
-
def _dispatch2(_, _); end
|
165
|
-
def _dispatch3(_, _, _); end
|
166
|
-
def _dispatch4(_, _, _, _); end
|
167
|
-
def _dispatch5(_, _, _, _, _); end
|
168
|
-
def _dispatch7(_, _, _, _, _, _, _); end
|
180
|
+
def _dispatch0; end # :nodoc:
|
181
|
+
def _dispatch1(_); end # :nodoc:
|
182
|
+
def _dispatch2(_, _); end # :nodoc:
|
183
|
+
def _dispatch3(_, _, _); end # :nodoc:
|
184
|
+
def _dispatch4(_, _, _, _); end # :nodoc:
|
185
|
+
def _dispatch5(_, _, _, _, _); end # :nodoc:
|
186
|
+
def _dispatch7(_, _, _, _, _, _, _); end # :nodoc:
|
169
187
|
|
170
188
|
(Ripper::SCANNER_EVENT_TABLE.merge(Ripper::PARSER_EVENT_TABLE)).each do |event, arity|
|
171
189
|
alias_method :"on_#{event}", :"_dispatch#{arity}"
|
data/lib/prism/serialize.rb
CHANGED
@@ -11,7 +11,7 @@ require "stringio"
|
|
11
11
|
if String.instance_method(:unpack1).parameters.none? { |_, name| name == :offset }
|
12
12
|
String.prepend(
|
13
13
|
Module.new {
|
14
|
-
def unpack1(format, offset: 0)
|
14
|
+
def unpack1(format, offset: 0) # :nodoc:
|
15
15
|
offset == 0 ? super(format) : self[offset..].unpack1(format)
|
16
16
|
end
|
17
17
|
}
|
@@ -19,11 +19,21 @@ if String.instance_method(:unpack1).parameters.none? { |_, name| name == :offset
|
|
19
19
|
end
|
20
20
|
|
21
21
|
module Prism
|
22
|
+
# A module responsible for deserializing parse results.
|
22
23
|
module Serialize
|
24
|
+
# The major version of prism that we are expecting to find in the serialized
|
25
|
+
# strings.
|
23
26
|
MAJOR_VERSION = 0
|
24
|
-
|
27
|
+
|
28
|
+
# The minor version of prism that we are expecting to find in the serialized
|
29
|
+
# strings.
|
30
|
+
MINOR_VERSION = 17
|
31
|
+
|
32
|
+
# The patch version of prism that we are expecting to find in the serialized
|
33
|
+
# strings.
|
25
34
|
PATCH_VERSION = 0
|
26
35
|
|
36
|
+
# Deserialize the AST represented by the given string into a parse result.
|
27
37
|
def self.load(input, serialized)
|
28
38
|
input = input.dup
|
29
39
|
source = Source.new(input)
|
@@ -34,13 +44,16 @@ module Prism
|
|
34
44
|
result
|
35
45
|
end
|
36
46
|
|
47
|
+
# Deserialize the tokens represented by the given string into a parse
|
48
|
+
# result.
|
37
49
|
def self.load_tokens(source, serialized)
|
38
50
|
Loader.new(source, serialized).load_tokens_result
|
39
51
|
end
|
40
52
|
|
41
|
-
class Loader
|
53
|
+
class Loader # :nodoc:
|
42
54
|
attr_reader :encoding, :input, :serialized, :io
|
43
55
|
attr_reader :constant_pool_offset, :constant_pool, :source
|
56
|
+
attr_reader :start_line
|
44
57
|
|
45
58
|
def initialize(source, serialized)
|
46
59
|
@encoding = Encoding::UTF_8
|
@@ -54,7 +67,7 @@ module Prism
|
|
54
67
|
@constant_pool = nil
|
55
68
|
|
56
69
|
@source = source
|
57
|
-
define_load_node_lambdas unless RUBY_ENGINE ==
|
70
|
+
define_load_node_lambdas unless RUBY_ENGINE == "ruby"
|
58
71
|
end
|
59
72
|
|
60
73
|
def load_header
|
@@ -75,8 +88,18 @@ module Prism
|
|
75
88
|
@input = input.force_encoding(@encoding).freeze
|
76
89
|
end
|
77
90
|
|
91
|
+
def load_start_line
|
92
|
+
source.start_line = load_varint
|
93
|
+
end
|
94
|
+
|
78
95
|
def load_comments
|
79
|
-
load_varint.times.map
|
96
|
+
load_varint.times.map do
|
97
|
+
case load_varint
|
98
|
+
when 0 then InlineComment.new(load_location)
|
99
|
+
when 1 then EmbDocComment.new(load_location)
|
100
|
+
when 2 then DATAComment.new(load_location)
|
101
|
+
end
|
102
|
+
end
|
80
103
|
end
|
81
104
|
|
82
105
|
def load_metadata
|
@@ -103,6 +126,7 @@ module Prism
|
|
103
126
|
def load_tokens_result
|
104
127
|
tokens = load_tokens
|
105
128
|
encoding = load_encoding
|
129
|
+
load_start_line
|
106
130
|
comments, magic_comments, errors, warnings = load_metadata
|
107
131
|
|
108
132
|
if encoding != @encoding
|
@@ -116,6 +140,7 @@ module Prism
|
|
116
140
|
def load_nodes
|
117
141
|
load_header
|
118
142
|
load_force_encoding
|
143
|
+
load_start_line
|
119
144
|
|
120
145
|
comments, magic_comments, errors, warnings = load_metadata
|
121
146
|
|
@@ -389,47 +414,47 @@ module Prism
|
|
389
414
|
when 84 then
|
390
415
|
KeywordHashNode.new(Array.new(load_varint) { load_node }, location)
|
391
416
|
when 85 then
|
392
|
-
KeywordParameterNode.new(load_required_constant, load_location, load_optional_node, location)
|
393
|
-
when 86 then
|
394
417
|
KeywordRestParameterNode.new(load_optional_constant, load_optional_location, load_location, location)
|
395
|
-
when
|
418
|
+
when 86 then
|
396
419
|
LambdaNode.new(Array.new(load_varint) { load_required_constant }, load_location, load_location, load_location, load_optional_node, load_optional_node, location)
|
397
|
-
when
|
420
|
+
when 87 then
|
398
421
|
LocalVariableAndWriteNode.new(load_location, load_location, load_node, load_required_constant, load_varint, location)
|
399
|
-
when
|
422
|
+
when 88 then
|
400
423
|
LocalVariableOperatorWriteNode.new(load_location, load_location, load_node, load_required_constant, load_required_constant, load_varint, location)
|
401
|
-
when
|
424
|
+
when 89 then
|
402
425
|
LocalVariableOrWriteNode.new(load_location, load_location, load_node, load_required_constant, load_varint, location)
|
403
|
-
when
|
426
|
+
when 90 then
|
404
427
|
LocalVariableReadNode.new(load_required_constant, load_varint, location)
|
405
|
-
when
|
428
|
+
when 91 then
|
406
429
|
LocalVariableTargetNode.new(load_required_constant, load_varint, location)
|
407
|
-
when
|
430
|
+
when 92 then
|
408
431
|
LocalVariableWriteNode.new(load_required_constant, load_varint, load_location, load_node, load_location, location)
|
409
|
-
when
|
432
|
+
when 93 then
|
410
433
|
MatchLastLineNode.new(load_location, load_location, load_location, load_string, load_varint, location)
|
411
|
-
when
|
434
|
+
when 94 then
|
412
435
|
MatchPredicateNode.new(load_node, load_node, load_location, location)
|
413
|
-
when
|
436
|
+
when 95 then
|
414
437
|
MatchRequiredNode.new(load_node, load_node, load_location, location)
|
415
|
-
when
|
438
|
+
when 96 then
|
416
439
|
MatchWriteNode.new(load_node, Array.new(load_varint) { load_required_constant }, location)
|
417
|
-
when
|
440
|
+
when 97 then
|
418
441
|
MissingNode.new(location)
|
419
|
-
when
|
442
|
+
when 98 then
|
420
443
|
ModuleNode.new(Array.new(load_varint) { load_required_constant }, load_location, load_node, load_optional_node, load_location, load_required_constant, location)
|
421
|
-
when
|
444
|
+
when 99 then
|
422
445
|
MultiTargetNode.new(Array.new(load_varint) { load_node }, load_optional_node, Array.new(load_varint) { load_node }, load_optional_location, load_optional_location, location)
|
423
|
-
when
|
446
|
+
when 100 then
|
424
447
|
MultiWriteNode.new(Array.new(load_varint) { load_node }, load_optional_node, Array.new(load_varint) { load_node }, load_optional_location, load_optional_location, load_location, load_node, location)
|
425
|
-
when
|
448
|
+
when 101 then
|
426
449
|
NextNode.new(load_optional_node, load_location, location)
|
427
|
-
when
|
450
|
+
when 102 then
|
428
451
|
NilNode.new(location)
|
429
|
-
when
|
452
|
+
when 103 then
|
430
453
|
NoKeywordsParameterNode.new(load_location, load_location, location)
|
431
|
-
when
|
454
|
+
when 104 then
|
432
455
|
NumberedReferenceReadNode.new(load_varint, location)
|
456
|
+
when 105 then
|
457
|
+
OptionalKeywordParameterNode.new(load_required_constant, load_location, load_node, location)
|
433
458
|
when 106 then
|
434
459
|
OptionalParameterNode.new(load_required_constant, load_location, load_location, load_node, location)
|
435
460
|
when 107 then
|
@@ -457,54 +482,56 @@ module Prism
|
|
457
482
|
when 118 then
|
458
483
|
RegularExpressionNode.new(load_location, load_location, load_location, load_string, load_varint, location)
|
459
484
|
when 119 then
|
460
|
-
|
485
|
+
RequiredKeywordParameterNode.new(load_required_constant, load_location, location)
|
461
486
|
when 120 then
|
462
|
-
|
487
|
+
RequiredParameterNode.new(load_required_constant, location)
|
463
488
|
when 121 then
|
464
|
-
|
489
|
+
RescueModifierNode.new(load_node, load_location, load_node, location)
|
465
490
|
when 122 then
|
466
|
-
|
491
|
+
RescueNode.new(load_location, Array.new(load_varint) { load_node }, load_optional_location, load_optional_node, load_optional_node, load_optional_node, location)
|
467
492
|
when 123 then
|
468
|
-
|
493
|
+
RestParameterNode.new(load_optional_constant, load_optional_location, load_location, location)
|
469
494
|
when 124 then
|
470
|
-
|
495
|
+
RetryNode.new(location)
|
471
496
|
when 125 then
|
472
|
-
|
497
|
+
ReturnNode.new(load_location, load_optional_node, location)
|
473
498
|
when 126 then
|
474
|
-
|
499
|
+
SelfNode.new(location)
|
475
500
|
when 127 then
|
476
|
-
|
501
|
+
SingletonClassNode.new(Array.new(load_varint) { load_required_constant }, load_location, load_location, load_node, load_optional_node, load_location, location)
|
477
502
|
when 128 then
|
478
|
-
|
503
|
+
SourceEncodingNode.new(location)
|
479
504
|
when 129 then
|
480
|
-
|
505
|
+
SourceFileNode.new(load_string, location)
|
481
506
|
when 130 then
|
482
|
-
|
507
|
+
SourceLineNode.new(location)
|
483
508
|
when 131 then
|
484
|
-
|
509
|
+
SplatNode.new(load_location, load_optional_node, location)
|
485
510
|
when 132 then
|
486
|
-
|
511
|
+
StatementsNode.new(Array.new(load_varint) { load_node }, location)
|
487
512
|
when 133 then
|
488
|
-
|
513
|
+
StringConcatNode.new(load_node, load_node, location)
|
489
514
|
when 134 then
|
490
|
-
|
515
|
+
StringNode.new(load_varint, load_optional_location, load_location, load_optional_location, load_string, location)
|
491
516
|
when 135 then
|
492
|
-
|
517
|
+
SuperNode.new(load_location, load_optional_location, load_optional_node, load_optional_location, load_optional_node, location)
|
493
518
|
when 136 then
|
494
|
-
|
519
|
+
SymbolNode.new(load_optional_location, load_optional_location, load_optional_location, load_string, location)
|
495
520
|
when 137 then
|
496
|
-
|
521
|
+
TrueNode.new(location)
|
497
522
|
when 138 then
|
498
|
-
|
523
|
+
UndefNode.new(Array.new(load_varint) { load_node }, load_location, location)
|
499
524
|
when 139 then
|
500
|
-
|
525
|
+
UnlessNode.new(load_location, load_node, load_optional_node, load_optional_node, load_optional_location, location)
|
501
526
|
when 140 then
|
502
|
-
|
527
|
+
UntilNode.new(load_location, load_optional_location, load_node, load_optional_node, load_varint, location)
|
503
528
|
when 141 then
|
504
|
-
|
529
|
+
WhenNode.new(load_location, Array.new(load_varint) { load_node }, load_optional_node, location)
|
505
530
|
when 142 then
|
506
|
-
|
531
|
+
WhileNode.new(load_location, load_optional_location, load_node, load_optional_node, load_varint, location)
|
507
532
|
when 143 then
|
533
|
+
XStringNode.new(load_location, load_location, load_location, load_string, location)
|
534
|
+
when 144 then
|
508
535
|
YieldNode.new(load_location, load_optional_location, load_optional_node, load_optional_location, location)
|
509
536
|
end
|
510
537
|
end
|
@@ -854,10 +881,6 @@ module Prism
|
|
854
881
|
location = load_location
|
855
882
|
KeywordHashNode.new(Array.new(load_varint) { load_node }, location)
|
856
883
|
},
|
857
|
-
-> {
|
858
|
-
location = load_location
|
859
|
-
KeywordParameterNode.new(load_required_constant, load_location, load_optional_node, location)
|
860
|
-
},
|
861
884
|
-> {
|
862
885
|
location = load_location
|
863
886
|
KeywordRestParameterNode.new(load_optional_constant, load_optional_location, load_location, location)
|
@@ -938,6 +961,10 @@ module Prism
|
|
938
961
|
location = load_location
|
939
962
|
NumberedReferenceReadNode.new(load_varint, location)
|
940
963
|
},
|
964
|
+
-> {
|
965
|
+
location = load_location
|
966
|
+
OptionalKeywordParameterNode.new(load_required_constant, load_location, load_node, location)
|
967
|
+
},
|
941
968
|
-> {
|
942
969
|
location = load_location
|
943
970
|
OptionalParameterNode.new(load_required_constant, load_location, load_location, load_node, location)
|
@@ -990,6 +1017,10 @@ module Prism
|
|
990
1017
|
location = load_location
|
991
1018
|
RegularExpressionNode.new(load_location, load_location, load_location, load_string, load_varint, location)
|
992
1019
|
},
|
1020
|
+
-> {
|
1021
|
+
location = load_location
|
1022
|
+
RequiredKeywordParameterNode.new(load_required_constant, load_location, location)
|
1023
|
+
},
|
993
1024
|
-> {
|
994
1025
|
location = load_location
|
995
1026
|
RequiredParameterNode.new(load_required_constant, location)
|
@@ -1095,6 +1126,7 @@ module Prism
|
|
1095
1126
|
end
|
1096
1127
|
end
|
1097
1128
|
|
1129
|
+
# The token types that can be indexed by their enum values.
|
1098
1130
|
TOKEN_TYPES = [
|
1099
1131
|
nil,
|
1100
1132
|
:EOF,
|
data/lib/prism/visitor.rb
CHANGED
@@ -11,14 +11,18 @@ module Prism
|
|
11
11
|
# implement each one that they need. For a default implementation that
|
12
12
|
# continues walking the tree, see the Visitor class.
|
13
13
|
class BasicVisitor
|
14
|
+
# Calls `accept` on the given node if it is not `nil`, which in turn should
|
15
|
+
# call back into this visitor by calling the appropriate `visit_*` method.
|
14
16
|
def visit(node)
|
15
17
|
node&.accept(self)
|
16
18
|
end
|
17
19
|
|
20
|
+
# Visits each node in `nodes` by calling `accept` on each one.
|
18
21
|
def visit_all(nodes)
|
19
22
|
nodes.each { |node| node&.accept(self) }
|
20
23
|
end
|
21
24
|
|
25
|
+
# Visits the child nodes of `node` by calling `accept` on each one.
|
22
26
|
def visit_child_nodes(node)
|
23
27
|
node.compact_child_nodes.each { |node| node.accept(self) }
|
24
28
|
end
|
@@ -296,9 +300,6 @@ module Prism
|
|
296
300
|
# Visit a KeywordHashNode node
|
297
301
|
alias visit_keyword_hash_node visit_child_nodes
|
298
302
|
|
299
|
-
# Visit a KeywordParameterNode node
|
300
|
-
alias visit_keyword_parameter_node visit_child_nodes
|
301
|
-
|
302
303
|
# Visit a KeywordRestParameterNode node
|
303
304
|
alias visit_keyword_rest_parameter_node visit_child_nodes
|
304
305
|
|
@@ -359,6 +360,9 @@ module Prism
|
|
359
360
|
# Visit a NumberedReferenceReadNode node
|
360
361
|
alias visit_numbered_reference_read_node visit_child_nodes
|
361
362
|
|
363
|
+
# Visit a OptionalKeywordParameterNode node
|
364
|
+
alias visit_optional_keyword_parameter_node visit_child_nodes
|
365
|
+
|
362
366
|
# Visit a OptionalParameterNode node
|
363
367
|
alias visit_optional_parameter_node visit_child_nodes
|
364
368
|
|
@@ -398,6 +402,9 @@ module Prism
|
|
398
402
|
# Visit a RegularExpressionNode node
|
399
403
|
alias visit_regular_expression_node visit_child_nodes
|
400
404
|
|
405
|
+
# Visit a RequiredKeywordParameterNode node
|
406
|
+
alias visit_required_keyword_parameter_node visit_child_nodes
|
407
|
+
|
401
408
|
# Visit a RequiredParameterNode node
|
402
409
|
alias visit_required_parameter_node visit_child_nodes
|
403
410
|
|
data/lib/prism.rb
CHANGED
@@ -1,10 +1,16 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
# The Prism Ruby parser.
|
4
|
+
#
|
5
|
+
# "Parsing Ruby is suddenly manageable!"
|
6
|
+
# - You, hopefully
|
7
|
+
#
|
3
8
|
module Prism
|
4
9
|
# There are many files in prism that are templated to handle every node type,
|
5
10
|
# which means the files can end up being quite large. We autoload them to make
|
6
11
|
# our require speed faster since consuming libraries are unlikely to use all
|
7
12
|
# of these features.
|
13
|
+
|
8
14
|
autoload :BasicVisitor, "prism/visitor"
|
9
15
|
autoload :Compiler, "prism/compiler"
|
10
16
|
autoload :Debug, "prism/debug"
|
@@ -23,17 +29,26 @@ module Prism
|
|
23
29
|
|
24
30
|
# Some of these constants are not meant to be exposed, so marking them as
|
25
31
|
# private here.
|
32
|
+
|
26
33
|
private_constant :Debug
|
27
34
|
private_constant :LexCompat
|
28
35
|
private_constant :LexRipper
|
29
36
|
|
37
|
+
# :call-seq:
|
38
|
+
# Prism::lex_compat(source, **options) -> Array
|
39
|
+
#
|
30
40
|
# Returns an array of tokens that closely resembles that of the Ripper lexer.
|
31
41
|
# The only difference is that since we don't keep track of lexer state in the
|
32
42
|
# same way, it's going to always return the NONE state.
|
33
|
-
|
34
|
-
|
43
|
+
#
|
44
|
+
# For supported options, see Prism::parse.
|
45
|
+
def self.lex_compat(source, **options)
|
46
|
+
LexCompat.new(source, **options).result
|
35
47
|
end
|
36
48
|
|
49
|
+
# :call-seq:
|
50
|
+
# Prism::lex_ripper(source) -> Array
|
51
|
+
#
|
37
52
|
# This lexes with the Ripper lex. It drops any space events but otherwise
|
38
53
|
# returns the same tokens. Raises SyntaxError if the syntax in source is
|
39
54
|
# invalid.
|
@@ -41,6 +56,9 @@ module Prism
|
|
41
56
|
LexRipper.new(source).result
|
42
57
|
end
|
43
58
|
|
59
|
+
# :call-seq:
|
60
|
+
# Prism::load(source, serialized) -> ParseResult
|
61
|
+
#
|
44
62
|
# Load the serialized AST using the source as a reference into a tree.
|
45
63
|
def self.load(source, serialized)
|
46
64
|
Serialize.load(source, serialized)
|
data/prism.gemspec
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |spec|
|
4
4
|
spec.name = "prism"
|
5
|
-
spec.version = "0.
|
5
|
+
spec.version = "0.17.0"
|
6
6
|
spec.authors = ["Shopify"]
|
7
7
|
spec.email = ["ruby@shopify.com"]
|
8
8
|
|
@@ -30,7 +30,6 @@ Gem::Specification.new do |spec|
|
|
30
30
|
"docs/heredocs.md",
|
31
31
|
"docs/javascript.md",
|
32
32
|
"docs/mapping.md",
|
33
|
-
"docs/prism.png",
|
34
33
|
"docs/releasing.md",
|
35
34
|
"docs/ripper.md",
|
36
35
|
"docs/ruby_api.md",
|
@@ -46,6 +45,7 @@ Gem::Specification.new do |spec|
|
|
46
45
|
"include/prism/diagnostic.h",
|
47
46
|
"include/prism/enc/pm_encoding.h",
|
48
47
|
"include/prism/node.h",
|
48
|
+
"include/prism/options.h",
|
49
49
|
"include/prism/pack.h",
|
50
50
|
"include/prism/parser.h",
|
51
51
|
"include/prism/prettyprint.h",
|
@@ -57,6 +57,7 @@ Gem::Specification.new do |spec|
|
|
57
57
|
"include/prism/util/pm_memchr.h",
|
58
58
|
"include/prism/util/pm_newline_list.h",
|
59
59
|
"include/prism/util/pm_state_stack.h",
|
60
|
+
"include/prism/util/pm_strncasecmp.h",
|
60
61
|
"include/prism/util/pm_string.h",
|
61
62
|
"include/prism/util/pm_string_list.h",
|
62
63
|
"include/prism/util/pm_strpbrk.h",
|
@@ -106,6 +107,7 @@ Gem::Specification.new do |spec|
|
|
106
107
|
"src/util/pm_string_list.c",
|
107
108
|
"src/util/pm_strncasecmp.c",
|
108
109
|
"src/util/pm_strpbrk.c",
|
110
|
+
"src/options.c",
|
109
111
|
"src/prism.c",
|
110
112
|
"prism.gemspec",
|
111
113
|
"sig/prism.rbs",
|