prism 1.4.0 → 1.6.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 (79) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +51 -1
  3. data/Makefile +4 -2
  4. data/README.md +2 -0
  5. data/config.yml +266 -38
  6. data/docs/design.md +2 -2
  7. data/docs/parser_translation.md +8 -23
  8. data/docs/releasing.md +5 -24
  9. data/docs/ripper_translation.md +1 -1
  10. data/ext/prism/api_node.c +2 -0
  11. data/ext/prism/extension.c +25 -3
  12. data/ext/prism/extension.h +1 -1
  13. data/include/prism/ast.h +306 -50
  14. data/include/prism/diagnostic.h +5 -0
  15. data/include/prism/options.h +43 -3
  16. data/include/prism/regexp.h +2 -2
  17. data/include/prism/util/pm_buffer.h +8 -0
  18. data/include/prism/util/pm_integer.h +4 -0
  19. data/include/prism/util/pm_list.h +6 -0
  20. data/include/prism/util/pm_string.h +12 -2
  21. data/include/prism/version.h +2 -2
  22. data/include/prism.h +39 -14
  23. data/lib/prism/compiler.rb +456 -151
  24. data/lib/prism/desugar_compiler.rb +1 -0
  25. data/lib/prism/dispatcher.rb +16 -0
  26. data/lib/prism/dot_visitor.rb +5 -1
  27. data/lib/prism/dsl.rb +3 -0
  28. data/lib/prism/ffi.rb +25 -9
  29. data/lib/prism/inspect_visitor.rb +3 -0
  30. data/lib/prism/lex_compat.rb +1 -0
  31. data/lib/prism/mutation_compiler.rb +3 -0
  32. data/lib/prism/node.rb +507 -336
  33. data/lib/prism/node_ext.rb +4 -1
  34. data/lib/prism/pack.rb +2 -0
  35. data/lib/prism/parse_result/comments.rb +1 -0
  36. data/lib/prism/parse_result/errors.rb +1 -0
  37. data/lib/prism/parse_result/newlines.rb +1 -0
  38. data/lib/prism/parse_result.rb +1 -0
  39. data/lib/prism/pattern.rb +1 -0
  40. data/lib/prism/polyfill/scan_byte.rb +14 -0
  41. data/lib/prism/polyfill/warn.rb +36 -0
  42. data/lib/prism/reflection.rb +3 -0
  43. data/lib/prism/relocation.rb +1 -0
  44. data/lib/prism/serialize.rb +25 -19
  45. data/lib/prism/string_query.rb +1 -0
  46. data/lib/prism/translation/parser/builder.rb +1 -0
  47. data/lib/prism/translation/parser/compiler.rb +47 -25
  48. data/lib/prism/translation/parser/lexer.rb +29 -21
  49. data/lib/prism/translation/parser.rb +21 -2
  50. data/lib/prism/translation/parser33.rb +1 -0
  51. data/lib/prism/translation/parser34.rb +1 -0
  52. data/lib/prism/translation/parser35.rb +1 -0
  53. data/lib/prism/translation/parser_current.rb +24 -0
  54. data/lib/prism/translation/ripper/sexp.rb +1 -0
  55. data/lib/prism/translation/ripper.rb +17 -1
  56. data/lib/prism/translation/ruby_parser.rb +287 -4
  57. data/lib/prism/translation.rb +2 -0
  58. data/lib/prism/visitor.rb +457 -152
  59. data/lib/prism.rb +23 -0
  60. data/prism.gemspec +5 -1
  61. data/rbi/prism/dsl.rbi +3 -3
  62. data/rbi/prism/node.rbi +21 -9
  63. data/sig/prism/dispatcher.rbs +3 -0
  64. data/sig/prism/dsl.rbs +3 -3
  65. data/sig/prism/node.rbs +444 -30
  66. data/sig/prism/node_ext.rbs +84 -17
  67. data/sig/prism/parse_result/comments.rbs +38 -0
  68. data/sig/prism/parse_result.rbs +4 -0
  69. data/sig/prism/reflection.rbs +1 -1
  70. data/sig/prism.rbs +4 -0
  71. data/src/diagnostic.c +9 -1
  72. data/src/node.c +2 -0
  73. data/src/options.c +2 -2
  74. data/src/prettyprint.c +2 -0
  75. data/src/prism.c +324 -147
  76. data/src/serialize.c +2 -0
  77. data/src/token_type.c +36 -34
  78. data/src/util/pm_string.c +6 -8
  79. metadata +7 -3
