parser 2.7.1.4 → 2.7.1.5
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/.travis.yml +1 -0
- data/CHANGELOG.md +22 -1
- data/Rakefile +1 -1
- data/doc/AST_FORMAT.md +6 -5
- data/lib/parser.rb +1 -1
- data/lib/parser/all.rb +1 -1
- data/lib/parser/ast/processor.rb +0 -7
- data/lib/parser/base.rb +6 -5
- data/lib/parser/builders/default.rb +55 -19
- data/lib/parser/current.rb +5 -5
- data/lib/parser/lexer.rb +23770 -0
- data/lib/parser/lexer.rl +1 -1
- data/lib/parser/macruby.rb +6149 -0
- data/lib/parser/macruby.y +1 -1
- data/lib/parser/max_numparam_stack.rb +1 -1
- data/lib/parser/messages.rb +2 -0
- data/lib/parser/meta.rb +3 -3
- data/lib/parser/ruby18.rb +5663 -0
- data/lib/parser/ruby18.y +1 -1
- data/lib/parser/ruby19.rb +6092 -0
- data/lib/parser/ruby19.y +1 -1
- data/lib/parser/ruby20.rb +6527 -0
- data/lib/parser/ruby20.y +1 -1
- data/lib/parser/ruby21.rb +6578 -0
- data/lib/parser/ruby21.y +1 -1
- data/lib/parser/ruby22.rb +6613 -0
- data/lib/parser/ruby22.y +1 -1
- data/lib/parser/ruby23.rb +6624 -0
- data/lib/parser/ruby23.y +1 -1
- data/lib/parser/ruby24.rb +6694 -0
- data/lib/parser/ruby24.y +1 -1
- data/lib/parser/ruby25.rb +6662 -0
- data/lib/parser/ruby25.y +1 -1
- data/lib/parser/ruby26.rb +6676 -0
- data/lib/parser/ruby26.y +1 -1
- data/lib/parser/ruby27.rb +7803 -0
- data/lib/parser/ruby27.y +1 -2
- data/lib/parser/ruby30.rb +8052 -0
- data/lib/parser/{ruby28.y → ruby30.y} +9 -4
- data/lib/parser/rubymotion.rb +6086 -0
- data/lib/parser/rubymotion.y +1 -1
- data/lib/parser/runner.rb +3 -3
- data/lib/parser/source/comment.rb +1 -1
- data/lib/parser/source/comment/associator.rb +1 -1
- data/lib/parser/source/map/{endless_definition.rb → method_definition.rb} +5 -3
- data/lib/parser/source/range.rb +2 -2
- data/lib/parser/version.rb +1 -1
- data/parser.gemspec +4 -1
- data/test/helper.rb +1 -1
- data/test/parse_helper.rb +26 -21
- data/test/test_current.rb +2 -2
- data/test/test_lexer.rb +1 -1
- data/test/test_parse_helper.rb +12 -9
- data/test/test_parser.rb +253 -47
- metadata +8 -9
- data/.gitignore +0 -34
data/lib/parser/rubymotion.y
CHANGED
data/lib/parser/runner.rb
CHANGED
@@ -113,9 +113,9 @@ module Parser
|
|
113
113
|
@parser_class = Parser::Ruby27
|
114
114
|
end
|
115
115
|
|
116
|
-
opts.on '--
|
117
|
-
require 'parser/
|
118
|
-
@parser_class = Parser::
|
116
|
+
opts.on '--30', 'Parse as Ruby 3.0 would' do
|
117
|
+
require 'parser/ruby30'
|
118
|
+
@parser_class = Parser::Ruby30
|
119
119
|
end
|
120
120
|
|
121
121
|
opts.on '--mac', 'Parse as MacRuby 0.12 would' do
|
@@ -107,7 +107,7 @@ module Parser
|
|
107
107
|
|
108
108
|
private
|
109
109
|
|
110
|
-
POSTFIX_TYPES = Set[:if, :while, :while_post, :until, :until_post].freeze
|
110
|
+
POSTFIX_TYPES = Set[:if, :while, :while_post, :until, :until_post, :masgn].freeze
|
111
111
|
def children_in_source_order(node)
|
112
112
|
if POSTFIX_TYPES.include?(node.type)
|
113
113
|
# All these types have either nodes with expressions, or `nil`
|
@@ -3,19 +3,21 @@
|
|
3
3
|
module Parser
|
4
4
|
module Source
|
5
5
|
|
6
|
-
class Map::
|
6
|
+
class Map::MethodDefinition < Map
|
7
7
|
attr_reader :keyword
|
8
8
|
attr_reader :operator
|
9
9
|
attr_reader :name
|
10
|
+
attr_reader :end
|
10
11
|
attr_reader :assignment
|
11
12
|
|
12
|
-
def initialize(keyword_l, operator_l, name_l, assignment_l, body_l)
|
13
|
+
def initialize(keyword_l, operator_l, name_l, end_l, assignment_l, body_l)
|
13
14
|
@keyword = keyword_l
|
14
15
|
@operator = operator_l
|
15
16
|
@name = name_l
|
17
|
+
@end = end_l
|
16
18
|
@assignment = assignment_l
|
17
19
|
|
18
|
-
super(@keyword.join(body_l))
|
20
|
+
super(@keyword.join(end_l || body_l))
|
19
21
|
end
|
20
22
|
end
|
21
23
|
|
data/lib/parser/source/range.rb
CHANGED
@@ -112,11 +112,11 @@ module Parser
|
|
112
112
|
# @raise RangeError
|
113
113
|
#
|
114
114
|
def column_range
|
115
|
-
if
|
115
|
+
if line != last_line
|
116
116
|
raise RangeError, "#{self.inspect} spans more than one line"
|
117
117
|
end
|
118
118
|
|
119
|
-
|
119
|
+
column...last_column
|
120
120
|
end
|
121
121
|
|
122
122
|
##
|
data/lib/parser/version.rb
CHANGED
data/parser.gemspec
CHANGED
@@ -32,10 +32,13 @@ Gem::Specification.new do |spec|
|
|
32
32
|
lib/parser/ruby25.rb
|
33
33
|
lib/parser/ruby26.rb
|
34
34
|
lib/parser/ruby27.rb
|
35
|
-
lib/parser/
|
35
|
+
lib/parser/ruby30.rb
|
36
36
|
lib/parser/macruby.rb
|
37
37
|
lib/parser/rubymotion.rb
|
38
|
+
) - %w(
|
39
|
+
.gitignore
|
38
40
|
)
|
41
|
+
|
39
42
|
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
40
43
|
spec.test_files = spec.files.grep(%r{^test/})
|
41
44
|
spec.require_paths = ['lib']
|
data/test/helper.rb
CHANGED
data/test/parse_helper.rb
CHANGED
@@ -7,7 +7,7 @@ module ParseHelper
|
|
7
7
|
require 'parser/macruby'
|
8
8
|
require 'parser/rubymotion'
|
9
9
|
|
10
|
-
ALL_VERSIONS = %w(1.8 1.9 2.0 2.1 2.2 2.3 2.4 2.5 2.6 2.7
|
10
|
+
ALL_VERSIONS = %w(1.8 1.9 2.0 2.1 2.2 2.3 2.4 2.5 2.6 2.7 3.0 mac ios)
|
11
11
|
|
12
12
|
def setup
|
13
13
|
@diagnostics = []
|
@@ -27,7 +27,7 @@ module ParseHelper
|
|
27
27
|
when '2.5' then parser = Parser::Ruby25.new
|
28
28
|
when '2.6' then parser = Parser::Ruby26.new
|
29
29
|
when '2.7' then parser = Parser::Ruby27.new
|
30
|
-
when '
|
30
|
+
when '3.0' then parser = Parser::Ruby30.new
|
31
31
|
when 'mac' then parser = Parser::MacRuby.new
|
32
32
|
when 'ios' then parser = Parser::RubyMotion.new
|
33
33
|
else raise "Unrecognized Ruby version #{version}"
|
@@ -49,15 +49,17 @@ module ParseHelper
|
|
49
49
|
end
|
50
50
|
end
|
51
51
|
|
52
|
-
def assert_source_range(
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
52
|
+
def assert_source_range(expect_range, range, version, what)
|
53
|
+
if expect_range == nil
|
54
|
+
# Avoid "Use assert_nil if expecting nil from .... This will fail in Minitest 6.""
|
55
|
+
assert_nil range,
|
56
|
+
"(#{version}) range of #{what}"
|
57
|
+
else
|
58
|
+
assert range.is_a?(Parser::Source::Range),
|
59
|
+
"(#{version}) #{range.inspect}.is_a?(Source::Range) for #{what}"
|
60
|
+
assert_equal expect_range, range.to_range,
|
61
|
+
"(#{version}) range of #{what}"
|
62
|
+
end
|
61
63
|
end
|
62
64
|
|
63
65
|
# Use like this:
|
@@ -105,7 +107,7 @@ module ParseHelper
|
|
105
107
|
assert_equal ast, parsed_ast,
|
106
108
|
"(#{version}) AST equality"
|
107
109
|
|
108
|
-
parse_source_map_descriptions(source_maps) do |
|
110
|
+
parse_source_map_descriptions(source_maps) do |range, map_field, ast_path, line|
|
109
111
|
|
110
112
|
astlet = traverse_ast(parsed_ast, ast_path)
|
111
113
|
|
@@ -119,9 +121,9 @@ module ParseHelper
|
|
119
121
|
assert astlet.location.respond_to?(map_field),
|
120
122
|
"(#{version}) #{astlet.location.inspect}.respond_to?(#{map_field.inspect}) for:\n#{parsed_ast.inspect}"
|
121
123
|
|
122
|
-
|
124
|
+
found_range = astlet.location.send(map_field)
|
123
125
|
|
124
|
-
assert_source_range(
|
126
|
+
assert_source_range(range, found_range, version, line.inspect)
|
125
127
|
end
|
126
128
|
|
127
129
|
assert parser.instance_eval { @lexer }.cmdarg.empty?,
|
@@ -164,18 +166,18 @@ module ParseHelper
|
|
164
166
|
assert_equal arguments, emitted_diagnostic.arguments
|
165
167
|
assert_equal message, emitted_diagnostic.message
|
166
168
|
|
167
|
-
parse_source_map_descriptions(source_maps) do |
|
169
|
+
parse_source_map_descriptions(source_maps) do |range, map_field, ast_path, line|
|
168
170
|
|
169
171
|
case map_field
|
170
172
|
when 'location'
|
171
|
-
assert_source_range
|
173
|
+
assert_source_range range,
|
172
174
|
emitted_diagnostic.location,
|
173
175
|
version, 'location'
|
174
176
|
|
175
177
|
when 'highlights'
|
176
178
|
index = ast_path.first.to_i
|
177
179
|
|
178
|
-
assert_source_range
|
180
|
+
assert_source_range range,
|
179
181
|
emitted_diagnostic.highlights[index],
|
180
182
|
version, "#{index}th highlight"
|
181
183
|
|
@@ -254,7 +256,7 @@ module ParseHelper
|
|
254
256
|
SOURCE_MAP_DESCRIPTION_RE =
|
255
257
|
/(?x)
|
256
258
|
^(?# $1 skip) ^(\s*)
|
257
|
-
(?# $2 highlight) ([~\^]
|
259
|
+
(?# $2 highlight) ([~\^]+|\!)
|
258
260
|
\s+
|
259
261
|
(?# $3 source_map_field) ([a-z_]+)
|
260
262
|
(?# $5 ast_path) (\s+\(([a-z_.\/0-9]+)\))?
|
@@ -272,8 +274,11 @@ module ParseHelper
|
|
272
274
|
next if line.empty?
|
273
275
|
|
274
276
|
if (match = SOURCE_MAP_DESCRIPTION_RE.match(line))
|
275
|
-
|
276
|
-
|
277
|
+
if match[2] != '!'
|
278
|
+
begin_pos = match[1].length
|
279
|
+
end_pos = begin_pos + match[2].length
|
280
|
+
range = begin_pos...end_pos
|
281
|
+
end
|
277
282
|
source_map_field = match[3]
|
278
283
|
|
279
284
|
if match[5]
|
@@ -282,7 +287,7 @@ module ParseHelper
|
|
282
287
|
ast_path = []
|
283
288
|
end
|
284
289
|
|
285
|
-
yield
|
290
|
+
yield range, source_map_field, ast_path, line
|
286
291
|
else
|
287
292
|
raise "Cannot parse source map description line: #{line.inspect}."
|
288
293
|
end
|
data/test/test_current.rb
CHANGED
@@ -22,8 +22,8 @@ class TestCurrent < Minitest::Test
|
|
22
22
|
assert_equal Parser::Ruby26, Parser::CurrentRuby
|
23
23
|
when /^2\.7\.\d+/
|
24
24
|
assert_equal Parser::Ruby27, Parser::CurrentRuby
|
25
|
-
when /^
|
26
|
-
assert_equal Parser::
|
25
|
+
when /^3\.0\.\d+/
|
26
|
+
assert_equal Parser::Ruby30, Parser::CurrentRuby
|
27
27
|
else
|
28
28
|
flunk "Update test_current for #{RUBY_VERSION}"
|
29
29
|
end
|
data/test/test_lexer.rb
CHANGED
data/test/test_parse_helper.rb
CHANGED
@@ -25,33 +25,36 @@ class TestParseHelper < Minitest::Test
|
|
25
25
|
end
|
26
26
|
|
27
27
|
def test_parse_mapsation_description
|
28
|
-
assert_equal [[0
|
28
|
+
assert_equal [[0...4, 'expr', [], '~~~~ expr']],
|
29
29
|
parse_maps('~~~~ expr')
|
30
30
|
|
31
|
-
assert_equal [[0
|
31
|
+
assert_equal [[0...4, 'expr', [], '^~~~ expr']],
|
32
32
|
parse_maps('^~~~ expr')
|
33
33
|
|
34
|
-
assert_equal [[0
|
34
|
+
assert_equal [[0...4, 'expr', [], '^^^^ expr']],
|
35
35
|
parse_maps('^^^^ expr')
|
36
36
|
|
37
|
-
assert_equal [[2
|
37
|
+
assert_equal [[2...3, 'op', [], ' ^ op']],
|
38
38
|
parse_maps(' ^ op')
|
39
39
|
|
40
|
-
assert_equal [[2
|
40
|
+
assert_equal [[2...3, 'op', ['foo'], ' ~ op (foo)']],
|
41
41
|
parse_maps(' ~ op (foo)')
|
42
42
|
|
43
|
-
assert_equal [[2
|
43
|
+
assert_equal [[2...4, 'op', ['foo', 'bar'], ' ~~ op (foo.bar)']],
|
44
44
|
parse_maps(' ~~ op (foo.bar)')
|
45
45
|
|
46
|
-
assert_equal [[2
|
46
|
+
assert_equal [[2...4, 'op', ['foo/2', 'bar'], ' ~~ op (foo/2.bar)']],
|
47
47
|
parse_maps(' ~~ op (foo/2.bar)')
|
48
48
|
|
49
|
-
assert_equal [[0
|
50
|
-
[5
|
49
|
+
assert_equal [[0...4, 'expr', [], '~~~~ expr'],
|
50
|
+
[5...7, 'op', ['str', 'e_h'], ' ~~ op (str.e_h)']],
|
51
51
|
parse_maps(%{
|
52
52
|
|~~~~ expr
|
53
53
|
| ~~ op (str.e_h)
|
54
54
|
})
|
55
|
+
|
56
|
+
assert_equal [[nil, 'expr', [], '! expr']],
|
57
|
+
parse_maps('! expr')
|
55
58
|
end
|
56
59
|
|
57
60
|
def test_traverse_ast
|
data/test/test_parser.rb
CHANGED
@@ -29,7 +29,7 @@ class TestParser < Minitest::Test
|
|
29
29
|
SINCE_2_5 = SINCE_2_4 - %w(2.4)
|
30
30
|
SINCE_2_6 = SINCE_2_5 - %w(2.5)
|
31
31
|
SINCE_2_7 = SINCE_2_6 - %w(2.6)
|
32
|
-
|
32
|
+
SINCE_3_0 = SINCE_2_7 - %w(2.7)
|
33
33
|
|
34
34
|
# Guidelines for test naming:
|
35
35
|
# * Test structure follows structure of AST_FORMAT.md.
|
@@ -1856,6 +1856,7 @@ class TestParser < Minitest::Test
|
|
1856
1856
|
%q{def foo; end},
|
1857
1857
|
%q{~~~ keyword
|
1858
1858
|
| ~~~ name
|
1859
|
+
|! assignment
|
1859
1860
|
| ~~~ end})
|
1860
1861
|
|
1861
1862
|
assert_parses(
|
@@ -1976,7 +1977,9 @@ class TestParser < Minitest::Test
|
|
1976
1977
|
%q{alias :foo bar},
|
1977
1978
|
%q{~~~~~ keyword
|
1978
1979
|
| ~~~~ expression (sym/1)
|
1980
|
+
| ^ begin (sym/1)
|
1979
1981
|
| ~~~ expression (sym/2)
|
1982
|
+
| ! begin (sym/2)
|
1980
1983
|
|~~~~~~~~~~~~~~ expression})
|
1981
1984
|
end
|
1982
1985
|
|
@@ -6584,7 +6587,7 @@ class TestParser < Minitest::Test
|
|
6584
6587
|
%q{def m() = get_context},
|
6585
6588
|
%q{def m(a = get_context) = 42}
|
6586
6589
|
].each do |code|
|
6587
|
-
assert_context([:def], code,
|
6590
|
+
assert_context([:def], code, SINCE_3_0)
|
6588
6591
|
end
|
6589
6592
|
end
|
6590
6593
|
|
@@ -6600,7 +6603,7 @@ class TestParser < Minitest::Test
|
|
6600
6603
|
%q{def foo.m() = get_context},
|
6601
6604
|
%q{def foo.m(a = get_context) = 42}
|
6602
6605
|
].each do |code|
|
6603
|
-
assert_context([:defs], code,
|
6606
|
+
assert_context([:defs], code, SINCE_3_0)
|
6604
6607
|
end
|
6605
6608
|
end
|
6606
6609
|
|
@@ -7511,7 +7514,7 @@ class TestParser < Minitest::Test
|
|
7511
7514
|
s(:nil))),
|
7512
7515
|
%q{proc {_1 = nil}},
|
7513
7516
|
%q{},
|
7514
|
-
|
7517
|
+
%w(2.7))
|
7515
7518
|
|
7516
7519
|
assert_diagnoses(
|
7517
7520
|
[:error, :cant_assign_to_numparam, { :name => '_1' }],
|
@@ -7539,7 +7542,7 @@ class TestParser < Minitest::Test
|
|
7539
7542
|
|
7540
7543
|
refute_diagnoses(
|
7541
7544
|
%q{proc { _1 = nil; _1}},
|
7542
|
-
|
7545
|
+
%w(2.7))
|
7543
7546
|
end
|
7544
7547
|
|
7545
7548
|
def test_numparams_in_nested_blocks
|
@@ -7894,7 +7897,7 @@ class TestParser < Minitest::Test
|
|
7894
7897
|
[:error, :unexpected_token, { :token => 'tBDOT3' }],
|
7895
7898
|
%q{def foo(x,y,z); bar(x, y, z, ...); end},
|
7896
7899
|
%q{ ^^^ location},
|
7897
|
-
|
7900
|
+
SINCE_3_0)
|
7898
7901
|
|
7899
7902
|
assert_diagnoses(
|
7900
7903
|
[:error, :unexpected_token, { :token => 'tBDOT3' }],
|
@@ -7918,7 +7921,7 @@ class TestParser < Minitest::Test
|
|
7918
7921
|
[:error, :unexpected_token, { :token => 'tDOT3' }],
|
7919
7922
|
%q{->(...) {}},
|
7920
7923
|
%q{ ^^^ location},
|
7921
|
-
|
7924
|
+
SINCE_3_0)
|
7922
7925
|
|
7923
7926
|
# Here and below the parser asssumes that
|
7924
7927
|
# it can be a beginningless range, so the error comes after reducing right paren
|
@@ -7987,7 +7990,7 @@ class TestParser < Minitest::Test
|
|
7987
7990
|
| ~~~~~~~~~~~ expression (args)
|
7988
7991
|
| ~ end (args)
|
7989
7992
|
| ~~~ expression (args.forward_arg)},
|
7990
|
-
|
7993
|
+
SINCE_3_0)
|
7991
7994
|
end
|
7992
7995
|
|
7993
7996
|
|
@@ -8906,6 +8909,21 @@ class TestParser < Minitest::Test
|
|
8906
8909
|
%q{}
|
8907
8910
|
)
|
8908
8911
|
|
8912
|
+
assert_parses_pattern_match(
|
8913
|
+
s(:in_pattern,
|
8914
|
+
s(:hash_pattern,
|
8915
|
+
s(:pair,
|
8916
|
+
s(:sym, :Foo),
|
8917
|
+
s(:int, 42))), nil,
|
8918
|
+
s(:false)),
|
8919
|
+
%q{
|
8920
|
+
in {Foo: 42
|
8921
|
+
}
|
8922
|
+
false
|
8923
|
+
},
|
8924
|
+
%q{}
|
8925
|
+
)
|
8926
|
+
|
8909
8927
|
assert_parses_pattern_match(
|
8910
8928
|
s(:in_pattern,
|
8911
8929
|
s(:hash_pattern,
|
@@ -9561,18 +9579,19 @@ class TestParser < Minitest::Test
|
|
9561
9579
|
|
9562
9580
|
def test_endless_method
|
9563
9581
|
assert_parses(
|
9564
|
-
s(:
|
9582
|
+
s(:def, :foo,
|
9565
9583
|
s(:args),
|
9566
9584
|
s(:int, 42)),
|
9567
9585
|
%q{def foo() = 42},
|
9568
9586
|
%q{~~~ keyword
|
9569
9587
|
| ~~~ name
|
9570
9588
|
| ^ assignment
|
9589
|
+
|! end
|
9571
9590
|
|~~~~~~~~~~~~~~ expression},
|
9572
|
-
|
9591
|
+
SINCE_3_0)
|
9573
9592
|
|
9574
9593
|
assert_parses(
|
9575
|
-
s(:
|
9594
|
+
s(:def, :inc,
|
9576
9595
|
s(:args, s(:arg, :x)),
|
9577
9596
|
s(:send,
|
9578
9597
|
s(:lvar, :x), :+,
|
@@ -9582,10 +9601,10 @@ class TestParser < Minitest::Test
|
|
9582
9601
|
| ~~~ name
|
9583
9602
|
| ^ assignment
|
9584
9603
|
|~~~~~~~~~~~~~~~~~~ expression},
|
9585
|
-
|
9604
|
+
SINCE_3_0)
|
9586
9605
|
|
9587
9606
|
assert_parses(
|
9588
|
-
s(:
|
9607
|
+
s(:defs, s(:send, nil, :obj), :foo,
|
9589
9608
|
s(:args),
|
9590
9609
|
s(:int, 42)),
|
9591
9610
|
%q{def obj.foo() = 42},
|
@@ -9594,10 +9613,10 @@ class TestParser < Minitest::Test
|
|
9594
9613
|
| ~~~ name
|
9595
9614
|
| ^ assignment
|
9596
9615
|
|~~~~~~~~~~~~~~~~~~ expression},
|
9597
|
-
|
9616
|
+
SINCE_3_0)
|
9598
9617
|
|
9599
9618
|
assert_parses(
|
9600
|
-
s(:
|
9619
|
+
s(:defs, s(:send, nil, :obj), :inc,
|
9601
9620
|
s(:args, s(:arg, :x)),
|
9602
9621
|
s(:send,
|
9603
9622
|
s(:lvar, :x), :+,
|
@@ -9608,13 +9627,13 @@ class TestParser < Minitest::Test
|
|
9608
9627
|
| ^ operator
|
9609
9628
|
| ^ assignment
|
9610
9629
|
|~~~~~~~~~~~~~~~~~~~~~~ expression},
|
9611
|
-
|
9630
|
+
SINCE_3_0)
|
9612
9631
|
end
|
9613
9632
|
|
9614
9633
|
def test_endless_method_forwarded_args_legacy
|
9615
9634
|
Parser::Builders::Default.emit_forward_arg = false
|
9616
9635
|
assert_parses(
|
9617
|
-
s(:
|
9636
|
+
s(:def, :foo,
|
9618
9637
|
s(:forward_args),
|
9619
9638
|
s(:send, nil, :bar,
|
9620
9639
|
s(:forwarded_args))),
|
@@ -9623,7 +9642,7 @@ class TestParser < Minitest::Test
|
|
9623
9642
|
| ~~~ name
|
9624
9643
|
| ^ assignment
|
9625
9644
|
|~~~~~~~~~~~~~~~~~~~~~~~ expression},
|
9626
|
-
|
9645
|
+
SINCE_3_0)
|
9627
9646
|
Parser::Builders::Default.emit_forward_arg = true
|
9628
9647
|
end
|
9629
9648
|
|
@@ -9632,19 +9651,19 @@ class TestParser < Minitest::Test
|
|
9632
9651
|
[:error, :unexpected_token, { :token => 'tEQL' }],
|
9633
9652
|
%Q{def foo = 42},
|
9634
9653
|
%q{ ^ location},
|
9635
|
-
|
9654
|
+
SINCE_3_0)
|
9636
9655
|
|
9637
9656
|
assert_diagnoses(
|
9638
9657
|
[:error, :unexpected_token, { :token => 'tEQL' }],
|
9639
9658
|
%Q{def obj.foo = 42},
|
9640
9659
|
%q{ ^ location},
|
9641
|
-
|
9660
|
+
SINCE_3_0
|
9642
9661
|
)
|
9643
9662
|
end
|
9644
9663
|
|
9645
9664
|
def test_endless_method_with_rescue_mod
|
9646
9665
|
assert_parses(
|
9647
|
-
s(:
|
9666
|
+
s(:def, :m,
|
9648
9667
|
s(:args),
|
9649
9668
|
s(:rescue,
|
9650
9669
|
s(:int, 1),
|
@@ -9652,10 +9671,10 @@ class TestParser < Minitest::Test
|
|
9652
9671
|
s(:int, 2)), nil)),
|
9653
9672
|
%q{def m() = 1 rescue 2},
|
9654
9673
|
%q{},
|
9655
|
-
|
9674
|
+
SINCE_3_0)
|
9656
9675
|
|
9657
9676
|
assert_parses(
|
9658
|
-
s(:
|
9677
|
+
s(:defs,
|
9659
9678
|
s(:self), :m,
|
9660
9679
|
s(:args),
|
9661
9680
|
s(:rescue,
|
@@ -9664,48 +9683,48 @@ class TestParser < Minitest::Test
|
|
9664
9683
|
s(:int, 2)), nil)),
|
9665
9684
|
%q{def self.m() = 1 rescue 2},
|
9666
9685
|
%q{},
|
9667
|
-
|
9686
|
+
SINCE_3_0)
|
9668
9687
|
end
|
9669
9688
|
|
9670
9689
|
def test_rasgn
|
9671
9690
|
assert_parses(
|
9672
|
-
s(:
|
9673
|
-
s(:int, 1)
|
9691
|
+
s(:lvasgn, :a,
|
9692
|
+
s(:int, 1)),
|
9674
9693
|
%q{1 => a},
|
9675
9694
|
%q{~~~~~~ expression
|
9676
9695
|
| ^^ operator},
|
9677
|
-
|
9696
|
+
SINCE_3_0)
|
9678
9697
|
|
9679
9698
|
assert_parses(
|
9680
|
-
s(:
|
9681
|
-
s(:send, s(:int, 1), :+, s(:int, 2)),
|
9682
|
-
s(:gvasgn, :$a)),
|
9699
|
+
s(:gvasgn, :$a,
|
9700
|
+
s(:send, s(:int, 1), :+, s(:int, 2))),
|
9683
9701
|
%q{1 + 2 => $a},
|
9684
9702
|
%q{~~~~~~~~~~~ expression
|
9685
9703
|
| ^^ operator},
|
9686
|
-
|
9704
|
+
SINCE_3_0)
|
9687
9705
|
end
|
9688
9706
|
|
9689
9707
|
def test_mrasgn
|
9690
9708
|
assert_parses(
|
9691
|
-
s(:
|
9692
|
-
s(:
|
9693
|
-
s(:
|
9709
|
+
s(:masgn,
|
9710
|
+
s(:mlhs, s(:lvasgn, :a), s(:lvasgn, :b)),
|
9711
|
+
s(:send, s(:int, 13), :divmod, s(:int, 5))),
|
9694
9712
|
%q{13.divmod(5) => a,b},
|
9695
9713
|
%q{~~~~~~~~~~~~~~~~~~~ expression
|
9696
9714
|
| ^^ operator},
|
9697
|
-
|
9715
|
+
SINCE_3_0)
|
9698
9716
|
|
9699
9717
|
assert_parses(
|
9700
|
-
s(:
|
9701
|
-
s(:
|
9702
|
-
|
9703
|
-
s(:mlhs, s(:lvasgn, :a), s(:lvasgn, :b))
|
9704
|
-
|
9718
|
+
s(:masgn,
|
9719
|
+
s(:mlhs, s(:lvasgn, :c), s(:lvasgn, :d)),
|
9720
|
+
s(:masgn,
|
9721
|
+
s(:mlhs, s(:lvasgn, :a), s(:lvasgn, :b)),
|
9722
|
+
s(:send, s(:int, 13), :divmod, s(:int, 5))),
|
9723
|
+
),
|
9705
9724
|
%q{13.divmod(5) => a,b => c, d},
|
9706
|
-
%q{~~~~~~~~~~~~~~~~~~~ expression (
|
9725
|
+
%q{~~~~~~~~~~~~~~~~~~~ expression (masgn)
|
9707
9726
|
|~~~~~~~~~~~~~~~~~~~~~~~~~~~ expression},
|
9708
|
-
|
9727
|
+
SINCE_3_0)
|
9709
9728
|
end
|
9710
9729
|
|
9711
9730
|
def test_rasgn_line_continuation
|
@@ -9713,7 +9732,7 @@ class TestParser < Minitest::Test
|
|
9713
9732
|
[:error, :unexpected_token, { :token => 'tASSOC' }],
|
9714
9733
|
%Q{13.divmod(5)\n=> a,b; [a, b]},
|
9715
9734
|
%{ ^^ location},
|
9716
|
-
|
9735
|
+
SINCE_3_0)
|
9717
9736
|
end
|
9718
9737
|
|
9719
9738
|
def test_find_pattern
|
@@ -9735,7 +9754,7 @@ class TestParser < Minitest::Test
|
|
9735
9754
|
| ~ end (in_pattern.find_pattern)
|
9736
9755
|
| ~~ expression (in_pattern.find_pattern.match_rest/1)
|
9737
9756
|
| ~~ expression (in_pattern.find_pattern.match_rest/2)},
|
9738
|
-
|
9757
|
+
SINCE_3_0)
|
9739
9758
|
|
9740
9759
|
assert_parses_pattern_match(
|
9741
9760
|
s(:in_pattern,
|
@@ -9749,7 +9768,7 @@ class TestParser < Minitest::Test
|
|
9749
9768
|
s(:true)),
|
9750
9769
|
%q{in String(*, 1, *) then true},
|
9751
9770
|
%q{ ~~~~~~~ expression (in_pattern.const_pattern.find_pattern)},
|
9752
|
-
|
9771
|
+
SINCE_3_0)
|
9753
9772
|
|
9754
9773
|
assert_parses_pattern_match(
|
9755
9774
|
s(:in_pattern,
|
@@ -9763,7 +9782,7 @@ class TestParser < Minitest::Test
|
|
9763
9782
|
s(:true)),
|
9764
9783
|
%q{in Array[*, 1, *] then true},
|
9765
9784
|
%q{ ~~~~~~~ expression (in_pattern.const_pattern.find_pattern)},
|
9766
|
-
|
9785
|
+
SINCE_3_0)
|
9767
9786
|
|
9768
9787
|
assert_parses_pattern_match(
|
9769
9788
|
s(:in_pattern,
|
@@ -9775,6 +9794,193 @@ class TestParser < Minitest::Test
|
|
9775
9794
|
s(:true)),
|
9776
9795
|
%q{in *, 42, * then true},
|
9777
9796
|
%q{ ~~~~~~~~ expression (in_pattern.find_pattern)},
|
9778
|
-
|
9797
|
+
SINCE_3_0)
|
9798
|
+
end
|
9799
|
+
|
9800
|
+
def test_invalid_source
|
9801
|
+
with_versions(ALL_VERSIONS) do |_ver, parser|
|
9802
|
+
source_file = Parser::Source::Buffer.new('(comments)', source: "def foo; en")
|
9803
|
+
|
9804
|
+
parser.diagnostics.all_errors_are_fatal = false
|
9805
|
+
ast = parser.parse(source_file)
|
9806
|
+
assert_nil(ast)
|
9807
|
+
end
|
9808
|
+
end
|
9809
|
+
|
9810
|
+
def test_reserved_for_numparam__before_30
|
9811
|
+
assert_parses(
|
9812
|
+
s(:block,
|
9813
|
+
s(:send, nil, :proc),
|
9814
|
+
s(:args),
|
9815
|
+
s(:lvasgn, :_1,
|
9816
|
+
s(:nil))),
|
9817
|
+
%q{proc {_1 = nil}},
|
9818
|
+
%q{},
|
9819
|
+
ALL_VERSIONS - SINCE_3_0)
|
9820
|
+
|
9821
|
+
assert_parses(
|
9822
|
+
s(:lvasgn, :_2,
|
9823
|
+
s(:int, 1)),
|
9824
|
+
%q{_2 = 1},
|
9825
|
+
%q{},
|
9826
|
+
ALL_VERSIONS - SINCE_3_0)
|
9827
|
+
|
9828
|
+
assert_parses(
|
9829
|
+
s(:block,
|
9830
|
+
s(:send, nil, :proc),
|
9831
|
+
s(:args,
|
9832
|
+
s(:procarg0,
|
9833
|
+
s(:arg, :_3))), nil),
|
9834
|
+
%q{proc {|_3|}},
|
9835
|
+
%q{},
|
9836
|
+
SINCE_1_9 - SINCE_3_0)
|
9837
|
+
|
9838
|
+
assert_parses(
|
9839
|
+
s(:def, :x,
|
9840
|
+
s(:args,
|
9841
|
+
s(:arg, :_4)), nil),
|
9842
|
+
%q{def x(_4) end},
|
9843
|
+
%q{},
|
9844
|
+
ALL_VERSIONS - SINCE_3_0)
|
9845
|
+
|
9846
|
+
assert_parses(
|
9847
|
+
s(:def, :_5,
|
9848
|
+
s(:args), nil),
|
9849
|
+
%q{def _5; end},
|
9850
|
+
%q{},
|
9851
|
+
ALL_VERSIONS - SINCE_3_0)
|
9852
|
+
|
9853
|
+
assert_parses(
|
9854
|
+
s(:defs,
|
9855
|
+
s(:self), :_6,
|
9856
|
+
s(:args), nil),
|
9857
|
+
%q{def self._6; end},
|
9858
|
+
%q{},
|
9859
|
+
ALL_VERSIONS - SINCE_3_0)
|
9860
|
+
end
|
9861
|
+
|
9862
|
+
def test_reserved_for_numparam__since_30
|
9863
|
+
# Regular assignments:
|
9864
|
+
|
9865
|
+
assert_diagnoses(
|
9866
|
+
[:error, :reserved_for_numparam, { :name => '_1' }],
|
9867
|
+
%q{proc {_1 = nil}},
|
9868
|
+
%q{ ^^ location},
|
9869
|
+
SINCE_3_0)
|
9870
|
+
|
9871
|
+
assert_diagnoses(
|
9872
|
+
[:error, :reserved_for_numparam, { :name => '_2' }],
|
9873
|
+
%q{_2 = 1},
|
9874
|
+
%q{^^ location},
|
9875
|
+
SINCE_3_0)
|
9876
|
+
|
9877
|
+
# Arguments:
|
9878
|
+
|
9879
|
+
[
|
9880
|
+
# req (procarg0)
|
9881
|
+
[
|
9882
|
+
%q{proc {|_3|}},
|
9883
|
+
%q{ ^^ location},
|
9884
|
+
],
|
9885
|
+
|
9886
|
+
# req
|
9887
|
+
[
|
9888
|
+
%q{proc {|_3,|}},
|
9889
|
+
%q{ ^^ location},
|
9890
|
+
],
|
9891
|
+
|
9892
|
+
# opt
|
9893
|
+
[
|
9894
|
+
%q{proc {|_3 = 42|}},
|
9895
|
+
%q{ ^^ location},
|
9896
|
+
],
|
9897
|
+
|
9898
|
+
# mlhs
|
9899
|
+
[
|
9900
|
+
%q{proc {|(_3)|}},
|
9901
|
+
%q{ ^^ location},
|
9902
|
+
],
|
9903
|
+
|
9904
|
+
# rest
|
9905
|
+
[
|
9906
|
+
%q{proc {|*_3|}},
|
9907
|
+
%q{ ^^ location},
|
9908
|
+
],
|
9909
|
+
|
9910
|
+
# kwarg
|
9911
|
+
[
|
9912
|
+
%q{proc {|_3:|}},
|
9913
|
+
%q{ ^^^ location},
|
9914
|
+
],
|
9915
|
+
|
9916
|
+
# kwoptarg
|
9917
|
+
[
|
9918
|
+
%q{proc {|_3: 42|}},
|
9919
|
+
%q{ ^^^ location},
|
9920
|
+
],
|
9921
|
+
|
9922
|
+
# kwrestarg
|
9923
|
+
[
|
9924
|
+
%q{proc {|**_3|}},
|
9925
|
+
%q{ ^^ location},
|
9926
|
+
],
|
9927
|
+
|
9928
|
+
# block
|
9929
|
+
[
|
9930
|
+
%q{proc {|&_3|}},
|
9931
|
+
%q{ ^^ location},
|
9932
|
+
],
|
9933
|
+
|
9934
|
+
# shadowarg
|
9935
|
+
[
|
9936
|
+
%q{proc {|;_3|}},
|
9937
|
+
%q{ ^^ location},
|
9938
|
+
],
|
9939
|
+
].each do |(code, location)|
|
9940
|
+
assert_diagnoses(
|
9941
|
+
[:error, :reserved_for_numparam, { :name => '_3' }],
|
9942
|
+
code,
|
9943
|
+
location,
|
9944
|
+
SINCE_3_0)
|
9945
|
+
end
|
9946
|
+
|
9947
|
+
# Method definitions:
|
9948
|
+
|
9949
|
+
[
|
9950
|
+
# regular method
|
9951
|
+
[
|
9952
|
+
%q{def _5; end},
|
9953
|
+
%q{ ^^ location}
|
9954
|
+
],
|
9955
|
+
# regular singleton method
|
9956
|
+
[
|
9957
|
+
%q{def self._5; end},
|
9958
|
+
%q{ ^^ location}
|
9959
|
+
],
|
9960
|
+
# endless method
|
9961
|
+
[
|
9962
|
+
%q{def _5() = nil},
|
9963
|
+
%q{ ^^ location}
|
9964
|
+
],
|
9965
|
+
# endless singleton method
|
9966
|
+
[
|
9967
|
+
%q{def self._5() = nil},
|
9968
|
+
%q{ ^^ location}
|
9969
|
+
],
|
9970
|
+
].each do |(code, location)|
|
9971
|
+
assert_diagnoses(
|
9972
|
+
[:error, :reserved_for_numparam, { :name => '_5' }],
|
9973
|
+
code,
|
9974
|
+
location,
|
9975
|
+
SINCE_3_0)
|
9976
|
+
end
|
9977
|
+
end
|
9978
|
+
|
9979
|
+
def test_endless_setter
|
9980
|
+
assert_diagnoses(
|
9981
|
+
[:error, :endless_setter],
|
9982
|
+
%q{def foo=() = 42},
|
9983
|
+
%q{ ^^^^ location},
|
9984
|
+
SINCE_3_0)
|
9779
9985
|
end
|
9780
9986
|
end
|