prism 0.27.0 → 0.29.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 (65) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +45 -1
  3. data/config.yml +68 -44
  4. data/docs/configuration.md +1 -0
  5. data/ext/prism/api_node.c +854 -847
  6. data/ext/prism/extconf.rb +27 -23
  7. data/ext/prism/extension.c +5 -3
  8. data/ext/prism/extension.h +1 -1
  9. data/include/prism/ast.h +70 -48
  10. data/include/prism/diagnostic.h +23 -6
  11. data/include/prism/options.h +2 -2
  12. data/include/prism/parser.h +10 -0
  13. data/include/prism/static_literals.h +8 -6
  14. data/include/prism/version.h +2 -2
  15. data/lib/prism/desugar_compiler.rb +4 -4
  16. data/lib/prism/dot_visitor.rb +54 -38
  17. data/lib/prism/dsl.rb +24 -24
  18. data/lib/prism/ffi.rb +4 -4
  19. data/lib/prism/inspect_visitor.rb +2156 -0
  20. data/lib/prism/lex_compat.rb +1 -1
  21. data/lib/prism/mutation_compiler.rb +2 -2
  22. data/lib/prism/node.rb +737 -1863
  23. data/lib/prism/node_ext.rb +176 -5
  24. data/lib/prism/parse_result/comments.rb +1 -1
  25. data/lib/prism/parse_result/newlines.rb +1 -1
  26. data/lib/prism/parse_result.rb +78 -0
  27. data/lib/prism/pattern.rb +12 -6
  28. data/lib/prism/polyfill/byteindex.rb +13 -0
  29. data/lib/prism/polyfill/unpack1.rb +14 -0
  30. data/lib/prism/reflection.rb +20 -20
  31. data/lib/prism/serialize.rb +32 -15
  32. data/lib/prism/translation/parser/compiler.rb +156 -26
  33. data/lib/prism/translation/parser.rb +7 -7
  34. data/lib/prism/translation/ripper.rb +29 -25
  35. data/lib/prism/translation/ruby_parser.rb +13 -13
  36. data/lib/prism.rb +2 -1
  37. data/prism.gemspec +37 -38
  38. data/rbi/prism/compiler.rbi +3 -5
  39. data/rbi/prism/inspect_visitor.rbi +12 -0
  40. data/rbi/prism/node.rbi +405 -370
  41. data/rbi/prism/node_ext.rbi +5 -0
  42. data/rbi/prism/parse_result.rbi +23 -0
  43. data/rbi/prism/translation/ripper.rbi +1 -11
  44. data/sig/prism/dsl.rbs +12 -12
  45. data/sig/prism/inspect_visitor.rbs +22 -0
  46. data/sig/prism/lex_compat.rbs +10 -0
  47. data/sig/prism/node.rbs +108 -91
  48. data/sig/prism/node_ext.rbs +4 -0
  49. data/sig/prism/parse_result.rbs +12 -0
  50. data/src/diagnostic.c +66 -33
  51. data/src/node.c +89 -64
  52. data/src/options.c +2 -2
  53. data/src/prettyprint.c +109 -66
  54. data/src/prism.c +862 -317
  55. data/src/serialize.c +21 -18
  56. data/src/static_literals.c +120 -34
  57. data/src/token_type.c +6 -6
  58. metadata +8 -9
  59. data/lib/prism/node_inspector.rb +0 -68
  60. data/lib/prism/polyfill/string.rb +0 -12
  61. data/rbi/prism/desugar_compiler.rbi +0 -5
  62. data/rbi/prism/mutation_compiler.rbi +0 -5
  63. data/rbi/prism/translation/parser/compiler.rbi +0 -13
  64. data/rbi/prism/translation/ripper/ripper_compiler.rbi +0 -5
  65. data/rbi/prism/translation/ruby_parser.rbi +0 -11
@@ -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)
@@ -1456,16 +1456,16 @@ module Prism
1456
1456
  # ^^^^^^^^
