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
data/ext/prism/extconf.rb CHANGED
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "rbconfig"
4
+
3
5
  if ARGV.delete("--help")
4
6
  print(<<~TEXT)
5
7
  USAGE: ruby #{$PROGRAM_NAME} [options]
@@ -40,26 +42,6 @@ def generate_templates
40
42
  end
41
43
  end
42
44
 
43
- # We're going to need to run `make` using prism's `Makefile`. We want to match
44
- # up as much of the configuration to the configuration that built the current
45
- # version of Ruby as possible.
46
- require "rbconfig"
47
- env = RbConfig::CONFIG.slice("SOEXT", "CPPFLAGS", "CFLAGS", "CC", "AR", "ARFLAGS", "MAKEDIRS", "RMALL")
48
-
49
- # It's possible that the Ruby that is being run wasn't actually compiled on this
50
- # machine, in which case the configuration might be incorrect. In this case
51
- # we'll need to do some additional checks and potentially fall back to defaults.
52
- if env.key?("CC") && !File.exist?(env["CC"])
53
- env.delete("CC")
54
- env.delete("CFLAGS")
55
- env.delete("CPPFLAGS")
56
- end
57
-
58
- if env.key?("AR") && !File.exist?(env["AR"])
59
- env.delete("AR")
60
- env.delete("ARFLAGS")
61
- end
62
-
63
45
  # Runs `make` in the root directory of the project. Note that this is the
64
46
  # `Makefile` for the overall project, not the `Makefile` that is being generated
65
47
  # by this script.`
@@ -77,15 +59,37 @@ end
77
59
 
78
60
  # On non-CRuby we only need the shared library since we'll interface with it
79
61
  # through FFI, so we'll build only that and not the C extension. We also avoid
80
- # `require "mkmf"` as that prepends the LLVM toolchain to PATH on TruffleRuby,
81
- # but we want to use the native toolchain here since libprism is run natively.
62
+ # `require "mkmf"` as that prepends the GraalVM LLVM toolchain to PATH on TruffleRuby < 24.0,
63
+ # but we want to use the system toolchain here since libprism is run natively.
82
64
  if RUBY_ENGINE != "ruby"
83
65
  generate_templates
84
- make(env, "build/libprism.#{RbConfig::CONFIG["SOEXT"]}")
66
+ soext = RbConfig::CONFIG["SOEXT"]
67
+ # Pass SOEXT to avoid an extra subprocess just to query that
68
+ make({ "SOEXT" => soext }, "build/libprism.#{soext}")
85
69
  File.write("Makefile", "all install clean:\n\t@#{RbConfig::CONFIG["NULLCMD"]}\n")
86
70
  return
87
71
  end
88
72
 
73
+ # We're going to need to run `make` using prism's `Makefile`.
74
+ # We want to use the same toolchain (compiler, flags, etc) to compile libprism.a and
75
+ # the C extension since they will be linked together.
76
+ # The C extension uses RbConfig, which contains values from the toolchain that built the running Ruby.
77
+ env = RbConfig::CONFIG.slice("SOEXT", "CPPFLAGS", "CFLAGS", "CC", "AR", "ARFLAGS", "MAKEDIRS", "RMALL")
78
+
79
+ # It's possible that the Ruby that is being run wasn't actually compiled on this
80
+ # machine, in which case parts of RbConfig might be incorrect. In this case
81
+ # we'll need to do some additional checks and potentially fall back to defaults.
82
+ if env.key?("CC") && !File.exist?(env["CC"])
83
+ env.delete("CC")
84
+ env.delete("CFLAGS")
85
+ env.delete("CPPFLAGS")
86
+ end
87
+
88
+ if env.key?("AR") && !File.exist?(env["AR"])
89
+ env.delete("AR")
90
+ env.delete("ARFLAGS")
91
+ end
92
+
89
93
  require "mkmf"
90
94
 
91
95
  # First, ensure that we can find the header for the prism library.
@@ -32,6 +32,7 @@ ID rb_option_id_frozen_string_literal;
32
32
  ID rb_option_id_line;
