parser 3.0.3.0 → 3.0.3.1

Sign up to get free protection for your applications and to get access to all the features.
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