parser 3.0.3.0 → 3.0.3.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2f2373806f006b11c31c2f32d9576d0518857bd56a6aa2cdcb726d53b9637b9b
4
- data.tar.gz: 75b1007432711a397706519cf5c58ca8e4b1080d3d0ff2f78b7211335b339aab
3
+ metadata.gz: 77c9eebb09451e4a14705adad346538d2abe88fee102045ea98d041cf39f07d8
4
+ data.tar.gz: 67e81c519a542b6f8927a3e076280cf1c6fb35c0c5c738fa9f44efefb8a436b5
5
5
  SHA512:
6
- metadata.gz: '01900a02647f2a01d3124adba64fa162d2bd34b894d5e308131bde78076efbaec5bcc9b78237cdfea3361b6a46358e9812e7cb6f09cbadec79bd0bf54c1046a9'
7
- data.tar.gz: efcf5dcbc08a9082b495f39fe18379398f29ba97b0a00444bf26e2e32b477c31b7cf7e0c01c24f8e8b67e30f6c3ac87f42eb3a3d9201f97cec84fc9fd0062949
6
+ metadata.gz: ad73beaf5b3110282c673bbbb2566fad13ddbbe92ffa24f52eca02efc8a83f56c504d84dbc4e571ff42a3af6f7762a517c19654c6942775b26330a25ff67fc9b
7
+ data.tar.gz: d17eaef98d39bfe83f09ed5a7fbcd6bf94eff3d9b85b23f1fd12732f40c965796910184eca6fe9686a62a6f152566c2a72d473a338a7f9903794676d56ca831b
@@ -879,8 +879,14 @@ module Parser
879
879
 
880
880
  def args(begin_t, args, end_t, check_args=true)
881
881
  args = check_duplicate_args(args) if check_args
882
- n(:args, args,
883
- collection_map(begin_t, args, end_t))
882
+ validate_no_forward_arg_after_restarg(args)
883
+
884
+ map = collection_map(begin_t, args, end_t)
885
+ if !self.class.emit_forward_arg && args.length == 1 && args[0].type == :forward_arg
886
+ n(:forward_args, [], map)
887
+ else
888
+ n(:args, args, map)
889
+ end
884
890
  end
885
891
 
886
892
  def numargs(max_numparam)
@@ -967,9 +973,12 @@ module Parser
967
973
  end
968
974
 
969
975
  def blockarg(amper_t, name_t)
970
- check_reserved_for_numparam(value(name_t), loc(name_t))
976
+ if !name_t.nil?
977
+ check_reserved_for_numparam(value(name_t), loc(name_t))
978
+ end
971
979
 
972
- n(:blockarg, [ value(name_t).to_sym ],
980
+ arg_name = name_t ? value(name_t).to_sym : nil
981
+ n(:blockarg, [ arg_name ],
973
982
  arg_prefix_map(amper_t, name_t))
974
983
  end
975
984
 
@@ -1744,6 +1753,21 @@ module Parser
1744
1753
  end
1745
1754
  end
1746
1755
 
1756
+ def validate_no_forward_arg_after_restarg(args)
1757
+ restarg = nil
1758
+ forward_arg = nil
1759
+ args.each do |arg|
1760
+ case arg.type
1761
+ when :restarg then restarg = arg
1762
+ when :forward_arg then forward_arg = arg
1763
+ end
1764
+ end
1765
+
1766
+ if !forward_arg.nil? && !restarg.nil?
1767
+ diagnostic :error, :forward_arg_after_restarg, nil, forward_arg.loc.expression, [restarg.loc.expression]
1768
+ end
1769
+ end
1770
+
1747
1771
  def check_assignment_to_numparam(name, loc)
1748
1772
  # MRI < 2.7 treats numbered parameters as regular variables
1749
1773
  # and so it's allowed to perform assignments like `_1 = 42`.
@@ -9,6 +9,9 @@ module Parser
9
9
  # + :sclass - in the singleton class body (class << obj; end)
10
10
  # + :def - in the method body (def m; end)
11
11
  # + :defs - in the singleton method body (def self.m; end)
12
+ # + :def_open_args - in the arglist of the method definition
13
+ # keep in mind that it's set **only** after reducing the first argument,
14
+ # if you need to handle the first argument check `lex_state == expr_fname`
12
15
  # + :block - in the block body (tap {})
13
16
  # + :lambda - in the lambda body (-> {})
14
17
  #
@@ -64,5 +67,9 @@ module Parser
64
67
  def in_dynamic_block?
65
68
  in_block? || in_lambda?
66
69
  end
70
+
71
+ def in_def_open_args?
72
+ @stack.last == :def_open_args
73
+ end
67
74
  end
68
75
  end