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.
- checksums.yaml +4 -4
- data/lib/gauntlet_parser.rb +1 -1
- data/lib/parser/all.rb +15 -13
- data/lib/parser/ast/node.rb +2 -2
- data/lib/parser/ast/processor.rb +3 -1
- data/lib/parser/builders/default.rb +53 -32
- data/lib/parser/current.rb +37 -19
- data/lib/parser/lexer/literal.rb +16 -1
- data/lib/parser/lexer-F0.rb +12922 -0
- data/lib/parser/lexer-F1.rb +14875 -0
- data/lib/parser/lexer-strings.rb +5424 -0
- data/lib/parser/macruby.rb +5 -3
- data/lib/parser/messages.rb +46 -41
- data/lib/parser/ruby18.rb +5 -3
- data/lib/parser/ruby19.rb +5 -3
- data/lib/parser/ruby20.rb +5 -3
- data/lib/parser/ruby21.rb +5 -3
- data/lib/parser/ruby22.rb +5 -3
- data/lib/parser/ruby23.rb +5 -3
- data/lib/parser/ruby24.rb +5 -3
- data/lib/parser/ruby25.rb +5 -3
- data/lib/parser/ruby26.rb +5 -3
- data/lib/parser/ruby27.rb +5 -3
- data/lib/parser/ruby30.rb +5 -3
- data/lib/parser/ruby31.rb +5 -3
- data/lib/parser/ruby32.rb +1039 -1026
- data/lib/parser/ruby33.rb +12589 -0
- data/lib/parser/ruby34.rb +12589 -0
- data/lib/parser/rubymotion.rb +5 -3
- data/lib/parser/runner/ruby_parse.rb +3 -3
- data/lib/parser/runner/ruby_rewrite.rb +1 -1
- data/lib/parser/runner.rb +27 -17
- data/lib/parser/source/buffer.rb +18 -4
- data/lib/parser/source/comment/associator.rb +7 -7
- data/lib/parser/source/range.rb +1 -1
- data/lib/parser/source/tree_rewriter/action.rb +5 -4
- data/lib/parser/static_environment.rb +56 -9
- data/lib/parser/unknown_encoding_in_magic_comment_error.rb +15 -0
- data/lib/parser/version.rb +1 -1
- data/lib/parser.rb +57 -51
- data/parser.gemspec +1 -1
- metadata +26 -21
- data/lib/parser/lexer.rb +0 -25045
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 6b1e8c490a997a2df26e2e03604458f20f94295241ed5b99dfbe45d7f06bac3c
|
|
4
|
+
data.tar.gz: 48a7733a1a6a7ff5ce9db5ae9a3ab11a4ef29e40baa5d0a4fbd9c4f8d97d34aa
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 01dbf93e7c6f423aefef85196a0d4a4ea2aa3e7b967761d386326b8d6279d8990864dae261bb642040288e51496b8b9270fbadf2a7794a97d85788e57f7d4cf4
|
|
7
|
+
data.tar.gz: 71c4254b20d51d8df265d65628235d2fe3d13b6105a917449ecb5e00a280f11956412cea0364fe03957a7e5c09f704724b42ecf68c0419a048711cc7b6426c8f
|
data/lib/gauntlet_parser.rb
CHANGED
data/lib/parser/all.rb
CHANGED
|
@@ -1,15 +1,17 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
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'
|
data/lib/parser/ast/node.rb
CHANGED
|
@@ -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](
|
|
9
|
-
# class provided by gem [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
|
#
|
data/lib/parser/ast/processor.rb
CHANGED
|
@@ -538,29 +538,23 @@ module Parser
|
|
|
538
538
|
end
|
|
539
539
|
|
|
540
540
|
def associate(begin_t, pairs, end_t)
|
|
541
|
-
|
|
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
|
-
|
|
562
|
-
|
|
563
|
-
|
|
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
|
-
|
|
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
|
|
1706
|
+
when :and, :or
|
|
1700
1707
|
lhs, rhs = *cond
|
|
1701
1708
|
|
|
1702
|
-
|
|
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
|
data/lib/parser/current.rb
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
74
|
+
require_relative 'ruby26'
|
|
75
75
|
CurrentRuby = Ruby26
|
|
76
76
|
|
|
77
77
|
when /^2\.7\./
|
|
78
|
-
current_version = '2.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
|
-
|
|
83
|
+
require_relative 'ruby27'
|
|
84
84
|
CurrentRuby = Ruby27
|
|
85
85
|
|
|
86
86
|
when /^3\.0\./
|
|
87
|
-
current_version = '3.0.
|
|
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
|
-
|
|
92
|
+
require_relative 'ruby30'
|
|
93
93
|
CurrentRuby = Ruby30
|
|
94
94
|
|
|
95
95
|
when /^3\.1\./
|
|
96
|
-
current_version = '3.1.
|
|
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
|
-
|
|
101
|
+
require_relative 'ruby31'
|
|
102
102
|
CurrentRuby = Ruby31
|
|
103
103
|
|
|
104
104
|
when /^3\.2\./
|
|
105
|
-
current_version = '3.2.
|
|
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
|
-
|
|
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/
|
|
116
|
-
|
|
117
|
-
CurrentRuby =
|
|
133
|
+
warn_syntax_deviation 'parser/ruby33', '3.3.x'
|
|
134
|
+
require_relative 'ruby33'
|
|
135
|
+
CurrentRuby = Ruby33
|
|
118
136
|
end
|
|
119
137
|
end
|
data/lib/parser/lexer/literal.rb
CHANGED
|
@@ -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
|
|
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
|