prism 0.29.0 → 1.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (92) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +115 -1
  3. data/CONTRIBUTING.md +0 -4
  4. data/Makefile +1 -1
  5. data/README.md +4 -0
  6. data/config.yml +920 -148
  7. data/docs/build_system.md +8 -11
  8. data/docs/fuzzing.md +1 -1
  9. data/docs/parsing_rules.md +4 -1
  10. data/docs/relocation.md +34 -0
  11. data/docs/ripper_translation.md +22 -0
  12. data/docs/serialization.md +3 -0
  13. data/ext/prism/api_node.c +2863 -2079
  14. data/ext/prism/extconf.rb +14 -37
  15. data/ext/prism/extension.c +241 -391
  16. data/ext/prism/extension.h +2 -2
  17. data/include/prism/ast.h +2156 -453
  18. data/include/prism/defines.h +58 -7
  19. data/include/prism/diagnostic.h +24 -6
  20. data/include/prism/node.h +0 -21
  21. data/include/prism/options.h +94 -3
  22. data/include/prism/parser.h +82 -40
  23. data/include/prism/regexp.h +18 -8
  24. data/include/prism/static_literals.h +3 -2
  25. data/include/prism/util/pm_char.h +1 -2
  26. data/include/prism/util/pm_constant_pool.h +0 -8
  27. data/include/prism/util/pm_integer.h +22 -15
  28. data/include/prism/util/pm_newline_list.h +11 -0
  29. data/include/prism/util/pm_string.h +28 -12
  30. data/include/prism/version.h +3 -3
  31. data/include/prism.h +47 -11
  32. data/lib/prism/compiler.rb +3 -0
  33. data/lib/prism/desugar_compiler.rb +111 -74
  34. data/lib/prism/dispatcher.rb +16 -1
  35. data/lib/prism/dot_visitor.rb +55 -34
  36. data/lib/prism/dsl.rb +660 -468
  37. data/lib/prism/ffi.rb +113 -8
  38. data/lib/prism/inspect_visitor.rb +296 -64
  39. data/lib/prism/lex_compat.rb +1 -1
  40. data/lib/prism/mutation_compiler.rb +11 -6
  41. data/lib/prism/node.rb +4262 -5023
  42. data/lib/prism/node_ext.rb +91 -14
  43. data/lib/prism/parse_result/comments.rb +0 -7
  44. data/lib/prism/parse_result/errors.rb +65 -0
  45. data/lib/prism/parse_result/newlines.rb +101 -11
  46. data/lib/prism/parse_result.rb +183 -6
  47. data/lib/prism/reflection.rb +12 -10
  48. data/lib/prism/relocation.rb +504 -0
  49. data/lib/prism/serialize.rb +496 -609
  50. data/lib/prism/string_query.rb +30 -0
  51. data/lib/prism/translation/parser/compiler.rb +185 -155
  52. data/lib/prism/translation/parser/lexer.rb +26 -4
  53. data/lib/prism/translation/parser.rb +9 -4
  54. data/lib/prism/translation/ripper.rb +23 -25
  55. data/lib/prism/translation/ruby_parser.rb +86 -17
  56. data/lib/prism/visitor.rb +3 -0
  57. data/lib/prism.rb +6 -8
  58. data/prism.gemspec +9 -5
  59. data/rbi/prism/dsl.rbi +521 -0
  60. data/rbi/prism/node.rbi +1115 -1120
  61. data/rbi/prism/parse_result.rbi +29 -0
  62. data/rbi/prism/string_query.rbi +12 -0
  63. data/rbi/prism/visitor.rbi +3 -0
  64. data/rbi/prism.rbi +36 -30
  65. data/sig/prism/dsl.rbs +190 -303
  66. data/sig/prism/mutation_compiler.rbs +1 -0
  67. data/sig/prism/node.rbs +678 -632
  68. data/sig/prism/parse_result.rbs +22 -0
  69. data/sig/prism/relocation.rbs +185 -0
  70. data/sig/prism/string_query.rbs +11 -0
  71. data/sig/prism/visitor.rbs +1 -0
  72. data/sig/prism.rbs +103 -64
  73. data/src/diagnostic.c +64 -28
  74. data/src/node.c +502 -1739
  75. data/src/options.c +76 -27
  76. data/src/prettyprint.c +188 -112
  77. data/src/prism.c +3376 -2293
  78. data/src/regexp.c +208 -71
  79. data/src/serialize.c +182 -50
  80. data/src/static_literals.c +64 -85
  81. data/src/token_type.c +4 -4
  82. data/src/util/pm_char.c +1 -1
  83. data/src/util/pm_constant_pool.c +0 -8
  84. data/src/util/pm_integer.c +53 -25
  85. data/src/util/pm_newline_list.c +29 -0
  86. data/src/util/pm_string.c +131 -80
  87. data/src/util/pm_strpbrk.c +32 -6
  88. metadata +11 -7
  89. data/include/prism/util/pm_string_list.h +0 -44
  90. data/lib/prism/debug.rb +0 -249
  91. data/lib/prism/translation/parser/rubocop.rb +0 -73
  92. data/src/util/pm_string_list.c +0 -28
