prism 0.26.0 → 0.28.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 (67) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +45 -1
  3. data/Makefile +3 -2
  4. data/config.yml +305 -20
  5. data/docs/configuration.md +1 -0
  6. data/ext/prism/api_node.c +884 -879
  7. data/ext/prism/extconf.rb +23 -4
  8. data/ext/prism/extension.c +16 -9
  9. data/ext/prism/extension.h +1 -1
  10. data/include/prism/ast.h +298 -9
  11. data/include/prism/diagnostic.h +15 -5
  12. data/include/prism/options.h +2 -2
  13. data/include/prism/parser.h +10 -0
  14. data/include/prism/static_literals.h +8 -6
  15. data/include/prism/version.h +2 -2
  16. data/lib/prism/dot_visitor.rb +22 -6
  17. data/lib/prism/dsl.rb +8 -8
  18. data/lib/prism/ffi.rb +4 -4
  19. data/lib/prism/inspect_visitor.rb +2156 -0
  20. data/lib/prism/lex_compat.rb +18 -1
  21. data/lib/prism/mutation_compiler.rb +2 -2
  22. data/lib/prism/node.rb +2345 -1964
  23. data/lib/prism/node_ext.rb +34 -5
  24. data/lib/prism/parse_result/newlines.rb +0 -2
  25. data/lib/prism/parse_result.rb +137 -13
  26. data/lib/prism/pattern.rb +12 -6
  27. data/lib/prism/polyfill/byteindex.rb +13 -0
  28. data/lib/prism/polyfill/unpack1.rb +14 -0
  29. data/lib/prism/reflection.rb +21 -31
  30. data/lib/prism/serialize.rb +27 -17
  31. data/lib/prism/translation/parser/compiler.rb +34 -15
  32. data/lib/prism/translation/parser.rb +6 -6
  33. data/lib/prism/translation/ripper.rb +72 -68
  34. data/lib/prism/translation/ruby_parser.rb +69 -31
  35. data/lib/prism.rb +3 -2
  36. data/prism.gemspec +36 -38
  37. data/rbi/prism/compiler.rbi +3 -5
  38. data/rbi/prism/inspect_visitor.rbi +12 -0
  39. data/rbi/prism/node.rbi +359 -321
  40. data/rbi/prism/parse_result.rbi +85 -34
  41. data/rbi/prism/reflection.rbi +7 -13
  42. data/rbi/prism/translation/ripper.rbi +1 -11
  43. data/rbi/prism.rbi +9 -9
  44. data/sig/prism/dsl.rbs +3 -3
  45. data/sig/prism/inspect_visitor.rbs +22 -0
  46. data/sig/prism/node.rbs +68 -48
  47. data/sig/prism/parse_result.rbs +42 -10
  48. data/sig/prism/reflection.rbs +2 -8
  49. data/sig/prism/serialize.rbs +2 -3
  50. data/sig/prism.rbs +9 -9
  51. data/src/diagnostic.c +44 -24
  52. data/src/node.c +41 -16
  53. data/src/options.c +2 -2
  54. data/src/prettyprint.c +61 -18
  55. data/src/prism.c +623 -188
  56. data/src/serialize.c +5 -2
  57. data/src/static_literals.c +120 -34
  58. data/src/token_type.c +4 -4
  59. data/src/util/pm_integer.c +9 -2
  60. metadata +7 -9
  61. data/lib/prism/node_inspector.rb +0 -68
  62. data/lib/prism/polyfill/string.rb +0 -12
  63. data/rbi/prism/desugar_compiler.rbi +0 -5
  64. data/rbi/prism/mutation_compiler.rbi +0 -5
  65. data/rbi/prism/translation/parser/compiler.rbi +0 -13
  66. data/rbi/prism/translation/ripper/ripper_compiler.rbi +0 -5
  67. data/rbi/prism/translation/ruby_parser.rbi +0 -11
@@ -8,8 +8,7 @@
8
8
 
9
9
  #include "prism/defines.h"
10
10
  #include "prism/ast.h"
11
- #include "prism/node.h"
12
- #include "prism/parser.h"
11
+ #include "prism/util/pm_newline_list.h"
13
12
 
14
13
  #include <assert.h>
15
14
  #include <stdbool.h>