33
33
  ID rb_option_id_scopes;
34
34
  ID rb_option_id_version;
35
+ ID rb_prism_source_id_for;
35
36
 
36
37
  /******************************************************************************/
37
38
  /* IO of Ruby code */
@@ -599,8 +600,7 @@ parse_lex_input(pm_string_t *input, const pm_options_t *options, bool return_nod
599
600
 
600
601
  VALUE source_string = rb_str_new((const char *) pm_string_source(input), pm_string_length(input));
601
602
  VALUE offsets = rb_ary_new();
602
- VALUE source_argv[] = { source_string, LONG2NUM(parser.start_line), offsets };
603
- VALUE source = rb_class_new_instance(3, source_argv, rb_cPrismSource);
603
+ VALUE source = rb_funcall(rb_cPrismSource, rb_prism_source_id_for, 3, source_string, LONG2NUM(parser.start_line), offsets);
604
604
 
605
605
  parse_lex_data_t parse_lex_data = {
606
606
  .source = source,
@@ -1243,7 +1243,7 @@ static_inspect(int argc, VALUE *argv, VALUE self) {
1243
1243
  pm_node_t *node = ((pm_program_node_t *) program)->statements->body.nodes[0];
1244
1244
 
1245
1245
  pm_buffer_t buffer = { 0 };
1246
- pm_static_literal_inspect(&buffer, &parser, node);
1246
+ pm_static_literal_inspect(&buffer, &parser.newline_list, parser.start_line, parser.encoding->name, node);
1247
1247
 
1248
1248
  rb_encoding *encoding = rb_enc_find(parser.encoding->name);
1249
1249
  VALUE result = rb_enc_str_new(pm_buffer_value(&buffer), pm_buffer_length(&buffer), encoding);
@@ -1379,6 +1379,8 @@ Init_prism(void) {
1379
1379
  rb_option_id_scopes = rb_intern_const("scopes");
1380
1380
  rb_option_id_version = rb_intern_const("version");
1381
1381
 
1382
+ rb_prism_source_id_for = rb_intern("for");
1383
+
1382
1384
  /**
1383
1385
  * The version of the prism library.
1384
1386
  */
@@ -1,7 +1,7 @@
1
1
  #ifndef PRISM_EXT_NODE_H
2
2
  #define PRISM_EXT_NODE_H
3
3
 
4
- #define EXPECTED_PRISM_VERSION "0.27.0"
4
+ #define EXPECTED_PRISM_VERSION "0.29.0"
5
5
 
6
6
  #include <ruby.h>
7
7
  #include <ruby/encoding.h>
data/include/prism/ast.h CHANGED
@@ -1235,6 +1235,7 @@ typedef struct pm_and_node {
1235
1235
  *
1236
1236
  * Type: PM_ARGUMENTS_NODE
1237
1237
  * Flags:
1238
+ * PM_ARGUMENTS_NODE_FLAGS_CONTAINS_KEYWORDS
1238
1239
  * PM_ARGUMENTS_NODE_FLAGS_CONTAINS_KEYWORD_SPLAT
1239
1240
  *
1240
1241
  * @extends pm_node_t
@@ -1817,14 +1818,14 @@ typedef struct pm_call_operator_write_node {
1817
1818
  pm_constant_id_t write_name;
1818
1819
 
1819
1820
  /**
1820
- * CallOperatorWriteNode#operator
1821
+ * CallOperatorWriteNode#binary_operator
1821
1822
  */
1822
- pm_constant_id_t operator;
1823
+ pm_constant_id_t binary_operator;
1823
1824
 
1824
1825
  /**
1825
- * CallOperatorWriteNode#operator_loc
1826
+ * CallOperatorWriteNode#binary_operator_loc
1826
1827
  */
1827
- pm_location_t operator_loc;
1828
+ pm_location_t binary_operator_loc;
1828
1829
 
1829
1830
  /**
1830
1831
  * CallOperatorWriteNode#value
@@ -2128,9 +2129,9 @@ typedef struct pm_class_variable_operator_write_node {
2128
2129
  pm_location_t name_loc;
2129
2130
 
2130
2131
  /**
2131
- * ClassVariableOperatorWriteNode#operator_loc
2132
+ * ClassVariableOperatorWriteNode#binary_operator_loc
2132
2133
  */
2133
- pm_location_t operator_loc;
2134
+ pm_location_t binary_operator_loc;
2134
2135
 
2135
2136
  /**
2136
2137
  * ClassVariableOperatorWriteNode#value
@@ -2138,9 +2139,9 @@ typedef struct pm_class_variable_operator_write_node {
2138
2139
  struct pm_node *value;
2139
2140
 
2140
2141
  /**
2141
- * ClassVariableOperatorWriteNode#operator
2142
+ * ClassVariableOperatorWriteNode#binary_operator
2142
2143
  */
2143
- pm_constant_id_t operator;
2144
+ pm_constant_id_t binary_operator;
2144
2145
  } pm_class_variable_operator_write_node_t;
2145
2146
 
2146
2147
  /**
@@ -2325,9 +2326,9 @@ typedef struct pm_constant_operator_write_node {
2325
2326
  pm_location_t name_loc;
2326
2327
 
2327
2328
  /**
2328
- * ConstantOperatorWriteNode#operator_loc
2329
+ * ConstantOperatorWriteNode#binary_operator_loc
2329
2330
  */
2330
- pm_location_t operator_loc;
2331
+ pm_location_t binary_operator_loc;
2331
2332
 
2332
2333
  /**
2333
2334
  * ConstantOperatorWriteNode#value
@@ -2335,9 +2336,9 @@ typedef struct pm_constant_operator_write_node {
2335
2336
  struct pm_node *value;
2336
2337
 
2337
2338
  /**
2338
- * ConstantOperatorWriteNode#operator
2339
+ * ConstantOperatorWriteNode#binary_operator
2339
2340
  */
2340
- pm_constant_id_t operator;
2341
+ pm_constant_id_t binary_operator;
2341
2342
  } pm_constant_operator_write_node_t;
2342
2343
 
2343
2344
  /**
@@ -2427,21 +2428,11 @@ typedef struct pm_constant_path_node {
2427
2428
  struct pm_node *parent;
2428
2429
 
2429
2430
  /**
2430
- * ConstantPathNode#child
2431
- *
2432
- * The right-hand node of the path. Always a `ConstantReadNode` in a
2433
- * valid Ruby syntax tree.
2434
- *
2435
- * ::Foo
2436
- * ^^^
2437
- *
2438
- * self::Test
2439
- * ^^^^
2431
+ * ConstantPathNode#name
2440
2432
  *
2441
- * a.b::C
2442
- * ^
2433
+ * The name of the constant being accessed. This could be `nil` in the event of a syntax error.
2443
2434
  */
2444
- struct pm_node *child;
2435
+ pm_constant_id_t name;
2445
2436
 
2446
2437
  /**
2447
2438
  * ConstantPathNode#delimiter_loc
@@ -2455,6 +2446,19 @@ typedef struct pm_constant_path_node {
2455
2446
  * ^^
2456
2447
  */
2457
2448
  pm_location_t delimiter_loc;
2449
+
2450
+ /**
2451
+ * ConstantPathNode#name_loc
2452
+ *
2453
+ * The location of the name of the constant.
2454
+ *
2455
+ * ::Foo
2456
+ * ^^^
2457
+ *
2458
+ * One::Two
2459
+ * ^^^
2460
+ */
2461
+ pm_location_t name_loc;
2458
2462
  } pm_constant_path_node_t;
2459
2463
 
2460
2464
  /**
@@ -2474,9 +2478,9 @@ typedef struct pm_constant_path_operator_write_node {
2474
2478
  struct pm_constant_path_node *target;
2475
2479
 
2476
2480
  /**
2477
- * ConstantPathOperatorWriteNode#operator_loc
2481
+ * ConstantPathOperatorWriteNode#binary_operator_loc
2478
2482
  */
2479
- pm_location_t operator_loc;
2483
+ pm_location_t binary_operator_loc;
2480
2484
 
2481
2485
  /**
2482
2486
  * ConstantPathOperatorWriteNode#value
@@ -2484,9 +2488,9 @@ typedef struct pm_constant_path_operator_write_node {
2484
2488
  struct pm_node *value;
2485
2489
 
2486
2490
  /**
2487
- * ConstantPathOperatorWriteNode#operator
2491
+ * ConstantPathOperatorWriteNode#binary_operator
2488
2492
  */
2489
- pm_constant_id_t operator;
2493
+ pm_constant_id_t binary_operator;
2490
2494
  } pm_constant_path_operator_write_node_t;
2491
2495
 
2492
2496
  /**
@@ -2533,14 +2537,19 @@ typedef struct pm_constant_path_target_node {
2533
2537
  struct pm_node *parent;
2534
2538
 
2535
2539
  /**
2536
- * ConstantPathTargetNode#child
2540
+ * ConstantPathTargetNode#name
2537
2541
  */
2538
- struct pm_node *child;
2542
+ pm_constant_id_t name;
2539
2543
 
2540
2544
  /**
2541
2545
  * ConstantPathTargetNode#delimiter_loc
2542
2546
  */
2543
2547
  pm_location_t delimiter_loc;
2548
+
2549
+ /**
2550
+ * ConstantPathTargetNode#name_loc
2551
+ */
2552
+ pm_location_t name_loc;
2544
2553
  } pm_constant_path_target_node_t;
2545
2554
 
2546
2555
  /**
@@ -3135,9 +3144,9 @@ typedef struct pm_global_variable_operator_write_node {
3135
3144
  pm_location_t name_loc;
3136
3145
 
3137
3146
  /**
3138
- * GlobalVariableOperatorWriteNode#operator_loc
3147
+ * GlobalVariableOperatorWriteNode#binary_operator_loc
3139
3148
  */
3140
- pm_location_t operator_loc;
3149
+ pm_location_t binary_operator_loc;
3141
3150
 
3142
3151
  /**
3143
3152
  * GlobalVariableOperatorWriteNode#value
@@ -3145,9 +3154,9 @@ typedef struct pm_global_variable_operator_write_node {
3145
3154
  struct pm_node *value;
3146
3155
 
3147
3156
  /**
3148
- * GlobalVariableOperatorWriteNode#operator
3157
+ * GlobalVariableOperatorWriteNode#binary_operator
3149
3158
  */
3150
- pm_constant_id_t operator;
3159
+ pm_constant_id_t binary_operator;
3151
3160
  } pm_global_variable_operator_write_node_t;