@@ -22,7 +22,8 @@ module Prism
22
22
  # end
23
23
  # end
24
24
  #
25
- # dispatcher = Dispatcher.new
25
+ # listener = OctalListener.new
26
+ # dispatcher = Prism::Dispatcher.new
26
27
  # dispatcher.register(listener, :on_integer_node_enter)
27
28
  #
28
29
  # Then, you can walk any number of trees and dispatch events to the listeners:
@@ -762,6 +763,14 @@ module Prism
762
763
  listeners[:on_interpolated_x_string_node_leave]&.each { |listener| listener.on_interpolated_x_string_node_leave(node) }
763
764
  end
764
765
 
766
+ # Dispatch enter and leave events for ItLocalVariableReadNode nodes and continue
767
+ # walking the tree.
768
+ def visit_it_local_variable_read_node(node)
769
+ listeners[:on_it_local_variable_read_node_enter]&.each { |listener| listener.on_it_local_variable_read_node_enter(node) }
770
+ super
771
+ listeners[:on_it_local_variable_read_node_leave]&.each { |listener| listener.on_it_local_variable_read_node_leave(node) }
772
+ end
773
+
765
774
  # Dispatch enter and leave events for ItParametersNode nodes and continue
766
775
  # walking the tree.
767
776
  def visit_it_parameters_node(node)
@@ -1795,6 +1804,12 @@ module Prism
1795
1804
  listeners[:on_interpolated_x_string_node_leave]&.each { |listener| listener.on_interpolated_x_string_node_leave(node) }
1796
1805
  end
1797
1806
 
1807
+ # Dispatch enter and leave events for ItLocalVariableReadNode nodes.
1808
+ def visit_it_local_variable_read_node(node)
1809
+ listeners[:on_it_local_variable_read_node_enter]&.each { |listener| listener.on_it_local_variable_read_node_enter(node) }
1810
+ listeners[:on_it_local_variable_read_node_leave]&.each { |listener| listener.on_it_local_variable_read_node_leave(node) }
1811
+ end
1812
+
1798
1813
  # Dispatch enter and leave events for ItParametersNode nodes.
1799
1814
  def visit_it_parameters_node(node)
1800
1815
  listeners[:on_it_parameters_node_enter]&.each { |listener| listener.on_it_parameters_node_enter(node) }
@@ -909,10 +909,10 @@ module Prism
909
909
  table.field("conditions", "[]")
910
910
  end
911
911
 
912
- # consequent
913
- unless (consequent = node.consequent).nil?
914
- table.field("consequent", port: true)
915
- digraph.edge("#{id}:consequent -> #{node_id(consequent)};")
912
+ # else_clause
913
+ unless (else_clause = node.else_clause).nil?
914
+ table.field("else_clause", port: true)
915
+ digraph.edge("#{id}:else_clause -> #{node_id(else_clause)};")
916
916
  end
917
917
 
918
918
  # case_keyword_loc
@@ -954,10 +954,10 @@ module Prism
954
954
  table.field("conditions", "[]")
955
955
  end
956
956
 
957
- # consequent
958
- unless (consequent = node.consequent).nil?
959
- table.field("consequent", port: true)
960
- digraph.edge("#{id}:consequent -> #{node_id(consequent)};")
957
+ # else_clause
958
+ unless (else_clause = node.else_clause).nil?
959
+ table.field("else_clause", port: true)
960
+ digraph.edge("#{id}:else_clause -> #{node_id(else_clause)};")
961
961
  end
962
962
 
963
963
  # case_keyword_loc
@@ -2130,10 +2130,10 @@ module Prism
2130
2130
  digraph.edge("#{id}:statements -> #{node_id(statements)};")
2131
2131
  end
2132
2132
 
2133
- # consequent
2134
- unless (consequent = node.consequent).nil?
2135
- table.field("consequent", port: true)
2136
- digraph.edge("#{id}:consequent -> #{node_id(consequent)};")
2133
+ # subsequent
2134
+ unless (subsequent = node.subsequent).nil?
2135
+ table.field("subsequent", port: true)
2136
+ digraph.edge("#{id}:subsequent -> #{node_id(subsequent)};")
2137
2137
  end
2138
2138
 
2139
2139
  # end_keyword_loc
@@ -2780,6 +2780,20 @@ module Prism
2780
2780
  super
2781
2781
  end
2782
2782
 
2783
+ # Visit a ItLocalVariableReadNode node.
2784
+ def visit_it_local_variable_read_node(node)
2785
+ table = Table.new("ItLocalVariableReadNode")
2786
+ id = node_id(node)
2787
+
2788
+ digraph.nodes << <<~DOT
2789
+ #{id} [
2790
+ label=<#{table.to_dot.gsub(/\n/, "\n ")}>
2791
+ ];
2792
+ DOT
2793
+
2794
+ super
2795
+ end
2796
+
2783
2797
  # Visit a ItParametersNode node.
2784
2798
  def visit_it_parameters_node(node)
2785
2799
  table = Table.new("ItParametersNode")