@@ -1,46 +1,40 @@
1
1
  module Prism
2
+ class Node
3
+ def deprecated: (*String replacements) -> void
4
+ end
5
+
2
6
  class InterpolatedMatchLastLineNode < Node
3
- # Returns a numeric value that represents the flags that were used to create
4
- # the regular expression.
5
7
  def options: () -> Integer
6
8
  end
7
9
 
8
10
  class InterpolatedRegularExpressionNode < Node
9
- # Returns a numeric value that represents the flags that were used to create
10
- # the regular expression.
11
11
  def options: () -> Integer
12
12
  end
13
13
 
14
14
  class MatchLastLineNode < Node
15
- # Returns a numeric value that represents the flags that were used to create
16
- # the regular expression.
17
15
  def options: () -> Integer
18
16
  end
19
17
 
20
18
  class RegularExpressionNode < Node
21
- # Returns a numeric value that represents the flags that were used to create
22
- # the regular expression.
23
19
  def options: () -> Integer
24
20
  end
25
21
 
26
22
  class InterpolatedStringNode < Node
27
- # Returns true if this node was represented as a heredoc in the source code.
28
- def heredoc?: () -> bool?
23
+ def heredoc?: () -> bool
29
24
  end
30
25
 
31
26
  class InterpolatedXStringNode < Node
32
- # Returns true if this node was represented as a heredoc in the source code.
33
- def heredoc?: () -> bool?
27
+ def heredoc?: () -> bool
34
28
  end
35
29
 
36
30
  class StringNode < Node
37
- # Returns true if this node was represented as a heredoc in the source code.
38
- def heredoc?: () -> bool?
31
+ def heredoc?: () -> bool
32
+ def to_interpolated: () -> InterpolatedStringNode
39
33
  end
40
34
 
41
35
  class XStringNode < Node
42
- # Returns true if this node was represented as a heredoc in the source code.
43
- def heredoc?: () -> bool?
36
+ def heredoc?: () -> bool
37
+ def to_interpolated: () -> InterpolatedXStringNode
44
38
  end
45
39
 
46
40
  class ImaginaryNode < Node
@@ -49,10 +43,16 @@ module Prism
49
43
 
50
44
  class RationalNode < Node
51
45
  def value: () -> Rational
46
+ def numeric: () -> (IntegerNode | FloatNode)
52
47
  end
53
48
 
54
49
  class ConstantReadNode < Node
55
- def full_name_parts: () -> [Symbol]
50
+ def full_name_parts: () -> Array[Symbol]
51
+ def full_name: () -> String
52
+ end
53
+
54
+ class ConstantWriteNode < Node
55
+ def full_name_parts: () -> Array[Symbol]
56
56
  def full_name: () -> String
57
57
  end
58
58
 
@@ -65,11 +65,18 @@ module Prism
65
65
 
66
66
  def full_name_parts: () -> Array[Symbol]
67
67
  def full_name: () -> String
68
+ def child: () -> (ConstantReadNode | MissingNode)
68
69
  end
69
70
 
70
71
  class ConstantPathTargetNode < Node
71
72
  def full_name_parts: () -> Array[Symbol]
72
73
  def full_name: () -> String
74
+ def child: () -> (ConstantReadNode | MissingNode)
75
+ end
76
+
77
+ class ConstantTargetNode < Node
78
+ def full_name_parts: () -> Array[Symbol]
79
+ def full_name: () -> String
73
80
  end
74
81
 
75
82
  class ParametersNode < Node
@@ -79,4 +86,64 @@ module Prism
79
86
  class CallNode < Node
80
87
  def full_message_loc: () -> Location?
81
88
  end