3152
3161
 
3153
3162
  /**
@@ -3642,14 +3651,14 @@ typedef struct pm_index_operator_write_node {
3642
3651
  struct pm_node *block;
3643
3652
 
3644
3653
  /**
3645
- * IndexOperatorWriteNode#operator
3654
+ * IndexOperatorWriteNode#binary_operator
3646
3655
  */
3647
- pm_constant_id_t operator;
3656
+ pm_constant_id_t binary_operator;
3648
3657
 
3649
3658
  /**
3650
- * IndexOperatorWriteNode#operator_loc
3659
+ * IndexOperatorWriteNode#binary_operator_loc
3651
3660
  */
3652
- pm_location_t operator_loc;
3661
+ pm_location_t binary_operator_loc;
3653
3662
 
3654
3663
  /**
3655
3664
  * IndexOperatorWriteNode#value
@@ -3810,9 +3819,9 @@ typedef struct pm_instance_variable_operator_write_node {
3810
3819
  pm_location_t name_loc;
3811
3820
 
3812
3821
  /**
3813
- * InstanceVariableOperatorWriteNode#operator_loc
3822
+ * InstanceVariableOperatorWriteNode#binary_operator_loc
3814
3823
  */
3815
- pm_location_t operator_loc;
3824
+ pm_location_t binary_operator_loc;
3816
3825
 