@@ -3779,9 +3793,14 @@ module Prism
3779
3793
  table = Table.new("RationalNode")
3780
3794
  id = node_id(node)
3781
3795
 
3782
- # numeric
3783
- table.field("numeric", port: true)
3784
- digraph.edge("#{id}:numeric -> #{node_id(node.numeric)};")
3796
+ # flags
3797
+ table.field("flags", integer_base_flags_inspect(node))
3798
+
3799
+ # numerator
3800
+ table.field("numerator", node.numerator.inspect)
3801
+
3802
+ # denominator
3803
+ table.field("denominator", node.denominator.inspect)
3785
3804
 
3786
3805
  digraph.nodes << <<~DOT
3787
3806
  #{id} [
@@ -3941,10 +3960,10 @@ module Prism
3941
3960
  digraph.edge("#{id}:statements -> #{node_id(statements)};")
3942
3961
  end
3943
3962
 
3944
- # consequent
3945
- unless (consequent = node.consequent).nil?
3946
- table.field("consequent", port: true)
3947
- digraph.edge("#{id}:consequent -> #{node_id(consequent)};")
3963
+ # subsequent
3964
+ unless (subsequent = node.subsequent).nil?
3965
+ table.field("subsequent", port: true)
3966
+ digraph.edge("#{id}:subsequent -> #{node_id(subsequent)};")
3948
3967
  end
3949
3968
 
3950
3969
  digraph.nodes << <<~DOT
@@ -4003,9 +4022,6 @@ module Prism
4003
4022
  table = Table.new("ReturnNode")
4004
4023
  id = node_id(node)
4005
4024
 
4006
- # flags
4007
- table.field("flags", return_node_flags_inspect(node))
4008
-
4009
4025
  # keyword_loc
4010
4026
  table.field("keyword_loc", location_inspect(node.keyword_loc))
4011
4027
 
@@ -4367,10 +4383,10 @@ module Prism
4367
4383
  digraph.edge("#{id}:statements -> #{node_id(statements)};")
4368
4384
  end
4369
4385
 
4370
- # consequent
4371
- unless (consequent = node.consequent).nil?
4372
- table.field("consequent", port: true)
4373
- digraph.edge("#{id}:consequent -> #{node_id(consequent)};")
4386
+ # else_clause
4387
+ unless (else_clause = node.else_clause).nil?
4388
+ table.field("else_clause", port: true)
4389
+ digraph.edge("#{id}:else_clause -> #{node_id(else_clause)};")
4374
4390
  end
4375
4391
 
4376
4392
  # end_keyword_loc
@@ -4398,6 +4414,11 @@ module Prism
4398
4414
  # keyword_loc
4399
4415
  table.field("keyword_loc", location_inspect(node.keyword_loc))
4400
4416
 
4417
+ # do_keyword_loc
4418
+ unless (do_keyword_loc = node.do_keyword_loc).nil?
4419
+ table.field("do_keyword_loc", location_inspect(do_keyword_loc))
4420
+ end
4421
+
4401
4422
  # closing_loc
4402
4423
  unless (closing_loc = node.closing_loc).nil?
4403
4424
  table.field("closing_loc", location_inspect(closing_loc))
@@ -4474,6 +4495,11 @@ module Prism
4474
4495
  # keyword_loc
4475
4496
  table.field("keyword_loc", location_inspect(node.keyword_loc))
4476
4497
 
4498
+ # do_keyword_loc
4499
+ unless (do_keyword_loc = node.do_keyword_loc).nil?
4500
+ table.field("do_keyword_loc", location_inspect(do_keyword_loc))
4501
+ end
4502
+
4477
4503
  # closing_loc
4478
4504
  unless (closing_loc = node.closing_loc).nil?
4479
4505
  table.field("closing_loc", location_inspect(closing_loc))
@@ -4576,8 +4602,11 @@ module Prism
4576
4602
  # comma-separated list.
4577
4603
  def arguments_node_flags_inspect(node)
4578
4604
  flags = [] #: Array[String]
4605
+ flags << "contains_forwarding" if node.contains_forwarding?
4579
4606
  flags << "contains_keywords" if node.contains_keywords?
4580
4607
  flags << "contains_keyword_splat" if node.contains_keyword_splat?
4608
+ flags << "contains_splat" if node.contains_splat?
4609
+ flags << "contains_multiple_splats" if node.contains_multiple_splats?
4581
4610
  flags.join(", ")
4582
4611
  end
4583
4612
 
@@ -4679,14 +4708,6 @@ module Prism
4679
4708
  flags.join(", ")
4680
4709
  end
4681
4710
 
4682
- # Inspect a node that has return_node_flags flags to display the flags as a
4683
- # comma-separated list.
4684
- def return_node_flags_inspect(node)
4685
- flags = [] #: Array[String]
4686
- flags << "redundant" if node.redundant?
4687
- flags.join(", ")
4688
- end
4689
-
4690
4711
  # Inspect a node that has shareable_constant_node_flags flags to display the flags as a
4691
4712
  # comma-separated list.
4692
4713
  def shareable_constant_node_flags_inspect(node)