parser 3.0.1.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: dced4877039fb67469d83e8d10c513c2ca05cc09878b487e60a29a9795bef7f1
4
- data.tar.gz: c7827038c9b8acfe02c7878e3f74c46184106ff1939a8fa8f0eb2d60c7560cc4
3
+ metadata.gz: 77c9eebb09451e4a14705adad346538d2abe88fee102045ea98d041cf39f07d8
4
+ data.tar.gz: 67e81c519a542b6f8927a3e076280cf1c6fb35c0c5c738fa9f44efefb8a436b5
5
5
  SHA512:
6
- metadata.gz: 6c1bc36f5b08e5ccb99d6dc7774a7e7041709b14d0ddecaa2aa63cacabd9e1be39ce28fbceb9c9c90512cd79d19e20d163386621694a9265fcdf6085c82aaf5e
7
- data.tar.gz: 4c3f661941751ea6f66b2e1089fd5d53125e12b0c4819d7e80123143d1798736ba5169cc09b4f3be1dff50c56d8a609355c751c20b1236a3d7288c6d9fee9875
6
+ metadata.gz: ad73beaf5b3110282c673bbbb2566fad13ddbbe92ffa24f52eca02efc8a83f56c504d84dbc4e571ff42a3af6f7762a517c19654c6942775b26330a25ff67fc9b
7
+ data.tar.gz: d17eaef98d39bfe83f09ed5a7fbcd6bf94eff3d9b85b23f1fd12732f40c965796910184eca6fe9686a62a6f152566c2a72d473a338a7f9903794676d56ca831b
data/lib/parser/all.rb CHANGED
@@ -11,3 +11,4 @@ require 'parser/ruby25'
11
11
  require 'parser/ruby26'
12
12
  require 'parser/ruby27'
13
13
  require 'parser/ruby30'
14
+ require 'parser/ruby31'
@@ -161,7 +161,7 @@ module Parser
161
161
  #
162
162
  # ```
163
163
  # (send nil :foo
164
- # (hash
164
+ # (kwargs
165
165
  # (pair
166
166
  # (sym :a)
167
167
  # (int 42))
@@ -518,12 +518,52 @@ module Parser
518
518
  n(:pair, [ key, value ], pair_map)
519
519
  end
520
520
 
521
+ def pair_label(key_t)
522
+ key_l = loc(key_t)
523
+ value_l = key_l.adjust(end_pos: -1)
524
+
525
+ label = value(key_t)
526
+ value =
527
+ if label =~ /\A[[:lower:]]/
528
+ n(:ident, [ label.to_sym ], Source::Map::Variable.new(value_l))
529
+ else
530
+ n(:const, [ nil, label.to_sym ], Source::Map::Constant.new(nil, value_l, value_l))
531
+ end
532
+ pair_keyword(key_t, accessible(value))
533
+ end
534
+
521
535
  def kwsplat(dstar_t, arg)
522
536
  n(:kwsplat, [ arg ],
523
537
  unary_op_map(dstar_t, arg))
524
538
  end
525
539
 
526
540
  def associate(begin_t, pairs, end_t)
541
+ 0.upto(pairs.length - 1) do |i|
542
+ (i + 1).upto(pairs.length - 1) do |j|
543
+ key1, = *pairs[i]
544
+ key2, = *pairs[j]
545
+
546
+ do_warn = false
547
+
548
+ # keys have to be simple nodes, MRI ignores equal composite keys like
549
+ # `{ a(1) => 1, a(1) => 1 }`
550
+ case key1.type
551
+ when :sym, :str, :int, :float
552
+ if key1 == key2
553
+ do_warn = true
554
+ end
555
+ when :rational, :complex, :regexp
556
+ if @parser.version >= 31 && key1 == key2
557
+ do_warn = true
558
+ end
559
+ end
560
+
561
+ if do_warn
562
+ diagnostic :warning, :duplicate_hash_key, nil, key2.loc.expression
563
+ end
564
+ end
565
+ end
566
+
527
567
  n(:hash, [ *pairs ],
528
568
  collection_map(begin_t, pairs, end_t))
529
569
  end
@@ -608,19 +648,29 @@ module Parser
608
648
  when :ident
609
649
  name, = *node
610
650
 
611
- if @parser.static_env.declared?(name)
612
- if name.to_s == parser.current_arg_stack.top
613
- diagnostic :error, :circular_argument_reference,
614
- { :var_name => name.to_s }, node.loc.expression
615
- end
651
+ if %w[? !].any? { |c| name.to_s.end_with?(c) }
652
+ diagnostic :error, :invalid_id_to_get,
653
+ { :identifier => name.to_s }, node.loc.expression
654
+ end
616
655
 