3817
3826
  /**
3818
3827
  * InstanceVariableOperatorWriteNode#value
@@ -3820,9 +3829,9 @@ typedef struct pm_instance_variable_operator_write_node {
3820
3829
  struct pm_node *value;
3821
3830
 
3822
3831
  /**
3823
- * InstanceVariableOperatorWriteNode#operator
3832
+ * InstanceVariableOperatorWriteNode#binary_operator
3824
3833
  */
3825
- pm_constant_id_t operator;
3834
+ pm_constant_id_t binary_operator;
3826
3835
  } pm_instance_variable_operator_write_node_t;
3827
3836
 
3828
3837
  /**
@@ -4295,9 +4304,9 @@ typedef struct pm_local_variable_operator_write_node {
4295
4304
  pm_location_t name_loc;
4296
4305
 
4297
4306
  /**
4298
- * LocalVariableOperatorWriteNode#operator_loc
4307
+ * LocalVariableOperatorWriteNode#binary_operator_loc
4299
4308
  */
4300
- pm_location_t operator_loc;
4309
+ pm_location_t binary_operator_loc;
4301
4310
 
4302
4311
  /**
4303
4312
  * LocalVariableOperatorWriteNode#value
@@ -4310,9 +4319,9 @@ typedef struct pm_local_variable_operator_write_node {
4310
4319
  pm_constant_id_t name;
4311
4320
 
4312
4321
  /**
4313
- * LocalVariableOperatorWriteNode#operator
4322
+ * LocalVariableOperatorWriteNode#binary_operator
4314
4323
  */
