ruby-next-parser 3.0.0.2 → 3.1.0.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 -24
- data/lib/parser/ruby-next/ast/processor.rb +0 -4
- data/lib/parser/ruby-next/builder.rb +0 -4
- 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 +3988 -3813
- data/lib/parser/rubynext.y +172 -79
- 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
|
@@ -2195,8 +2273,8 @@ opt_block_args_tail:
|
|
2195
2273
|
{
|
2196
2274
|
result = @builder.range_exclusive(val[0], val[1], nil)
|
2197
2275
|
}
|
2198
|
-
| p_variable
|
2199
2276
|
| p_var_ref
|
2277
|
+
| p_expr_ref
|
2200
2278
|
| p_const
|
2201
2279
|
| tBDOT2 p_primitive
|
2202
2280
|
{
|
@@ -2223,7 +2301,7 @@ opt_block_args_tail:
|
|
2223
2301
|
|
2224
2302
|
p_variable: tIDENTIFIER
|
2225
2303
|
{
|
2226
|
-
result = @builder.match_var(val[0])
|
2304
|
+
result = @builder.assignable(@builder.match_var(val[0]))
|
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
|
{
|
@@ -3025,6 +3070,10 @@ f_opt_paren_args: f_paren_args
|
|
3025
3070
|
{
|
3026
3071
|
result = @builder.pair_keyword(val[0], val[1])
|
3027
3072
|
}
|
3073
|
+
| tLABEL
|
3074
|
+
{
|
3075
|
+
result = @builder.pair_label(val[0])
|
3076
|
+
}
|
3028
3077
|
| tSTRING_BEG string_contents tLABEL_END arg_value
|
3029
3078
|
{
|
3030
3079
|
result = @builder.pair_quoted(val[0], val[1], val[2], val[3])
|
@@ -3087,7 +3136,7 @@ require 'parser/ruby-next/parser_ext'
|
|
3087
3136
|
prepend Parser::NextExt
|
3088
3137
|
|
3089
3138
|
def version
|
3090
|
-
|
3139
|
+
31
|
3091
3140
|
end
|
3092
3141
|
|
3093
3142
|
def default_encoding
|
@@ -3095,7 +3144,51 @@ require 'parser/ruby-next/parser_ext'
|
|
3095
3144
|
end
|
3096
3145
|
|
3097
3146
|
def endless_method_name(name_t)
|
3098
|
-
if name_t[0].end_with?('=')
|
3147
|
+
if !%w[=== == != <= >=].include?(name_t[0]) && name_t[0].end_with?('=')
|
3099
3148
|
diagnostic :error, :endless_setter, nil, name_t
|
3100
3149
|
end
|
3101
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.0.1
|
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-11-30 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: []
|