89
+
90
+ class CallOperatorWriteNode < Node
91
+ def operator: () -> Symbol
92
+ def operator_loc: () -> Location
93
+ end
94
+
95
+ class ClassVariableOperatorWriteNode < Node
96
+ def operator: () -> Symbol
97
+ def operator_loc: () -> Location
98
+ end
99
+
100
+ class ConstantOperatorWriteNode < Node
101
+ def operator: () -> Symbol
102
+ def operator_loc: () -> Location
103
+ end
104
+
105
+ class ConstantPathOperatorWriteNode < Node
106
+ def operator: () -> Symbol
107
+ def operator_loc: () -> Location
108
+ end
109
+
110
+ class GlobalVariableOperatorWriteNode < Node
111
+ def operator: () -> Symbol
112
+ def operator_loc: () -> Location
113
+ end
114
+
115
+ class IndexOperatorWriteNode < Node
116
+ def operator: () -> Symbol
117
+ def operator_loc: () -> Location
118
+ end
119
+
120
+ class InstanceVariableOperatorWriteNode < Node
121
+ def operator: () -> Symbol
122
+ def operator_loc: () -> Location
123
+ end
124
+
125
+ class LocalVariableOperatorWriteNode < Node
126
+ def operator: () -> Symbol
127
+ def operator_loc: () -> Location
128
+ end
129
+
130
+ class CaseMatchNode < Node
131
+ def consequent: () -> ElseNode?
132
+ end
133
+
134
+ class CaseNode < Node
135
+ def consequent: () -> ElseNode?
136
+ end
137
+
138
+ class IfNode < Node
139
+ def consequent: () -> (ElseNode | IfNode | nil)
140
+ end
141
+
142
+ class RescueNode < Node
143
+ def consequent: () -> RescueNode?
144
+ end
145
+
146
+ class UnlessNode < Node
147
+ def consequent: () -> ElseNode?
148
+ end
82
149
  end
@@ -0,0 +1,38 @@
1
+ module Prism
2
+ class ParseResult < Result
3
+ class Comments
4
+ interface _Target
5
+ def start_offset: () -> Integer
6
+ def end_offset: () -> Integer
7
+ def encloses?: (comment) -> bool
8
+ def leading_comment: (comment) -> void
9
+ def trailing_comment: (comment) -> void
10
+ end
11
+
12
+ class NodeTarget
13
+ include _Target
14
+
15
+ attr_reader node: node
16
+
17
+ def initialize: (node) -> void
18
+ end
19
+
20
+ class LocationTarget
21
+ include _Target
22
+
23
+ attr_reader location: Location
24
+
25
+ def initialize: (Location location) -> void
26
+ end
27
+
28
+ attr_reader parse_result: ParseResult
29
+
30
+ def initialize: (ParseResult parse_result) -> void
31
+ def attach!: () -> void
32
+
33
+ private
34
+
35
+ def nearest_targets: (node, comment) -> [_Target?, _Target, _Target?]
36
+ end
37
+ end
38
+ end
@@ -24,6 +24,7 @@ module Prism
24
24
  def code_units_offset: (Integer byte_offset, Encoding encoding) -> Integer
25
25
  def code_units_cache: (Encoding encoding) -> _CodeUnitsCache
26
26
  def code_units_column: (Integer byte_offset, Encoding encoding) -> Integer
27
+ def deep_freeze: () -> void
27
28
 
28
29
  def self.for: (String source) -> Source
29
30
  end
@@ -145,6 +146,7 @@ module Prism
145
146
 
146
147
  def initialize: (Array[comment] comments, Array[MagicComment] magic_comments, Location? data_loc, Array[ParseError] errors, Array[ParseWarning] warnings, Source source) -> void
147
148
  def deconstruct_keys: (Array[Symbol]? keys) -> Hash[Symbol, untyped]
149
+ def encoding: () -> Encoding
148
150
  def success?: () -> bool
149
151
  def failure?: () -> bool
150
152
  def code_units_cache: (Encoding encoding) -> _CodeUnitsCache
@@ -155,6 +157,7 @@ module Prism
155
157
 
156
158
  def initialize: (ProgramNode value, Array[comment] comments, Array[MagicComment] magic_comments, Location? data_loc, Array[ParseError] errors, Array[ParseWarning] warnings, Source source) -> void
157
159
  def deconstruct_keys: (Array[Symbol]? keys) -> Hash[Symbol, untyped]
