prism 0.26.0 → 0.28.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +45 -1
- data/Makefile +3 -2
- data/config.yml +305 -20
- data/docs/configuration.md +1 -0
- data/ext/prism/api_node.c +884 -879
- data/ext/prism/extconf.rb +23 -4
- data/ext/prism/extension.c +16 -9
- data/ext/prism/extension.h +1 -1
- data/include/prism/ast.h +298 -9
- data/include/prism/diagnostic.h +15 -5
- data/include/prism/options.h +2 -2
- data/include/prism/parser.h +10 -0
- data/include/prism/static_literals.h +8 -6
- data/include/prism/version.h +2 -2
- data/lib/prism/dot_visitor.rb +22 -6
- data/lib/prism/dsl.rb +8 -8
- data/lib/prism/ffi.rb +4 -4
- data/lib/prism/inspect_visitor.rb +2156 -0
- data/lib/prism/lex_compat.rb +18 -1
- data/lib/prism/mutation_compiler.rb +2 -2
- data/lib/prism/node.rb +2345 -1964
- data/lib/prism/node_ext.rb +34 -5
- data/lib/prism/parse_result/newlines.rb +0 -2
- data/lib/prism/parse_result.rb +137 -13
- data/lib/prism/pattern.rb +12 -6
- data/lib/prism/polyfill/byteindex.rb +13 -0
- data/lib/prism/polyfill/unpack1.rb +14 -0
- data/lib/prism/reflection.rb +21 -31
- data/lib/prism/serialize.rb +27 -17
- data/lib/prism/translation/parser/compiler.rb +34 -15
- data/lib/prism/translation/parser.rb +6 -6
- data/lib/prism/translation/ripper.rb +72 -68
- data/lib/prism/translation/ruby_parser.rb +69 -31
- data/lib/prism.rb +3 -2
- data/prism.gemspec +36 -38
- data/rbi/prism/compiler.rbi +3 -5
- data/rbi/prism/inspect_visitor.rbi +12 -0
- data/rbi/prism/node.rbi +359 -321
- data/rbi/prism/parse_result.rbi +85 -34
- data/rbi/prism/reflection.rbi +7 -13
- data/rbi/prism/translation/ripper.rbi +1 -11
- data/rbi/prism.rbi +9 -9
- data/sig/prism/dsl.rbs +3 -3
- data/sig/prism/inspect_visitor.rbs +22 -0
- data/sig/prism/node.rbs +68 -48
- data/sig/prism/parse_result.rbs +42 -10
- data/sig/prism/reflection.rbs +2 -8
- data/sig/prism/serialize.rbs +2 -3
- data/sig/prism.rbs +9 -9
- data/src/diagnostic.c +44 -24
- data/src/node.c +41 -16
- data/src/options.c +2 -2
- data/src/prettyprint.c +61 -18
- data/src/prism.c +623 -188
- data/src/serialize.c +5 -2
- data/src/static_literals.c +120 -34
- data/src/token_type.c +4 -4
- data/src/util/pm_integer.c +9 -2
- metadata +7 -9
- data/lib/prism/node_inspector.rb +0 -68
- data/lib/prism/polyfill/string.rb +0 -12
- data/rbi/prism/desugar_compiler.rbi +0 -5
- data/rbi/prism/mutation_compiler.rbi +0 -5
- data/rbi/prism/translation/parser/compiler.rbi +0 -13
- data/rbi/prism/translation/ripper/ripper_compiler.rbi +0 -5
- data/rbi/prism/translation/ruby_parser.rbi +0 -11
data/include/prism/ast.h
CHANGED
@@ -1099,16 +1099,31 @@ typedef struct pm_alias_global_variable_node {
|
|
1099
1099
|
|
1100
1100
|
/**
|
1101
1101
|
* AliasGlobalVariableNode#new_name
|
1102
|
+
*
|
1103
|
+
* Represents the new name of the global variable that can be used after aliasing. This can be either a global variable, a back reference, or a numbered reference.
|
1104
|
+
*
|
1105
|
+
* alias $foo $bar
|
1106
|
+
* ^^^^
|
1102
1107
|
*/
|
1103
1108
|
struct pm_node *new_name;
|
1104
1109
|
|
1105
1110
|
/**
|
1106
1111
|
* AliasGlobalVariableNode#old_name
|
1112
|
+
*
|
1113
|
+
* Represents the old name of the global variable that could be used before aliasing. This can be either a global variable, a back reference, or a numbered reference.
|
1114
|
+
*
|
1115
|
+
* alias $foo $bar
|
1116
|
+
* ^^^^
|
1107
1117
|
*/
|
1108
1118
|
struct pm_node *old_name;
|
1109
1119
|
|
1110
1120
|
/**
|
1111
1121
|
* AliasGlobalVariableNode#keyword_loc
|
1122
|
+
*
|
1123
|
+
* The location of the `alias` keyword.
|
1124
|
+
*
|
1125
|
+
* alias $foo $bar
|
1126
|
+
* ^^^^^
|
1112
1127
|
*/
|
1113
1128
|
pm_location_t keyword_loc;
|
1114
1129
|
} pm_alias_global_variable_node_t;
|
@@ -1220,6 +1235,7 @@ typedef struct pm_and_node {
|
|
1220
1235
|
*
|
1221
1236
|
* Type: PM_ARGUMENTS_NODE
|
1222
1237
|
* Flags:
|
1238
|
+
* PM_ARGUMENTS_NODE_FLAGS_CONTAINS_KEYWORDS
|
1223
1239
|
* PM_ARGUMENTS_NODE_FLAGS_CONTAINS_KEYWORD_SPLAT
|
1224
1240
|
*
|
1225
1241
|
* @extends pm_node_t
|
@@ -1249,16 +1265,32 @@ typedef struct pm_array_node {
|
|
1249
1265
|
|
1250
1266
|
/**
|
1251
1267
|
* ArrayNode#elements
|
1268
|
+
*
|
1269
|
+
* Represent the list of zero or more [non-void expressions](https://github.com/ruby/prism/blob/main/docs/parsing_rules.md#non-void-expression) within the array.
|
1252
1270
|
*/
|
1253
1271
|
struct pm_node_list elements;
|
1254
1272
|
|
1255
1273
|
/**
|
1256
1274
|
* ArrayNode#opening_loc
|
1275
|
+
*
|
1276
|
+
* Represents the optional source location for the opening token.
|
1277
|
+
*
|
1278
|
+
* [1,2,3] # "["
|
1279
|
+
* %w[foo bar baz] # "%w["
|
1280
|
+
* %I(apple orange banana) # "%I("
|
1281
|
+
* foo = 1, 2, 3 # nil
|
1257
1282
|
*/
|
1258
1283
|
pm_location_t opening_loc;
|
1259
1284
|
|
1260
1285
|
/**
|
1261
1286
|
* ArrayNode#closing_loc
|
1287
|
+
*
|
1288
|
+
* Represents the optional source location for the closing token.
|
1289
|
+
*
|
1290
|
+
* [1,2,3] # "]"
|
1291
|
+
* %w[foo bar baz] # "]"
|
1292
|
+
* %I(apple orange banana) # ")"
|
1293
|
+
* foo = 1, 2, 3 # nil
|
1262
1294
|
*/
|
1263
1295
|
pm_location_t closing_loc;
|
1264
1296
|
} pm_array_node_t;
|
@@ -1605,11 +1637,21 @@ typedef struct pm_break_node {
|
|
1605
1637
|
|
1606
1638
|
/**
|
1607
1639
|
* BreakNode#arguments
|
1640
|
+
*
|
1641
|
+
* The arguments to the break statement, if present. These can be any [non-void expressions](https://github.com/ruby/prism/blob/main/docs/parsing_rules.md#non-void-expression).
|
1642
|
+
*
|
1643
|
+
* break foo
|
1644
|
+
* ^^^
|
1608
1645
|
*/
|
1609
1646
|
struct pm_arguments_node *arguments;
|
1610
1647
|
|
1611
1648
|
/**
|
1612
1649
|
* BreakNode#keyword_loc
|
1650
|
+
*
|
1651
|
+
* The location of the `break` keyword.
|
1652
|
+
*
|
1653
|
+
* break foo
|
1654
|
+
* ^^^^^
|
1613
1655
|
*/
|
1614
1656
|
pm_location_t keyword_loc;
|
1615
1657
|
} pm_break_node_t;
|
@@ -2209,8 +2251,7 @@ typedef struct pm_class_variable_write_node {
|
|
2209
2251
|
/**
|
2210
2252
|
* ClassVariableWriteNode#value
|
2211
2253
|
*
|
2212
|
-
* The value to
|
2213
|
-
* represents a non-void expression.
|
2254
|
+
* The value to write to the class variable. This can be any [non-void expression](https://github.com/ruby/prism/blob/main/docs/parsing_rules.md#non-void-expression).
|
2214
2255
|
*
|
2215
2256
|
* @@foo = :bar
|
2216
2257
|
* ^^^^
|
@@ -2372,18 +2413,52 @@ typedef struct pm_constant_path_node {
|
|
2372
2413
|
|
2373
2414
|
/**
|
2374
2415
|
* ConstantPathNode#parent
|
2416
|
+
*
|
2417
|
+
* The left-hand node of the path, if present. It can be `nil` or any [non-void expression](https://github.com/ruby/prism/blob/main/docs/parsing_rules.md#non-void-expression). It will be `nil` when the constant lookup is at the root of the module tree.
|
2418
|
+
*
|
2419
|
+
* Foo::Bar
|
2420
|
+
* ^^^
|
2421
|
+
*
|
2422
|
+
* self::Test
|
2423
|
+
* ^^^^
|
2424
|
+
*
|
2425
|
+
* a.b::C
|
2426
|
+
* ^^^
|
2375
2427
|
*/
|
2376
2428
|
struct pm_node *parent;
|
2377
2429
|
|
2378
2430
|
/**
|
2379
|
-
* ConstantPathNode#
|
2431
|
+
* ConstantPathNode#name
|
2432
|
+
*
|
2433
|
+
* The name of the constant being accessed. This could be `nil` in the event of a syntax error.
|
2380
2434
|
*/
|
2381
|
-
|
2435
|
+
pm_constant_id_t name;
|
2382
2436
|
|
2383
2437
|
/**
|
2384
2438
|
* ConstantPathNode#delimiter_loc
|
2439
|
+
*
|
2440
|
+
* The location of the `::` delimiter.
|
2441
|
+
*
|
2442
|
+
* ::Foo
|
2443
|
+
* ^^
|
2444
|
+
*
|
2445
|
+
* One::Two
|
2446
|
+
* ^^
|
2385
2447
|
*/
|
2386
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;
|
2387
2462
|
} pm_constant_path_node_t;
|
2388
2463
|
|
2389
2464
|
/**
|
@@ -2462,14 +2537,19 @@ typedef struct pm_constant_path_target_node {
|
|
2462
2537
|
struct pm_node *parent;
|
2463
2538
|
|
2464
2539
|
/**
|
2465
|
-
* ConstantPathTargetNode#
|
2540
|
+
* ConstantPathTargetNode#name
|
2466
2541
|
*/
|
2467
|
-
|
2542
|
+
pm_constant_id_t name;
|
2468
2543
|
|
2469
2544
|
/**
|
2470
2545
|
* ConstantPathTargetNode#delimiter_loc
|
2471
2546
|
*/
|
2472
2547
|
pm_location_t delimiter_loc;
|
2548
|
+
|
2549
|
+
/**
|
2550
|
+
* ConstantPathTargetNode#name_loc
|
2551
|
+
*/
|
2552
|
+
pm_location_t name_loc;
|
2473
2553
|
} pm_constant_path_target_node_t;
|
2474
2554
|
|
2475
2555
|
/**
|
@@ -2485,16 +2565,34 @@ typedef struct pm_constant_path_write_node {
|
|
2485
2565
|
|
2486
2566
|
/**
|
2487
2567
|
* ConstantPathWriteNode#target
|
2568
|
+
*
|
2569
|
+
* A node representing the constant path being written to.
|
2570
|
+
*
|
2571
|
+
* Foo::Bar = 1
|
2572
|
+
* ^^^^^^^^
|
2573
|
+
*
|
2574
|
+
* ::Foo = :abc
|
2575
|
+
* ^^^^^
|
2488
2576
|
*/
|
2489
2577
|
struct pm_constant_path_node *target;
|
2490
2578
|
|
2491
2579
|
/**
|
2492
2580
|
* ConstantPathWriteNode#operator_loc
|
2581
|
+
*
|
2582
|
+
* The location of the `=` operator.
|
2583
|
+
*
|
2584
|
+
* ::ABC = 123
|
2585
|
+
* ^
|
2493
2586
|
*/
|
2494
2587
|
pm_location_t operator_loc;
|
2495
2588
|
|
2496
2589
|
/**
|
2497
2590
|
* ConstantPathWriteNode#value
|
2591
|
+
*
|
2592
|
+
* The value to write to the constant path. It can be any [non-void expression](https://github.com/ruby/prism/blob/main/docs/parsing_rules.md#non-void-expression).
|
2593
|
+
*
|
2594
|
+
* FOO::BAR = :abc
|
2595
|
+
* ^^^^
|
2498
2596
|
*/
|
2499
2597
|
struct pm_node *value;
|
2500
2598
|
} pm_constant_path_write_node_t;
|
@@ -2552,21 +2650,45 @@ typedef struct pm_constant_write_node {
|
|
2552
2650
|
|
2553
2651
|
/**
|
2554
2652
|
* ConstantWriteNode#name
|
2653
|
+
*
|
2654
|
+
* The name of the [constant](https://github.com/ruby/prism/blob/main/docs/parsing_rules.md#constants).
|
2655
|
+
*
|
2656
|
+
* Foo = :bar # name `:Foo`
|
2657
|
+
*
|
2658
|
+
* XYZ = 1 # name `:XYZ`
|
2555
2659
|
*/
|
2556
2660
|
pm_constant_id_t name;
|
2557
2661
|
|
2558
2662
|
/**
|
2559
2663
|
* ConstantWriteNode#name_loc
|
2664
|
+
*
|
2665
|
+
* The location of the constant name.
|
2666
|
+
*
|
2667
|
+
* FOO = 1
|
2668
|
+
* ^^^
|
2560
2669
|
*/
|
2561
2670
|
pm_location_t name_loc;
|
2562
2671
|
|
2563
2672
|
/**
|
2564
2673
|
* ConstantWriteNode#value
|
2674
|
+
*
|
2675
|
+
* The value to write to the constant. It can be any [non-void expression](https://github.com/ruby/prism/blob/main/docs/parsing_rules.md#non-void-expression).
|
2676
|
+
*
|
2677
|
+
* FOO = :bar
|
2678
|
+
* ^^^^
|
2679
|
+
*
|
2680
|
+
* MyClass = Class.new
|
2681
|
+
* ^^^^^^^^^
|
2565
2682
|
*/
|
2566
2683
|
struct pm_node *value;
|
2567
2684
|
|
2568
2685
|
/**
|
2569
2686
|
* ConstantWriteNode#operator_loc
|
2687
|
+
*
|
2688
|
+
* The location of the `=` operator.
|
2689
|
+
*
|
2690
|
+
* FOO = :bar
|
2691
|
+
* ^
|
2570
2692
|
*/
|
2571
2693
|
pm_location_t operator_loc;
|
2572
2694
|
} pm_constant_write_node_t;
|
@@ -3122,21 +3244,45 @@ typedef struct pm_global_variable_write_node {
|
|
3122
3244
|
|
3123
3245
|
/**
|
3124
3246
|
* GlobalVariableWriteNode#name
|
3247
|
+
*
|
3248
|
+
* The name of the global variable, which is a `$` followed by an [identifier](https://github.com/ruby/prism/blob/main/docs/parsing_rules.md#identifier). Alternatively, it can be one of the special global variables designated by a symbol.
|
3249
|
+
*
|
3250
|
+
* $foo = :bar # name `:$foo`
|
3251
|
+
*
|
3252
|
+
* $_Test = 123 # name `:$_Test`
|
3125
3253
|
*/
|
3126
3254
|
pm_constant_id_t name;
|
3127
3255
|
|
3128
3256
|
/**
|
3129
3257
|
* GlobalVariableWriteNode#name_loc
|
3258
|
+
*
|
3259
|
+
* The location of the global variable's name.
|
3260
|
+
*
|
3261
|
+
* $foo = :bar
|
3262
|
+
* ^^^^
|
3130
3263
|
*/
|
3131
3264
|
pm_location_t name_loc;
|
3132
3265
|
|
3133
3266
|
/**
|
3134
3267
|
* GlobalVariableWriteNode#value
|
3268
|
+
*
|
3269
|
+
* The value to write to the global variable. It can be any [non-void expression](https://github.com/ruby/prism/blob/main/docs/parsing_rules.md#non-void-expression).
|
3270
|
+
*
|
3271
|
+
* $foo = :bar
|
3272
|
+
* ^^^^
|
3273
|
+
*
|
3274
|
+
* $-xyz = 123
|
3275
|
+
* ^^^
|
3135
3276
|
*/
|
3136
3277
|
struct pm_node *value;
|
3137
3278
|
|
3138
3279
|
/**
|
3139
3280
|
* GlobalVariableWriteNode#operator_loc
|
3281
|
+
*
|
3282
|
+
* The location of the `=` operator.
|
3283
|
+
*
|
3284
|
+
* $foo = :bar
|
3285
|
+
* ^
|
3140
3286
|
*/
|
3141
3287
|
pm_location_t operator_loc;
|
3142
3288
|
} pm_global_variable_write_node_t;
|
@@ -3236,31 +3382,89 @@ typedef struct pm_if_node {
|
|
3236
3382
|
|
3237
3383
|
/**
|
3238
3384
|
* IfNode#if_keyword_loc
|
3385
|
+
*
|
3386
|
+
* The location of the `if` keyword if present.
|
3387
|
+
*
|
3388
|
+
* bar if foo
|
3389
|
+
* ^^
|
3390
|
+
*
|
3391
|
+
* The `if_keyword_loc` field will be `nil` when the `IfNode` represents a ternary expression.
|
3239
3392
|
*/
|
3240
3393
|
pm_location_t if_keyword_loc;
|
3241
3394
|
|
3242
3395
|
/**
|
3243
3396
|
* IfNode#predicate
|
3397
|
+
*
|
3398
|
+
* The node for the condition the `IfNode` is testing.
|
3399
|
+
*
|
3400
|
+
* if foo
|
3401
|
+
* ^^^
|
3402
|
+
* bar
|
3403
|
+
* end
|
3404
|
+
*
|
3405
|
+
* bar if foo
|
3406
|
+
* ^^^
|
3407
|
+
*
|
3408
|
+
* foo ? bar : baz
|
3409
|
+
* ^^^
|
3244
3410
|
*/
|
3245
3411
|
struct pm_node *predicate;
|
3246
3412
|
|
3247
3413
|
/**
|
3248
3414
|
* IfNode#then_keyword_loc
|
3415
|
+
*
|
3416
|
+
* The location of the `then` keyword (if present) or the `?` in a ternary expression, `nil` otherwise.
|
3417
|
+
*
|
3418
|
+
* if foo then bar end
|
3419
|
+
* ^^^^
|
3420
|
+
*
|
3421
|
+
* a ? b : c
|
3422
|
+
* ^
|
3249
3423
|
*/
|
3250
3424
|
pm_location_t then_keyword_loc;
|
3251
3425
|
|
3252
3426
|
/**
|
3253
3427
|
* IfNode#statements
|
3428
|
+
*
|
3429
|
+
* Represents the body of statements that will be executed when the predicate is evaluated as truthy. Will be `nil` when no body is provided.
|
3430
|
+
*
|
3431
|
+
* if foo
|
3432
|
+
* bar
|
3433
|
+
* ^^^
|
3434
|
+
* baz
|
3435
|
+
* ^^^
|
3436
|
+
* end
|
3254
3437
|
*/
|
3255
3438
|
struct pm_statements_node *statements;
|
3256
3439
|
|
3257
3440
|
/**
|
3258
3441
|
* IfNode#consequent
|
3442
|
+
*
|
3443
|
+
* Represents an `ElseNode` or an `IfNode` when there is an `else` or an `elsif` in the `if` statement.
|
3444
|
+
*
|
3445
|
+
* if foo
|
3446
|
+
* bar
|
3447
|
+
* elsif baz
|
3448
|
+
* ^^^^^^^^^
|
3449
|
+
* qux
|
3450
|
+
* ^^^
|
3451
|
+
* end
|
3452
|
+
* ^^^
|
3453
|
+
*
|
3454
|
+
* if foo then bar else baz end
|
3455
|
+
* ^^^^^^^^^^^^
|
3259
3456
|
*/
|
3260
3457
|
struct pm_node *consequent;
|
3261
3458
|
|
3262
3459
|
/**
|
3263
3460
|
* IfNode#end_keyword_loc
|
3461
|
+
*
|
3462
|
+
* The location of the `end` keyword if present, `nil` otherwise.
|
3463
|
+
*
|
3464
|
+
* if foo
|
3465
|
+
* bar
|
3466
|
+
* end
|
3467
|
+
* ^^^
|
3264
3468
|
*/
|
3265
3469
|
pm_location_t end_keyword_loc;
|
3266
3470
|
} pm_if_node_t;
|
@@ -3737,8 +3941,7 @@ typedef struct pm_instance_variable_write_node {
|
|
3737
3941
|
/**
|
3738
3942
|
* InstanceVariableWriteNode#value
|
3739
3943
|
*
|
3740
|
-
* The value to
|
3741
|
-
* represents a non-void expression.
|
3944
|
+
* The value to write to the instance variable. It can be any [non-void expression](https://github.com/ruby/prism/blob/main/docs/parsing_rules.md#non-void-expression).
|
3742
3945
|
*
|
3743
3946
|
* @foo = :bar
|
3744
3947
|
* ^^^^
|
@@ -4242,26 +4445,62 @@ typedef struct pm_local_variable_write_node {
|
|
4242
4445
|
|
4243
4446
|
/**
|
4244
4447
|
* LocalVariableWriteNode#name
|
4448
|
+
*
|
4449
|
+
* The name of the local variable, which is an [identifier](https://github.com/ruby/prism/blob/main/docs/parsing_rules.md#identifiers).
|
4450
|
+
*
|
4451
|
+
* foo = :bar # name `:foo`
|
4452
|
+
*
|
4453
|
+
* abc = 123 # name `:abc`
|
4245
4454
|
*/
|
4246
4455
|
pm_constant_id_t name;
|
4247
4456
|
|
4248
4457
|
/**
|
4249
4458
|
* LocalVariableWriteNode#depth
|
4459
|
+
*
|
4460
|
+
* The number of semantic scopes we have to traverse to find the declaration of this variable.
|
4461
|
+
*
|
4462
|
+
* foo = 1 # depth 0
|
4463
|
+
*
|
4464
|
+
* tap { foo = 1 } # depth 1
|
4465
|
+
*
|
4466
|
+
* The specific rules for calculating the depth may differ from individual Ruby implementations, as they are not specified by the language. For more information, see [the Prism documentation](https://github.com/ruby/prism/blob/main/docs/local_variable_depth.md).
|
4250
4467
|
*/
|
4251
4468
|
uint32_t depth;
|
4252
4469
|
|
4253
4470
|
/**
|
4254
4471
|
* LocalVariableWriteNode#name_loc
|
4472
|
+
*
|
4473
|
+
* The location of the variable name.
|
4474
|
+
*
|
4475
|
+
* foo = :bar
|
4476
|
+
* ^^^
|
4255
4477
|
*/
|
4256
4478
|
pm_location_t name_loc;
|
4257
4479
|
|
4258
4480
|
/**
|
4259
4481
|
* LocalVariableWriteNode#value
|
4482
|
+
*
|
4483
|
+
* The value to write to the local variable. It can be any [non-void expression](https://github.com/ruby/prism/blob/main/docs/parsing_rules.md#non-void-expression).
|
4484
|
+
*
|
4485
|
+
* foo = :bar
|
4486
|
+
* ^^^^
|
4487
|
+
*
|
4488
|
+
* abc = 1234
|
4489
|
+
* ^^^^
|
4490
|
+
*
|
4491
|
+
* Note that since the name of a local variable is known before the value is parsed, it is valid for a local variable to appear within the value of its own write.
|
4492
|
+
*
|
4493
|
+
* foo = foo
|
4260
4494
|
*/
|
4261
4495
|
struct pm_node *value;
|
4262
4496
|
|
4263
4497
|
/**
|
4264
4498
|
* LocalVariableWriteNode#operator_loc
|
4499
|
+
*
|
4500
|
+
* The location of the `=` operator.
|
4501
|
+
*
|
4502
|
+
* x = :y
|
4503
|
+
* ^
|
4265
4504
|
*/
|
4266
4505
|
pm_location_t operator_loc;
|
4267
4506
|
} pm_local_variable_write_node_t;
|
@@ -5225,6 +5464,8 @@ typedef struct pm_retry_node {
|
|
5225
5464
|
* ReturnNode
|
5226
5465
|
*
|
5227
5466
|
* Type: PM_RETURN_NODE
|
5467
|
+
* Flags:
|
5468
|
+
* PM_RETURN_NODE_FLAGS_REDUNDANT
|
5228
5469
|
*
|
5229
5470
|
* @extends pm_node_t
|
5230
5471
|
*/
|
@@ -5350,6 +5591,8 @@ typedef struct pm_source_file_node {
|
|
5350
5591
|
|
5351
5592
|
/**
|
5352
5593
|
* SourceFileNode#filepath
|
5594
|
+
*
|
5595
|
+
* Represents the file path being parsed. This corresponds directly to the `filepath` option given to the various `Prism::parse*` APIs.
|
5353
5596
|
*/
|
5354
5597
|
pm_string_t filepath;
|
5355
5598
|
} pm_source_file_node_t;
|
@@ -5562,31 +5805,66 @@ typedef struct pm_unless_node {
|
|
5562
5805
|
|
5563
5806
|
/**
|
5564
5807
|
* UnlessNode#keyword_loc
|
5808
|
+
*
|
5809
|
+
* The location of the `unless` keyword.
|
5810
|
+
*
|
5811
|
+
* unless cond then bar end
|
5812
|
+
* ^^^^^^
|
5813
|
+
*
|
5814
|
+
* bar unless cond
|
5815
|
+
* ^^^^^^
|
5565
5816
|
*/
|
5566
5817
|
pm_location_t keyword_loc;
|
5567
5818
|
|
5568
5819
|
/**
|
5569
5820
|
* UnlessNode#predicate
|
5821
|
+
*
|
5822
|
+
* The condition to be evaluated for the unless expression. It can be any [non-void expression](https://github.com/ruby/prism/blob/main/docs/parsing_rules.md#non-void-expression).
|
5823
|
+
*
|
5824
|
+
* unless cond then bar end
|
5825
|
+
* ^^^^
|
5826
|
+
*
|
5827
|
+
* bar unless cond
|
5828
|
+
* ^^^^
|
5570
5829
|
*/
|
5571
5830
|
struct pm_node *predicate;
|
5572
5831
|
|
5573
5832
|
/**
|
5574
5833
|
* UnlessNode#then_keyword_loc
|
5834
|
+
*
|
5835
|
+
* The location of the `then` keyword, if present.
|
5836
|
+
* unless cond then bar end ^^^^
|
5575
5837
|
*/
|
5576
5838
|
pm_location_t then_keyword_loc;
|
5577
5839
|
|
5578
5840
|
/**
|
5579
5841
|
* UnlessNode#statements
|
5842
|
+
*
|
5843
|
+
* The body of statements that will executed if the unless condition is
|
5844
|
+
* falsey. Will be `nil` if no body is provided.
|
5845
|
+
*
|
5846
|
+
* unless cond then bar end
|
5847
|
+
* ^^^
|
5580
5848
|
*/
|
5581
5849
|
struct pm_statements_node *statements;
|
5582
5850
|
|
5583
5851
|
/**
|
5584
5852
|
* UnlessNode#consequent
|
5853
|
+
*
|
5854
|
+
* The else clause of the unless expression, if present.
|
5855
|
+
*
|
5856
|
+
* unless cond then bar else baz end
|
5857
|
+
* ^^^^^^^^
|
5585
5858
|
*/
|
5586
5859
|
struct pm_else_node *consequent;
|
5587
5860
|
|
5588
5861
|
/**
|
5589
5862
|
* UnlessNode#end_keyword_loc
|
5863
|
+
*
|
5864
|
+
* The location of the `end` keyword, if present.
|
5865
|
+
*
|
5866
|
+
* unless cond then bar end
|
5867
|
+
* ^^^
|
5590
5868
|
*/
|
5591
5869
|
pm_location_t end_keyword_loc;
|
5592
5870
|
} pm_unless_node_t;
|
@@ -5762,8 +6040,11 @@ typedef struct pm_yield_node {
|
|
5762
6040
|
* Flags for arguments nodes.
|
5763
6041
|
*/
|
5764
6042
|
typedef enum pm_arguments_node_flags {
|
6043
|
+
/** if arguments contain keywords */
|
6044
|
+
PM_ARGUMENTS_NODE_FLAGS_CONTAINS_KEYWORDS = 1,
|
6045
|
+
|
5765
6046
|
/** if arguments contain keyword splat */
|
5766
|
-
PM_ARGUMENTS_NODE_FLAGS_CONTAINS_KEYWORD_SPLAT =
|
6047
|
+
PM_ARGUMENTS_NODE_FLAGS_CONTAINS_KEYWORD_SPLAT = 2,
|
5767
6048
|
} pm_arguments_node_flags_t;
|
5768
6049
|
|
5769
6050
|
/**
|
@@ -5900,6 +6181,14 @@ typedef enum pm_regular_expression_flags {
|
|
5900
6181
|
PM_REGULAR_EXPRESSION_FLAGS_FORCED_US_ASCII_ENCODING = 1024,
|
5901
6182
|
} pm_regular_expression_flags_t;
|
5902
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
|
+
|
5903
6192
|
/**
|
5904
6193
|
* Flags for shareable constant nodes.
|
5905
6194
|
*/
|
data/include/prism/diagnostic.h
CHANGED
@@ -152,17 +152,20 @@ typedef enum {
|
|
152
152
|
PM_ERR_HASH_ROCKET,
|
153
153
|
PM_ERR_HASH_TERM,
|
154
154
|
PM_ERR_HASH_VALUE,
|
155
|
+
PM_ERR_HEREDOC_IDENTIFIER,
|
155
156
|
PM_ERR_HEREDOC_TERM,
|
156
157
|
PM_ERR_INCOMPLETE_QUESTION_MARK,
|
157
158
|
PM_ERR_INCOMPLETE_VARIABLE_CLASS,
|
158
|
-
|
159
|
+
PM_ERR_INCOMPLETE_VARIABLE_CLASS_3_3,
|
159
160
|
PM_ERR_INCOMPLETE_VARIABLE_INSTANCE,
|
160
|
-
|
161
|
+
PM_ERR_INCOMPLETE_VARIABLE_INSTANCE_3_3,
|
161
162
|
PM_ERR_INSTANCE_VARIABLE_BARE,
|
162
163
|
PM_ERR_INVALID_BLOCK_EXIT,
|
163
164
|
PM_ERR_INVALID_CHARACTER,
|
164
165
|
PM_ERR_INVALID_ENCODING_MAGIC_COMMENT,
|
165
166
|
PM_ERR_INVALID_FLOAT_EXPONENT,
|
167
|
+
PM_ERR_INVALID_LOCAL_VARIABLE_READ,
|
168
|
+
PM_ERR_INVALID_LOCAL_VARIABLE_WRITE,
|
166
169
|
PM_ERR_INVALID_MULTIBYTE_CHAR,
|
167
170
|
PM_ERR_INVALID_MULTIBYTE_CHARACTER,
|
168
171
|
PM_ERR_INVALID_MULTIBYTE_ESCAPE,
|
@@ -170,14 +173,16 @@ typedef enum {
|
|
170
173
|
PM_ERR_INVALID_NUMBER_DECIMAL,
|
171
174
|
PM_ERR_INVALID_NUMBER_HEXADECIMAL,
|
172
175
|
PM_ERR_INVALID_NUMBER_OCTAL,
|
173
|
-
|
176
|
+
PM_ERR_INVALID_NUMBER_UNDERSCORE_INNER,
|
177
|
+
PM_ERR_INVALID_NUMBER_UNDERSCORE_TRAILING,
|
174
178
|
PM_ERR_INVALID_PERCENT,
|
175
179
|
PM_ERR_INVALID_PRINTABLE_CHARACTER,
|
176
180
|
PM_ERR_INVALID_RETRY_AFTER_ELSE,
|
177
181
|
PM_ERR_INVALID_RETRY_AFTER_ENSURE,
|
178
182
|
PM_ERR_INVALID_RETRY_WITHOUT_RESCUE,
|
183
|
+
PM_ERR_INVALID_SYMBOL,
|
179
184
|
PM_ERR_INVALID_VARIABLE_GLOBAL,
|
180
|
-
|
185
|
+
PM_ERR_INVALID_VARIABLE_GLOBAL_3_3,
|
181
186
|
PM_ERR_INVALID_YIELD,
|
182
187
|
PM_ERR_IT_NOT_ALLOWED_NUMBERED,
|
183
188
|
PM_ERR_IT_NOT_ALLOWED_ORDINARY,
|
@@ -221,6 +226,7 @@ typedef enum {
|
|
221
226
|
PM_ERR_PARAMETER_STAR,
|
222
227
|
PM_ERR_PARAMETER_UNEXPECTED_FWD,
|
223
228
|
PM_ERR_PARAMETER_WILD_LOOSE_COMMA,
|
229
|
+
PM_ERR_PARAMETER_UNEXPECTED_NO_KW,
|
224
230
|
PM_ERR_PATTERN_CAPTURE_DUPLICATE,
|
225
231
|
PM_ERR_PATTERN_EXPRESSION_AFTER_BRACKET,
|
226
232
|
PM_ERR_PATTERN_EXPRESSION_AFTER_COMMA,
|
@@ -235,6 +241,7 @@ typedef enum {
|
|
235
241
|
PM_ERR_PATTERN_HASH_KEY,
|
236
242
|
PM_ERR_PATTERN_HASH_KEY_DUPLICATE,
|
237
243
|
PM_ERR_PATTERN_HASH_KEY_LABEL,
|
244
|
+
PM_ERR_PATTERN_HASH_KEY_LOCALS,
|
238
245
|
PM_ERR_PATTERN_IDENT_AFTER_HROCKET,
|
239
246
|
PM_ERR_PATTERN_LABEL_AFTER_COMMA,
|
240
247
|
PM_ERR_PATTERN_REST,
|
@@ -273,6 +280,9 @@ typedef enum {
|
|
273
280
|
PM_ERR_UNARY_RECEIVER,
|
274
281
|
PM_ERR_UNDEF_ARGUMENT,
|
275
282
|
PM_ERR_UNEXPECTED_BLOCK_ARGUMENT,
|
283
|
+
PM_ERR_UNEXPECTED_INDEX_BLOCK,
|
284
|
+
PM_ERR_UNEXPECTED_INDEX_KEYWORDS,
|
285
|
+
PM_ERR_UNEXPECTED_SAFE_NAVIGATION,
|
276
286
|
PM_ERR_UNEXPECTED_TOKEN_CLOSE_CONTEXT,
|
277
287
|
PM_ERR_UNEXPECTED_TOKEN_IGNORE,
|
278
288
|
PM_ERR_UNTIL_TERM,
|
@@ -293,7 +303,7 @@ typedef enum {
|
|
293
303
|
PM_WARN_COMPARISON_AFTER_COMPARISON,
|
294
304
|
PM_WARN_DOT_DOT_DOT_EOL,
|
295
305
|
PM_WARN_EQUAL_IN_CONDITIONAL,
|
296
|
-
|
306
|
+
PM_WARN_EQUAL_IN_CONDITIONAL_3_3,
|
297
307
|
PM_WARN_END_IN_METHOD,
|
298
308
|
PM_WARN_DUPLICATED_HASH_KEY,
|
299
309
|
PM_WARN_DUPLICATED_WHEN_CLAUSE,
|
data/include/prism/options.h
CHANGED
@@ -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.
|
53
|
-
|
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
|
/**
|
data/include/prism/parser.h
CHANGED
@@ -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.
|