1457
1457
  def visit_constant_path_node(node)
1458
1458
  if node.parent.nil?
1459
- bounds(node.child.location)
1460
- child = on_const(node.child.name.to_s)
1459
+ bounds(node.name_loc)
1460
+ child = on_const(node.name.to_s)
1461
1461
 
1462
1462
  bounds(node.location)
1463
1463
  on_top_const_ref(child)
1464
1464
  else
1465
1465
  parent = visit(node.parent)
1466
1466
 
1467
- bounds(node.child.location)
1468
- child = on_const(node.child.name.to_s)
1467
+ bounds(node.name_loc)
1468
+ child = on_const(node.name.to_s)
1469
1469
 
1470
1470
  bounds(node.location)
1471
1471
  on_const_path_ref(parent, child)
@@ -1488,16 +1488,16 @@ module Prism
1488
1488
  # Visit a constant path that is part of a write node.
1489
1489
  private def visit_constant_path_write_node_target(node)
1490
1490
  if node.parent.nil?
1491
- bounds(node.child.location)
1492
- child = on_const(node.child.name.to_s)
1491
+ bounds(node.name_loc)
1492
+ child = on_const(node.name.to_s)
1493
1493
 
1494
1494
  bounds(node.location)
1495
1495
  on_top_const_field(child)
1496
1496
  else
1497
1497
  parent = visit(node.parent)
1498
1498
 
1499
- bounds(node.child.location)
1500
- child = on_const(node.child.name.to_s)
1499
+ bounds(node.name_loc)
1500
+ child = on_const(node.name.to_s)
1501
1501
 
1502
1502
  bounds(node.location)
1503
1503
  on_const_path_field(parent, child)
@@ -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)
@@ -2337,8 +2337,8 @@ module Prism
2337
2337
  bounds(node.name_loc)
2338
2338
  target = on_var_field(on_ident(node.name_loc.slice))
2339
2339
 
2340
- bounds(node.operator_loc)
2341
- operator = on_op("#{node.operator}=")
2340
+ bounds(node.binary_operator_loc)
2341
+ operator = on_op("#{node.binary_operator}=")
2342
2342
  value = visit_write_value(node.value)
2343
2343
 
2344
2344
  bounds(node.location)
@@ -3267,7 +3267,11 @@ module Prism
3267
3267
 
3268
3268
  # Lazily initialize the parse result.
3269
3269
  def result
3270
- @result ||= Prism.parse(source)
3270
+ @result ||=
3271
+ begin
3272
+ scopes = RUBY_VERSION >= "3.3.0" ? [] : [[]]
3273
+ Prism.parse(source, scopes: scopes)
3274
+ end
3271
3275
  end
3272
3276
 
3273
3277
  ##########################################################################
@@ -271,9 +271,9 @@ module Prism
271
271
  # ^^^^^^^^^^^^^^^
272
272
  def visit_call_operator_write_node(node)
273
273
  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)
274
+ s(node, op_asgn_type(node, :op_asgn), visit(node.receiver), visit_write_value(node.value), node.read_name, node.binary_operator)
275
275
  else
276
- s(node, op_asgn_type(node, :op_asgn2), visit(node.receiver), node.write_name, node.operator, visit_write_value(node.value))
276
+ s(node, op_asgn_type(node, :op_asgn2), visit(node.receiver), node.write_name, node.binary_operator, visit_write_value(node.value))
277
277
  end
278
278
  end
279
279
 
@@ -372,7 +372,7 @@ module Prism
372
372
  # @@foo += bar
373
373
  # ^^^^^^^^^^^^
374
374
  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)))
375
+ 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
376
  end
377
377
 
378
378
  # @@foo &&= bar
@@ -417,7 +417,7 @@ module Prism
417
417
  # Foo += bar
418
418
  # ^^^^^^^^^^^
419
419
  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)))
420
+ s(node, :cdecl, node.name, s(node, :call, s(node, :const, node.name), node.binary_operator, visit_write_value(node.value)))
421
421
  end
