parser 3.1.3.0 → 3.3.2.0

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.
Files changed (43) hide show
  1. checksums.yaml +4 -4
  2. data/lib/gauntlet_parser.rb +1 -1
  3. data/lib/parser/all.rb +15 -13
  4. data/lib/parser/ast/node.rb +2 -2
  5. data/lib/parser/ast/processor.rb +3 -1
  6. data/lib/parser/builders/default.rb +53 -32
  7. data/lib/parser/current.rb +37 -19
  8. data/lib/parser/lexer/literal.rb +16 -1
  9. data/lib/parser/lexer-F0.rb +12922 -0
  10. data/lib/parser/lexer-F1.rb +14875 -0
  11. data/lib/parser/lexer-strings.rb +5424 -0
  12. data/lib/parser/macruby.rb +5 -3
  13. data/lib/parser/messages.rb +46 -41
  14. data/lib/parser/ruby18.rb +5 -3
  15. data/lib/parser/ruby19.rb +5 -3
  16. data/lib/parser/ruby20.rb +5 -3
  17. data/lib/parser/ruby21.rb +5 -3
  18. data/lib/parser/ruby22.rb +5 -3
  19. data/lib/parser/ruby23.rb +5 -3
  20. data/lib/parser/ruby24.rb +5 -3
  21. data/lib/parser/ruby25.rb +5 -3
  22. data/lib/parser/ruby26.rb +5 -3
  23. data/lib/parser/ruby27.rb +5 -3
  24. data/lib/parser/ruby30.rb +5 -3
  25. data/lib/parser/ruby31.rb +5 -3
  26. data/lib/parser/ruby32.rb +1039 -1026
  27. data/lib/parser/ruby33.rb +12589 -0
  28. data/lib/parser/ruby34.rb +12589 -0
  29. data/lib/parser/rubymotion.rb +5 -3
  30. data/lib/parser/runner/ruby_parse.rb +3 -3
  31. data/lib/parser/runner/ruby_rewrite.rb +1 -1
  32. data/lib/parser/runner.rb +27 -17
  33. data/lib/parser/source/buffer.rb +18 -4
  34. data/lib/parser/source/comment/associator.rb +7 -7
  35. data/lib/parser/source/range.rb +1 -1
  36. data/lib/parser/source/tree_rewriter/action.rb +5 -4
  37. data/lib/parser/static_environment.rb +56 -9
  38. data/lib/parser/unknown_encoding_in_magic_comment_error.rb +15 -0
  39. data/lib/parser/version.rb +1 -1
  40. data/lib/parser.rb +57 -51
  41. data/parser.gemspec +1 -1
  42. metadata +26 -21
  43. data/lib/parser/lexer.rb +0 -25045
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 41190efffa46e773dca6e8579ecca87ded55e3156774838d0e6bea3cec40803e
4
- data.tar.gz: e9219ad92e0da926e964d5f13a00208e772f4f3ba2af7910ac13fd9bf9dcb19b
3
+ metadata.gz: 6b1e8c490a997a2df26e2e03604458f20f94295241ed5b99dfbe45d7f06bac3c
4
+ data.tar.gz: 48a7733a1a6a7ff5ce9db5ae9a3ab11a4ef29e40baa5d0a4fbd9c4f8d97d34aa
5
5
  SHA512:
6
- metadata.gz: 786be93811a076e9736a02fccafab91eac37e4d6eab27cdafffc41743ed93e910c84cf073fde0195b7e51e47e1d6868b9673d7c91fbd792ac17428afeabcf68f
7
- data.tar.gz: 472cc7b075befe6502a6f1f543565941cc9d1ffd3c7e5f66f2f21bfed82597cc0a0ad42b8e0f3319321fa9554fbd44a9d375b9a7f226231c7980d8782e5dd23a
6
+ metadata.gz: 01dbf93e7c6f423aefef85196a0d4a4ea2aa3e7b967761d386326b8d6279d8990864dae261bb642040288e51496b8b9270fbadf2a7794a97d85788e57f7d4cf4
7
+ data.tar.gz: 71c4254b20d51d8df265d65628235d2fe3d13b6105a917449ecb5e00a280f11956412cea0364fe03957a7e5c09f704724b42ecf68c0419a048711cc7b6426c8f
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'gauntlet'
4
- require 'parser/all'
4
+ require_relative 'parser/all'
5
5
  require 'shellwords'
