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.
Files changed (73) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +41 -1
  3. data/CONTRIBUTING.md +0 -4
  4. data/README.md +1 -0
  5. data/config.yml +95 -26
  6. data/docs/fuzzing.md +1 -1
  7. data/docs/ripper_translation.md +22 -0
  8. data/ext/prism/api_node.c +70 -52
  9. data/ext/prism/extconf.rb +27 -23
  10. data/ext/prism/extension.c +107 -372
  11. data/ext/prism/extension.h +1 -1
  12. data/include/prism/ast.h +170 -102
  13. data/include/prism/diagnostic.h +18 -3
  14. data/include/prism/node.h +0 -21
  15. data/include/prism/parser.h +23 -25
  16. data/include/prism/regexp.h +17 -8
  17. data/include/prism/static_literals.h +3 -2
  18. data/include/prism/util/pm_char.h +1 -2
  19. data/include/prism/util/pm_constant_pool.h +0 -8
  20. data/include/prism/util/pm_integer.h +16 -9
  21. data/include/prism/util/pm_string.h +0 -8
  22. data/include/prism/version.h +2 -2
  23. data/include/prism.h +0 -11
  24. data/lib/prism/compiler.rb +3 -0
  25. data/lib/prism/desugar_compiler.rb +4 -4
  26. data/lib/prism/dispatcher.rb +14 -0
  27. data/lib/prism/dot_visitor.rb +54 -35
  28. data/lib/prism/dsl.rb +23 -18
  29. data/lib/prism/ffi.rb +25 -4
  30. data/lib/prism/inspect_visitor.rb +26 -24
  31. data/lib/prism/mutation_compiler.rb +6 -1
  32. data/lib/prism/node.rb +314 -389
  33. data/lib/prism/node_ext.rb +175 -17
  34. data/lib/prism/parse_result/comments.rb +1 -8
  35. data/lib/prism/parse_result/newlines.rb +102 -12
  36. data/lib/prism/parse_result.rb +17 -0
  37. data/lib/prism/reflection.rb +11 -9
  38. data/lib/prism/serialize.rb +91 -68
  39. data/lib/prism/translation/parser/compiler.rb +288 -138
  40. data/lib/prism/translation/parser.rb +7 -2
  41. data/lib/prism/translation/ripper.rb +24 -22
  42. data/lib/prism/translation/ruby_parser.rb +32 -14
  43. data/lib/prism/visitor.rb +3 -0
  44. data/lib/prism.rb +0 -4
  45. data/prism.gemspec +2 -4
  46. data/rbi/prism/node.rbi +114 -57
  47. data/rbi/prism/node_ext.rbi +5 -0
  48. data/rbi/prism/parse_result.rbi +1 -1
  49. data/rbi/prism/visitor.rbi +3 -0
  50. data/rbi/prism.rbi +6 -0
  51. data/sig/prism/dsl.rbs +13 -10
  52. data/sig/prism/lex_compat.rbs +10 -0
  53. data/sig/prism/mutation_compiler.rbs +1 -0
  54. data/sig/prism/node.rbs +72 -48
  55. data/sig/prism/node_ext.rbs +4 -0
  56. data/sig/prism/visitor.rbs +1 -0
  57. data/sig/prism.rbs +21 -0
  58. data/src/diagnostic.c +56 -27
  59. data/src/node.c +432 -1690
  60. data/src/prettyprint.c +97 -54
  61. data/src/prism.c +1286 -1196
  62. data/src/regexp.c +133 -68
  63. data/src/serialize.c +22 -17
  64. data/src/static_literals.c +63 -84
  65. data/src/token_type.c +4 -4
  66. data/src/util/pm_constant_pool.c +0 -8
  67. data/src/util/pm_integer.c +39 -11
  68. data/src/util/pm_string.c +0 -12
  69. data/src/util/pm_strpbrk.c +32 -6
  70. metadata +3 -5
  71. data/include/prism/util/pm_string_list.h +0 -44
  72. data/lib/prism/debug.rb +0 -249
  73. data/src/util/pm_string_list.c +0 -28
@@ -1,6 +1,11 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "parser"
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.0"
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.operator_loc)
1185
- operator = on_op("#{node.operator}=")
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.operator_loc)
1343
- operator = on_op("#{node.operator}=")
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.operator_loc)
1413
- operator = on_op("#{node.operator}=")
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.operator_loc)
1514
- operator = on_op("#{node.operator}=")
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.operator_loc)
1806
- operator = on_op("#{node.operator}=")
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.operator_loc)
1987
- operator = on_op("#{node.operator}=")
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.operator_loc)
2063
- operator = on_op("#{node.operator}=")
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.operator_loc)
2341
- operator = on_op("#{node.operator}=")
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
- require "ruby_parser"
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.operator)
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.operator, visit_write_value(node.value))
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.operator, visit_write_value(node.value)))
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.operator, visit_write_value(node.value)))
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.operator, visit_write_value(node.value))
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.child.name)
488
+ s(node, :colon3, node.name)
484
489
  else
485
- s(node, :colon2, visit(node.parent), node.child.name)
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.operator, visit(node.value)))
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.operator, visit_write_value(node.value))
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.operator, visit_write_value(node.value)))
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
- else
904
- results << result
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.operator, visit_write_value(node.value)))
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.28.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"