prism 0.27.0 → 0.29.0

Sign up to get free protection for your applications and to get access to all the features.
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