4315
- pm_constant_id_t operator;
4324
+ pm_constant_id_t binary_operator;
4316
4325
 
4317
4326
  /**
4318
4327
  * LocalVariableOperatorWriteNode#depth
@@ -5455,6 +5464,8 @@ typedef struct pm_retry_node {
5455
5464
  * ReturnNode
5456
5465
  *
5457
5466
  * Type: PM_RETURN_NODE
5467
+ * Flags:
5468
+ * PM_RETURN_NODE_FLAGS_REDUNDANT
5458
5469
  *
5459
5470
  * @extends pm_node_t
5460
5471
  */
@@ -6029,8 +6040,11 @@ typedef struct pm_yield_node {
6029
6040
  * Flags for arguments nodes.
6030
6041
  */
6031
6042
  typedef enum pm_arguments_node_flags {
6043
+ /** if arguments contain keywords */
6044
+ PM_ARGUMENTS_NODE_FLAGS_CONTAINS_KEYWORDS = 1,
6045
+
6032
6046
  /** if arguments contain keyword splat */
6033
- PM_ARGUMENTS_NODE_FLAGS_CONTAINS_KEYWORD_SPLAT = 1,
6047
+ PM_ARGUMENTS_NODE_FLAGS_CONTAINS_KEYWORD_SPLAT = 2,
6034
6048
  } pm_arguments_node_flags_t;
6035
6049
 
6036
6050
  /**
@@ -6167,6 +6181,14 @@ typedef enum pm_regular_expression_flags {
6167
6181
  PM_REGULAR_EXPRESSION_FLAGS_FORCED_US_ASCII_ENCODING = 1024,
6168
6182
  } pm_regular_expression_flags_t;
6169
6183
 
6184
+ /**
6185
+ * Flags for return nodes.
6186
+ */
6187
+ typedef enum pm_return_node_flags {
6188
+ /** a return statement that is redundant because it is the last statement in a method */
6189
+ PM_RETURN_NODE_FLAGS_REDUNDANT = 1,
6190
+ } pm_return_node_flags_t;
6191
+
6170
6192
  /**
6171
6193
  * Flags for shareable constant nodes.
6172
6194
  */
@@ -36,13 +36,16 @@ typedef enum {
36
36
  PM_ERR_ARGUMENT_BARE_HASH,
37
37
  PM_ERR_ARGUMENT_BLOCK_FORWARDING,
38
38
  PM_ERR_ARGUMENT_BLOCK_MULTI,
39
+ PM_ERR_ARGUMENT_CONFLICT_AMPERSAND,
40
+ PM_ERR_ARGUMENT_CONFLICT_STAR,
41
+ PM_ERR_ARGUMENT_CONFLICT_STAR_STAR,
39
42
  PM_ERR_ARGUMENT_FORMAL_CLASS,
40
43
  PM_ERR_ARGUMENT_FORMAL_CONSTANT,
41
44
  PM_ERR_ARGUMENT_FORMAL_GLOBAL,
42
45
  PM_ERR_ARGUMENT_FORMAL_IVAR,
43
46
  PM_ERR_ARGUMENT_FORWARDING_UNBOUND,
44
47
  PM_ERR_ARGUMENT_IN,
45
- PM_ERR_ARGUMENT_NO_FORWARDING_AMP,
48
+ PM_ERR_ARGUMENT_NO_FORWARDING_AMPERSAND,
46
49
  PM_ERR_ARGUMENT_NO_FORWARDING_ELLIPSES,
47
50
  PM_ERR_ARGUMENT_NO_FORWARDING_STAR,
48
51
  PM_ERR_ARGUMENT_NO_FORWARDING_STAR_STAR,
@@ -124,6 +127,7 @@ typedef enum {
124
127
  PM_ERR_EXPECT_EXPRESSION_AFTER_SPLAT_HASH,
125
128
  PM_ERR_EXPECT_EXPRESSION_AFTER_STAR,
126
129
  PM_ERR_EXPECT_IDENT_REQ_PARAMETER,
130
+ PM_ERR_EXPECT_IN_DELIMITER,
127
131
  PM_ERR_EXPECT_LPAREN_REQ_PARAMETER,
128
132
  PM_ERR_EXPECT_MESSAGE,
129
133
  PM_ERR_EXPECT_RBRACKET,
@@ -152,16 +156,18 @@ typedef enum {
152
156
  PM_ERR_HASH_ROCKET,
153
157
  PM_ERR_HASH_TERM,
154
158
  PM_ERR_HASH_VALUE,
159
+ PM_ERR_HEREDOC_IDENTIFIER,
155
160
  PM_ERR_HEREDOC_TERM,
156
161
  PM_ERR_INCOMPLETE_QUESTION_MARK,
157
162
  PM_ERR_INCOMPLETE_VARIABLE_CLASS,
158
- PM_ERR_INCOMPLETE_VARIABLE_CLASS_3_3_0,
163
+ PM_ERR_INCOMPLETE_VARIABLE_CLASS_3_3,
159
164
  PM_ERR_INCOMPLETE_VARIABLE_INSTANCE,
160
- PM_ERR_INCOMPLETE_VARIABLE_INSTANCE_3_3_0,
165
+ PM_ERR_INCOMPLETE_VARIABLE_INSTANCE_3_3,
161
166
  PM_ERR_INSTANCE_VARIABLE_BARE,
162
167
  PM_ERR_INVALID_BLOCK_EXIT,
163
168
  PM_ERR_INVALID_CHARACTER,
164
169
  PM_ERR_INVALID_ENCODING_MAGIC_COMMENT,
170
+ PM_ERR_INVALID_ESCAPE_CHARACTER,
165
171
  PM_ERR_INVALID_FLOAT_EXPONENT,
166
172
  PM_ERR_INVALID_LOCAL_VARIABLE_READ,
167
173
  PM_ERR_INVALID_LOCAL_VARIABLE_WRITE,
@@ -170,16 +176,19 @@ typedef enum {
170
176
  PM_ERR_INVALID_MULTIBYTE_ESCAPE,
171
177
  PM_ERR_INVALID_NUMBER_BINARY,
172
178
  PM_ERR_INVALID_NUMBER_DECIMAL,
179
+ PM_ERR_INVALID_NUMBER_FRACTION,
173
180
  PM_ERR_INVALID_NUMBER_HEXADECIMAL,
174
181
  PM_ERR_INVALID_NUMBER_OCTAL,
175
- PM_ERR_INVALID_NUMBER_UNDERSCORE,
182
+ PM_ERR_INVALID_NUMBER_UNDERSCORE_INNER,
183
+ PM_ERR_INVALID_NUMBER_UNDERSCORE_TRAILING,
176
184
  PM_ERR_INVALID_PERCENT,
177
185
  PM_ERR_INVALID_PRINTABLE_CHARACTER,
178
186
  PM_ERR_INVALID_RETRY_AFTER_ELSE,
179
187
  PM_ERR_INVALID_RETRY_AFTER_ENSURE,
180
188
  PM_ERR_INVALID_RETRY_WITHOUT_RESCUE,
189
+ PM_ERR_INVALID_SYMBOL,
181
190
  PM_ERR_INVALID_VARIABLE_GLOBAL,
182
- PM_ERR_INVALID_VARIABLE_GLOBAL_3_3_0,
191
+ PM_ERR_INVALID_VARIABLE_GLOBAL_3_3,
183
192
  PM_ERR_INVALID_YIELD,
184
193
  PM_ERR_IT_NOT_ALLOWED_NUMBERED,
185
194
  PM_ERR_IT_NOT_ALLOWED_ORDINARY,
@@ -213,6 +222,7 @@ typedef enum {
213
222
  PM_ERR_PARAMETER_ASSOC_SPLAT_MULTI,
214
223
  PM_ERR_PARAMETER_BLOCK_MULTI,
215
224
  PM_ERR_PARAMETER_CIRCULAR,
225
+ PM_ERR_PARAMETER_FORWARDING_AFTER_REST,
216
226
  PM_ERR_PARAMETER_METHOD_NAME,
217
227
  PM_ERR_PARAMETER_NAME_DUPLICATED,
218
228
  PM_ERR_PARAMETER_NO_DEFAULT,
@@ -223,6 +233,7 @@ typedef enum {
223
233
  PM_ERR_PARAMETER_STAR,
224
234
  PM_ERR_PARAMETER_UNEXPECTED_FWD,
225
235
  PM_ERR_PARAMETER_WILD_LOOSE_COMMA,
236
+ PM_ERR_PARAMETER_UNEXPECTED_NO_KW,
226
237
  PM_ERR_PATTERN_CAPTURE_DUPLICATE,
227
238
  PM_ERR_PATTERN_EXPRESSION_AFTER_BRACKET,
228
239
  PM_ERR_PATTERN_EXPRESSION_AFTER_COMMA,
@@ -234,8 +245,10 @@ typedef enum {
234
245
  PM_ERR_PATTERN_EXPRESSION_AFTER_PIPE,
235
246
  PM_ERR_PATTERN_EXPRESSION_AFTER_RANGE,
236
247
  PM_ERR_PATTERN_EXPRESSION_AFTER_REST,
248
+ PM_ERR_PATTERN_HASH_IMPLICIT,
237
249
  PM_ERR_PATTERN_HASH_KEY,
238
250
  PM_ERR_PATTERN_HASH_KEY_DUPLICATE,
251
+ PM_ERR_PATTERN_HASH_KEY_INTERPOLATED,
239
252
  PM_ERR_PATTERN_HASH_KEY_LABEL,
240
253
  PM_ERR_PATTERN_HASH_KEY_LOCALS,
241
254
  PM_ERR_PATTERN_IDENT_AFTER_HROCKET,
@@ -276,6 +289,9 @@ typedef enum {
276
289
  PM_ERR_UNARY_RECEIVER,
277
290
  PM_ERR_UNDEF_ARGUMENT,
278
291
  PM_ERR_UNEXPECTED_BLOCK_ARGUMENT,
292
+ PM_ERR_UNEXPECTED_INDEX_BLOCK,
293
+ PM_ERR_UNEXPECTED_INDEX_KEYWORDS,
294
+ PM_ERR_UNEXPECTED_SAFE_NAVIGATION,
279
295
  PM_ERR_UNEXPECTED_TOKEN_CLOSE_CONTEXT,
280
296
  PM_ERR_UNEXPECTED_TOKEN_IGNORE,
281
297
  PM_ERR_UNTIL_TERM,
@@ -296,7 +312,7 @@ typedef enum {
296
312
  PM_WARN_COMPARISON_AFTER_COMPARISON,
297
313
  PM_WARN_DOT_DOT_DOT_EOL,
298
314
  PM_WARN_EQUAL_IN_CONDITIONAL,
299
- PM_WARN_EQUAL_IN_CONDITIONAL_3_3_0,
315
+ PM_WARN_EQUAL_IN_CONDITIONAL_3_3,
300
316
  PM_WARN_END_IN_METHOD,
301
317
  PM_WARN_DUPLICATED_HASH_KEY,
302
318
  PM_WARN_DUPLICATED_WHEN_CLAUSE,
@@ -309,6 +325,7 @@ typedef enum {
309
325
  PM_WARN_KEYWORD_EOL,
310
326
  PM_WARN_LITERAL_IN_CONDITION_DEFAULT,
311
327
  PM_WARN_LITERAL_IN_CONDITION_VERBOSE,
328
+ PM_WARN_SHAREABLE_CONSTANT_VALUE_LINE,
312
329
  PM_WARN_SHEBANG_CARRIAGE_RETURN,
313
330
  PM_WARN_UNEXPECTED_CARRIAGE_RETURN,
314
331
  PM_WARN_UNREACHABLE_STATEMENT,
@@ -49,8 +49,8 @@ typedef enum {
49
49
  /** The current version of prism. */
50
50
  PM_OPTIONS_VERSION_LATEST = 0,
51
51
 
52
- /** The vendored version of prism in CRuby 3.3.0. */
53
- PM_OPTIONS_VERSION_CRUBY_3_3_0 = 1
52
+ /** The vendored version of prism in CRuby 3.3.x. */
53
+ PM_OPTIONS_VERSION_CRUBY_3_3 = 1
54
54
  } pm_options_version_t;
55
55
 
56
56
  /**
@@ -10,6 +10,7 @@
10
10
  #include "prism/ast.h"
11
11
  #include "prism/encoding.h"
12
12
  #include "prism/options.h"
13
+ #include "prism/static_literals.h"
13
14
  #include "prism/util/pm_constant_pool.h"
14
15
  #include "prism/util/pm_list.h"
15
16
  #include "prism/util/pm_newline_list.h"
@@ -717,6 +718,15 @@ struct pm_parser {
717
718
  /** The current parsing context. */
718
719
  pm_context_node_t *current_context;
719
720
 
721
+ /**
722
+ * The hash keys for the hash that is currently being parsed. This is not
723
+ * usually necessary because it can pass it down the various call chains,
724
+ * but in the event that you're parsing a hash that is being directly
725
+ * pushed into another hash with **, we need to share the hash keys so that
726
+ * we can warn for the nested hash as well.
727
+ */
728
+ pm_static_literals_t *current_hash_keys;
729
+
720
730
  /**
721
731
  * The encoding functions for the current file is attached to the parser as
722
732
  * it's parsing so that it can change with a magic comment.
@@ -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 27
17
+ #define PRISM_VERSION_MINOR 29
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.27.0"
27
+ #define PRISM_VERSION "0.29.0"
28
28
 
29
29
  #endif
@@ -73,7 +73,7 @@ module Prism
73
73
 
74
74
  # Desugar `x += y` to `x = x + y`
75
75
  def compile
76
- operator_loc = node.operator_loc.chop
76
+ binary_operator_loc = node.binary_operator_loc.chop
77
77
 
78
78
  write_class.new(
79
79
  source,
@@ -84,15 +84,15 @@ module Prism
84
84
  0,
85
85
  read_class.new(source, *arguments, node.name_loc),
86
86
  nil,
87
- operator_loc.slice.to_sym,
88
- operator_loc,
87
+ binary_operator_loc.slice.to_sym,
88
+ binary_operator_loc,
89
89
  nil,
90
90
  ArgumentsNode.new(source, 0, [node.value], node.value.location),
91
91
  nil,
92
92
  nil,
93
93
  node.location
94
94
  ),
95
- node.operator_loc.copy(start_offset: node.operator_loc.end_offset - 1, length: 1),
95
+ node.binary_operator_loc.copy(start_offset: node.binary_operator_loc.end_offset - 1, length: 1),
96
96
  node.location
97
97
  )
98
98
  end