ruby-next-parser 3.0.0.3 → 3.1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- 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 +12805 -11557
- data/lib/parser/ruby-next/lexer.rl +74 -9
- data/lib/parser/ruby-next/meta.rb +1 -1
- data/lib/parser/ruby-next/version.rb +1 -1
- data/lib/parser/rubynext.rb +4031 -3863
- data/lib/parser/rubynext.y +183 -95
- metadata +10 -10
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
|
@@ -261,6 +262,74 @@ rule
|
|
261
262
|
val[0], val[1], val[2]),
|
262
263
|
val[3], val[4])
|
263
264
|
}
|
265
|
+
| defn_head f_opt_paren_args tEQL command
|
266
|
+
{
|
267
|
+
_def_t, name_t = val[0]
|
268
|
+
endless_method_name(name_t)
|
269
|
+
|
270
|
+
result = @builder.def_endless_method(*val[0],
|
271
|
+
val[1], val[2], val[3])
|
272
|
+
|
273
|
+
@lexer.cmdarg.pop
|
274
|
+
@lexer.cond.pop
|
275
|
+
@static_env.unextend
|
276
|
+
@context.pop
|
277
|
+
@current_arg_stack.pop
|
278
|
+
}
|
279
|
+
| defn_head f_opt_paren_args tEQL command kRESCUE_MOD arg
|
280
|
+
{
|
281
|
+
_def_t, name_t = val[0]
|
282
|
+
endless_method_name(name_t)
|
283
|
+
|
284
|
+
rescue_body = @builder.rescue_body(val[4],
|
285
|
+
nil, nil, nil,
|
286
|
+
nil, val[5])
|
287
|
+
|
288
|
+
method_body = @builder.begin_body(val[3], [ rescue_body ])
|
289
|
+
|
290
|
+
result = @builder.def_endless_method(*val[0],
|
291
|
+
val[1], val[2], method_body)
|
292
|
+
|
293
|
+
@lexer.cmdarg.pop
|
294
|
+
@lexer.cond.pop
|
295
|
+
@static_env.unextend
|
296
|
+
@context.pop
|
297
|
+
@current_arg_stack.pop
|
298
|
+
}
|
299
|
+
| defs_head f_opt_paren_args tEQL command
|
300
|
+
{
|
301
|
+
_def_t, _recv, _dot_t, name_t = val[0]
|
302
|
+
endless_method_name(name_t)
|
303
|
+
|
304
|
+
result = @builder.def_endless_singleton(*val[0],
|
305
|
+
val[1], val[2], val[3])
|
306
|
+
|
307
|
+
@lexer.cmdarg.pop
|
308
|
+
@lexer.cond.pop
|
309
|
+
@static_env.unextend
|
310
|
+
@context.pop
|
311
|
+
@current_arg_stack.pop
|
312
|
+
}
|
313
|
+
| defs_head f_opt_paren_args tEQL command kRESCUE_MOD arg
|
314
|
+
{
|
315
|
+
_def_t, _recv, _dot_t, name_t = val[0]
|
316
|
+
endless_method_name(name_t)
|
317
|
+
|
318
|
+
rescue_body = @builder.rescue_body(val[4],
|
319
|
+
nil, nil, nil,
|
320
|
+
nil, val[5])
|
321
|
+
|
322
|
+
method_body = @builder.begin_body(val[3], [ rescue_body ])
|
323
|
+
|
324
|
+
result = @builder.def_endless_singleton(*val[0],
|
325
|
+
val[1], val[2], method_body)
|
326
|
+
|
327
|
+
@lexer.cmdarg.pop
|
328
|
+
@lexer.cond.pop
|
329
|
+
@static_env.unextend
|
330
|
+
@context.pop
|
331
|
+
@current_arg_stack.pop
|
332
|
+
}
|
264
333
|
| backref tOP_ASGN command_rhs
|
265
334
|
{
|
266
335
|
@builder.op_assign(val[0], val[1], val[2])
|
@@ -303,7 +372,7 @@ rule
|
|
303
372
|
result = @lexer.in_kwarg
|
304
373
|
@lexer.in_kwarg = true
|
305
374
|
}
|
306
|
-
|
375
|
+
p_top_expr_body
|
307
376
|
{
|
308
377
|
@pattern_variables.pop
|
309
378
|
@lexer.in_kwarg = val[2]
|
@@ -318,7 +387,7 @@ rule
|
|
318
387
|
result = @lexer.in_kwarg
|
319
388
|
@lexer.in_kwarg = true
|
320
389
|
}
|
321
|
-
|
390
|
+
p_top_expr_body
|
322
391
|
{
|
323
392
|
@pattern_variables.pop
|
324
393
|
@lexer.in_kwarg = val[2]
|
@@ -1091,6 +1160,14 @@ rule
|
|
1091
1160
|
{
|
1092
1161
|
result = @builder.block_pass(val[0], val[1])
|
1093
1162
|
}
|
1163
|
+
| tAMPER
|
1164
|
+
{
|
1165
|
+
if !@static_env.declared_anonymous_blockarg?
|
1166
|
+
diagnostic :error, :no_anonymous_blockarg, nil, val[0]
|
1167
|
+
end
|
1168
|
+
|
1169
|
+
result = @builder.block_pass(val[0], nil)
|
1170
|
+
}
|
1094
1171
|
|
1095
1172
|
opt_block_arg: tCOMMA block_arg
|
1096
1173
|
{
|
@@ -1950,6 +2027,7 @@ opt_block_args_tail:
|
|
1950
2027
|
}
|
1951
2028
|
|
1952
2029
|
p_expr_basic: p_value
|
2030
|
+
| p_variable
|
1953
2031
|
| p_const p_lparen p_args rparen
|
1954
2032
|
{
|
1955
2033
|
@pattern_hash_keys.pop
|
@@ -2046,23 +2124,13 @@ opt_block_args_tail:
|
|
2046
2124
|
{
|
2047
2125
|
result = [ *val[0], val[1] ]
|
2048
2126
|
}
|
2049
|
-
| p_args_head
|
2050
|
-
{
|
2051
|
-
match_rest = @builder.match_rest(val[1], val[2])
|
2052
|
-
result = [ *val[0], match_rest ]
|
2053
|
-
}
|
2054
|
-
| p_args_head tSTAR tIDENTIFIER tCOMMA p_args_post
|
2127
|
+
| p_args_head p_rest
|
2055
2128
|
{
|
2056
|
-
|
2057
|
-
result = [ *val[0], match_rest, *val[4] ]
|
2058
|
-
}
|
2059
|
-
| p_args_head tSTAR
|
2060
|
-
{
|
2061
|
-
result = [ *val[0], @builder.match_rest(val[1]) ]
|
2129
|
+
result = [ *val[0], val[1] ]
|
2062
2130
|
}
|
2063
|
-
| p_args_head
|
2131
|
+
| p_args_head p_rest tCOMMA p_args_post
|
2064
2132
|
{
|
2065
|
-
result = [ *val[0],
|
2133
|
+
result = [ *val[0], val[1], *val[3] ]
|
2066
2134
|
}
|
2067
2135
|
| p_args_tail
|
2068
2136
|
|
@@ -2101,6 +2169,11 @@ opt_block_args_tail:
|
|
2101
2169
|
{
|
2102
2170
|
result = @builder.match_rest(val[0], val[1])
|
2103
2171
|
}
|
2172
|
+
| tSTAR nonlocal_var
|
2173
|
+
{
|
2174
|
+
non_lvar = @builder.accessible(val[1])
|
2175
|
+
result = @builder.match_rest(val[0], non_lvar)
|
2176
|
+
}
|
2104
2177
|
| tSTAR
|
2105
2178
|
{
|
2106
2179
|
result = @builder.match_rest(val[0])
|
@@ -2195,8 +2268,8 @@ opt_block_args_tail:
|
|
2195
2268
|
{
|
2196
2269
|
result = @builder.range_exclusive(val[0], val[1], nil)
|
2197
2270
|
}
|
2198
|
-
| p_variable
|
2199
2271
|
| p_var_ref
|
2272
|
+
| p_expr_ref
|
2200
2273
|
| p_const
|
2201
2274
|
| tBDOT2 p_primitive
|
2202
2275
|
{
|
@@ -2223,7 +2296,12 @@ opt_block_args_tail:
|
|
2223
2296
|
|
2224
2297
|
p_variable: tIDENTIFIER
|
2225
2298
|
{
|
2226
|
-
result = @builder.match_var(val[0])
|
2299
|
+
result = @builder.assignable(@builder.match_var(val[0]))
|
2300
|
+
}
|
2301
|
+
| nonlocal_var
|
2302
|
+
{
|
2303
|
+
non_lvar = @builder.accessible(val[0])
|
2304
|
+
result = @builder.assignable(@builder.match_var(non_lvar))
|
2227
2305
|
}
|
2228
2306
|
|
2229
2307
|
p_var_ref: tCARET tIDENTIFIER
|
@@ -2237,6 +2315,18 @@ opt_block_args_tail:
|
|
2237
2315
|
result = @builder.pin(val[0], lvar)
|
2238
2316
|
}
|
2239
2317
|
|
2318
|
+
| tCARET nonlocal_var
|
2319
|
+
{
|
2320
|
+
non_lvar = @builder.accessible(val[1])
|
2321
|
+
result = @builder.pin(val[0], non_lvar)
|
2322
|
+
}
|
2323
|
+
|
2324
|
+
p_expr_ref: tCARET tLPAREN expr_value tRPAREN
|
2325
|
+
{
|
2326
|
+
expr = @builder.begin(val[1], val[2], val[3])
|
2327
|
+
result = @builder.pin(val[0], expr)
|
2328
|
+
}
|
2329
|
+
|
2240
2330
|
p_const: tCOLON3 cname
|
2241
2331
|
{
|
2242
2332
|
result = @builder.const_global(val[0], val[1])
|
@@ -2508,6 +2598,19 @@ regexp_contents: # nothing
|
|
2508
2598
|
result = @builder.complex(val[0])
|
2509
2599
|
}
|
2510
2600
|
|
2601
|
+
nonlocal_var: tIVAR
|
2602
|
+
{
|
2603
|
+
result = @builder.ivar(val[0])
|
2604
|
+
}
|
2605
|
+
| tGVAR
|
2606
|
+
{
|
2607
|
+
result = @builder.gvar(val[0])
|
2608
|
+
}
|
2609
|
+
| tCVAR
|
2610
|
+
{
|
2611
|
+
result = @builder.cvar(val[0])
|
2612
|
+
}
|
2613
|
+
|
2511
2614
|
user_variable: tIDENTIFIER
|
2512
2615
|
{
|
2513
2616
|
result = @builder.ident(val[0])
|
@@ -2560,46 +2663,6 @@ keyword_variable: kNIL
|
|
2560
2663
|
|
2561
2664
|
var_ref: user_variable
|
2562
2665
|
{
|
2563
|
-
if (node = val[0]) && node.type == :ident
|
2564
|
-
name = node.children[0]
|
2565
|
-
|
2566
|
-
if name =~ /\A_[1-9]\z/ && !static_env.declared?(name) && context.in_dynamic_block?
|
2567
|
-
# definitely an implicit param
|
2568
|
-
location = node.loc.expression
|
2569
|
-
|
2570
|
-
if max_numparam_stack.has_ordinary_params?
|
2571
|
-
diagnostic :error, :ordinary_param_defined, nil, [nil, location]
|
2572
|
-
end
|
2573
|
-
|
2574
|
-
raw_context = context.stack.dup
|
2575
|
-
raw_max_numparam_stack = max_numparam_stack.stack.dup
|
2576
|
-
|
2577
|
-
# ignore current block scope
|
2578
|
-
raw_context.pop
|
2579
|
-
raw_max_numparam_stack.pop
|
2580
|
-
|
2581
|
-
raw_context.reverse_each do |outer_scope|
|
2582
|
-
if outer_scope == :block || outer_scope == :lambda
|
2583
|
-
outer_scope_has_numparams = raw_max_numparam_stack.pop > 0
|
2584
|
-
|
2585
|
-
if outer_scope_has_numparams
|
2586
|
-
diagnostic :error, :numparam_used_in_outer_scope, nil, [nil, location]
|
2587
|
-
else
|
2588
|
-
# for now it's ok, but an outer scope can also be a block
|
2589
|
-
# with numparams, so we need to continue
|
2590
|
-
end
|
2591
|
-
else
|
2592
|
-
# found an outer scope that can't have numparams
|
2593
|
-
# like def/class/etc
|
2594
|
-
break
|
2595
|
-
end
|
2596
|
-
end
|
2597
|
-
|
2598
|
-
static_env.declare(name)
|
2599
|
-
max_numparam_stack.register(name[1].to_i)
|
2600
|
-
end
|
2601
|
-
end
|
2602
|
-
|
2603
2666
|
result = @builder.accessible(val[0])
|
2604
2667
|
}
|
2605
2668
|
| keyword_variable
|
@@ -2648,20 +2711,6 @@ f_opt_paren_args: f_paren_args
|
|
2648
2711
|
{
|
2649
2712
|
result = @builder.args(val[0], val[1], val[2])
|
2650
2713
|
|
2651
|
-
@lexer.state = :expr_value
|
2652
|
-
}
|
2653
|
-
| tLPAREN2 f_arg tCOMMA args_forward rparen
|
2654
|
-
{
|
2655
|
-
args = [ *val[1], @builder.forward_arg(val[3]) ]
|
2656
|
-
result = @builder.args(val[0], args, val[4])
|
2657
|
-
|
2658
|
-
@static_env.declare_forward_args
|
2659
|
-
}
|
2660
|
-
| tLPAREN2 args_forward rparen
|
2661
|
-
{
|
2662
|
-
result = @builder.forward_only_args(val[0], val[1], val[2])
|
2663
|
-
@static_env.declare_forward_args
|
2664
|
-
|
2665
2714
|
@lexer.state = :expr_value
|
2666
2715
|
}
|
2667
2716
|
|
@@ -2669,9 +2718,11 @@ f_opt_paren_args: f_paren_args
|
|
2669
2718
|
| {
|
2670
2719
|
result = @lexer.in_kwarg
|
2671
2720
|
@lexer.in_kwarg = true
|
2721
|
+
@context.push(:def_open_args)
|
2672
2722
|
}
|
2673
2723
|
f_args term
|
2674
2724
|
{
|
2725
|
+
@context.pop
|
2675
2726
|
@lexer.in_kwarg = val[0]
|
2676
2727
|
result = @builder.args(nil, val[1], nil)
|
2677
2728
|
}
|
@@ -2692,6 +2743,11 @@ f_opt_paren_args: f_paren_args
|
|
2692
2743
|
{
|
2693
2744
|
result = [ val[0] ]
|
2694
2745
|
}
|
2746
|
+
| args_forward
|
2747
|
+
{
|
2748
|
+
@static_env.declare_forward_args
|
2749
|
+
result = [ @builder.forward_arg(val[0]) ]
|
2750
|
+
}
|
2695
2751
|
|
2696
2752
|
opt_args_tail: tCOMMA args_tail
|
2697
2753
|
{
|
@@ -2969,6 +3025,12 @@ f_opt_paren_args: f_paren_args
|
|
2969
3025
|
|
2970
3026
|
result = @builder.blockarg(val[0], val[1])
|
2971
3027
|
}
|
3028
|
+
| blkarg_mark
|
3029
|
+
{
|
3030
|
+
@static_env.declare_anonymous_blockarg
|
3031
|
+
|
3032
|
+
result = @builder.blockarg(val[0], nil)
|
3033
|
+
}
|
2972
3034
|
|
2973
3035
|
opt_f_block_arg: tCOMMA f_block_arg
|
2974
3036
|
{
|
@@ -2989,24 +3051,7 @@ f_opt_paren_args: f_paren_args
|
|
2989
3051
|
{
|
2990
3052
|
result = []
|
2991
3053
|
}
|
2992
|
-
|
|
2993
|
-
|
2994
|
-
assoc_items : assoc_item
|
2995
|
-
{
|
2996
|
-
result = [ val[0] ]
|
2997
|
-
}
|
2998
|
-
| assoc_items tCOMMA assoc_item
|
2999
|
-
{
|
3000
|
-
result = val[0] << val[2]
|
3001
|
-
}
|
3002
|
-
|
3003
|
-
assoc_item: assoc
|
3004
|
-
|
|
3005
|
-
tIDENTIFIER
|
3006
|
-
{
|
3007
|
-
lvar = @builder.accessible(@builder.ident(val[0]))
|
3008
|
-
result = @builder.ipair(lvar)
|
3009
|
-
}
|
3054
|
+
| assocs trailer
|
3010
3055
|
|
3011
3056
|
assocs: assoc
|
3012
3057
|
{
|
@@ -3027,8 +3072,7 @@ f_opt_paren_args: f_paren_args
|
|
3027
3072
|
}
|
3028
3073
|
| tLABEL
|
3029
3074
|
{
|
3030
|
-
|
3031
|
-
result = @builder.ipair_keyword(lvar)
|
3075
|
+
result = @builder.pair_label(val[0])
|
3032
3076
|
}
|
3033
3077
|
| tSTRING_BEG string_contents tLABEL_END arg_value
|
3034
3078
|
{
|
@@ -3092,7 +3136,7 @@ require 'parser/ruby-next/parser_ext'
|
|
3092
3136
|
prepend Parser::NextExt
|
3093
3137
|
|
3094
3138
|
def version
|
3095
|
-
|
3139
|
+
31
|
3096
3140
|
end
|
3097
3141
|
|
3098
3142
|
def default_encoding
|
@@ -3100,7 +3144,51 @@ require 'parser/ruby-next/parser_ext'
|
|
3100
3144
|
end
|
3101
3145
|
|
3102
3146
|
def endless_method_name(name_t)
|
3103
|
-
if name_t[0].end_with?('=')
|
3147
|
+
if !%w[=== == != <= >=].include?(name_t[0]) && name_t[0].end_with?('=')
|
3104
3148
|
diagnostic :error, :endless_setter, nil, name_t
|
3105
3149
|
end
|
3106
3150
|
end
|
3151
|
+
|
3152
|
+
def try_declare_numparam(node)
|
3153
|
+
name = node.children[0]
|
3154
|
+
|
3155
|
+
if name =~ /\A_[1-9]\z/ && !static_env.declared?(name) && context.in_dynamic_block?
|
3156
|
+
# definitely an implicit param
|
3157
|
+
location = node.loc.expression
|
3158
|
+
|
3159
|
+
if max_numparam_stack.has_ordinary_params?
|
3160
|
+
diagnostic :error, :ordinary_param_defined, nil, [nil, location]
|
3161
|
+
end
|
3162
|
+
|
3163
|
+
raw_context = context.stack.dup
|
3164
|
+
raw_max_numparam_stack = max_numparam_stack.stack.dup
|
3165
|
+
|
3166
|
+
# ignore current block scope
|
3167
|
+
raw_context.pop
|
3168
|
+
raw_max_numparam_stack.pop
|
3169
|
+
|
3170
|
+
raw_context.reverse_each do |outer_scope|
|
3171
|
+
if outer_scope == :block || outer_scope == :lambda
|
3172
|
+
outer_scope_has_numparams = raw_max_numparam_stack.pop > 0
|
3173
|
+
|
3174
|
+
if outer_scope_has_numparams
|
3175
|
+
diagnostic :error, :numparam_used_in_outer_scope, nil, [nil, location]
|
3176
|
+
else
|
3177
|
+
# for now it's ok, but an outer scope can also be a block
|
3178
|
+
# with numparams, so we need to continue
|
3179
|
+
end
|
3180
|
+
else
|
3181
|
+
# found an outer scope that can't have numparams
|
3182
|
+
# like def/class/etc
|
3183
|
+
break
|
3184
|
+
end
|
3185
|
+
end
|
3186
|
+
|
3187
|
+
static_env.declare(name)
|
3188
|
+
max_numparam_stack.register(name[1].to_i)
|
3189
|
+
|
3190
|
+
true
|
3191
|
+
else
|
3192
|
+
false
|
3193
|
+
end
|
3194
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ruby-next-parser
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.
|
4
|
+
version: 3.1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Vladimir Dementyev
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-12-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: parser
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version:
|
19
|
+
version: 3.0.3.1
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version:
|
26
|
+
version: 3.0.3.1
|
27
27
|
description: "\n Parser extension to support edge and experimental Ruby syntax\n
|
28
28
|
\ "
|
29
29
|
email:
|
@@ -46,9 +46,9 @@ homepage: http://github.com/ruby-next/parser
|
|
46
46
|
licenses:
|
47
47
|
- MIT
|
48
48
|
metadata:
|
49
|
-
homepage_uri: http://github.com/
|
50
|
-
source_code_uri: http://github.com/
|
51
|
-
post_install_message:
|
49
|
+
homepage_uri: http://github.com/ruby-next/parser
|
50
|
+
source_code_uri: http://github.com/ruby-next/parser
|
51
|
+
post_install_message:
|
52
52
|
rdoc_options: []
|
53
53
|
require_paths:
|
54
54
|
- lib
|
@@ -63,8 +63,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
63
63
|
- !ruby/object:Gem::Version
|
64
64
|
version: '0'
|
65
65
|
requirements: []
|
66
|
-
rubygems_version: 3.
|
67
|
-
signing_key:
|
66
|
+
rubygems_version: 3.2.22
|
67
|
+
signing_key:
|
68
68
|
specification_version: 4
|
69
69
|
summary: Parser extension to support edge and experimental Ruby syntax
|
70
70
|
test_files: []
|