ruby-next-parser 3.0.1.0 → 3.1.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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 tMETHREF tBDOT2 tBDOT3
20
+ tRATIONAL tIMAGINARY tLABEL_END tANDDOT tBDOT2 tBDOT3
21
+ tMETHREF
21
22
 
22
23
  prechigh
23
24
  right tBANG tTILDE tUPLUS
@@ -371,7 +372,7 @@ rule
371
372
  result = @lexer.in_kwarg
372
373
  @lexer.in_kwarg = true
373
374
  }
374
- p_expr
375
+ p_top_expr_body
375
376
  {
376
377
  @pattern_variables.pop
377
378
  @lexer.in_kwarg = val[2]
@@ -386,7 +387,7 @@ rule
386
387
  result = @lexer.in_kwarg
387
388
  @lexer.in_kwarg = true
388
389
  }
389
- p_expr
390
+ p_top_expr_body
390
391
  {
391
392
  @pattern_variables.pop
392
393
  @lexer.in_kwarg = val[2]
@@ -2292,7 +2293,7 @@ opt_block_args_tail:
2292
2293
 
2293
2294
  p_variable: tIDENTIFIER
2294
2295
  {
2295
- result = @builder.match_var(val[0])
2296
+ result = @builder.assignable(@builder.match_var(val[0]))
2296
2297
  }
2297
2298
 
2298
2299
  p_var_ref: tCARET tIDENTIFIER
@@ -2305,11 +2306,19 @@ opt_block_args_tail:
2305
2306
  lvar = @builder.accessible(@builder.ident(val[1]))
2306
2307
  result = @builder.pin(val[0], lvar)
2307
2308
  }
2309
+
2310
+ | tCARET nonlocal_var
2311
+ {
2312
+ non_lvar = @builder.accessible(val[1])
2313
+ result = @builder.pin(val[0], non_lvar)
2314
+ }
2315
+
2308
2316
  p_expr_ref: tCARET tLPAREN expr_value tRPAREN
2309
2317
  {
2310
2318
  expr = @builder.begin(val[1], val[2], val[3])
2311
2319
  result = @builder.pin(val[0], expr)
2312
2320
  }
2321
+
2313
2322
  p_const: tCOLON3 cname
2314
2323
  {
2315
2324
  result = @builder.const_global(val[0], val[1])
@@ -2581,6 +2590,19 @@ regexp_contents: # nothing
2581
2590
  result = @builder.complex(val[0])
2582
2591
  }
2583
2592
 
2593
+ nonlocal_var: tIVAR
2594
+ {
2595
+ result = @builder.ivar(val[0])
2596
+ }
2597
+ | tGVAR
2598
+ {
2599
+ result = @builder.gvar(val[0])
2600
+ }
2601
+ | tCVAR
2602
+ {
2603
+ result = @builder.cvar(val[0])
2604
+ }
2605
+
2584
2606
  user_variable: tIDENTIFIER
2585
2607
  {
2586
2608
  result = @builder.ident(val[0])
@@ -2633,46 +2655,6 @@ keyword_variable: kNIL
2633
2655
 
2634
2656
  var_ref: user_variable
2635
2657
  {
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
2658
  result = @builder.accessible(val[0])
2677
2659
  }
2678
2660
  | keyword_variable
@@ -3062,24 +3044,7 @@ f_opt_paren_args: f_paren_args
3062
3044
  {
3063
3045
  result = []
3064
3046
  }
3065
- | assoc_items trailer
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
- }
3047
+ | assocs trailer
3083
3048
 
3084
3049
  assocs: assoc
3085
3050
  {
@@ -3100,8 +3065,7 @@ f_opt_paren_args: f_paren_args
3100
3065
  }
3101
3066
  | tLABEL
3102
3067
  {
3103
- lvar = @builder.accessible(@builder.ident(val[0]))
3104
- result = @builder.ipair_keyword(lvar)
3068
+ result = @builder.pair_label(val[0])
3105
3069
  }
3106
3070
  | tSTRING_BEG string_contents tLABEL_END arg_value
3107
3071
  {
@@ -3177,3 +3141,47 @@ require 'parser/ruby-next/parser_ext'
3177
3141
  diagnostic :error, :endless_setter, nil, name_t
3178
3142
  end
3179
3143
  end
3144
+
3145
+ def try_declare_numparam(node)
3146
+ name = node.children[0]
3147
+
3148
+ if name =~ /\A_[1-9]\z/ && !static_env.declared?(name) && context.in_dynamic_block?
3149
+ # definitely an implicit param
3150
+ location = node.loc.expression
3151
+
3152
+ if max_numparam_stack.has_ordinary_params?
3153
+ diagnostic :error, :ordinary_param_defined, nil, [nil, location]
3154
+ end
3155
+
3156
+ raw_context = context.stack.dup
3157
+ raw_max_numparam_stack = max_numparam_stack.stack.dup
3158
+
3159
+ # ignore current block scope
3160
+ raw_context.pop
3161
+ raw_max_numparam_stack.pop
3162
+
3163
+ raw_context.reverse_each do |outer_scope|
3164
+ if outer_scope == :block || outer_scope == :lambda
3165
+ outer_scope_has_numparams = raw_max_numparam_stack.pop > 0
3166
+
3167
+ if outer_scope_has_numparams
3168
+ diagnostic :error, :numparam_used_in_outer_scope, nil, [nil, location]
3169
+ else
3170
+ # for now it's ok, but an outer scope can also be a block
3171
+ # with numparams, so we need to continue
3172
+ end
3173
+ else
3174
+ # found an outer scope that can't have numparams
3175
+ # like def/class/etc
3176
+ break
3177
+ end
3178
+ end
3179
+
3180
+ static_env.declare(name)
3181
+ max_numparam_stack.register(name[1].to_i)
3182
+
3183
+ true
3184
+ else
3185
+ false
3186
+ end
3187
+ 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.0.1.0
4
+ version: 3.1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Vladimir Dementyev
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-06-04 00:00:00.000000000 Z
11
+ date: 2021-11-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: 2.7.2.0
19
+ version: 3.0.3.0
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: 2.7.2.0
26
+ version: 3.0.3.0
27
27
  description: "\n Parser extension to support edge and experimental Ruby syntax\n
28
28
  \ "
29
29
  email:
@@ -63,7 +63,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
63
63
  - !ruby/object:Gem::Version
64
64
  version: '0'
65
65
  requirements: []
66
- rubygems_version: 3.2.15
66
+ rubygems_version: 3.2.22
67
67
  signing_key:
68
68
  specification_version: 4
69
69
  summary: Parser extension to support edge and experimental Ruby syntax