prism 0.26.0 → 0.27.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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +20 -1
- data/Makefile +3 -2
- data/config.yml +278 -5
- data/ext/prism/api_node.c +70 -72
- data/ext/prism/extconf.rb +23 -4
- data/ext/prism/extension.c +11 -6
- data/ext/prism/extension.h +1 -1
- data/include/prism/ast.h +271 -4
- data/include/prism/diagnostic.h +3 -0
- data/include/prism/version.h +2 -2
- data/lib/prism/ffi.rb +1 -1
- data/lib/prism/lex_compat.rb +18 -1
- data/lib/prism/node.rb +1772 -265
- data/lib/prism/parse_result/newlines.rb +0 -2
- data/lib/prism/parse_result.rb +59 -13
- data/lib/prism/reflection.rb +18 -28
- data/lib/prism/serialize.rb +7 -4
- data/lib/prism/translation/parser/compiler.rb +32 -13
- data/lib/prism/translation/ripper.rb +59 -59
- data/lib/prism/translation/ruby_parser.rb +66 -28
- data/lib/prism.rb +1 -1
- data/prism.gemspec +1 -1
- data/rbi/prism/node.rbi +5 -2
- data/rbi/prism/parse_result.rbi +62 -34
- data/rbi/prism/reflection.rbi +7 -13
- data/rbi/prism.rbi +9 -9
- data/sig/prism/node.rbs +4 -1
- data/sig/prism/parse_result.rbs +30 -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 +7 -1
- data/src/prism.c +16 -3
- data/src/util/pm_integer.c +9 -2
- metadata +2 -2
data/ext/prism/extension.c
CHANGED
@@ -19,7 +19,9 @@ VALUE rb_cPrismEmbDocComment;
|
|
19
19
|
VALUE rb_cPrismMagicComment;
|
20
20
|
VALUE rb_cPrismParseError;
|
21
21
|
VALUE rb_cPrismParseWarning;
|
22
|
+
VALUE rb_cPrismResult;
|
22
23
|
VALUE rb_cPrismParseResult;
|
24
|
+
VALUE rb_cPrismParseLexResult;
|
23
25
|
|
24
26
|
VALUE rb_cPrismDebugEncoding;
|
25
27
|
|
@@ -515,7 +517,7 @@ parser_warnings(pm_parser_t *parser, rb_encoding *encoding, VALUE source) {
|
|
515
517
|
* Create a new parse result from the given parser, value, encoding, and source.
|
516
518
|
*/
|
517
519
|
static VALUE
|
518
|
-
parse_result_create(pm_parser_t *parser, VALUE value, rb_encoding *encoding, VALUE source) {
|
520
|
+
parse_result_create(VALUE class, pm_parser_t *parser, VALUE value, rb_encoding *encoding, VALUE source) {
|
519
521
|
VALUE result_argv[] = {
|
520
522
|
value,
|
521
523
|
parser_comments(parser, source),
|
@@ -526,7 +528,7 @@ parse_result_create(pm_parser_t *parser, VALUE value, rb_encoding *encoding, VAL
|
|
526
528
|
source
|
527
529
|
};
|
528
530
|
|
529
|
-
return rb_class_new_instance(7, result_argv,
|
531
|
+
return rb_class_new_instance(7, result_argv, class);
|
530
532
|
}
|
531
533
|
|
532
534
|
/******************************************************************************/
|
@@ -635,7 +637,7 @@ parse_lex_input(pm_string_t *input, const pm_options_t *options, bool return_nod
|
|
635
637
|
value = parse_lex_data.tokens;
|
636
638
|
}
|
637
639
|
|
638
|
-
VALUE result = parse_result_create(&parser, value, parse_lex_data.encoding, source);
|
640
|
+
VALUE result = parse_result_create(rb_cPrismParseLexResult, &parser, value, parse_lex_data.encoding, source);
|
639
641
|
pm_node_destroy(&parser, node);
|
640
642
|
pm_parser_free(&parser);
|
641
643
|
|
@@ -700,7 +702,7 @@ parse_input(pm_string_t *input, const pm_options_t *options) {
|
|
700
702
|
|
701
703
|
VALUE source = pm_source_new(&parser, encoding);
|
702
704
|
VALUE value = pm_ast_new(&parser, node, encoding, source);
|
703
|
-
VALUE result = parse_result_create(&parser, value, encoding, source) ;
|
705
|
+
VALUE result = parse_result_create(rb_cPrismParseResult, &parser, value, encoding, source) ;
|
704
706
|
|
705
707
|
pm_node_destroy(&parser, node);
|
706
708
|
pm_parser_free(&parser);
|
@@ -804,7 +806,7 @@ parse_stream(int argc, VALUE *argv, VALUE self) {
|
|
804
806
|
|
805
807
|
VALUE source = pm_source_new(&parser, encoding);
|
806
808
|
VALUE value = pm_ast_new(&parser, node, encoding, source);
|
807
|
-
VALUE result = parse_result_create(&parser, value, encoding, source);
|
809
|
+
VALUE result = parse_result_create(rb_cPrismParseResult, &parser, value, encoding, source);
|
808
810
|
|
809
811
|
pm_node_destroy(&parser, node);
|
810
812
|
pm_buffer_free(&buffer);
|
@@ -1362,7 +1364,10 @@ Init_prism(void) {
|
|
1362
1364
|
rb_cPrismMagicComment = rb_define_class_under(rb_cPrism, "MagicComment", rb_cObject);
|
1363
1365
|
rb_cPrismParseError = rb_define_class_under(rb_cPrism, "ParseError", rb_cObject);
|
1364
1366
|
rb_cPrismParseWarning = rb_define_class_under(rb_cPrism, "ParseWarning", rb_cObject);
|
1365
|
-
|
1367
|
+
|
1368
|
+
rb_cPrismResult = rb_define_class_under(rb_cPrism, "Result", rb_cObject);
|
1369
|
+
rb_cPrismParseResult = rb_define_class_under(rb_cPrism, "ParseResult", rb_cPrismResult);
|
1370
|
+
rb_cPrismParseLexResult = rb_define_class_under(rb_cPrism, "ParseLexResult", rb_cPrismResult);
|
1366
1371
|
|
1367
1372
|
// Intern all of the options that we support so that we don't have to do it
|
1368
1373
|
// every time we parse.
|
data/ext/prism/extension.h
CHANGED
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;
|
@@ -1249,16 +1264,32 @@ typedef struct pm_array_node {
|
|
1249
1264
|
|
1250
1265
|
/**
|
1251
1266
|
* ArrayNode#elements
|
1267
|
+
*
|
1268
|
+
* 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
1269
|
*/
|
1253
1270
|
struct pm_node_list elements;
|
1254
1271
|
|
1255
1272
|
/**
|
1256
1273
|
* ArrayNode#opening_loc
|
1274
|
+
*
|
1275
|
+
* Represents the optional source location for the opening token.
|
1276
|
+
*
|
1277
|
+
* [1,2,3] # "["
|
1278
|
+
* %w[foo bar baz] # "%w["
|
1279
|
+
* %I(apple orange banana) # "%I("
|
1280
|
+
* foo = 1, 2, 3 # nil
|
1257
1281
|
*/
|
1258
1282
|
pm_location_t opening_loc;
|
1259
1283
|
|
1260
1284
|
/**
|
1261
1285
|
* ArrayNode#closing_loc
|
1286
|
+
*
|
1287
|
+
* Represents the optional source location for the closing token.
|
1288
|
+
*
|
1289
|
+
* [1,2,3] # "]"
|
1290
|
+
* %w[foo bar baz] # "]"
|
1291
|
+
* %I(apple orange banana) # ")"
|
1292
|
+
* foo = 1, 2, 3 # nil
|
1262
1293
|
*/
|
1263
1294
|
pm_location_t closing_loc;
|
1264
1295
|
} pm_array_node_t;
|
@@ -1605,11 +1636,21 @@ typedef struct pm_break_node {
|
|
1605
1636
|
|
1606
1637
|
/**
|
1607
1638
|
* BreakNode#arguments
|
1639
|
+
*
|
1640
|
+
* 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).
|
1641
|
+
*
|
1642
|
+
* break foo
|
1643
|
+
* ^^^
|
1608
1644
|
*/
|
1609
1645
|
struct pm_arguments_node *arguments;
|
1610
1646
|
|
1611
1647
|
/**
|
1612
1648
|
* BreakNode#keyword_loc
|
1649
|
+
*
|
1650
|
+
* The location of the `break` keyword.
|
1651
|
+
*
|
1652
|
+
* break foo
|
1653
|
+
* ^^^^^
|
1613
1654
|
*/
|
1614
1655
|
pm_location_t keyword_loc;
|
1615
1656
|
} pm_break_node_t;
|
@@ -2209,8 +2250,7 @@ typedef struct pm_class_variable_write_node {
|
|
2209
2250
|
/**
|
2210
2251
|
* ClassVariableWriteNode#value
|
2211
2252
|
*
|
2212
|
-
* The value to
|
2213
|
-
* represents a non-void expression.
|
2253
|
+
* 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
2254
|
*
|
2215
2255
|
* @@foo = :bar
|
2216
2256
|
* ^^^^
|
@@ -2372,16 +2412,47 @@ typedef struct pm_constant_path_node {
|
|
2372
2412
|
|
2373
2413
|
/**
|
2374
2414
|
* ConstantPathNode#parent
|
2415
|
+
*
|
2416
|
+
* 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.
|
2417
|
+
*
|
2418
|
+
* Foo::Bar
|
2419
|
+
* ^^^
|
2420
|
+
*
|
2421
|
+
* self::Test
|
2422
|
+
* ^^^^
|
2423
|
+
*
|
2424
|
+
* a.b::C
|
2425
|
+
* ^^^
|
2375
2426
|
*/
|
2376
2427
|
struct pm_node *parent;
|
2377
2428
|
|
2378
2429
|
/**
|
2379
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
|
+
* ^^^^
|
2440
|
+
*
|
2441
|
+
* a.b::C
|
2442
|
+
* ^
|
2380
2443
|
*/
|
2381
2444
|
struct pm_node *child;
|
2382
2445
|
|
2383
2446
|
/**
|
2384
2447
|
* ConstantPathNode#delimiter_loc
|
2448
|
+
*
|
2449
|
+
* The location of the `::` delimiter.
|
2450
|
+
*
|
2451
|
+
* ::Foo
|
2452
|
+
* ^^
|
2453
|
+
*
|
2454
|
+
* One::Two
|
2455
|
+
* ^^
|
2385
2456
|
*/
|
2386
2457
|
pm_location_t delimiter_loc;
|
2387
2458
|
} pm_constant_path_node_t;
|
@@ -2485,16 +2556,34 @@ typedef struct pm_constant_path_write_node {
|
|
2485
2556
|
|
2486
2557
|
/**
|
2487
2558
|
* ConstantPathWriteNode#target
|
2559
|
+
*
|
2560
|
+
* A node representing the constant path being written to.
|
2561
|
+
*
|
2562
|
+
* Foo::Bar = 1
|
2563
|
+
* ^^^^^^^^
|
2564
|
+
*
|
2565
|
+
* ::Foo = :abc
|
2566
|
+
* ^^^^^
|
2488
2567
|
*/
|
2489
2568
|
struct pm_constant_path_node *target;
|
2490
2569
|
|
2491
2570
|
/**
|
2492
2571
|
* ConstantPathWriteNode#operator_loc
|
2572
|
+
*
|
2573
|
+
* The location of the `=` operator.
|
2574
|
+
*
|
2575
|
+
* ::ABC = 123
|
2576
|
+
* ^
|
2493
2577
|
*/
|
2494
2578
|
pm_location_t operator_loc;
|
2495
2579
|
|
2496
2580
|
/**
|
2497
2581
|
* ConstantPathWriteNode#value
|
2582
|
+
*
|
2583
|
+
* 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).
|
2584
|
+
*
|
2585
|
+
* FOO::BAR = :abc
|
2586
|
+
* ^^^^
|
2498
2587
|
*/
|
2499
2588
|
struct pm_node *value;
|
2500
2589
|
} pm_constant_path_write_node_t;
|
@@ -2552,21 +2641,45 @@ typedef struct pm_constant_write_node {
|
|
2552
2641
|
|
2553
2642
|
/**
|
2554
2643
|
* ConstantWriteNode#name
|
2644
|
+
*
|
2645
|
+
* The name of the [constant](https://github.com/ruby/prism/blob/main/docs/parsing_rules.md#constants).
|
2646
|
+
*
|
2647
|
+
* Foo = :bar # name `:Foo`
|
2648
|
+
*
|
2649
|
+
* XYZ = 1 # name `:XYZ`
|
2555
2650
|
*/
|
2556
2651
|
pm_constant_id_t name;
|
2557
2652
|
|
2558
2653
|
/**
|
2559
2654
|
* ConstantWriteNode#name_loc
|
2655
|
+
*
|
2656
|
+
* The location of the constant name.
|
2657
|
+
*
|
2658
|
+
* FOO = 1
|
2659
|
+
* ^^^
|
2560
2660
|
*/
|
2561
2661
|
pm_location_t name_loc;
|
2562
2662
|
|
2563
2663
|
/**
|
2564
2664
|
* ConstantWriteNode#value
|
2665
|
+
*
|
2666
|
+
* 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).
|
2667
|
+
*
|
2668
|
+
* FOO = :bar
|
2669
|
+
* ^^^^
|
2670
|
+
*
|
2671
|
+
* MyClass = Class.new
|
2672
|
+
* ^^^^^^^^^
|
2565
2673
|
*/
|
2566
2674
|
struct pm_node *value;
|
2567
2675
|
|
2568
2676
|
/**
|
2569
2677
|
* ConstantWriteNode#operator_loc
|
2678
|
+
*
|
2679
|
+
* The location of the `=` operator.
|
2680
|
+
*
|
2681
|
+
* FOO = :bar
|
2682
|
+
* ^
|
2570
2683
|
*/
|
2571
2684
|
pm_location_t operator_loc;
|
2572
2685
|
} pm_constant_write_node_t;
|
@@ -3122,21 +3235,45 @@ typedef struct pm_global_variable_write_node {
|
|
3122
3235
|
|
3123
3236
|
/**
|
3124
3237
|
* GlobalVariableWriteNode#name
|
3238
|
+
*
|
3239
|
+
* 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.
|
3240
|
+
*
|
3241
|
+
* $foo = :bar # name `:$foo`
|
3242
|
+
*
|
3243
|
+
* $_Test = 123 # name `:$_Test`
|
3125
3244
|
*/
|
3126
3245
|
pm_constant_id_t name;
|
3127
3246
|
|
3128
3247
|
/**
|
3129
3248
|
* GlobalVariableWriteNode#name_loc
|
3249
|
+
*
|
3250
|
+
* The location of the global variable's name.
|
3251
|
+
*
|
3252
|
+
* $foo = :bar
|
3253
|
+
* ^^^^
|
3130
3254
|
*/
|
3131
3255
|
pm_location_t name_loc;
|
3132
3256
|
|
3133
3257
|
/**
|
3134
3258
|
* GlobalVariableWriteNode#value
|
3259
|
+
*
|
3260
|
+
* 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).
|
3261
|
+
*
|
3262
|
+
* $foo = :bar
|
3263
|
+
* ^^^^
|
3264
|
+
*
|
3265
|
+
* $-xyz = 123
|
3266
|
+
* ^^^
|
3135
3267
|
*/
|
3136
3268
|
struct pm_node *value;
|
3137
3269
|
|
3138
3270
|
/**
|
3139
3271
|
* GlobalVariableWriteNode#operator_loc
|
3272
|
+
*
|
3273
|
+
* The location of the `=` operator.
|
3274
|
+
*
|
3275
|
+
* $foo = :bar
|
3276
|
+
* ^
|
3140
3277
|
*/
|
3141
3278
|
pm_location_t operator_loc;
|
3142
3279
|
} pm_global_variable_write_node_t;
|
@@ -3236,31 +3373,89 @@ typedef struct pm_if_node {
|
|
3236
3373
|
|
3237
3374
|
/**
|
3238
3375
|
* IfNode#if_keyword_loc
|
3376
|
+
*
|
3377
|
+
* The location of the `if` keyword if present.
|
3378
|
+
*
|
3379
|
+
* bar if foo
|
3380
|
+
* ^^
|
3381
|
+
*
|
3382
|
+
* The `if_keyword_loc` field will be `nil` when the `IfNode` represents a ternary expression.
|
3239
3383
|
*/
|
3240
3384
|
pm_location_t if_keyword_loc;
|
3241
3385
|
|
3242
3386
|
/**
|
3243
3387
|
* IfNode#predicate
|
3388
|
+
*
|
3389
|
+
* The node for the condition the `IfNode` is testing.
|
3390
|
+
*
|
3391
|
+
* if foo
|
3392
|
+
* ^^^
|
3393
|
+
* bar
|
3394
|
+
* end
|
3395
|
+
*
|
3396
|
+
* bar if foo
|
3397
|
+
* ^^^
|
3398
|
+
*
|
3399
|
+
* foo ? bar : baz
|
3400
|
+
* ^^^
|
3244
3401
|
*/
|
3245
3402
|
struct pm_node *predicate;
|
3246
3403
|
|
3247
3404
|
/**
|
3248
3405
|
* IfNode#then_keyword_loc
|
3406
|
+
*
|
3407
|
+
* The location of the `then` keyword (if present) or the `?` in a ternary expression, `nil` otherwise.
|
3408
|
+
*
|
3409
|
+
* if foo then bar end
|
3410
|
+
* ^^^^
|
3411
|
+
*
|
3412
|
+
* a ? b : c
|
3413
|
+
* ^
|
3249
3414
|
*/
|
3250
3415
|
pm_location_t then_keyword_loc;
|
3251
3416
|
|
3252
3417
|
/**
|
3253
3418
|
* IfNode#statements
|
3419
|
+
*
|
3420
|
+
* Represents the body of statements that will be executed when the predicate is evaluated as truthy. Will be `nil` when no body is provided.
|
3421
|
+
*
|
3422
|
+
* if foo
|
3423
|
+
* bar
|
3424
|
+
* ^^^
|
3425
|
+
* baz
|
3426
|
+
* ^^^
|
3427
|
+
* end
|
3254
3428
|
*/
|
3255
3429
|
struct pm_statements_node *statements;
|
3256
3430
|
|
3257
3431
|
/**
|
3258
3432
|
* IfNode#consequent
|
3433
|
+
*
|
3434
|
+
* Represents an `ElseNode` or an `IfNode` when there is an `else` or an `elsif` in the `if` statement.
|
3435
|
+
*
|
3436
|
+
* if foo
|
3437
|
+
* bar
|
3438
|
+
* elsif baz
|
3439
|
+
* ^^^^^^^^^
|
3440
|
+
* qux
|
3441
|
+
* ^^^
|
3442
|
+
* end
|
3443
|
+
* ^^^
|
3444
|
+
*
|
3445
|
+
* if foo then bar else baz end
|
3446
|
+
* ^^^^^^^^^^^^
|
3259
3447
|
*/
|
3260
3448
|
struct pm_node *consequent;
|
3261
3449
|
|
3262
3450
|
/**
|
3263
3451
|
* IfNode#end_keyword_loc
|
3452
|
+
*
|
3453
|
+
* The location of the `end` keyword if present, `nil` otherwise.
|
3454
|
+
*
|
3455
|
+
* if foo
|
3456
|
+
* bar
|
3457
|
+
* end
|
3458
|
+
* ^^^
|
3264
3459
|
*/
|
3265
3460
|
pm_location_t end_keyword_loc;
|
3266
3461
|
} pm_if_node_t;
|
@@ -3737,8 +3932,7 @@ typedef struct pm_instance_variable_write_node {
|
|
3737
3932
|
/**
|
3738
3933
|
* InstanceVariableWriteNode#value
|
3739
3934
|
*
|
3740
|
-
* The value to
|
3741
|
-
* represents a non-void expression.
|
3935
|
+
* 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
3936
|
*
|
3743
3937
|
* @foo = :bar
|
3744
3938
|
* ^^^^
|
@@ -4242,26 +4436,62 @@ typedef struct pm_local_variable_write_node {
|
|
4242
4436
|
|
4243
4437
|
/**
|
4244
4438
|
* LocalVariableWriteNode#name
|
4439
|
+
*
|
4440
|
+
* The name of the local variable, which is an [identifier](https://github.com/ruby/prism/blob/main/docs/parsing_rules.md#identifiers).
|
4441
|
+
*
|
4442
|
+
* foo = :bar # name `:foo`
|
4443
|
+
*
|
4444
|
+
* abc = 123 # name `:abc`
|
4245
4445
|
*/
|
4246
4446
|
pm_constant_id_t name;
|
4247
4447
|
|
4248
4448
|
/**
|
4249
4449
|
* LocalVariableWriteNode#depth
|
4450
|
+
*
|
4451
|
+
* The number of semantic scopes we have to traverse to find the declaration of this variable.
|
4452
|
+
*
|
4453
|
+
* foo = 1 # depth 0
|
4454
|
+
*
|
4455
|
+
* tap { foo = 1 } # depth 1
|
4456
|
+
*
|
4457
|
+
* 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
4458
|
*/
|
4251
4459
|
uint32_t depth;
|
4252
4460
|
|
4253
4461
|
/**
|
4254
4462
|
* LocalVariableWriteNode#name_loc
|
4463
|
+
*
|
4464
|
+
* The location of the variable name.
|
4465
|
+
*
|
4466
|
+
* foo = :bar
|
4467
|
+
* ^^^
|
4255
4468
|
*/
|
4256
4469
|
pm_location_t name_loc;
|
4257
4470
|
|
4258
4471
|
/**
|
4259
4472
|
* LocalVariableWriteNode#value
|
4473
|
+
*
|
4474
|
+
* 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).
|
4475
|
+
*
|
4476
|
+
* foo = :bar
|
4477
|
+
* ^^^^
|
4478
|
+
*
|
4479
|
+
* abc = 1234
|
4480
|
+
* ^^^^
|
4481
|
+
*
|
4482
|
+
* 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.
|
4483
|
+
*
|
4484
|
+
* foo = foo
|
4260
4485
|
*/
|
4261
4486
|
struct pm_node *value;
|
4262
4487
|
|
4263
4488
|
/**
|
4264
4489
|
* LocalVariableWriteNode#operator_loc
|
4490
|
+
*
|
4491
|
+
* The location of the `=` operator.
|
4492
|
+
*
|
4493
|
+
* x = :y
|
4494
|
+
* ^
|
4265
4495
|
*/
|
4266
4496
|
pm_location_t operator_loc;
|
4267
4497
|
} pm_local_variable_write_node_t;
|
@@ -5350,6 +5580,8 @@ typedef struct pm_source_file_node {
|
|
5350
5580
|
|
5351
5581
|
/**
|
5352
5582
|
* SourceFileNode#filepath
|
5583
|
+
*
|
5584
|
+
* Represents the file path being parsed. This corresponds directly to the `filepath` option given to the various `Prism::parse*` APIs.
|
5353
5585
|
*/
|
5354
5586
|
pm_string_t filepath;
|
5355
5587
|
} pm_source_file_node_t;
|
@@ -5562,31 +5794,66 @@ typedef struct pm_unless_node {
|
|
5562
5794
|
|
5563
5795
|
/**
|
5564
5796
|
* UnlessNode#keyword_loc
|
5797
|
+
*
|
5798
|
+
* The location of the `unless` keyword.
|
5799
|
+
*
|
5800
|
+
* unless cond then bar end
|
5801
|
+
* ^^^^^^
|
5802
|
+
*
|
5803
|
+
* bar unless cond
|
5804
|
+
* ^^^^^^
|
5565
5805
|
*/
|
5566
5806
|
pm_location_t keyword_loc;
|
5567
5807
|
|
5568
5808
|
/**
|
5569
5809
|
* UnlessNode#predicate
|
5810
|
+
*
|
5811
|
+
* 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).
|
5812
|
+
*
|
5813
|
+
* unless cond then bar end
|
5814
|
+
* ^^^^
|
5815
|
+
*
|
5816
|
+
* bar unless cond
|
5817
|
+
* ^^^^
|
5570
5818
|
*/
|
5571
5819
|
struct pm_node *predicate;
|
5572
5820
|
|
5573
5821
|
/**
|
5574
5822
|
* UnlessNode#then_keyword_loc
|
5823
|
+
*
|
5824
|
+
* The location of the `then` keyword, if present.
|
5825
|
+
* unless cond then bar end ^^^^
|
5575
5826
|
*/
|
5576
5827
|
pm_location_t then_keyword_loc;
|
5577
5828
|
|
5578
5829
|
/**
|
5579
5830
|
* UnlessNode#statements
|
5831
|
+
*
|
5832
|
+
* The body of statements that will executed if the unless condition is
|
5833
|
+
* falsey. Will be `nil` if no body is provided.
|
5834
|
+
*
|
5835
|
+
* unless cond then bar end
|
5836
|
+
* ^^^
|
5580
5837
|
*/
|
5581
5838
|
struct pm_statements_node *statements;
|
5582
5839
|
|
5583
5840
|
/**
|
5584
5841
|
* UnlessNode#consequent
|
5842
|
+
*
|
5843
|
+
* The else clause of the unless expression, if present.
|
5844
|
+
*
|
5845
|
+
* unless cond then bar else baz end
|
5846
|
+
* ^^^^^^^^
|
5585
5847
|
*/
|
5586
5848
|
struct pm_else_node *consequent;
|
5587
5849
|
|
5588
5850
|
/**
|
5589
5851
|
* UnlessNode#end_keyword_loc
|
5852
|
+
*
|
5853
|
+
* The location of the `end` keyword, if present.
|
5854
|
+
*
|
5855
|
+
* unless cond then bar end
|
5856
|
+
* ^^^
|
5590
5857
|
*/
|
5591
5858
|
pm_location_t end_keyword_loc;
|
5592
5859
|
} pm_unless_node_t;
|
data/include/prism/diagnostic.h
CHANGED
@@ -163,6 +163,8 @@ typedef enum {
|
|
163
163
|
PM_ERR_INVALID_CHARACTER,
|
164
164
|
PM_ERR_INVALID_ENCODING_MAGIC_COMMENT,
|
165
165
|
PM_ERR_INVALID_FLOAT_EXPONENT,
|
166
|
+
PM_ERR_INVALID_LOCAL_VARIABLE_READ,
|
167
|
+
PM_ERR_INVALID_LOCAL_VARIABLE_WRITE,
|
166
168
|
PM_ERR_INVALID_MULTIBYTE_CHAR,
|
167
169
|
PM_ERR_INVALID_MULTIBYTE_CHARACTER,
|
168
170
|
PM_ERR_INVALID_MULTIBYTE_ESCAPE,
|
@@ -235,6 +237,7 @@ typedef enum {
|
|
235
237
|
PM_ERR_PATTERN_HASH_KEY,
|
236
238
|
PM_ERR_PATTERN_HASH_KEY_DUPLICATE,
|
237
239
|
PM_ERR_PATTERN_HASH_KEY_LABEL,
|
240
|
+
PM_ERR_PATTERN_HASH_KEY_LOCALS,
|
238
241
|
PM_ERR_PATTERN_IDENT_AFTER_HROCKET,
|
239
242
|
PM_ERR_PATTERN_LABEL_AFTER_COMMA,
|
240
243
|
PM_ERR_PATTERN_REST,
|
data/include/prism/version.h
CHANGED
@@ -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
|
17
|
+
#define PRISM_VERSION_MINOR 27
|
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
|
+
#define PRISM_VERSION "0.27.0"
|
28
28
|
|
29
29
|
#endif
|
data/lib/prism/ffi.rb
CHANGED
@@ -350,7 +350,7 @@ module Prism
|
|
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
|
-
|
353
|
+
ParseLexResult.new([node, tokens], comments, magic_comments, data_loc, errors, warnings, source)
|
354
354
|
end
|
355
355
|
end
|
356
356
|
|
data/lib/prism/lex_compat.rb
CHANGED
@@ -10,6 +10,23 @@ module Prism
|
|
10
10
|
# generally lines up. However, there are a few cases that require special
|
11
11
|
# handling.
|
12
12
|
class LexCompat # :nodoc:
|
13
|
+
# A result class specialized for holding tokens produced by the lexer.
|
14
|
+
class Result < Prism::Result
|
15
|
+
# The list of tokens that were produced by the lexer.
|
16
|
+
attr_reader :value
|
17
|
+
|
18
|
+
# Create a new lex compat result object with the given values.
|
19
|
+
def initialize(value, comments, magic_comments, data_loc, errors, warnings, source)
|
20
|
+
@value = value
|
21
|
+
super(comments, magic_comments, data_loc, errors, warnings, source)
|
22
|
+
end
|
23
|
+
|
24
|
+
# Implement the hash pattern matching interface for Result.
|
25
|
+
def deconstruct_keys(keys)
|
26
|
+
super.merge!(value: value)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
13
30
|
# This is a mapping of prism token types to Ripper token types. This is a
|
14
31
|
# many-to-one mapping because we split up our token types, whereas Ripper
|
15
32
|
# tends to group them.
|
@@ -844,7 +861,7 @@ module Prism
|
|
844
861
|
# We sort by location to compare against Ripper's output
|
845
862
|
tokens.sort_by!(&:location)
|
846
863
|
|
847
|
-
|
864
|
+
Result.new(tokens, result.comments, result.magic_comments, result.data_loc, result.errors, result.warnings, Source.new(source))
|
848
865
|
end
|
849
866
|
end
|
850
867
|
|