6
6
 
7
7
  class ParserGauntlet < Gauntlet
data/lib/parser/all.rb CHANGED
@@ -1,15 +1,17 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'parser/ruby18'
4
- require 'parser/ruby19'
5
- require 'parser/ruby20'
6
- require 'parser/ruby21'
7
- require 'parser/ruby22'
8
- require 'parser/ruby23'
9
- require 'parser/ruby24'
10
- require 'parser/ruby25'
11
- require 'parser/ruby26'
12
- require 'parser/ruby27'
13
- require 'parser/ruby30'
14
- require 'parser/ruby31'
15
- require 'parser/ruby32'
3
+ require_relative 'ruby18'
4
+ require_relative 'ruby19'
5
+ require_relative 'ruby20'
6
+ require_relative 'ruby21'
7
+ require_relative 'ruby22'
8
+ require_relative 'ruby23'
9
+ require_relative 'ruby24'
10
+ require_relative 'ruby25'
11
+ require_relative 'ruby26'
12
+ require_relative 'ruby27'
13
+ require_relative 'ruby30'
14
+ require_relative 'ruby31'
15
+ require_relative 'ruby32'
16
+ require_relative 'ruby33'
17
+ require_relative 'ruby34'
@@ -5,8 +5,8 @@ module Parser
5
5
 
6
6
  ##
7
7
  # {Parser::AST::Node} contains information about a single AST node and its
8
- # child nodes. It extends the basic [AST::Node](http://rdoc.info/gems/ast/AST/Node)
9
- # class provided by gem [ast](http://rdoc.info/gems/ast).
8
+ # child nodes. It extends the basic [AST::Node](https://www.rubydoc.info/gems/ast/AST/Node)
9
+ # class provided by gem [ast](https://www.rubydoc.info/gems/ast).
10
10
  #
11
11
  # @api public
12
12
  #
@@ -6,7 +6,9 @@ module Parser
6
6
  ##
7
7
  # @api public
8
8
  #
9
- class Processor < ::AST::Processor
9
+ class Processor
10
+ include ::AST::Processor::Mixin
11
+
10
12
  def process_regular_node(node)
11
13
  node.updated(nil, process_all(node))
12
14
  end
@@ -538,29 +538,23 @@ module Parser
538
538
  end
539
539
 
540
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
541
+ key_set = Set.new
560
542
 
561
- if do_warn
562
- diagnostic :warning, :duplicate_hash_key, nil, key2.loc.expression
563
- end
543
+ pairs.each do |pair|
544
+ next unless pair.type.eql?(:pair)
545
+
546
+ key, = *pair
547
+
548
+ case key.type
549
+ when :sym, :str, :int, :float
550
+ when :rational, :complex, :regexp
551
+ next unless @parser.version >= 31
552
+ else
553
+ next
554
+ end
555
+
556
+ unless key_set.add?(key)
557
+ diagnostic :warning, :duplicate_hash_key, nil, key.loc.expression
564
558
  end
565
559
  end
566
560
 
@@ -600,7 +594,13 @@ module Parser
600
594
  end
601
595
 
602
596
  def gvar(token)