617
- node.updated(:lvar)
618
- else
619
- name, = *node
620
- n(:send, [ nil, name ],
656
+ # Numbered parameters are not declared anywhere,
657
+ # so they take precedence over method calls in numblock contexts
658
+ if @parser.version >= 27 && @parser.try_declare_numparam(node)
659
+ return node.updated(:lvar)
660
+ end
661
+
662
+ unless @parser.static_env.declared?(name)
663
+ return n(:send, [ nil, name ],
621
664
  var_send_map(node))
622
665
  end
623
666
 
667
+ if name.to_s == parser.current_arg_stack.top
668
+ diagnostic :error, :circular_argument_reference,
669
+ { :var_name => name.to_s }, node.loc.expression
670
+ end
671
+
672
+ node.updated(:lvar)
673
+
624
674
  else
625
675
  node
626
676
  end
@@ -683,6 +733,17 @@ module Parser
683
733
 
684
734
  node.updated(:lvasgn)
685
735
 
736
+ when :match_var
737
+ name, = *node
738
+
739
+ var_name = node.children[0].to_s
740
+ name_loc = node.loc.expression
741
+
742
+ check_assignment_to_numparam(var_name, name_loc)
743
+ check_reserved_for_numparam(var_name, name_loc)
744
+
745
+ node
746
+
686
747
  when :nil, :self, :true, :false,
687
748
  :__FILE__, :__LINE__, :__ENCODING__
688
749
  diagnostic :error, :invalid_assignment, nil, node.loc.expression
@@ -818,8 +879,14 @@ module Parser
818
879
 
819
880
  def args(begin_t, args, end_t, check_args=true)
820
881
  args = check_duplicate_args(args) if check_args
821
- n(:args, args,
822
- 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
823
890
  end
824
891
 
825
892
  def numargs(max_numparam)
@@ -906,9 +973,12 @@ module Parser
906
973
  end
907
974
 
908
975
  def blockarg(amper_t, name_t)
909
- 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
910
979
 
911
- n(:blockarg, [ value(name_t).to_sym ],
980
+ arg_name = name_t ? value(name_t).to_sym : nil
981
+ n(:blockarg, [ arg_name ],
912
982
  arg_prefix_map(amper_t, name_t))
913
983
  end
914
984
 
@@ -1683,6 +1753,21 @@ module Parser
1683
1753
  end
1684
1754
  end
1685
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
+
1686
1771
  def check_assignment_to_numparam(name, loc)
1687
1772
  # MRI < 2.7 treats numbered parameters as regular variables
1688
1773
  # and so it's allowed to perform assignments like `_1 = 42`.
@@ -1724,7 +1809,7 @@ module Parser
1724
1809
  end
1725
1810
 
1726
1811
  def check_lvar_name(name, loc)
1727
- if name =~ /\A[[[:lower:]]|_][[[:alnum:]]_]*\z/
1812
+ if name =~ /\A[[[:lower:]]_][[[:alnum:]]_]*\z/
1728
1813
  # OK
1729
1814
  else
1730
1815
  diagnostic :error, :lvar_name, { name: name }, loc
@@ -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
@@ -66,7 +66,7 @@ module Parser
66
66
  CurrentRuby = Ruby25
67
67
 
68
68
  when /^2\.6\./
69
- current_version = '2.6.7'
69
+ current_version = '2.6.9'
70
70
  if RUBY_VERSION != current_version
71
71
  warn_syntax_deviation 'parser/ruby26', current_version
72
72
  end
@@ -75,7 +75,7 @@ module Parser
75
75
  CurrentRuby = Ruby26
76
76
 
77
77
  when /^2\.7\./
78
- current_version = '2.7.3'
78
+ current_version = '2.7.5'
79
79
  if RUBY_VERSION != current_version
80
80
  warn_syntax_deviation 'parser/ruby27', current_version
81
81
  end
@@ -84,7 +84,7 @@ module Parser
84
84
  CurrentRuby = Ruby27
85
85
 
86
86
  when /^3\.0\./
87
- current_version = '3.0.1'
87
+ current_version = '3.0.3'
88
88
  if RUBY_VERSION != current_version
89
89
  warn_syntax_deviation 'parser/ruby30', current_version
90
90
  end
@@ -92,6 +92,15 @@ module Parser
92
92
  require 'parser/ruby30'
93
93
  CurrentRuby = Ruby30
94
94
 
95
+ when /^3\.1\./
96
+ current_version = '3.1.0-dev'
97
+ if RUBY_VERSION != current_version
98
+ warn_syntax_deviation 'parser/ruby31', current_version
99
+ end
100
+
101
+ require 'parser/ruby31'
102
+ CurrentRuby = Ruby31
103
+
95
104
  else # :nocov:
96
105
  # Keep this in sync with released Ruby.
97
106
  warn_syntax_deviation 'parser/ruby30', '3.0.x'
@@ -38,7 +38,13 @@ module Parser
38
38
  # Prevent the following error when processing binary encoded source.
39
39
  # "\xC0".split # => ArgumentError (invalid byte sequence in UTF-8)
40
40
  lines = string.force_encoding(Encoding::BINARY).split("\\\n")
41
- lines.map! {|s| s.force_encoding(original_encoding) }
41
+ if lines.length == 1
42
+ # If the line continuation sequence was found but there is no second
43
+ # line, it was not really a line continuation and must be ignored.
44
+ lines = [string]
45
+ else
46
+ lines.map! {|s| s.force_encoding(original_encoding) }
47
+ end
42
48
 
43
49
  if @at_line_begin
44
50
  lines_to_dedent = lines