prism 0.28.0 → 0.30.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 +41 -1
- data/CONTRIBUTING.md +0 -4
- data/README.md +1 -0
- data/config.yml +95 -26
- data/docs/fuzzing.md +1 -1
- data/docs/ripper_translation.md +22 -0
- data/ext/prism/api_node.c +70 -52
- data/ext/prism/extconf.rb +27 -23
- data/ext/prism/extension.c +107 -372
- data/ext/prism/extension.h +1 -1
- data/include/prism/ast.h +170 -102
- data/include/prism/diagnostic.h +18 -3
- data/include/prism/node.h +0 -21
- data/include/prism/parser.h +23 -25
- data/include/prism/regexp.h +17 -8
- data/include/prism/static_literals.h +3 -2
- data/include/prism/util/pm_char.h +1 -2
- data/include/prism/util/pm_constant_pool.h +0 -8
- data/include/prism/util/pm_integer.h +16 -9
- data/include/prism/util/pm_string.h +0 -8
- data/include/prism/version.h +2 -2
- data/include/prism.h +0 -11
- data/lib/prism/compiler.rb +3 -0
- data/lib/prism/desugar_compiler.rb +4 -4
- data/lib/prism/dispatcher.rb +14 -0
- data/lib/prism/dot_visitor.rb +54 -35
- data/lib/prism/dsl.rb +23 -18
- data/lib/prism/ffi.rb +25 -4
- data/lib/prism/inspect_visitor.rb +26 -24
- data/lib/prism/mutation_compiler.rb +6 -1
- data/lib/prism/node.rb +314 -389
- data/lib/prism/node_ext.rb +175 -17
- data/lib/prism/parse_result/comments.rb +1 -8
- data/lib/prism/parse_result/newlines.rb +102 -12
- data/lib/prism/parse_result.rb +17 -0
- data/lib/prism/reflection.rb +11 -9
- data/lib/prism/serialize.rb +91 -68
- data/lib/prism/translation/parser/compiler.rb +288 -138
- data/lib/prism/translation/parser.rb +7 -2
- data/lib/prism/translation/ripper.rb +24 -22
- data/lib/prism/translation/ruby_parser.rb +32 -14
- data/lib/prism/visitor.rb +3 -0
- data/lib/prism.rb +0 -4
- data/prism.gemspec +2 -4
- data/rbi/prism/node.rbi +114 -57
- data/rbi/prism/node_ext.rbi +5 -0
- data/rbi/prism/parse_result.rbi +1 -1
- data/rbi/prism/visitor.rbi +3 -0
- data/rbi/prism.rbi +6 -0
- data/sig/prism/dsl.rbs +13 -10
- data/sig/prism/lex_compat.rbs +10 -0
- data/sig/prism/mutation_compiler.rbs +1 -0
- data/sig/prism/node.rbs +72 -48
- data/sig/prism/node_ext.rbs +4 -0
- data/sig/prism/visitor.rbs +1 -0
- data/sig/prism.rbs +21 -0
- data/src/diagnostic.c +56 -27
- data/src/node.c +432 -1690
- data/src/prettyprint.c +97 -54
- data/src/prism.c +1286 -1196
- data/src/regexp.c +133 -68
- data/src/serialize.c +22 -17
- data/src/static_literals.c +63 -84
- data/src/token_type.c +4 -4
- data/src/util/pm_constant_pool.c +0 -8
- data/src/util/pm_integer.c +39 -11
- data/src/util/pm_string.c +0 -12
- data/src/util/pm_strpbrk.c +32 -6
- metadata +3 -5
- data/include/prism/util/pm_string_list.h +0 -44
- data/lib/prism/debug.rb +0 -249
- data/src/util/pm_string_list.c +0 -28
@@ -1,6 +1,11 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
3
|
+
begin
|
4
|
+
require "parser"
|
5
|
+
rescue LoadError
|
6
|
+
warn(%q{Error: Unable to load parser. Add `gem "parser"` to your Gemfile.})
|
7
|
+
exit(1)
|
8
|
+
end
|
4
9
|
|
5
10
|
module Prism
|
6
11
|
module Translation
|
@@ -284,7 +289,7 @@ module Prism
|
|
284
289
|
def convert_for_prism(version)
|
285
290
|
case version
|
286
291
|
when 33
|
287
|
-
"3.3.
|
292
|
+
"3.3.1"
|
288
293
|
when 34
|
289
294
|
"3.4.0"
|
290
295
|
else
|
@@ -1181,8 +1181,8 @@ module Prism
|
|
1181
1181
|
bounds(node.location)
|
1182
1182
|
target = on_field(receiver, call_operator, message)
|
1183
1183
|
|
1184
|
-
bounds(node.
|
1185
|
-
operator = on_op("#{node.
|
1184
|
+
bounds(node.binary_operator_loc)
|
1185
|
+
operator = on_op("#{node.binary_operator}=")
|
1186
1186
|
value = visit_write_value(node.value)
|
1187
1187
|
|
1188
1188
|
bounds(node.location)
|
@@ -1339,8 +1339,8 @@ module Prism
|
|
1339
1339
|
bounds(node.name_loc)
|
1340
1340
|
target = on_var_field(on_cvar(node.name.to_s))
|
1341
1341
|
|
1342
|
-
bounds(node.
|
1343
|
-
operator = on_op("#{node.
|
1342
|
+
bounds(node.binary_operator_loc)
|
1343
|
+
operator = on_op("#{node.binary_operator}=")
|
1344
1344
|
value = visit_write_value(node.value)
|
1345
1345
|
|
1346
1346
|
bounds(node.location)
|
@@ -1409,8 +1409,8 @@ module Prism
|
|
1409
1409
|
bounds(node.name_loc)
|
1410
1410
|
target = on_var_field(on_const(node.name.to_s))
|
1411
1411
|
|
1412
|
-
bounds(node.
|
1413
|
-
operator = on_op("#{node.
|
1412
|
+
bounds(node.binary_operator_loc)
|
1413
|
+
operator = on_op("#{node.binary_operator}=")
|
1414
1414
|
value = visit_write_value(node.value)
|
1415
1415
|
|
1416
1416
|
bounds(node.location)
|
@@ -1510,8 +1510,8 @@ module Prism
|
|
1510
1510
|
target = visit_constant_path_write_node_target(node.target)
|
1511
1511
|
value = visit(node.value)
|
1512
1512
|
|
1513
|
-
bounds(node.
|
1514
|
-
operator = on_op("#{node.
|
1513
|
+
bounds(node.binary_operator_loc)
|
1514
|
+
operator = on_op("#{node.binary_operator}=")
|
1515
1515
|
value = visit_write_value(node.value)
|
1516
1516
|
|
1517
1517
|
bounds(node.location)
|
@@ -1802,8 +1802,8 @@ module Prism
|
|
1802
1802
|
bounds(node.name_loc)
|
1803
1803
|
target = on_var_field(on_gvar(node.name.to_s))
|
1804
1804
|
|
1805
|
-
bounds(node.
|
1806
|
-
operator = on_op("#{node.
|
1805
|
+
bounds(node.binary_operator_loc)
|
1806
|
+
operator = on_op("#{node.binary_operator}=")
|
1807
1807
|
value = visit_write_value(node.value)
|
1808
1808
|
|
1809
1809
|
bounds(node.location)
|
@@ -1983,8 +1983,8 @@ module Prism
|
|
1983
1983
|
bounds(node.location)
|
1984
1984
|
target = on_aref_field(receiver, arguments)
|
1985
1985
|
|
1986
|
-
bounds(node.
|
1987
|
-
operator = on_op("#{node.
|
1986
|
+
bounds(node.binary_operator_loc)
|
1987
|
+
operator = on_op("#{node.binary_operator}=")
|
1988
1988
|
value = visit_write_value(node.value)
|
1989
1989
|
|
1990
1990
|
bounds(node.location)
|
@@ -2059,8 +2059,8 @@ module Prism
|
|
2059
2059
|
bounds(node.name_loc)
|
2060
2060
|
target = on_var_field(on_ivar(node.name.to_s))
|
2061
2061
|
|
2062
|
-
bounds(node.
|
2063
|
-
operator = on_op("#{node.
|
2062
|
+
bounds(node.binary_operator_loc)
|
2063
|
+
operator = on_op("#{node.binary_operator}=")
|
2064
2064
|
value = visit_write_value(node.value)
|
2065
2065
|
|
2066
2066
|
bounds(node.location)
|
@@ -2217,6 +2217,13 @@ module Prism
|
|
2217
2217
|
end
|
2218
2218
|
end
|
2219
2219
|
|
2220
|
+
# -> { it }
|
2221
|
+
# ^^
|
2222
|
+
def visit_it_local_variable_read_node(node)
|
2223
|
+
bounds(node.location)
|
2224
|
+
on_vcall(on_ident(node.slice))
|
2225
|
+
end
|
2226
|
+
|
2220
2227
|
# -> { it }
|
2221
2228
|
# ^^^^^^^^^
|
2222
2229
|
def visit_it_parameters_node(node)
|
@@ -2312,12 +2319,7 @@ module Prism
|
|
2312
2319
|
# ^^^
|
2313
2320
|
def visit_local_variable_read_node(node)
|
2314
2321
|
bounds(node.location)
|
2315
|
-
|
2316
|
-
if node.name == :"0it"
|
2317
|
-
on_vcall(on_ident(node.slice))
|
2318
|
-
else
|
2319
|
-
on_var_ref(on_ident(node.slice))
|
2320
|
-
end
|
2322
|
+
on_var_ref(on_ident(node.slice))
|
2321
2323
|
end
|
2322
2324
|
|
2323
2325
|
# foo = 1
|
@@ -2337,8 +2339,8 @@ module Prism
|
|
2337
2339
|
bounds(node.name_loc)
|
2338
2340
|
target = on_var_field(on_ident(node.name_loc.slice))
|
2339
2341
|
|
2340
|
-
bounds(node.
|
2341
|
-
operator = on_op("#{node.
|
2342
|
+
bounds(node.binary_operator_loc)
|
2343
|
+
operator = on_op("#{node.binary_operator}=")
|
2342
2344
|
value = visit_write_value(node.value)
|
2343
2345
|
|
2344
2346
|
bounds(node.location)
|
@@ -1,6 +1,11 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
3
|
+
begin
|
4
|
+
require "ruby_parser"
|
5
|
+
rescue LoadError
|
6
|
+
warn(%q{Error: Unable to load ruby_parser. Add `gem "ruby_parser"` to your Gemfile.})
|
7
|
+
exit(1)
|
8
|
+
end
|
4
9
|
|
5
10
|
module Prism
|
6
11
|
module Translation
|
@@ -271,9 +276,9 @@ module Prism
|
|
271
276
|
# ^^^^^^^^^^^^^^^
|
272
277
|
def visit_call_operator_write_node(node)
|
273
278
|
if op_asgn?(node)
|
274
|
-
s(node, op_asgn_type(node, :op_asgn), visit(node.receiver), visit_write_value(node.value), node.read_name, node.
|
279
|
+
s(node, op_asgn_type(node, :op_asgn), visit(node.receiver), visit_write_value(node.value), node.read_name, node.binary_operator)
|
275
280
|
else
|
276
|
-
s(node, op_asgn_type(node, :op_asgn2), visit(node.receiver), node.write_name, node.
|
281
|
+
s(node, op_asgn_type(node, :op_asgn2), visit(node.receiver), node.write_name, node.binary_operator, visit_write_value(node.value))
|
277
282
|
end
|
278
283
|
end
|
279
284
|
|
@@ -372,7 +377,7 @@ module Prism
|
|
372
377
|
# @@foo += bar
|
373
378
|
# ^^^^^^^^^^^^
|
374
379
|
def visit_class_variable_operator_write_node(node)
|
375
|
-
s(node, class_variable_write_type, node.name, s(node, :call, s(node, :cvar, node.name), node.
|
380
|
+
s(node, class_variable_write_type, node.name, s(node, :call, s(node, :cvar, node.name), node.binary_operator, visit_write_value(node.value)))
|
376
381
|
end
|
377
382
|
|
378
383
|
# @@foo &&= bar
|
@@ -417,7 +422,7 @@ module Prism
|
|
417
422
|
# Foo += bar
|
418
423
|
# ^^^^^^^^^^^
|
419
424
|
def visit_constant_operator_write_node(node)
|
420
|
-
s(node, :cdecl, node.name, s(node, :call, s(node, :const, node.name), node.
|
425
|
+
s(node, :cdecl, node.name, s(node, :call, s(node, :const, node.name), node.binary_operator, visit_write_value(node.value)))
|
421
426
|
end
|
422
427
|
|
423
428
|
# Foo &&= bar
|
@@ -460,7 +465,7 @@ module Prism
|
|
460
465
|
# Foo::Bar += baz
|
461
466
|
# ^^^^^^^^^^^^^^^
|
462
467
|
def visit_constant_path_operator_write_node(node)
|
463
|
-
s(node, :op_asgn, visit(node.target), node.
|
468
|
+
s(node, :op_asgn, visit(node.target), node.binary_operator, visit_write_value(node.value))
|
464
469
|
end
|
465
470
|
|
466
471
|
# Foo::Bar &&= baz
|
@@ -480,9 +485,9 @@ module Prism
|
|
480
485
|
def visit_constant_path_target_node(node)
|
481
486
|
inner =
|
482
487
|
if node.parent.nil?
|
483
|
-
s(node, :colon3, node.
|
488
|
+
s(node, :colon3, node.name)
|
484
489
|
else
|
485
|
-
s(node, :colon2, visit(node.parent), node.
|
490
|
+
s(node, :colon2, visit(node.parent), node.name)
|
486
491
|
end
|
487
492
|
|
488
493
|
s(node, :const, inner)
|
@@ -627,7 +632,7 @@ module Prism
|
|
627
632
|
# $foo += bar
|
628
633
|
# ^^^^^^^^^^^
|
629
634
|
def visit_global_variable_operator_write_node(node)
|
630
|
-
s(node, :gasgn, node.name, s(node, :call, s(node, :gvar, node.name), node.
|
635
|
+
s(node, :gasgn, node.name, s(node, :call, s(node, :gvar, node.name), node.binary_operator, visit(node.value)))
|
631
636
|
end
|
632
637
|
|
633
638
|
# $foo &&= bar
|
@@ -719,7 +724,7 @@ module Prism
|
|
719
724
|
arglist << visit(node.block) if !node.block.nil?
|
720
725
|
end
|
721
726
|
|
722
|
-
s(node, :op_asgn1, visit(node.receiver), arglist, node.
|
727
|
+
s(node, :op_asgn1, visit(node.receiver), arglist, node.binary_operator, visit_write_value(node.value))
|
723
728
|
end
|
724
729
|
|
725
730
|
# foo[bar] &&= baz
|
@@ -775,7 +780,7 @@ module Prism
|
|
775
780
|
# @foo += bar
|
776
781
|
# ^^^^^^^^^^^
|
777
782
|
def visit_instance_variable_operator_write_node(node)
|
778
|
-
s(node, :iasgn, node.name, s(node, :call, s(node, :ivar, node.name), node.
|
783
|
+
s(node, :iasgn, node.name, s(node, :call, s(node, :ivar, node.name), node.binary_operator, visit_write_value(node.value)))
|
779
784
|
end
|
780
785
|
|
781
786
|
# @foo &&= bar
|
@@ -870,6 +875,8 @@ module Prism
|
|
870
875
|
else
|
871
876
|
visited << result
|
872
877
|
end
|
878
|
+
elsif result[0] == :dstr
|
879
|
+
visited.concat(result[1..-1])
|
873
880
|
else
|
874
881
|
visited << result
|
875
882
|
end
|
@@ -900,12 +907,23 @@ module Prism
|
|
900
907
|
results << result
|
901
908
|
state = :interpolated_content
|
902
909
|
end
|
903
|
-
|
904
|
-
results
|
910
|
+
when :interpolated_content
|
911
|
+
if result.is_a?(Array) && result[0] == :str && results[-1][0] == :str && (results[-1].line_max == result.line)
|
912
|
+
results[-1][1] << result[1]
|
913
|
+
results[-1].line_max = result.line_max
|
914
|
+
else
|
915
|
+
results << result
|
916
|
+
end
|
905
917
|
end
|
906
918
|
end
|
907
919
|
end
|
908
920
|
|
921
|
+
# -> { it }
|
922
|
+
# ^^
|
923
|
+
def visit_it_local_variable_read_node(node)
|
924
|
+
s(node, :call, nil, :it)
|
925
|
+
end
|
926
|
+
|
909
927
|
# foo(bar: baz)
|
910
928
|
# ^^^^^^^^
|
911
929
|
def visit_keyword_hash_node(node)
|
@@ -960,7 +978,7 @@ module Prism
|
|
960
978
|
# foo += bar
|
961
979
|
# ^^^^^^^^^^
|
962
980
|
def visit_local_variable_operator_write_node(node)
|
963
|
-
s(node, :lasgn, node.name, s(node, :call, s(node, :lvar, node.name), node.
|
981
|
+
s(node, :lasgn, node.name, s(node, :call, s(node, :lvar, node.name), node.binary_operator, visit_write_value(node.value)))
|
964
982
|
end
|
965
983
|
|
966
984
|
# foo &&= bar
|
data/lib/prism/visitor.rb
CHANGED
@@ -313,6 +313,9 @@ module Prism
|
|
313
313
|
# Visit a InterpolatedXStringNode node
|
314
314
|
alias visit_interpolated_x_string_node visit_child_nodes
|
315
315
|
|
316
|
+
# Visit a ItLocalVariableReadNode node
|
317
|
+
alias visit_it_local_variable_read_node visit_child_nodes
|
318
|
+
|
316
319
|
# Visit a ItParametersNode node
|
317
320
|
alias visit_it_parameters_node visit_child_nodes
|
318
321
|
|
data/lib/prism.rb
CHANGED
@@ -13,7 +13,6 @@ module Prism
|
|
13
13
|
|
14
14
|
autoload :BasicVisitor, "prism/visitor"
|
15
15
|
autoload :Compiler, "prism/compiler"
|
16
|
-
autoload :Debug, "prism/debug"
|
17
16
|
autoload :DesugarCompiler, "prism/desugar_compiler"
|
18
17
|
autoload :Dispatcher, "prism/dispatcher"
|
19
18
|
autoload :DotVisitor, "prism/dot_visitor"
|
@@ -32,7 +31,6 @@ module Prism
|
|
32
31
|
# Some of these constants are not meant to be exposed, so marking them as
|
33
32
|
# private here.
|
34
33
|
|
35
|
-
private_constant :Debug
|
36
34
|
private_constant :LexCompat
|
37
35
|
private_constant :LexRipper
|
38
36
|
|
@@ -71,8 +69,6 @@ require_relative "prism/polyfill/byteindex"
|
|
71
69
|
require_relative "prism/node"
|
72
70
|
require_relative "prism/node_ext"
|
73
71
|
require_relative "prism/parse_result"
|
74
|
-
require_relative "prism/parse_result/comments"
|
75
|
-
require_relative "prism/parse_result/newlines"
|
76
72
|
|
77
73
|
# This is a Ruby implementation of the prism parser. If we're running on CRuby
|
78
74
|
# and we haven't explicitly set the PRISM_FFI_BACKEND environment variable, then
|
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.30.0"
|
6
6
|
spec.authors = ["Shopify"]
|
7
7
|
spec.email = ["ruby@shopify.com"]
|
8
8
|
|
@@ -65,12 +65,10 @@ Gem::Specification.new do |spec|
|
|
65
65
|
"include/prism/util/pm_newline_list.h",
|
66
66
|
"include/prism/util/pm_strncasecmp.h",
|
67
67
|
"include/prism/util/pm_string.h",
|
68
|
-
"include/prism/util/pm_string_list.h",
|
69
68
|
"include/prism/util/pm_strpbrk.h",
|
70
69
|
"include/prism/version.h",
|
71
70
|
"lib/prism.rb",
|
72
71
|
"lib/prism/compiler.rb",
|
73
|
-
"lib/prism/debug.rb",
|
74
72
|
"lib/prism/desugar_compiler.rb",
|
75
73
|
"lib/prism/dispatcher.rb",
|
76
74
|
"lib/prism/dot_visitor.rb",
|
@@ -121,6 +119,7 @@ Gem::Specification.new do |spec|
|
|
121
119
|
"sig/prism/dot_visitor.rbs",
|
122
120
|
"sig/prism/dsl.rbs",
|
123
121
|
"sig/prism/inspect_visitor.rbs",
|
122
|
+
"sig/prism/lex_compat.rbs",
|
124
123
|
"sig/prism/mutation_compiler.rbs",
|
125
124
|
"sig/prism/node_ext.rbs",
|
126
125
|
"sig/prism/node.rbs",
|
@@ -148,7 +147,6 @@ Gem::Specification.new do |spec|
|
|
148
147
|
"src/util/pm_list.c",
|
149
148
|
"src/util/pm_memchr.c",
|
150
149
|
"src/util/pm_newline_list.c",
|
151
|
-
"src/util/pm_string_list.c",
|
152
150
|
"src/util/pm_string.c",
|
153
151
|
"src/util/pm_strncasecmp.c",
|
154
152
|
"src/util/pm_strpbrk.c"
|