prism 0.26.0 → 0.27.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 +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
|
|