422
422
 
423
423
  # Foo &&= bar
@@ -442,9 +442,9 @@ module Prism
442
442
  # ^^^^^^^^
443
443
  def visit_constant_path_node(node)
444
444
  if node.parent.nil?
445
- s(node, :colon3, node.child.name)
445
+ s(node, :colon3, node.name)
446
446
  else
447
- s(node, :colon2, visit(node.parent), node.child.name)
447
+ s(node, :colon2, visit(node.parent), node.name)
448
448
  end
449
449
  end
450
450
 
@@ -460,7 +460,7 @@ module Prism
460
460
  # Foo::Bar += baz
461
461
  # ^^^^^^^^^^^^^^^
462
462
  def visit_constant_path_operator_write_node(node)
463
- s(node, :op_asgn, visit(node.target), node.operator, visit_write_value(node.value))
463
+ s(node, :op_asgn, visit(node.target), node.binary_operator, visit_write_value(node.value))
464
464
  end
465
465
 
466
466
  # Foo::Bar &&= baz
@@ -627,7 +627,7 @@ module Prism
627
627
  # $foo += bar
628
628
  # ^^^^^^^^^^^
629
629
  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)))
630
+ s(node, :gasgn, node.name, s(node, :call, s(node, :gvar, node.name), node.binary_operator, visit(node.value)))
631
631
  end
632
632
 
633
633
  # $foo &&= bar
@@ -719,7 +719,7 @@ module Prism
719
719
  arglist << visit(node.block) if !node.block.nil?
720
720
  end
721
721
 
722
- s(node, :op_asgn1, visit(node.receiver), arglist, node.operator, visit_write_value(node.value))
722
+ s(node, :op_asgn1, visit(node.receiver), arglist, node.binary_operator, visit_write_value(node.value))
723
723
  end
724
724
 
725
725
  # foo[bar] &&= baz
@@ -775,7 +775,7 @@ module Prism
775
775
  # @foo += bar
776
776
  # ^^^^^^^^^^^
777
777
  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)))
778
+ s(node, :iasgn, node.name, s(node, :call, s(node, :ivar, node.name), node.binary_operator, visit_write_value(node.value)))
779
779
  end
780
780
 
781
781
  # @foo &&= bar
@@ -960,7 +960,7 @@ module Prism
960
960
  # foo += bar
961
961
  # ^^^^^^^^^^
962
962
  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)))
963
+ s(node, :lasgn, node.name, s(node, :call, s(node, :lvar, node.name), node.binary_operator, visit_write_value(node.value)))
964
964
  end
965
965
 
966
966
  # foo &&= bar
@@ -1536,13 +1536,13 @@ module Prism
1536
1536
  # Parse the given source and translate it into the seattlerb/ruby_parser
1537
1537
  # gem's Sexp format.
1538
1538
  def parse(source, filepath = "(string)")
1539
- translate(Prism.parse(source, filepath: filepath), filepath)
1539
+ translate(Prism.parse(source, filepath: filepath, scopes: [[]]), filepath)
1540
1540
  end
1541
1541
 
1542
1542
  # Parse the given file and translate it into the seattlerb/ruby_parser
1543
1543
  # gem's Sexp format.
1544
1544
  def parse_file(filepath)
1545
- translate(Prism.parse_file(filepath), filepath)
1545
+ translate(Prism.parse_file(filepath, scopes: [[]]), filepath)
1546
1546
  end
1547
1547
 
1548
1548
  class << self
data/lib/prism.rb CHANGED
@@ -18,10 +18,10 @@ module Prism
18
18
  autoload :Dispatcher, "prism/dispatcher"
19
19
  autoload :DotVisitor, "prism/dot_visitor"
20
20
  autoload :DSL, "prism/dsl"
21
+ autoload :InspectVisitor, "prism/inspect_visitor"
21
22
  autoload :LexCompat, "prism/lex_compat"