@@ -92,12 +91,13 @@ typedef struct {
92
91
  /**
93
92
  * Add a node to the set of static literals.
94
93
  *
95
- * @param parser The parser that created the node.
94
+ * @param newline_list The list of newline offsets to use to calculate lines.
95
+ * @param start_line The line number that the parser starts on.
96
96
  * @param literals The set of static literals to add the node to.
97
97
  * @param node The node to add to the set.
98
98
  * @return A pointer to the node that is being overwritten, if there is one.
99
99
  */
100
- pm_node_t * pm_static_literals_add(const pm_parser_t *parser, pm_static_literals_t *literals, pm_node_t *node);
100
+ pm_node_t * pm_static_literals_add(const pm_newline_list_t *newline_list, int32_t start_line, pm_static_literals_t *literals, pm_node_t *node);
101
101
 
102
102
  /**
103
103
  * Free the internal memory associated with the given static literals set.
@@ -110,9 +110,11 @@ void pm_static_literals_free(pm_static_literals_t *literals);
110
110
  * Create a string-based representation of the given static literal.
111
111
  *
112
112
  * @param buffer The buffer to write the string to.
113
- * @param parser The parser that created the node.
113
+ * @param newline_list The list of newline offsets to use to calculate lines.
114
+ * @param start_line The line number that the parser starts on.
115
+ * @param encoding_name The name of the encoding of the source being parsed.
114
116
  * @param node The node to create a string representation of.
115
117
  */
116
- PRISM_EXPORTED_FUNCTION void pm_static_literal_inspect(pm_buffer_t *buffer, const pm_parser_t *parser, const pm_node_t *node);
118
+ PRISM_EXPORTED_FUNCTION void pm_static_literal_inspect(pm_buffer_t *buffer, const pm_newline_list_t *newline_list, int32_t start_line, const char *encoding_name, const pm_node_t *node);
117
119
 
118
120
  #endif
@@ -14,7 +14,7 @@
14
14
  /**
15
15
  * The minor version of the Prism library as an int.
16
16
  */
17
- #define PRISM_VERSION_MINOR 26
17
+ #define PRISM_VERSION_MINOR 28
18
18
 
19
19
  /**
20
20
  * The patch version of the Prism library as an int.
@@ -24,6 +24,6 @@
24
24
  /**
25
25
  * The version of the Prism library as a constant string.
26
26
  */
27
- #define PRISM_VERSION "0.26.0"
27
+ #define PRISM_VERSION "0.28.0"
28
28
 
29
29
  #endif
@@ -1287,13 +1287,15 @@ module Prism
1287
1287
  digraph.edge("#{id}:parent -> #{node_id(parent)};")
1288
1288
  end
1289
1289
 
1290
- # child
1291
- table.field("child", port: true)
1292
- digraph.edge("#{id}:child -> #{node_id(node.child)};")
1290
+ # name
1291
+ table.field("name", node.name.inspect)
1293
1292
 
1294
1293
  # delimiter_loc
1295
1294
  table.field("delimiter_loc", location_inspect(node.delimiter_loc))
1296
1295
 
1296
+ # name_loc
1297
+ table.field("name_loc", location_inspect(node.name_loc))
1298
+
1297
1299
  digraph.nodes << <<~DOT
1298
1300
  #{id} [
1299
1301
  label=<#{table.to_dot.gsub(/\n/, "\n ")}>
@@ -1367,13 +1369,15 @@ module Prism
1367
1369
  digraph.edge("#{id}:parent -> #{node_id(parent)};")
1368
1370
  end
1369
1371
 
1370
- # child
1371
- table.field("child", port: true)
1372
- digraph.edge("#{id}:child -> #{node_id(node.child)};")
1372
+ # name
1373
+ table.field("name", node.name.inspect)
1373
1374
 
1374
1375
  # delimiter_loc
1375
1376
  table.field("delimiter_loc", location_inspect(node.delimiter_loc))
1376
1377
 
1378
+ # name_loc
1379
+ table.field("name_loc", location_inspect(node.name_loc))
1380
+
1377
1381
  digraph.nodes << <<~DOT
1378
1382
  #{id} [
1379
1383
  label=<#{table.to_dot.gsub(/\n/, "\n ")}>
@@ -3999,6 +4003,9 @@ module Prism
3999
4003
  table = Table.new("ReturnNode")
4000
4004
  id = node_id(node)
4001
4005
 
4006
+ # flags
4007
+ table.field("flags", return_node_flags_inspect(node))
4008
+
4002
4009
  # keyword_loc
4003
4010
  table.field("keyword_loc", location_inspect(node.keyword_loc))
4004
4011
 
@@ -4569,6 +4576,7 @@ module Prism
4569
4576
  # comma-separated list.
4570
4577
  def arguments_node_flags_inspect(node)
4571
4578
  flags = [] #: Array[String]
4579
+ flags << "contains_keywords" if node.contains_keywords?
4572
4580
  flags << "contains_keyword_splat" if node.contains_keyword_splat?
4573
4581
  flags.join(", ")
4574
4582
  end
@@ -4671,6 +4679,14 @@ module Prism
4671
4679
  flags.join(", ")
4672
4680
  end
4673
4681
 
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
+
4674
4690
  # Inspect a node that has shareable_constant_node_flags flags to display the flags as a
4675
4691
  # comma-separated list.
4676
4692
  def shareable_constant_node_flags_inspect(node)
data/lib/prism/dsl.rb CHANGED
@@ -10,7 +10,7 @@ module Prism
10
10
  # The DSL module provides a set of methods that can be used to create prism
11
11
  # nodes in a more concise manner. For example, instead of writing:
12
12
  #
13
- # source = Prism::Source.new("[1]")
13
+ # source = Prism::Source.for("[1]")
14
14
  #
15
15
  # Prism::ArrayNode.new(
16
16
  # [
@@ -28,7 +28,7 @@ module Prism
28
28
  #
29
29
  # you could instead write:
30
30
  #
31
- # source = Prism::Source.new("[1]")
31
+ # source = Prism::Source.for("[1]")
32
32
  #
33
33
  # ArrayNode(
34
34
  # IntegerNode(Prism::IntegerBaseFlags::DECIMAL, 1, Location(source, 1, 1)), source),
@@ -228,8 +228,8 @@ module Prism
228
228
  end
229
229
 
230
230
  # Create a new ConstantPathNode node
231
- def ConstantPathNode(parent, child, delimiter_loc, source = nil, location = Location())
232
- ConstantPathNode.new(source, parent, child, delimiter_loc, location)
231
+ def ConstantPathNode(parent, name, delimiter_loc, name_loc, source = nil, location = Location())
232
+ ConstantPathNode.new(source, parent, name, delimiter_loc, name_loc, location)
233
233
  end
234
234
 
235
235
  # Create a new ConstantPathOperatorWriteNode node
@@ -243,8 +243,8 @@ module Prism
243
243
  end
244
244
 
245
245
  # Create a new ConstantPathTargetNode node
246
- def ConstantPathTargetNode(parent, child, delimiter_loc, source = nil, location = Location())
247
- ConstantPathTargetNode.new(source, parent, child, delimiter_loc, location)
246
+ def ConstantPathTargetNode(parent, name, delimiter_loc, name_loc, source = nil, location = Location())
247
+ ConstantPathTargetNode.new(source, parent, name, delimiter_loc, name_loc, location)
248
248
  end
249
249
 
250
250
  # Create a new ConstantPathWriteNode node
@@ -698,8 +698,8 @@ module Prism
698
698
  end
699
699
 
700
700
  # Create a new ReturnNode node
701
- def ReturnNode(keyword_loc, arguments, source = nil, location = Location())
702
- ReturnNode.new(source, keyword_loc, arguments, location)
701
+ def ReturnNode(flags, keyword_loc, arguments, source = nil, location = Location())
702
+ ReturnNode.new(source, flags, keyword_loc, arguments, location)
703
703
  end
704
704
 
705
705
  # Create a new SelfNode node
data/lib/prism/ffi.rb CHANGED
@@ -317,7 +317,7 @@ module Prism
317
317
  buffer.read
318
318
  end
319
319
 
320
- Serialize.load_tokens(Source.new(code), serialized)
320
+ Serialize.load_tokens(Source.for(code), serialized)
321
321
  end
322
322
 
323
323
  def parse_common(string, code, options) # :nodoc:
@@ -329,7 +329,7 @@ module Prism
329
329
  LibRubyParser::PrismBuffer.with do |buffer|
330
330
  LibRubyParser.pm_serialize_parse_comments(buffer.pointer, string.pointer, string.length, dump_options(options))
331
331
 
332
- source = Source.new(code)
332
+ source = Source.for(code)
333
333
  loader = Serialize::Loader.new(source, buffer.read)
334
334
 
335
335
  loader.load_header
@@ -343,14 +343,14 @@ module Prism
343
343
  LibRubyParser::PrismBuffer.with do |buffer|
344
344
  LibRubyParser.pm_serialize_parse_lex(buffer.pointer, string.pointer, string.length, dump_options(options))
345
345
 
346
- source = Source.new(code)
346
+ source = Source.for(code)
347
347
  loader = Serialize::Loader.new(source, buffer.read)
348
348
 
349
349
  tokens = loader.load_tokens
350
350
  node, comments, magic_comments, data_loc, errors, warnings = loader.load_nodes
351
351
  tokens.each { |token,| token.value.force_encoding(loader.encoding) }
352
352
 
353
- ParseResult.new([node, tokens], comments, magic_comments, data_loc, errors, warnings, source)
353
+ ParseLexResult.new([node, tokens], comments, magic_comments, data_loc, errors, warnings, source)
354
354
  end
355
355
  end
356
356