160
+ def errors_format: () -> String
158
161
  end
159
162
 
160
163
  class LexResult < Result
@@ -181,6 +184,7 @@ module Prism
181
184
  def deconstruct_keys: (Array[Symbol]? keys) -> Hash[Symbol, untyped]
182
185
  def pretty_print: (untyped q) -> untyped
183
186
  def ==: (untyped other) -> bool
187
+ def deep_freeze: () -> void
184
188
  end
185
189
 
186
190
  class Scope
@@ -45,6 +45,6 @@ module Prism
45
45
  def initialize: (Symbol name, Array[Symbol] flags) -> void
46
46
  end
47
47
 
48
- def self.fields_for: (node_singleton node) -> Array[Field]
48
+ def self.fields_for: (singleton(Node) node) -> Array[Field]
49
49
  end
50
50
  end
data/sig/prism.rbs CHANGED
@@ -6,6 +6,10 @@ module Prism
6
6
  BACKEND: :CEXT | :FFI
7
7
  VERSION: String
8
8
 
9
+ class CurrentVersionError < ArgumentError
10
+ def initialize: (String version) -> void
11
+ end
12
+
9
13
  # Methods taking a Ruby source code string:
10
14
 
11
15
  def self.parse: (
data/src/diagnostic.c CHANGED
@@ -1,3 +1,5 @@
1
+ /* :markup: markdown */
2
+
1
3
  /*----------------------------------------------------------------------------*/
2
4
  /* This file is generated by the templates/template.rb script and should not */
3
5
  /* be modified manually. See */
@@ -8,7 +10,7 @@
8
10
 
9
11
  #include "prism/diagnostic.h"
10
12
 
11
- #define PM_DIAGNOSTIC_ID_MAX 319
13
+ #define PM_DIAGNOSTIC_ID_MAX 322
12
14
 
13
15
  /** This struct holds the data for each diagnostic. */
14
16
  typedef struct {
@@ -152,6 +154,7 @@ static const pm_diagnostic_data_t diagnostic_messages[PM_DIAGNOSTIC_ID_MAX] = {
152
154
  [PM_ERR_CONDITIONAL_WHILE_PREDICATE] = { "expected a predicate expression for the `while` statement", PM_ERROR_LEVEL_SYNTAX },
153
155
  [PM_ERR_CONSTANT_PATH_COLON_COLON_CONSTANT] = { "expected a constant after the `::` operator", PM_ERROR_LEVEL_SYNTAX },
154
156
  [PM_ERR_DEF_ENDLESS] = { "could not parse the endless method body", PM_ERROR_LEVEL_SYNTAX },
157
+ [PM_ERR_DEF_ENDLESS_PARAMETERS] = { "could not parse the endless method parameters", PM_ERROR_LEVEL_SYNTAX },
155
158
  [PM_ERR_DEF_ENDLESS_SETTER] = { "invalid method name; a setter method cannot be defined in an endless method definition", PM_ERROR_LEVEL_SYNTAX },
156
159
  [PM_ERR_DEF_NAME] = { "unexpected %s; expected a method name", PM_ERROR_LEVEL_SYNTAX },
157
160
  [PM_ERR_DEF_PARAMS_TERM] = { "expected a delimiter to close the parameters", PM_ERROR_LEVEL_SYNTAX },
@@ -192,6 +195,8 @@ static const pm_diagnostic_data_t diagnostic_messages[PM_DIAGNOSTIC_ID_MAX] = {
192
195
  [PM_ERR_EXPECT_FOR_DELIMITER] = { "unexpected %s; expected a 'do', newline, or ';' after the 'for' loop collection", PM_ERROR_LEVEL_SYNTAX },
193
196
  [PM_ERR_EXPECT_IDENT_REQ_PARAMETER] = { "expected an identifier for the required parameter", PM_ERROR_LEVEL_SYNTAX },
194
197
  [PM_ERR_EXPECT_IN_DELIMITER] = { "expected a delimiter after the patterns of an `in` clause", PM_ERROR_LEVEL_SYNTAX },
198
+ [PM_ERR_EXPECT_LPAREN_AFTER_NOT_LPAREN] = { "expected a `(` immediately after `not`", PM_ERROR_LEVEL_SYNTAX },
199
+ [PM_ERR_EXPECT_LPAREN_AFTER_NOT_OTHER] = { "expected a `(` after `not`", PM_ERROR_LEVEL_SYNTAX },
195
200
  [PM_ERR_EXPECT_LPAREN_REQ_PARAMETER] = { "expected a `(` to start a required parameter", PM_ERROR_LEVEL_SYNTAX },
196
201
  [PM_ERR_EXPECT_MESSAGE] = { "unexpected %s; expecting a message to send to the receiver", PM_ERROR_LEVEL_SYNTAX },
197
202
  [PM_ERR_EXPECT_RBRACKET] = { "expected a matching `]`", PM_ERROR_LEVEL_SYNTAX },
@@ -478,6 +483,7 @@ pm_diagnostic_id_human(pm_diagnostic_id_t diag_id) {
478
483
  case PM_ERR_CONDITIONAL_WHILE_PREDICATE: return "conditional_while_predicate";
479
484
  case PM_ERR_CONSTANT_PATH_COLON_COLON_CONSTANT: return "constant_path_colon_colon_constant";
480
485
  case PM_ERR_DEF_ENDLESS: return "def_endless";
486
+ case PM_ERR_DEF_ENDLESS_PARAMETERS: return "def_endless_parameters";
481
487
  case PM_ERR_DEF_ENDLESS_SETTER: return "def_endless_setter";
482
488
  case PM_ERR_DEF_NAME: return "def_name";
483
489
  case PM_ERR_DEF_PARAMS_TERM: return "def_params_term";
@@ -519,6 +525,8 @@ pm_diagnostic_id_human(pm_diagnostic_id_t diag_id) {
519
525
  case PM_ERR_EXPECT_FOR_DELIMITER: return "expect_for_delimiter";
520
526
  case PM_ERR_EXPECT_IDENT_REQ_PARAMETER: return "expect_ident_req_parameter";
521
527
  case PM_ERR_EXPECT_IN_DELIMITER: return "expect_in_delimiter";
528
+ case PM_ERR_EXPECT_LPAREN_AFTER_NOT_LPAREN: return "expect_lparen_after_not_lparen";
529
+ case PM_ERR_EXPECT_LPAREN_AFTER_NOT_OTHER: return "expect_lparen_after_not_other";
522
530
  case PM_ERR_EXPECT_LPAREN_REQ_PARAMETER: return "expect_lparen_req_parameter";
523
531
  case PM_ERR_EXPECT_MESSAGE: return "expect_message";
524
532
  case PM_ERR_EXPECT_RBRACKET: return "expect_rbracket";
data/src/node.c CHANGED
@@ -1,3 +1,5 @@
1
+ /* :markup: markdown */
2
+
1
3
  /*----------------------------------------------------------------------------*/
2
4
  /* This file is generated by the templates/template.rb script and should not */
3
5
  /* be modified manually. See */
data/src/options.c CHANGED
@@ -89,7 +89,7 @@ pm_options_version_set(pm_options_t *options, const char *version, size_t length
89
89
  }
90
90
 
91
91
  if (strncmp(version, "3.5", 3) == 0) {
92
- options->version = PM_OPTIONS_VERSION_LATEST;
92
+ options->version = PM_OPTIONS_VERSION_CRUBY_3_5;
93
93
  return true;
94
94
  }
95
95
 
@@ -108,7 +108,7 @@ pm_options_version_set(pm_options_t *options, const char *version, size_t length
108
108
  }
109
109
 
110
110
  if (strncmp(version, "3.5.", 4) == 0 && is_number(version + 4, length - 4)) {
111
- options->version = PM_OPTIONS_VERSION_LATEST;
111
+ options->version = PM_OPTIONS_VERSION_CRUBY_3_5;
112
112
  return true;
113
113
  }
114
114
  }
data/src/prettyprint.c CHANGED
@@ -1,3 +1,5 @@
1
+ /* :markup: markdown */
2
+
1
3
  /*----------------------------------------------------------------------------*/
2
4
  /* This file is generated by the templates/template.rb script and should not */
3
5
  /* be modified manually. See */