22
23
  autoload :LexRipper, "prism/lex_compat"
23
24
  autoload :MutationCompiler, "prism/mutation_compiler"
24
- autoload :NodeInspector, "prism/node_inspector"
25
25
  autoload :Pack, "prism/pack"
26
26
  autoload :Pattern, "prism/pattern"
27
27
  autoload :Reflection, "prism/reflection"
@@ -67,6 +67,7 @@ module Prism
67
67
  end
68
68
  end
69
69
 
70
+ require_relative "prism/polyfill/byteindex"
70
71
  require_relative "prism/node"
71
72
  require_relative "prism/node_ext"
72
73
  require_relative "prism/parse_result"
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.27.0"
5
+ spec.version = "0.29.0"
6
6
  spec.authors = ["Shopify"]
7
7
  spec.email = ["ruby@shopify.com"]
8
8
 
@@ -76,17 +76,18 @@ Gem::Specification.new do |spec|
76
76
  "lib/prism/dot_visitor.rb",
77
77
  "lib/prism/dsl.rb",
78
78
  "lib/prism/ffi.rb",
79
+ "lib/prism/inspect_visitor.rb",
79
80
  "lib/prism/lex_compat.rb",
80
81
  "lib/prism/mutation_compiler.rb",
81
82
  "lib/prism/node_ext.rb",
82
- "lib/prism/node_inspector.rb",
83
83
  "lib/prism/node.rb",
84
84
  "lib/prism/pack.rb",
85
85
  "lib/prism/parse_result.rb",
86
86
  "lib/prism/parse_result/comments.rb",
87
87
  "lib/prism/parse_result/newlines.rb",
88
88
  "lib/prism/pattern.rb",
89
- "lib/prism/polyfill/string.rb",
89
+ "lib/prism/polyfill/byteindex.rb",
90
+ "lib/prism/polyfill/unpack1.rb",
90
91
  "lib/prism/reflection.rb",
91
92
  "lib/prism/serialize.rb",
92
93
  "lib/prism/translation.rb",
@@ -101,11 +102,42 @@ Gem::Specification.new do |spec|
101
102
  "lib/prism/translation/ripper/shim.rb",
102
103
  "lib/prism/translation/ruby_parser.rb",
103
104
  "lib/prism/visitor.rb",
105
+ "prism.gemspec",
106
+ "rbi/prism.rbi",
107
+ "rbi/prism/compiler.rbi",
108
+ "rbi/prism/inspect_visitor.rbi",
109
+ "rbi/prism/node_ext.rbi",
110
+ "rbi/prism/node.rbi",
111
+ "rbi/prism/parse_result.rbi",
112
+ "rbi/prism/reflection.rbi",
113
+ "rbi/prism/translation/parser.rbi",
114
+ "rbi/prism/translation/parser33.rbi",
115
+ "rbi/prism/translation/parser34.rbi",
116
+ "rbi/prism/translation/ripper.rbi",
117
+ "rbi/prism/visitor.rbi",
118
+ "sig/prism.rbs",
119
+ "sig/prism/compiler.rbs",
120
+ "sig/prism/dispatcher.rbs",
121
+ "sig/prism/dot_visitor.rbs",
122
+ "sig/prism/dsl.rbs",
123
+ "sig/prism/inspect_visitor.rbs",
124
+ "sig/prism/lex_compat.rbs",
125
+ "sig/prism/mutation_compiler.rbs",
126
+ "sig/prism/node_ext.rbs",
127
+ "sig/prism/node.rbs",
128
+ "sig/prism/pack.rbs",
129
+ "sig/prism/parse_result.rbs",
130
+ "sig/prism/pattern.rbs",
131
+ "sig/prism/reflection.rbs",
132
+ "sig/prism/serialize.rbs",
133
+ "sig/prism/visitor.rbs",
104
134
  "src/diagnostic.c",
105
135
  "src/encoding.c",
106
136
  "src/node.c",