603
- n(:gvar, [ value(token).to_sym ],
597
+ gvar_name = value(token)
598
+
599
+ if gvar_name.start_with?('$0') && gvar_name.length > 2
600
+ diagnostic :error, :gvar_name, { :name => gvar_name }, loc(token)
601
+ end
602
+
603
+ n(:gvar, [ gvar_name.to_sym ],
604
604
  variable_map(token))
605
605
  end
606
606
 
@@ -660,6 +660,13 @@ module Parser
660
660
  end
661
661
 
662
662
  unless @parser.static_env.declared?(name)
663
+ if @parser.version == 33 &&
664
+ name == :it &&
665
+ @parser.context.in_block &&
666
+ !@parser.max_numparam_stack.has_ordinary_params?
667
+ diagnostic :warning, :ambiguous_it_call, nil, node.loc.expression
668
+ end
669
+
663
670
  return n(:send, [ nil, name ],
664
671
  var_send_map(node))
665
672
  end
@@ -1696,24 +1703,34 @@ module Parser
1696
1703
  cond
1697
1704
  end
1698
1705
 
1699
- when :and, :or, :irange, :erange
1706
+ when :and, :or
1700
1707
  lhs, rhs = *cond
1701
1708
 
1702
- type = case cond.type
1703
- when :irange then :iflipflop
1704
- when :erange then :eflipflop
1705
- end
1706
-
1707
- if [:and, :or].include?(cond.type) &&
1708
- @parser.version == 18
1709
+ if @parser.version == 18
1709
1710
  cond
1710
1711
  else
1711
- cond.updated(type, [
1712
+ cond.updated(cond.type, [
1712
1713
  check_condition(lhs),
1713
1714
  check_condition(rhs)
1714
1715
  ])
1715
1716
  end
1716
1717
 
1718
+ when :irange, :erange
1719
+ lhs, rhs = *cond
1720
+
1721
+ type = case cond.type
1722
+ when :irange then :iflipflop
1723
+ when :erange then :eflipflop
1724
+ end
1725
+
1726
+ lhs_condition = check_condition(lhs) unless lhs.nil?
1727
+ rhs_condition = check_condition(rhs) unless rhs.nil?
1728
+
1729
+ return cond.updated(type, [
1730
+ lhs_condition,
1731
+ rhs_condition
1732
+ ])
1733
+
1717
1734
  when :regexp
1718
1735
  n(:match_current_line, [ cond ], expr_map(cond.loc.expression))
1719
1736
 
@@ -2251,6 +2268,10 @@ module Parser
2251
2268
 
2252
2269
  def static_regexp_node(node)
2253
2270
  if node.type == :regexp
2271
+ if @parser.version >= 33 && node.children[0..-2].any? { |child| child.type != :str }
2272
+ return nil
2273
+ end
2274
+
2254
2275
  parts, options = node.children[0..-2], node.children[-1]
2255
2276
  static_regexp(parts, options)
2256
2277
  end
@@ -3,7 +3,7 @@
3
3
  module Parser
4
4
  class << self
5
5
  def warn_syntax_deviation(feature, version)
6
- warn "warning: parser/current is loading #{feature}, which recognizes" \
6
+ warn "warning: parser/current is loading #{feature}, which recognizes " \
7
7
  "#{version}-compliant syntax, but you are running #{RUBY_VERSION}.\n" \
8
8
  "Please see https://github.com/whitequark/parser#compatibility-with-ruby-mri."
9
9
  end
@@ -17,7 +17,7 @@ module Parser
17
17
  warn_syntax_deviation 'parser/ruby20', current_version
18
18
  end
19
19
 
20
- require 'parser/ruby20'
20
+ require_relative 'ruby20'
21
21
  CurrentRuby = Ruby20
22
22
 
23
23
  when /^2\.1\./
@@ -26,7 +26,7 @@ module Parser
26
26
  warn_syntax_deviation 'parser/ruby21', current_version
27
27
  end
28
28
 
29
- require 'parser/ruby21'
29
+ require_relative 'ruby21'
30
30
  CurrentRuby = Ruby21
31
31
 
32
32
  when /^2\.2\./
@@ -35,7 +35,7 @@ module Parser
35
35
  warn_syntax_deviation 'parser/ruby22', current_version
36
36
  end
37
37
 
38
- require 'parser/ruby22'
38
+ require_relative 'ruby22'
39
39
  CurrentRuby = Ruby22
40
40
 
41
41
  when /^2\.3\./
@@ -44,7 +44,7 @@ module Parser
44
44
  warn_syntax_deviation 'parser/ruby23', current_version
45
45
  end
46
46
 
47
- require 'parser/ruby23'
47
+ require_relative 'ruby23'
48
48
  CurrentRuby = Ruby23
49
49
 
50
50
  when /^2\.4\./
@@ -53,7 +53,7 @@ module Parser
53
53
  warn_syntax_deviation 'parser/ruby24', current_version
54
54
  end
55
55
 
56
- require 'parser/ruby24'
56
+ require_relative 'ruby24'
57
57
  CurrentRuby = Ruby24
58
58
 
59
59
  when /^2\.5\./
@@ -62,7 +62,7 @@ module Parser
62
62
  warn_syntax_deviation 'parser/ruby25', current_version
63
63
  end
64
64
 
65
- require 'parser/ruby25'
65
+ require_relative 'ruby25'
66
66
  CurrentRuby = Ruby25
67
67
 
68
68
  when /^2\.6\./
@@ -71,49 +71,67 @@ module Parser
71
71
  warn_syntax_deviation 'parser/ruby26', current_version
72
72
  end
73
73
 
74
- require 'parser/ruby26'
74
+ require_relative 'ruby26'
75
75
  CurrentRuby = Ruby26
76
76
 
77
77
  when /^2\.7\./
78
- current_version = '2.7.7'
78
+ current_version = '2.7.8'
79
79
  if RUBY_VERSION != current_version
80
80
  warn_syntax_deviation 'parser/ruby27', current_version
81
81
  end
82
82
 
83
- require 'parser/ruby27'
83
+ require_relative 'ruby27'
84
84
  CurrentRuby = Ruby27
85
85
 
86
86
  when /^3\.0\./
87
- current_version = '3.0.5'
87
+ current_version = '3.0.7'
88
88
  if RUBY_VERSION != current_version
89
89
  warn_syntax_deviation 'parser/ruby30', current_version
90
90
  end
91
91
 
92
- require 'parser/ruby30'
92
+ require_relative 'ruby30'
93
93
  CurrentRuby = Ruby30
94
94
 
95
95
  when /^3\.1\./
96
- current_version = '3.1.3'
96
+ current_version = '3.1.6'
97
97
  if RUBY_VERSION != current_version
98
98
  warn_syntax_deviation 'parser/ruby31', current_version
99
99
  end
100
100
 
101
- require 'parser/ruby31'
101
+ require_relative 'ruby31'
102
102
  CurrentRuby = Ruby31
103
103
 
104
104
  when /^3\.2\./
105
- current_version = '3.2.0-dev'
105
+ current_version = '3.2.4'
106
106
  if RUBY_VERSION != current_version
107
107
  warn_syntax_deviation 'parser/ruby32', current_version
108
108
  end
109
109
 
110
- require 'parser/ruby32'
110
+ require_relative 'ruby32'
111
111
  CurrentRuby = Ruby32
112
112
 
113
+ when /^3\.3\./
114
+ current_version = '3.3.2'
115
+ if RUBY_VERSION != current_version
116
+ warn_syntax_deviation 'parser/ruby33', current_version
117
+ end
118
+
119
+ require_relative 'ruby33'
120
+ CurrentRuby = Ruby33
121
+
122
+ when /^3\.4\./
123
+ current_version = '3.4.0'
124
+ if RUBY_VERSION != current_version
125
+ warn_syntax_deviation 'parser/ruby34', current_version
126
+ end
127
+
128
+ require_relative 'ruby34'
129
+ CurrentRuby = Ruby34
130
+
113
131
  else # :nocov:
114
132
  # Keep this in sync with released Ruby.
115
- warn_syntax_deviation 'parser/ruby31', '3.1.x'
116
- require 'parser/ruby31'
117
- CurrentRuby = Ruby31
133
+ warn_syntax_deviation 'parser/ruby33', '3.3.x'
134
+ require_relative 'ruby33'
135
+ CurrentRuby = Ruby33
118
136
  end
119
137
  end
@@ -5,6 +5,8 @@ module Parser
5
5
 
6
6
  class Lexer::Literal
7
7
  DELIMITERS = { '(' => ')', '[' => ']', '{' => '}', '<' => '>' }
8
+ SPACE = ' '.ord
9
+ TAB = "\t".ord
8
10
 
9
11
  TYPES = {
10
12
  # type start token interpolate?
@@ -234,7 +236,20 @@ module Parser
234
236
  protected
235
237
 
236
238
  def delimiter?(delimiter)
237
- if @indent
239
+ if heredoc?
240
+ # This heredoc is valid:
241
+ # <<~E
242
+ # E
243
+ # and this:
244
+ # <<~E
245
+ # E
246
+ # but this one is not:
247
+ # <<~' E'
248
+ # E
249
+ # because there are not enough leading spaces in the closing delimiter.
250
+ delimiter.end_with?(@end_delim) &&
251
+ delimiter.sub(/#{Regexp.escape(@end_delim)}\z/, '').bytes.all? { |c| c == SPACE || c == TAB }
252
+ elsif @indent
238
253
  @end_delim == delimiter.lstrip
239
254
  else
240
255
  @end_delim == delimiter