ruby-next-parser 3.0.1.0 → 3.1.1.1
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/lib/parser/ruby-next/AST_FORMAT.md +0 -50
- data/lib/parser/ruby-next/ast/processor.rb +0 -4
- data/lib/parser/ruby-next/builder.rb +4 -5
- data/lib/parser/ruby-next/lexer.rb +12783 -11546
- data/lib/parser/ruby-next/lexer.rl +76 -11
- data/lib/parser/ruby-next/meta.rb +1 -1
- data/lib/parser/ruby-next/version.rb +1 -1
- data/lib/parser/rubynext.rb +3984 -3894
- data/lib/parser/rubynext.y +289 -236
- metadata +5 -5
data/lib/parser/rubynext.y
CHANGED
@@ -17,7 +17,8 @@ token kCLASS kMODULE kDEF kUNDEF kBEGIN kRESCUE kENSURE kEND kIF kUNLESS
|
|
17
17
|
tWORDS_BEG tQWORDS_BEG tSYMBOLS_BEG tQSYMBOLS_BEG tSTRING_DBEG
|
18
18
|
tSTRING_DVAR tSTRING_END tSTRING_DEND tSTRING tSYMBOL
|
19
19
|
tNL tEH tCOLON tCOMMA tSPACE tSEMI tLAMBDA tLAMBEG tCHARACTER
|
20
|
-
tRATIONAL tIMAGINARY tLABEL_END tANDDOT
|
20
|
+
tRATIONAL tIMAGINARY tLABEL_END tANDDOT tBDOT2 tBDOT3
|
21
|
+
tMETHREF
|
21
22
|
|
22
23
|
prechigh
|
23
24
|
right tBANG tTILDE tUPLUS
|
@@ -48,7 +49,7 @@ rule
|
|
48
49
|
|
49
50
|
program: {
|
50
51
|
@current_arg_stack.push(nil)
|
51
|
-
@max_numparam_stack.push
|
52
|
+
@max_numparam_stack.push(static: true)
|
52
53
|
}
|
53
54
|
top_compstmt
|
54
55
|
{
|
@@ -263,21 +264,19 @@ rule
|
|
263
264
|
}
|
264
265
|
| defn_head f_opt_paren_args tEQL command
|
265
266
|
{
|
266
|
-
|
267
|
+
def_t, (name_t, ctx) = val[0]
|
267
268
|
endless_method_name(name_t)
|
268
269
|
|
269
|
-
result = @builder.def_endless_method(
|
270
|
+
result = @builder.def_endless_method(def_t, name_t,
|
270
271
|
val[1], val[2], val[3])
|
271
272
|
|
272
|
-
|
273
|
-
@lexer.cond.pop
|
274
|
-
@static_env.unextend
|
275
|
-
@context.pop
|
273
|
+
local_pop
|
276
274
|
@current_arg_stack.pop
|
275
|
+
@context.in_def = ctx.in_def
|
277
276
|
}
|
278
277
|
| defn_head f_opt_paren_args tEQL command kRESCUE_MOD arg
|
279
278
|
{
|
280
|
-
|
279
|
+
def_t, (name_t, ctx) = val[0]
|
281
280
|
endless_method_name(name_t)
|
282
281
|
|
283
282
|
rescue_body = @builder.rescue_body(val[4],
|
@@ -286,32 +285,28 @@ rule
|
|
286
285
|
|
287
286
|
method_body = @builder.begin_body(val[3], [ rescue_body ])
|
288
287
|
|
289
|
-
result = @builder.def_endless_method(
|
288
|
+
result = @builder.def_endless_method(def_t, name_t,
|
290
289
|
val[1], val[2], method_body)
|
291
290
|
|
292
|
-
|
293
|
-
@lexer.cond.pop
|
294
|
-
@static_env.unextend
|
295
|
-
@context.pop
|
291
|
+
local_pop
|
296
292
|
@current_arg_stack.pop
|
293
|
+
@context.in_def = ctx.in_def
|
297
294
|
}
|
298
295
|
| defs_head f_opt_paren_args tEQL command
|
299
296
|
{
|
300
|
-
|
297
|
+
def_t, recv, dot_t, (name_t, ctx) = val[0]
|
301
298
|
endless_method_name(name_t)
|
302
299
|
|
303
|
-
result = @builder.def_endless_singleton(
|
300
|
+
result = @builder.def_endless_singleton(def_t, recv, dot_t, name_t,
|
304
301
|
val[1], val[2], val[3])
|
305
302
|
|
306
|
-
|
307
|
-
@lexer.cond.pop
|
308
|
-
@static_env.unextend
|
309
|
-
@context.pop
|
303
|
+
local_pop
|
310
304
|
@current_arg_stack.pop
|
305
|
+
@context.in_def = ctx.in_def
|
311
306
|
}
|
312
307
|
| defs_head f_opt_paren_args tEQL command kRESCUE_MOD arg
|
313
308
|
{
|
314
|
-
|
309
|
+
def_t, recv, dot_t, (name_t, ctx) = val[0]
|
315
310
|
endless_method_name(name_t)
|
316
311
|
|
317
312
|
rescue_body = @builder.rescue_body(val[4],
|
@@ -320,14 +315,12 @@ rule
|
|
320
315
|
|
321
316
|
method_body = @builder.begin_body(val[3], [ rescue_body ])
|
322
317
|
|
323
|
-
result = @builder.def_endless_singleton(
|
318
|
+
result = @builder.def_endless_singleton(def_t, recv, dot_t, name_t,
|
324
319
|
val[1], val[2], method_body)
|
325
320
|
|
326
|
-
|
327
|
-
@lexer.cond.pop
|
328
|
-
@static_env.unextend
|
329
|
-
@context.pop
|
321
|
+
local_pop
|
330
322
|
@current_arg_stack.pop
|
323
|
+
@context.in_def = ctx.in_def
|
331
324
|
}
|
332
325
|
| backref tOP_ASGN command_rhs
|
333
326
|
{
|
@@ -368,13 +361,13 @@ rule
|
|
368
361
|
@lexer.command_start = false
|
369
362
|
@pattern_variables.push
|
370
363
|
|
371
|
-
result = @
|
372
|
-
@
|
364
|
+
result = @context.in_kwarg
|
365
|
+
@context.in_kwarg = true
|
373
366
|
}
|
374
|
-
|
367
|
+
p_top_expr_body
|
375
368
|
{
|
376
369
|
@pattern_variables.pop
|
377
|
-
@
|
370
|
+
@context.in_kwarg = val[2]
|
378
371
|
result = @builder.match_pattern(val[0], val[1], val[3])
|
379
372
|
}
|
380
373
|
| arg kIN
|
@@ -383,13 +376,13 @@ rule
|
|
383
376
|
@lexer.command_start = false
|
384
377
|
@pattern_variables.push
|
385
378
|
|
386
|
-
result = @
|
387
|
-
@
|
379
|
+
result = @context.in_kwarg
|
380
|
+
@context.in_kwarg = true
|
388
381
|
}
|
389
|
-
|
382
|
+
p_top_expr_body
|
390
383
|
{
|
391
384
|
@pattern_variables.pop
|
392
|
-
@
|
385
|
+
@context.in_kwarg = val[2]
|
393
386
|
result = @builder.match_pattern_p(val[0], val[1], val[3])
|
394
387
|
}
|
395
388
|
| arg =tLBRACE_ARG
|
@@ -407,29 +400,25 @@ rule
|
|
407
400
|
|
408
401
|
def_name: fname
|
409
402
|
{
|
410
|
-
|
411
|
-
@lexer.cmdarg.push(false)
|
412
|
-
@lexer.cond.push(false)
|
403
|
+
local_push
|
413
404
|
@current_arg_stack.push(nil)
|
414
405
|
|
415
|
-
result = val[0]
|
406
|
+
result = [ val[0], @context.dup ]
|
407
|
+
@context.in_def = true
|
416
408
|
}
|
417
409
|
|
418
|
-
defn_head:
|
410
|
+
defn_head: k_def def_name
|
419
411
|
{
|
420
|
-
@context.push(:def)
|
421
|
-
|
422
412
|
result = [ val[0], val[1] ]
|
423
413
|
}
|
424
414
|
|
425
|
-
defs_head:
|
415
|
+
defs_head: k_def singleton dot_or_colon
|
426
416
|
{
|
427
417
|
@lexer.state = :expr_fname
|
418
|
+
@context.in_argdef = true
|
428
419
|
}
|
429
420
|
def_name
|
430
421
|
{
|
431
|
-
@context.push(:defs)
|
432
|
-
|
433
422
|
result = [ val[0], val[1], val[2], val[4] ]
|
434
423
|
}
|
435
424
|
|
@@ -446,12 +435,13 @@ rule
|
|
446
435
|
|
447
436
|
cmd_brace_block: tLBRACE_ARG
|
448
437
|
{
|
449
|
-
@context.
|
438
|
+
result = @context.dup
|
439
|
+
@context.in_block = true
|
450
440
|
}
|
451
441
|
brace_body tRCURLY
|
452
442
|
{
|
443
|
+
@context.in_block = val[1].in_block
|
453
444
|
result = [ val[0], *val[2], val[3] ]
|
454
|
-
@context.pop
|
455
445
|
}
|
456
446
|
|
457
447
|
fcall: operation
|
@@ -932,9 +922,14 @@ rule
|
|
932
922
|
{
|
933
923
|
result = @builder.logical_op(:or, val[0], val[1], val[2])
|
934
924
|
}
|
935
|
-
| kDEFINED opt_nl
|
925
|
+
| kDEFINED opt_nl
|
936
926
|
{
|
937
|
-
|
927
|
+
@context.in_defined = true
|
928
|
+
}
|
929
|
+
arg
|
930
|
+
{
|
931
|
+
@context.in_defined = false
|
932
|
+
result = @builder.keyword_cmd(:defined?, val[0], nil, [ val[3] ], nil)
|
938
933
|
}
|
939
934
|
| arg tEH arg opt_nl tCOLON arg
|
940
935
|
{
|
@@ -943,21 +938,19 @@ rule
|
|
943
938
|
}
|
944
939
|
| defn_head f_opt_paren_args tEQL arg
|
945
940
|
{
|
946
|
-
|
941
|
+
def_t, (name_t, ctx) = val[0]
|
947
942
|
endless_method_name(name_t)
|
948
943
|
|
949
|
-
result = @builder.def_endless_method(
|
944
|
+
result = @builder.def_endless_method(def_t, name_t,
|
950
945
|
val[1], val[2], val[3])
|
951
946
|
|
952
|
-
|
953
|
-
@lexer.cond.pop
|
954
|
-
@static_env.unextend
|
955
|
-
@context.pop
|
947
|
+
local_pop
|
956
948
|
@current_arg_stack.pop
|
949
|
+
@context.in_def = ctx.in_def
|
957
950
|
}
|
958
951
|
| defn_head f_opt_paren_args tEQL arg kRESCUE_MOD arg
|
959
952
|
{
|
960
|
-
|
953
|
+
def_t, (name_t, ctx) = val[0]
|
961
954
|
endless_method_name(name_t)
|
962
955
|
|
963
956
|
rescue_body = @builder.rescue_body(val[4],
|
@@ -966,32 +959,28 @@ rule
|
|
966
959
|
|
967
960
|
method_body = @builder.begin_body(val[3], [ rescue_body ])
|
968
961
|
|
969
|
-
result = @builder.def_endless_method(
|
962
|
+
result = @builder.def_endless_method(def_t, name_t,
|
970
963
|
val[1], val[2], method_body)
|
971
964
|
|
972
|
-
|
973
|
-
@lexer.cond.pop
|
974
|
-
@static_env.unextend
|
975
|
-
@context.pop
|
965
|
+
local_pop
|
976
966
|
@current_arg_stack.pop
|
967
|
+
@context.in_def = ctx.in_def
|
977
968
|
}
|
978
969
|
| defs_head f_opt_paren_args tEQL arg
|
979
970
|
{
|
980
|
-
|
971
|
+
def_t, recv, dot_t, (name_t, ctx) = val[0]
|
981
972
|
endless_method_name(name_t)
|
982
973
|
|
983
|
-
result = @builder.def_endless_singleton(
|
974
|
+
result = @builder.def_endless_singleton(def_t, recv, dot_t, name_t,
|
984
975
|
val[1], val[2], val[3])
|
985
976
|
|
986
|
-
|
987
|
-
@lexer.cond.pop
|
988
|
-
@static_env.unextend
|
989
|
-
@context.pop
|
977
|
+
local_pop
|
990
978
|
@current_arg_stack.pop
|
979
|
+
@context.in_def = ctx.in_def
|
991
980
|
}
|
992
981
|
| defs_head f_opt_paren_args tEQL arg kRESCUE_MOD arg
|
993
982
|
{
|
994
|
-
|
983
|
+
def_t, recv, dot_t, (name_t, ctx) = val[0]
|
995
984
|
endless_method_name(name_t)
|
996
985
|
|
997
986
|
rescue_body = @builder.rescue_body(val[4],
|
@@ -1000,14 +989,12 @@ rule
|
|
1000
989
|
|
1001
990
|
method_body = @builder.begin_body(val[3], [ rescue_body ])
|
1002
991
|
|
1003
|
-
result = @builder.def_endless_singleton(
|
992
|
+
result = @builder.def_endless_singleton(def_t, recv, dot_t, name_t,
|
1004
993
|
val[1], val[2], method_body)
|
1005
994
|
|
1006
|
-
|
1007
|
-
@lexer.cond.pop
|
1008
|
-
@static_env.unextend
|
1009
|
-
@context.pop
|
995
|
+
local_pop
|
1010
996
|
@current_arg_stack.pop
|
997
|
+
@context.in_def = ctx.in_def
|
1011
998
|
}
|
1012
999
|
| primary
|
1013
1000
|
|
@@ -1159,6 +1146,14 @@ rule
|
|
1159
1146
|
{
|
1160
1147
|
result = @builder.block_pass(val[0], val[1])
|
1161
1148
|
}
|
1149
|
+
| tAMPER
|
1150
|
+
{
|
1151
|
+
if !@static_env.declared_anonymous_blockarg?
|
1152
|
+
diagnostic :error, :no_anonymous_blockarg, nil, val[0]
|
1153
|
+
end
|
1154
|
+
|
1155
|
+
result = @builder.block_pass(val[0], nil)
|
1156
|
+
}
|
1162
1157
|
|
1163
1158
|
opt_block_arg: tCOMMA block_arg
|
1164
1159
|
{
|
@@ -1281,10 +1276,15 @@ rule
|
|
1281
1276
|
{
|
1282
1277
|
result = @builder.keyword_cmd(:yield, val[0])
|
1283
1278
|
}
|
1284
|
-
| kDEFINED opt_nl tLPAREN2
|
1279
|
+
| kDEFINED opt_nl tLPAREN2
|
1285
1280
|
{
|
1281
|
+
@context.in_defined = true
|
1282
|
+
}
|
1283
|
+
expr rparen
|
1284
|
+
{
|
1285
|
+
@context.in_defined = false
|
1286
1286
|
result = @builder.keyword_cmd(:defined?, val[0],
|
1287
|
-
val[2], [ val[
|
1287
|
+
val[2], [ val[4] ], val[5])
|
1288
1288
|
}
|
1289
1289
|
| kNOT tLPAREN2 expr rparen
|
1290
1290
|
{
|
@@ -1360,86 +1360,77 @@ rule
|
|
1360
1360
|
{
|
1361
1361
|
result = @builder.for(val[0], val[1], val[2], *val[3], val[4], val[5])
|
1362
1362
|
}
|
1363
|
-
|
|
1363
|
+
| k_class cpath superclass
|
1364
1364
|
{
|
1365
|
-
@
|
1366
|
-
|
1367
|
-
@lexer.cond.push(false)
|
1368
|
-
@context.push(:class)
|
1365
|
+
@context.in_class = true
|
1366
|
+
local_push
|
1369
1367
|
}
|
1370
1368
|
bodystmt kEND
|
1371
1369
|
{
|
1372
|
-
|
1373
|
-
|
1370
|
+
k_class, ctx = val[0]
|
1371
|
+
if @context.in_def
|
1372
|
+
diagnostic :error, :class_in_def, nil, k_class
|
1374
1373
|
end
|
1375
|
-
|
1376
1374
|
lt_t, superclass = val[2]
|
1377
|
-
result = @builder.def_class(
|
1375
|
+
result = @builder.def_class(k_class, val[1],
|
1378
1376
|
lt_t, superclass,
|
1379
1377
|
val[4], val[5])
|
1380
1378
|
|
1381
|
-
|
1382
|
-
@
|
1383
|
-
@static_env.unextend
|
1384
|
-
@context.pop
|
1379
|
+
local_pop
|
1380
|
+
@context.in_class = ctx.in_class
|
1385
1381
|
}
|
1386
|
-
|
|
1382
|
+
| k_class tLSHFT expr term
|
1387
1383
|
{
|
1388
|
-
@
|
1389
|
-
@
|
1390
|
-
|
1391
|
-
@context.push(:sclass)
|
1384
|
+
@context.in_def = false
|
1385
|
+
@context.in_class = false
|
1386
|
+
local_push
|
1392
1387
|
}
|
1393
1388
|
bodystmt kEND
|
1394
1389
|
{
|
1395
|
-
|
1390
|
+
k_class, ctx = val[0]
|
1391
|
+
result = @builder.def_sclass(k_class, val[1], val[2],
|
1396
1392
|
val[5], val[6])
|
1397
1393
|
|
1398
|
-
|
1399
|
-
@
|
1400
|
-
@
|
1401
|
-
@context.pop
|
1394
|
+
local_pop
|
1395
|
+
@context.in_def = ctx.in_def
|
1396
|
+
@context.in_class = ctx.in_class
|
1402
1397
|
}
|
1403
|
-
|
|
1398
|
+
| k_module cpath
|
1404
1399
|
{
|
1405
|
-
@
|
1406
|
-
|
1407
|
-
@context.push(:module)
|
1400
|
+
@context.in_class = true
|
1401
|
+
local_push
|
1408
1402
|
}
|
1409
1403
|
bodystmt kEND
|
1410
1404
|
{
|
1411
|
-
|
1412
|
-
|
1405
|
+
k_mod, ctx = val[0]
|
1406
|
+
if @context.in_def
|
1407
|
+
diagnostic :error, :module_in_def, nil, k_mod
|
1413
1408
|
end
|
1414
|
-
|
1415
|
-
result = @builder.def_module(val[0], val[1],
|
1409
|
+
result = @builder.def_module(k_mod, val[1],
|
1416
1410
|
val[3], val[4])
|
1417
1411
|
|
1418
|
-
|
1419
|
-
@
|
1420
|
-
@context.pop
|
1412
|
+
local_pop
|
1413
|
+
@context.in_class = ctx.in_class
|
1421
1414
|
}
|
1422
1415
|
| defn_head f_arglist bodystmt kEND
|
1423
1416
|
{
|
1424
|
-
|
1417
|
+
def_t, (name_t, ctx) = val[0]
|
1418
|
+
result = @builder.def_method(def_t, name_t, val[1],
|
1425
1419
|
val[2], val[3])
|
1426
1420
|
|
1427
|
-
|
1428
|
-
@lexer.cond.pop
|
1429
|
-
@static_env.unextend
|
1430
|
-
@context.pop
|
1421
|
+
local_pop
|
1431
1422
|
@current_arg_stack.pop
|
1423
|
+
@context.in_def = ctx.in_def
|
1432
1424
|
}
|
1433
1425
|
| defs_head f_arglist bodystmt kEND
|
1434
1426
|
{
|
1435
|
-
|
1427
|
+
def_t, recv, dot_t, (name_t, ctx) = val[0]
|
1428
|
+
result = @builder.def_singleton(def_t, recv, dot_t, name_t, val[1],
|
1436
1429
|
val[2], val[3])
|
1437
1430
|
|
1438
|
-
|
1439
|
-
@lexer.cond.pop
|
1440
|
-
@static_env.unextend
|
1441
|
-
@context.pop
|
1431
|
+
local_pop
|
1442
1432
|
@current_arg_stack.pop
|
1433
|
+
@context.in_def = ctx.in_def
|
1443
1434
|
}
|
1444
1435
|
| kBREAK
|
1445
1436
|
{
|
@@ -1464,9 +1455,25 @@ rule
|
|
1464
1455
|
|
1465
1456
|
primary_value: primary
|
1466
1457
|
|
1458
|
+
k_class: kCLASS
|
1459
|
+
{
|
1460
|
+
result = [ val[0], @context.dup ]
|
1461
|
+
}
|
1462
|
+
|
1463
|
+
k_module: kMODULE
|
1464
|
+
{
|
1465
|
+
result = [ val[0], @context.dup ]
|
1466
|
+
}
|
1467
|
+
|
1468
|
+
k_def: kDEF
|
1469
|
+
{
|
1470
|
+
result = val[0]
|
1471
|
+
@context.in_argdef = true
|
1472
|
+
}
|
1473
|
+
|
1467
1474
|
k_return: kRETURN
|
1468
1475
|
{
|
1469
|
-
if @context.in_class
|
1476
|
+
if @context.in_class && !@context.in_def && !(context.in_block || context.in_lambda)
|
1470
1477
|
diagnostic :error, :invalid_return, nil, val[0]
|
1471
1478
|
end
|
1472
1479
|
}
|
@@ -1552,6 +1559,15 @@ rule
|
|
1552
1559
|
f_any_kwrest: f_kwrest
|
1553
1560
|
| f_no_kwarg
|
1554
1561
|
|
1562
|
+
|
1563
|
+
f_eq: {
|
1564
|
+
@context.in_argdef = false
|
1565
|
+
}
|
1566
|
+
tEQL
|
1567
|
+
{
|
1568
|
+
result = val[1]
|
1569
|
+
}
|
1570
|
+
|
1555
1571
|
block_args_tail: f_block_kwarg tCOMMA f_kwrest opt_f_block_arg
|
1556
1572
|
{
|
1557
1573
|
result = val[0].concat(val[2]).concat(val[3])
|
@@ -1681,12 +1697,14 @@ opt_block_args_tail:
|
|
1681
1697
|
{
|
1682
1698
|
@max_numparam_stack.has_ordinary_params!
|
1683
1699
|
@current_arg_stack.set(nil)
|
1700
|
+
@context.in_argdef = false
|
1684
1701
|
result = @builder.args(val[0], val[1], val[2])
|
1685
1702
|
}
|
1686
1703
|
| tPIPE block_param opt_bv_decl tPIPE
|
1687
1704
|
{
|
1688
1705
|
@max_numparam_stack.has_ordinary_params!
|
1689
1706
|
@current_arg_stack.set(nil)
|
1707
|
+
@context.in_argdef = false
|
1690
1708
|
result = @builder.args(val[0], val[1].concat(val[2]), val[3])
|
1691
1709
|
}
|
1692
1710
|
|
@@ -1718,12 +1736,12 @@ opt_block_args_tail:
|
|
1718
1736
|
lambda: tLAMBDA
|
1719
1737
|
{
|
1720
1738
|
@static_env.extend_dynamic
|
1721
|
-
@max_numparam_stack.push
|
1722
|
-
@context.
|
1739
|
+
@max_numparam_stack.push(static: false)
|
1740
|
+
result = @context.dup
|
1741
|
+
@context.in_lambda = true
|
1723
1742
|
}
|
1724
1743
|
f_larglist
|
1725
1744
|
{
|
1726
|
-
@context.pop
|
1727
1745
|
@lexer.cmdarg.push(false)
|
1728
1746
|
}
|
1729
1747
|
lambda_body
|
@@ -1735,6 +1753,7 @@ opt_block_args_tail:
|
|
1735
1753
|
@max_numparam_stack.pop
|
1736
1754
|
@static_env.unextend
|
1737
1755
|
@lexer.cmdarg.pop
|
1756
|
+
@context.in_lambda = val[1].in_lambda
|
1738
1757
|
|
1739
1758
|
result = @builder.block(lambda_call,
|
1740
1759
|
begin_t, args, body, end_t)
|
@@ -1742,11 +1761,13 @@ opt_block_args_tail:
|
|
1742
1761
|
|
1743
1762
|
f_larglist: tLPAREN2 f_args opt_bv_decl tRPAREN
|
1744
1763
|
{
|
1764
|
+
@context.in_argdef = false
|
1745
1765
|
@max_numparam_stack.has_ordinary_params!
|
1746
1766
|
result = @builder.args(val[0], val[1].concat(val[2]), val[3])
|
1747
1767
|
}
|
1748
1768
|
| f_args
|
1749
1769
|
{
|
1770
|
+
@context.in_argdef = false
|
1750
1771
|
if val[0].any?
|
1751
1772
|
@max_numparam_stack.has_ordinary_params!
|
1752
1773
|
end
|
@@ -1755,31 +1776,34 @@ opt_block_args_tail:
|
|
1755
1776
|
|
1756
1777
|
lambda_body: tLAMBEG
|
1757
1778
|
{
|
1758
|
-
@context.
|
1779
|
+
result = @context.dup
|
1780
|
+
@context.in_lambda = true
|
1759
1781
|
}
|
1760
1782
|
compstmt tRCURLY
|
1761
1783
|
{
|
1784
|
+
@context.in_lambda = val[1].in_lambda
|
1762
1785
|
result = [ val[0], val[2], val[3] ]
|
1763
|
-
@context.pop
|
1764
1786
|
}
|
1765
1787
|
| kDO_LAMBDA
|
1766
1788
|
{
|
1767
|
-
@context.
|
1789
|
+
result = @context.dup
|
1790
|
+
@context.in_lambda = true
|
1768
1791
|
}
|
1769
1792
|
bodystmt kEND
|
1770
1793
|
{
|
1794
|
+
@context.in_lambda = val[1].in_lambda
|
1771
1795
|
result = [ val[0], val[2], val[3] ]
|
1772
|
-
@context.pop
|
1773
1796
|
}
|
1774
1797
|
|
1775
1798
|
do_block: kDO_BLOCK
|
1776
1799
|
{
|
1777
|
-
@context.
|
1800
|
+
result = @context.dup
|
1801
|
+
@context.in_block = true
|
1778
1802
|
}
|
1779
1803
|
do_body kEND
|
1780
1804
|
{
|
1805
|
+
@context.in_block = val[1].in_block
|
1781
1806
|
result = [ val[0], *val[2], val[3] ]
|
1782
|
-
@context.pop
|
1783
1807
|
}
|
1784
1808
|
|
1785
1809
|
block_call: command do_block
|
@@ -1865,26 +1889,28 @@ opt_block_args_tail:
|
|
1865
1889
|
|
1866
1890
|
brace_block: tLCURLY
|
1867
1891
|
{
|
1868
|
-
@context.
|
1892
|
+
result = @context.dup
|
1893
|
+
@context.in_block = true
|
1869
1894
|
}
|
1870
1895
|
brace_body tRCURLY
|
1871
1896
|
{
|
1897
|
+
@context.in_block = val[1].in_block
|
1872
1898
|
result = [ val[0], *val[2], val[3] ]
|
1873
|
-
@context.pop
|
1874
1899
|
}
|
1875
1900
|
| kDO
|
1876
1901
|
{
|
1877
|
-
@context.
|
1902
|
+
result = @context.dup
|
1903
|
+
@context.in_block = true
|
1878
1904
|
}
|
1879
1905
|
do_body kEND
|
1880
1906
|
{
|
1907
|
+
@context.in_block = val[1].in_block
|
1881
1908
|
result = [ val[0], *val[2], val[3] ]
|
1882
|
-
@context.pop
|
1883
1909
|
}
|
1884
1910
|
|
1885
1911
|
brace_body: {
|
1886
1912
|
@static_env.extend_dynamic
|
1887
|
-
@max_numparam_stack.push
|
1913
|
+
@max_numparam_stack.push(static: false)
|
1888
1914
|
}
|
1889
1915
|
opt_block_param compstmt
|
1890
1916
|
{
|
@@ -1897,7 +1923,7 @@ opt_block_args_tail:
|
|
1897
1923
|
|
1898
1924
|
do_body: {
|
1899
1925
|
@static_env.extend_dynamic
|
1900
|
-
@max_numparam_stack.push
|
1926
|
+
@max_numparam_stack.push(static: false)
|
1901
1927
|
}
|
1902
1928
|
{
|
1903
1929
|
@lexer.cmdarg.push(false)
|
@@ -1931,14 +1957,14 @@ opt_block_args_tail:
|
|
1931
1957
|
@pattern_variables.push
|
1932
1958
|
@pattern_hash_keys.push
|
1933
1959
|
|
1934
|
-
result = @
|
1935
|
-
@
|
1960
|
+
result = @context.in_kwarg
|
1961
|
+
@context.in_kwarg = true
|
1936
1962
|
}
|
1937
1963
|
p_top_expr then
|
1938
1964
|
{
|
1939
1965
|
@pattern_variables.pop
|
1940
1966
|
@pattern_hash_keys.pop
|
1941
|
-
@
|
1967
|
+
@context.in_kwarg = val[1]
|
1942
1968
|
}
|
1943
1969
|
compstmt p_cases
|
1944
1970
|
{
|
@@ -2080,13 +2106,13 @@ opt_block_args_tail:
|
|
2080
2106
|
| tLBRACE
|
2081
2107
|
{
|
2082
2108
|
@pattern_hash_keys.push
|
2083
|
-
result = @
|
2084
|
-
@
|
2109
|
+
result = @context.in_kwarg
|
2110
|
+
@context.in_kwarg = false
|
2085
2111
|
}
|
2086
2112
|
p_kwargs rbrace
|
2087
2113
|
{
|
2088
2114
|
@pattern_hash_keys.pop
|
2089
|
-
@
|
2115
|
+
@context.in_kwarg = val[1]
|
2090
2116
|
result = @builder.hash_pattern(val[0], val[2], val[3])
|
2091
2117
|
}
|
2092
2118
|
| tLBRACE rbrace
|
@@ -2115,23 +2141,13 @@ opt_block_args_tail:
|
|
2115
2141
|
{
|
2116
2142
|
result = [ *val[0], val[1] ]
|
2117
2143
|
}
|
2118
|
-
| p_args_head
|
2119
|
-
{
|
2120
|
-
match_rest = @builder.match_rest(val[1], val[2])
|
2121
|
-
result = [ *val[0], match_rest ]
|
2122
|
-
}
|
2123
|
-
| p_args_head tSTAR tIDENTIFIER tCOMMA p_args_post
|
2124
|
-
{
|
2125
|
-
match_rest = @builder.match_rest(val[1], val[2])
|
2126
|
-
result = [ *val[0], match_rest, *val[4] ]
|
2127
|
-
}
|
2128
|
-
| p_args_head tSTAR
|
2144
|
+
| p_args_head p_rest
|
2129
2145
|
{
|
2130
|
-
result = [ *val[0],
|
2146
|
+
result = [ *val[0], val[1] ]
|
2131
2147
|
}
|
2132
|
-
| p_args_head
|
2148
|
+
| p_args_head p_rest tCOMMA p_args_post
|
2133
2149
|
{
|
2134
|
-
result = [ *val[0],
|
2150
|
+
result = [ *val[0], val[1], *val[3] ]
|
2135
2151
|
}
|
2136
2152
|
| p_args_tail
|
2137
2153
|
|
@@ -2170,6 +2186,11 @@ opt_block_args_tail:
|
|
2170
2186
|
{
|
2171
2187
|
result = @builder.match_rest(val[0], val[1])
|
2172
2188
|
}
|
2189
|
+
| tSTAR nonlocal_var
|
2190
|
+
{
|
2191
|
+
non_lvar = @builder.accessible(val[1])
|
2192
|
+
result = @builder.match_rest(val[0], non_lvar)
|
2193
|
+
}
|
2173
2194
|
| tSTAR
|
2174
2195
|
{
|
2175
2196
|
result = @builder.match_rest(val[0])
|
@@ -2292,7 +2313,12 @@ opt_block_args_tail:
|
|
2292
2313
|
|
2293
2314
|
p_variable: tIDENTIFIER
|
2294
2315
|
{
|
2295
|
-
result = @builder.match_var(val[0])
|
2316
|
+
result = @builder.assignable(@builder.match_var(val[0]))
|
2317
|
+
}
|
2318
|
+
| nonlocal_var
|
2319
|
+
{
|
2320
|
+
non_lvar = @builder.accessible(val[0])
|
2321
|
+
result = @builder.assignable(@builder.match_var(non_lvar))
|
2296
2322
|
}
|
2297
2323
|
|
2298
2324
|
p_var_ref: tCARET tIDENTIFIER
|
@@ -2305,11 +2331,19 @@ opt_block_args_tail:
|
|
2305
2331
|
lvar = @builder.accessible(@builder.ident(val[1]))
|
2306
2332
|
result = @builder.pin(val[0], lvar)
|
2307
2333
|
}
|
2334
|
+
|
2335
|
+
| tCARET nonlocal_var
|
2336
|
+
{
|
2337
|
+
non_lvar = @builder.accessible(val[1])
|
2338
|
+
result = @builder.pin(val[0], non_lvar)
|
2339
|
+
}
|
2340
|
+
|
2308
2341
|
p_expr_ref: tCARET tLPAREN expr_value tRPAREN
|
2309
2342
|
{
|
2310
2343
|
expr = @builder.begin(val[1], val[2], val[3])
|
2311
2344
|
result = @builder.pin(val[0], expr)
|
2312
2345
|
}
|
2346
|
+
|
2313
2347
|
p_const: tCOLON3 cname
|
2314
2348
|
{
|
2315
2349
|
result = @builder.const_global(val[0], val[1])
|
@@ -2581,6 +2615,19 @@ regexp_contents: # nothing
|
|
2581
2615
|
result = @builder.complex(val[0])
|
2582
2616
|
}
|
2583
2617
|
|
2618
|
+
nonlocal_var: tIVAR
|
2619
|
+
{
|
2620
|
+
result = @builder.ivar(val[0])
|
2621
|
+
}
|
2622
|
+
| tGVAR
|
2623
|
+
{
|
2624
|
+
result = @builder.gvar(val[0])
|
2625
|
+
}
|
2626
|
+
| tCVAR
|
2627
|
+
{
|
2628
|
+
result = @builder.cvar(val[0])
|
2629
|
+
}
|
2630
|
+
|
2584
2631
|
user_variable: tIDENTIFIER
|
2585
2632
|
{
|
2586
2633
|
result = @builder.ident(val[0])
|
@@ -2633,46 +2680,6 @@ keyword_variable: kNIL
|
|
2633
2680
|
|
2634
2681
|
var_ref: user_variable
|
2635
2682
|
{
|
2636
|
-
if (node = val[0]) && node.type == :ident
|
2637
|
-
name = node.children[0]
|
2638
|
-
|
2639
|
-
if name =~ /\A_[1-9]\z/ && !static_env.declared?(name) && context.in_dynamic_block?
|
2640
|
-
# definitely an implicit param
|
2641
|
-
location = node.loc.expression
|
2642
|
-
|
2643
|
-
if max_numparam_stack.has_ordinary_params?
|
2644
|
-
diagnostic :error, :ordinary_param_defined, nil, [nil, location]
|
2645
|
-
end
|
2646
|
-
|
2647
|
-
raw_context = context.stack.dup
|
2648
|
-
raw_max_numparam_stack = max_numparam_stack.stack.dup
|
2649
|
-
|
2650
|
-
# ignore current block scope
|
2651
|
-
raw_context.pop
|
2652
|
-
raw_max_numparam_stack.pop
|
2653
|
-
|
2654
|
-
raw_context.reverse_each do |outer_scope|
|
2655
|
-
if outer_scope == :block || outer_scope == :lambda
|
2656
|
-
outer_scope_has_numparams = raw_max_numparam_stack.pop > 0
|
2657
|
-
|
2658
|
-
if outer_scope_has_numparams
|
2659
|
-
diagnostic :error, :numparam_used_in_outer_scope, nil, [nil, location]
|
2660
|
-
else
|
2661
|
-
# for now it's ok, but an outer scope can also be a block
|
2662
|
-
# with numparams, so we need to continue
|
2663
|
-
end
|
2664
|
-
else
|
2665
|
-
# found an outer scope that can't have numparams
|
2666
|
-
# like def/class/etc
|
2667
|
-
break
|
2668
|
-
end
|
2669
|
-
end
|
2670
|
-
|
2671
|
-
static_env.declare(name)
|
2672
|
-
max_numparam_stack.register(name[1].to_i)
|
2673
|
-
end
|
2674
|
-
end
|
2675
|
-
|
2676
2683
|
result = @builder.accessible(val[0])
|
2677
2684
|
}
|
2678
2685
|
| keyword_variable
|
@@ -2714,6 +2721,7 @@ keyword_variable: kNIL
|
|
2714
2721
|
f_opt_paren_args: f_paren_args
|
2715
2722
|
| none
|
2716
2723
|
{
|
2724
|
+
@context.in_argdef = false
|
2717
2725
|
result = @builder.args(nil, [], nil)
|
2718
2726
|
}
|
2719
2727
|
|
@@ -2722,30 +2730,19 @@ f_opt_paren_args: f_paren_args
|
|
2722
2730
|
result = @builder.args(val[0], val[1], val[2])
|
2723
2731
|
|
2724
2732
|
@lexer.state = :expr_value
|
2725
|
-
|
2726
|
-
| tLPAREN2 f_arg tCOMMA args_forward rparen
|
2727
|
-
{
|
2728
|
-
args = [ *val[1], @builder.forward_arg(val[3]) ]
|
2729
|
-
result = @builder.args(val[0], args, val[4])
|
2730
|
-
|
2731
|
-
@static_env.declare_forward_args
|
2732
|
-
}
|
2733
|
-
| tLPAREN2 args_forward rparen
|
2734
|
-
{
|
2735
|
-
result = @builder.forward_only_args(val[0], val[1], val[2])
|
2736
|
-
@static_env.declare_forward_args
|
2737
|
-
|
2738
|
-
@lexer.state = :expr_value
|
2733
|
+
@context.in_argdef = false
|
2739
2734
|
}
|
2740
2735
|
|
2741
2736
|
f_arglist: f_paren_args
|
2742
2737
|
| {
|
2743
|
-
result = @
|
2744
|
-
@
|
2738
|
+
result = @context.dup
|
2739
|
+
@context.in_kwarg = true
|
2740
|
+
@context.in_argdef = true
|
2745
2741
|
}
|
2746
2742
|
f_args term
|
2747
2743
|
{
|
2748
|
-
@
|
2744
|
+
@context.in_kwarg = val[0].in_kwarg
|
2745
|
+
@context.in_argdef = false
|
2749
2746
|
result = @builder.args(nil, val[1], nil)
|
2750
2747
|
}
|
2751
2748
|
|
@@ -2765,6 +2762,11 @@ f_opt_paren_args: f_paren_args
|
|
2765
2762
|
{
|
2766
2763
|
result = [ val[0] ]
|
2767
2764
|
}
|
2765
|
+
| args_forward
|
2766
|
+
{
|
2767
|
+
@static_env.declare_forward_args
|
2768
|
+
result = [ @builder.forward_arg(val[0]) ]
|
2769
|
+
}
|
2768
2770
|
|
2769
2771
|
opt_args_tail: tCOMMA args_tail
|
2770
2772
|
{
|
@@ -2931,6 +2933,7 @@ f_opt_paren_args: f_paren_args
|
|
2931
2933
|
@max_numparam_stack.has_ordinary_params!
|
2932
2934
|
|
2933
2935
|
@current_arg_stack.set(val[0][0])
|
2936
|
+
@context.in_argdef = false
|
2934
2937
|
|
2935
2938
|
result = val[0]
|
2936
2939
|
}
|
@@ -2938,20 +2941,24 @@ f_opt_paren_args: f_paren_args
|
|
2938
2941
|
f_kw: f_label arg_value
|
2939
2942
|
{
|
2940
2943
|
@current_arg_stack.set(nil)
|
2944
|
+
@context.in_argdef = true
|
2941
2945
|
result = @builder.kwoptarg(val[0], val[1])
|
2942
2946
|
}
|
2943
2947
|
| f_label
|
2944
2948
|
{
|
2945
2949
|
@current_arg_stack.set(nil)
|
2950
|
+
@context.in_argdef = true
|
2946
2951
|
result = @builder.kwarg(val[0])
|
2947
2952
|
}
|
2948
2953
|
|
2949
2954
|
f_block_kw: f_label primary_value
|
2950
2955
|
{
|
2956
|
+
@context.in_argdef = true
|
2951
2957
|
result = @builder.kwoptarg(val[0], val[1])
|
2952
2958
|
}
|
2953
2959
|
| f_label
|
2954
2960
|
{
|
2961
|
+
@context.in_argdef = true
|
2955
2962
|
result = @builder.kwarg(val[0])
|
2956
2963
|
}
|
2957
2964
|
|
@@ -2991,15 +2998,17 @@ f_opt_paren_args: f_paren_args
|
|
2991
2998
|
result = [ @builder.kwrestarg(val[0]) ]
|
2992
2999
|
}
|
2993
3000
|
|
2994
|
-
f_opt: f_arg_asgn
|
3001
|
+
f_opt: f_arg_asgn f_eq arg_value
|
2995
3002
|
{
|
2996
3003
|
@current_arg_stack.set(0)
|
3004
|
+
@context.in_argdef = true
|
2997
3005
|
result = @builder.optarg(val[0], val[1], val[2])
|
2998
3006
|
}
|
2999
3007
|
|
3000
|
-
f_block_opt: f_arg_asgn
|
3008
|
+
f_block_opt: f_arg_asgn f_eq primary_value
|
3001
3009
|
{
|
3002
3010
|
@current_arg_stack.set(0)
|
3011
|
+
@context.in_argdef = true
|
3003
3012
|
result = @builder.optarg(val[0], val[1], val[2])
|
3004
3013
|
}
|
3005
3014
|
|
@@ -3042,6 +3051,12 @@ f_opt_paren_args: f_paren_args
|
|
3042
3051
|
|
3043
3052
|
result = @builder.blockarg(val[0], val[1])
|
3044
3053
|
}
|
3054
|
+
| blkarg_mark
|
3055
|
+
{
|
3056
|
+
@static_env.declare_anonymous_blockarg
|
3057
|
+
|
3058
|
+
result = @builder.blockarg(val[0], nil)
|
3059
|
+
}
|
3045
3060
|
|
3046
3061
|
opt_f_block_arg: tCOMMA f_block_arg
|
3047
3062
|
{
|
@@ -3062,24 +3077,7 @@ f_opt_paren_args: f_paren_args
|
|
3062
3077
|
{
|
3063
3078
|
result = []
|
3064
3079
|
}
|
3065
|
-
|
|
3066
|
-
|
3067
|
-
assoc_items : assoc_item
|
3068
|
-
{
|
3069
|
-
result = [ val[0] ]
|
3070
|
-
}
|
3071
|
-
| assoc_items tCOMMA assoc_item
|
3072
|
-
{
|
3073
|
-
result = val[0] << val[2]
|
3074
|
-
}
|
3075
|
-
|
3076
|
-
assoc_item: assoc
|
3077
|
-
|
|
3078
|
-
tIDENTIFIER
|
3079
|
-
{
|
3080
|
-
lvar = @builder.accessible(@builder.ident(val[0]))
|
3081
|
-
result = @builder.ipair(lvar)
|
3082
|
-
}
|
3080
|
+
| assocs trailer
|
3083
3081
|
|
3084
3082
|
assocs: assoc
|
3085
3083
|
{
|
@@ -3100,8 +3098,7 @@ f_opt_paren_args: f_paren_args
|
|
3100
3098
|
}
|
3101
3099
|
| tLABEL
|
3102
3100
|
{
|
3103
|
-
|
3104
|
-
result = @builder.ipair_keyword(lvar)
|
3101
|
+
result = @builder.pair_label(val[0])
|
3105
3102
|
}
|
3106
3103
|
| tSTRING_BEG string_contents tLABEL_END arg_value
|
3107
3104
|
{
|
@@ -3162,10 +3159,10 @@ require 'parser/ruby-next/parser_ext'
|
|
3162
3159
|
|
3163
3160
|
---- inner
|
3164
3161
|
|
3165
|
-
|
3162
|
+
prepend Parser::NextExt
|
3166
3163
|
|
3167
3164
|
def version
|
3168
|
-
|
3165
|
+
32
|
3169
3166
|
end
|
3170
3167
|
|
3171
3168
|
def default_encoding
|
@@ -3177,3 +3174,59 @@ require 'parser/ruby-next/parser_ext'
|
|
3177
3174
|
diagnostic :error, :endless_setter, nil, name_t
|
3178
3175
|
end
|
3179
3176
|
end
|
3177
|
+
|
3178
|
+
def local_push
|
3179
|
+
@static_env.extend_static
|
3180
|
+
@lexer.cmdarg.push(false)
|
3181
|
+
@lexer.cond.push(false)
|
3182
|
+
@max_numparam_stack.push(static: true)
|
3183
|
+
end
|
3184
|
+
|
3185
|
+
def local_pop
|
3186
|
+
@static_env.unextend
|
3187
|
+
@lexer.cmdarg.pop
|
3188
|
+
@lexer.cond.pop
|
3189
|
+
@max_numparam_stack.pop
|
3190
|
+
end
|
3191
|
+
|
3192
|
+
def try_declare_numparam(node)
|
3193
|
+
name = node.children[0]
|
3194
|
+
|
3195
|
+
if name =~ /\A_[1-9]\z/ && !static_env.declared?(name) && @context.in_dynamic_block?
|
3196
|
+
# definitely an implicit param
|
3197
|
+
location = node.loc.expression
|
3198
|
+
|
3199
|
+
if max_numparam_stack.has_ordinary_params?
|
3200
|
+
diagnostic :error, :ordinary_param_defined, nil, [nil, location]
|
3201
|
+
end
|
3202
|
+
|
3203
|
+
raw_max_numparam_stack = max_numparam_stack.stack.dup
|
3204
|
+
# ignore current block scope
|
3205
|
+
raw_max_numparam_stack.pop
|
3206
|
+
|
3207
|
+
raw_max_numparam_stack.reverse_each do |outer_scope|
|
3208
|
+
if outer_scope[:static]
|
3209
|
+
# found an outer scope that can't have numparams
|
3210
|
+
# like def/class/etc
|
3211
|
+
break
|
3212
|
+
else
|
3213
|
+
outer_scope_has_numparams = outer_scope[:value] > 0
|
3214
|
+
|
3215
|
+
if outer_scope_has_numparams
|
3216
|
+
diagnostic :error, :numparam_used_in_outer_scope, nil, [nil, location]
|
3217
|
+
else
|
3218
|
+
# for now it's ok, but an outer scope can also be a block
|
3219
|
+
# like proc { _1; proc { proc { proc { _2 }} }}
|
3220
|
+
# with numparams, so we need to continue
|
3221
|
+
end
|
3222
|
+
end
|
3223
|
+
end
|
3224
|
+
|
3225
|
+
static_env.declare(name)
|
3226
|
+
max_numparam_stack.register(name[1].to_i)
|
3227
|
+
|
3228
|
+
true
|
3229
|
+
else
|
3230
|
+
false
|
3231
|
+
end
|
3232
|
+
end
|