137
+ "src/options.c",
107
138
  "src/pack.c",
108
139
  "src/prettyprint.c",
140
+ "src/prism.c",
109
141
  "src/regexp.c",
110
142
  "src/serialize.c",
111
143
  "src/static_literals.c",
@@ -117,43 +149,10 @@ Gem::Specification.new do |spec|
117
149
  "src/util/pm_list.c",
118
150
  "src/util/pm_memchr.c",
119
151
  "src/util/pm_newline_list.c",
120
- "src/util/pm_string.c",
121
152
  "src/util/pm_string_list.c",
153
+ "src/util/pm_string.c",
122
154
  "src/util/pm_strncasecmp.c",
123
- "src/util/pm_strpbrk.c",
124
- "src/options.c",
125
- "src/prism.c",
126
- "prism.gemspec",
127
- "sig/prism.rbs",
128
- "sig/prism/compiler.rbs",
129
- "sig/prism/dispatcher.rbs",
130
- "sig/prism/dot_visitor.rbs",
131
- "sig/prism/dsl.rbs",
132
- "sig/prism/mutation_compiler.rbs",
133
- "sig/prism/node.rbs",
134
- "sig/prism/node_ext.rbs",
135
- "sig/prism/pack.rbs",
136
- "sig/prism/parse_result.rbs",
137
- "sig/prism/pattern.rbs",
138
- "sig/prism/reflection.rbs",
139
- "sig/prism/serialize.rbs",
140
- "sig/prism/visitor.rbs",
141
- "rbi/prism.rbi",
142
- "rbi/prism/compiler.rbi",
143
- "rbi/prism/desugar_compiler.rbi",
144
- "rbi/prism/mutation_compiler.rbi",
145
- "rbi/prism/node_ext.rbi",
146
- "rbi/prism/node.rbi",
147
- "rbi/prism/parse_result.rbi",
148
- "rbi/prism/reflection.rbi",
149
- "rbi/prism/translation/parser.rbi",
150
- "rbi/prism/translation/parser/compiler.rbi",
151
- "rbi/prism/translation/parser33.rbi",
152
- "rbi/prism/translation/parser34.rbi",
153
- "rbi/prism/translation/ripper.rbi",
154
- "rbi/prism/translation/ripper/ripper_compiler.rbi",
155
- "rbi/prism/translation/ruby_parser.rbi",
156
- "rbi/prism/visitor.rbi"
155
+ "src/util/pm_strpbrk.c"
157
156
  ]
158
157
 
159
158
  spec.extensions = ["ext/prism/extconf.rb"]
@@ -1,14 +1,12 @@
1
1
  # typed: strict
2
2
 
3
3
  class Prism::Compiler
4
- Result = type_member
5
-
6
- sig { params(node: T.nilable(Prism::Node)).returns(T.nilable(Result)) }
4
+ sig { params(node: T.nilable(Prism::Node)).returns(T.untyped) }
7
5
  def visit(node); end
8
6
 
9
- sig { params(nodes: T::Array[T.nilable(Prism::Node)]).returns(T::Array[T.nilable(Result)]) }
7
+ sig { params(nodes: T::Array[T.nilable(Prism::Node)]).returns(T::Array[T.untyped]) }
10
8
  def visit_all(nodes); end
11
9
 
12
- sig { params(node: Prism::Node).returns(T::Array[T.nilable(Result)]) }
10
+ sig { params(node: Prism::Node).returns(T::Array[T.untyped]) }
13
11
  def visit_child_nodes(node); end
14
12
  end
@@ -0,0 +1,12 @@
1
+ # typed: strict
2
+
3
+ class Prism::InspectVisitor < Prism::Visitor
4
+ sig { params(indent: String).void }
5
+ def initialize(indent = ""); end
6
+
7
+ sig { params(node: Prism::Node).returns(String) }
8
+ def self.compose(node); end
9
+
10
+ sig { returns(String) }
11
+ def compose; end
12
+ end