parser 2.7.1.0 → 2.7.1.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +10 -11
- data/CHANGELOG.md +70 -1
- data/README.md +2 -2
- data/Rakefile +2 -1
- data/doc/AST_FORMAT.md +107 -3
- data/lib/parser.rb +1 -0
- data/lib/parser/all.rb +1 -0
- data/lib/parser/ast/processor.rb +2 -0
- data/lib/parser/base.rb +6 -5
- data/lib/parser/builders/default.rb +146 -19
- data/lib/parser/context.rb +1 -0
- data/lib/parser/current.rb +9 -0
- data/lib/parser/diagnostic.rb +1 -1
- data/lib/parser/diagnostic/engine.rb +1 -2
- data/lib/parser/lexer.rb +23770 -0
- data/lib/parser/lexer.rl +15 -1
- data/lib/parser/macruby.rb +6149 -0
- data/lib/parser/macruby.y +15 -5
- data/lib/parser/max_numparam_stack.rb +1 -1
- data/lib/parser/messages.rb +17 -0
- data/lib/parser/meta.rb +3 -3
- data/lib/parser/ruby18.rb +5663 -0
- data/lib/parser/ruby18.y +3 -1
- data/lib/parser/ruby19.rb +6092 -0
- data/lib/parser/ruby19.y +15 -5
- data/lib/parser/ruby20.rb +6527 -0
- data/lib/parser/ruby20.y +15 -5
- data/lib/parser/ruby21.rb +6578 -0
- data/lib/parser/ruby21.y +10 -3
- data/lib/parser/ruby22.rb +6613 -0
- data/lib/parser/ruby22.y +10 -3
- data/lib/parser/ruby23.rb +6624 -0
- data/lib/parser/ruby23.y +10 -3
- data/lib/parser/ruby24.rb +6694 -0
- data/lib/parser/ruby24.y +10 -3
- data/lib/parser/ruby25.rb +6662 -0
- data/lib/parser/ruby25.y +10 -3
- data/lib/parser/ruby26.rb +6676 -0
- data/lib/parser/ruby26.y +10 -3
- data/lib/parser/ruby27.rb +7803 -0
- data/lib/parser/ruby27.y +16 -8
- data/lib/parser/ruby30.rb +8052 -0
- data/lib/parser/ruby30.y +3048 -0
- data/lib/parser/rubymotion.rb +6086 -0
- data/lib/parser/rubymotion.y +15 -5
- data/lib/parser/runner.rb +26 -2
- data/lib/parser/runner/ruby_rewrite.rb +2 -2
- data/lib/parser/source/buffer.rb +3 -1
- data/lib/parser/source/comment.rb +1 -1
- data/lib/parser/source/comment/associator.rb +14 -4
- data/lib/parser/source/map/method_definition.rb +25 -0
- data/lib/parser/source/range.rb +19 -3
- data/lib/parser/source/tree_rewriter.rb +115 -12
- data/lib/parser/source/tree_rewriter/action.rb +135 -26
- data/lib/parser/tree_rewriter.rb +1 -2
- data/lib/parser/version.rb +1 -1
- data/parser.gemspec +6 -2
- data/test/helper.rb +49 -6
- data/test/parse_helper.rb +49 -40
- data/test/test_ast_processor.rb +32 -0
- data/test/test_base.rb +1 -1
- data/test/test_current.rb +2 -0
- data/test/test_diagnostic.rb +6 -7
- data/test/test_diagnostic_engine.rb +5 -8
- data/test/test_lexer.rb +17 -8
- data/test/test_meta.rb +12 -0
- data/test/test_parse_helper.rb +12 -9
- data/test/test_parser.rb +612 -56
- data/test/test_runner_parse.rb +22 -1
- data/test/test_runner_rewrite.rb +1 -1
- data/test/test_source_buffer.rb +4 -1
- data/test/test_source_comment.rb +2 -2
- data/test/test_source_comment_associator.rb +47 -15
- data/test/test_source_map.rb +1 -2
- data/test/test_source_range.rb +29 -9
- data/test/test_source_rewriter.rb +4 -4
- data/test/test_source_rewriter_action.rb +2 -2
- data/test/test_source_tree_rewriter.rb +201 -13
- metadata +19 -13
- data/.gitignore +0 -33
data/test/test_lexer.rb
CHANGED
@@ -37,9 +37,8 @@ class TestLexer < Minitest::Test
|
|
37
37
|
end
|
38
38
|
|
39
39
|
def assert_escape(expected, input)
|
40
|
-
source_buffer = Parser::Source::Buffer.new('(assert_escape)'
|
41
|
-
|
42
|
-
source_buffer.source = "\"\\#{input}\"".encode(input.encoding)
|
40
|
+
source_buffer = Parser::Source::Buffer.new('(assert_escape)',
|
41
|
+
source: "\"\\#{input}\"".encode(input.encoding))
|
43
42
|
|
44
43
|
@lex.reset
|
45
44
|
@lex.source_buffer = source_buffer
|
@@ -71,8 +70,7 @@ class TestLexer < Minitest::Test
|
|
71
70
|
end
|
72
71
|
|
73
72
|
def assert_scanned(input, *args)
|
74
|
-
source_buffer = Parser::Source::Buffer.new('(assert_scanned)')
|
75
|
-
source_buffer.source = input
|
73
|
+
source_buffer = Parser::Source::Buffer.new('(assert_scanned)', source: input)
|
76
74
|
|
77
75
|
@lex.reset(false)
|
78
76
|
@lex.source_buffer = source_buffer
|
@@ -3569,14 +3567,25 @@ class TestLexer < Minitest::Test
|
|
3569
3567
|
:tIDENTIFIER, 're', [1, 3])
|
3570
3568
|
end
|
3571
3569
|
|
3570
|
+
def test_endless_method
|
3571
|
+
setup_lexer(30)
|
3572
|
+
|
3573
|
+
assert_scanned('def foo() = 42',
|
3574
|
+
:kDEF, "def", [0, 3],
|
3575
|
+
:tIDENTIFIER, "foo", [4, 7],
|
3576
|
+
:tLPAREN2, "(", [7, 8],
|
3577
|
+
:tRPAREN, ")", [8, 9],
|
3578
|
+
:tEQL, "=", [10, 11],
|
3579
|
+
:tINTEGER, 42, [12, 14])
|
3580
|
+
end
|
3581
|
+
|
3572
3582
|
def lex_numbered_parameter(input)
|
3573
3583
|
@lex.max_numparam_stack.push
|
3574
3584
|
|
3575
3585
|
@lex.context = Parser::Context.new
|
3576
3586
|
@lex.context.push(:block)
|
3577
3587
|
|
3578
|
-
source_buffer = Parser::Source::Buffer.new('(assert_lex_numbered_parameter)')
|
3579
|
-
source_buffer.source = input
|
3588
|
+
source_buffer = Parser::Source::Buffer.new('(assert_lex_numbered_parameter)', source: input)
|
3580
3589
|
|
3581
3590
|
@lex.source_buffer = source_buffer
|
3582
3591
|
|
@@ -3594,7 +3603,7 @@ class TestLexer < Minitest::Test
|
|
3594
3603
|
|
3595
3604
|
def refute_scanned_numbered_parameter(input, message = nil)
|
3596
3605
|
err = assert_raises Parser::SyntaxError do
|
3597
|
-
|
3606
|
+
_lex_token, (_lex_value, _lex_range) = lex_numbered_parameter(input)
|
3598
3607
|
end
|
3599
3608
|
|
3600
3609
|
if message
|
data/test/test_meta.rb
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'helper'
|
4
|
+
|
5
|
+
class TestMeta < Minitest::Test
|
6
|
+
def test_NODE_TYPES
|
7
|
+
for_each_node do |node|
|
8
|
+
assert Parser::Meta::NODE_TYPES.include?(node.type),
|
9
|
+
"Type #{node.type} missing from Parser::Meta::NODE_TYPES"
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
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,6 +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
|
+
SINCE_3_0 = SINCE_2_7 - %w(2.7)
|
32
33
|
|
33
34
|
# Guidelines for test naming:
|
34
35
|
# * Test structure follows structure of AST_FORMAT.md.
|
@@ -1855,6 +1856,7 @@ class TestParser < Minitest::Test
|
|
1855
1856
|
%q{def foo; end},
|
1856
1857
|
%q{~~~ keyword
|
1857
1858
|
| ~~~ name
|
1859
|
+
|! assignment
|
1858
1860
|
| ~~~ end})
|
1859
1861
|
|
1860
1862
|
assert_parses(
|
@@ -1975,7 +1977,9 @@ class TestParser < Minitest::Test
|
|
1975
1977
|
%q{alias :foo bar},
|
1976
1978
|
%q{~~~~~ keyword
|
1977
1979
|
| ~~~~ expression (sym/1)
|
1980
|
+
| ^ begin (sym/1)
|
1978
1981
|
| ~~~ expression (sym/2)
|
1982
|
+
| ! begin (sym/2)
|
1979
1983
|
|~~~~~~~~~~~~~~ expression})
|
1980
1984
|
end
|
1981
1985
|
|
@@ -5359,8 +5363,7 @@ class TestParser < Minitest::Test
|
|
5359
5363
|
|
5360
5364
|
def test_crlf_line_endings
|
5361
5365
|
with_versions(ALL_VERSIONS) do |_ver, parser|
|
5362
|
-
source_file = Parser::Source::Buffer.new('(comments)')
|
5363
|
-
source_file.source = "\r\nfoo"
|
5366
|
+
source_file = Parser::Source::Buffer.new('(comments)', source: "\r\nfoo")
|
5364
5367
|
|
5365
5368
|
range = lambda do |from, to|
|
5366
5369
|
Parser::Source::Range.new(source_file, from, to)
|
@@ -5433,8 +5436,7 @@ class TestParser < Minitest::Test
|
|
5433
5436
|
with_versions(ALL_VERSIONS) do |_ver, parser|
|
5434
5437
|
parser.builder.emit_file_line_as_literals = false
|
5435
5438
|
|
5436
|
-
source_file = Parser::Source::Buffer.new('(comments)')
|
5437
|
-
source_file.source = "[__FILE__, __LINE__]"
|
5439
|
+
source_file = Parser::Source::Buffer.new('(comments)', source: "[__FILE__, __LINE__]")
|
5438
5440
|
|
5439
5441
|
ast = parser.parse(source_file)
|
5440
5442
|
|
@@ -5518,8 +5520,7 @@ class TestParser < Minitest::Test
|
|
5518
5520
|
|
5519
5521
|
def assert_parses_with_comments(ast_pattern, source, comments_pattern)
|
5520
5522
|
with_versions(ALL_VERSIONS) do |_ver, parser|
|
5521
|
-
source_file = Parser::Source::Buffer.new('(comments)')
|
5522
|
-
source_file.source = source
|
5523
|
+
source_file = Parser::Source::Buffer.new('(comments)', source: source)
|
5523
5524
|
|
5524
5525
|
comments_pattern_here = comments_pattern.map do |(from, to)|
|
5525
5526
|
range = Parser::Source::Range.new(source_file, from, to)
|
@@ -5550,8 +5551,8 @@ class TestParser < Minitest::Test
|
|
5550
5551
|
|
5551
5552
|
def test_tokenize
|
5552
5553
|
with_versions(ALL_VERSIONS) do |_ver, parser|
|
5553
|
-
source_file = Parser::Source::Buffer.new('(tokenize)'
|
5554
|
-
|
5554
|
+
source_file = Parser::Source::Buffer.new('(tokenize)',
|
5555
|
+
source: "1 + # foo\n 2")
|
5555
5556
|
|
5556
5557
|
range = lambda do |from, to|
|
5557
5558
|
Parser::Source::Range.new(source_file, from, to)
|
@@ -5577,8 +5578,8 @@ class TestParser < Minitest::Test
|
|
5577
5578
|
|
5578
5579
|
def test_tokenize_recover
|
5579
5580
|
with_versions(ALL_VERSIONS) do |_ver, parser|
|
5580
|
-
source_file = Parser::Source::Buffer.new('(tokenize)'
|
5581
|
-
|
5581
|
+
source_file = Parser::Source::Buffer.new('(tokenize)',
|
5582
|
+
source: "1 + # foo\n ")
|
5582
5583
|
|
5583
5584
|
range = lambda do |from, to|
|
5584
5585
|
Parser::Source::Range.new(source_file, from, to)
|
@@ -6553,39 +6554,64 @@ class TestParser < Minitest::Test
|
|
6553
6554
|
|
6554
6555
|
def test_context_class
|
6555
6556
|
[
|
6556
|
-
%q{class A;},
|
6557
|
-
%q{class A < B;}
|
6557
|
+
%q{class A; get_context; end},
|
6558
|
+
%q{class A < B; get_context; end}
|
6558
6559
|
].each do |code|
|
6559
6560
|
assert_context([:class], code, ALL_VERSIONS)
|
6560
6561
|
end
|
6561
6562
|
end
|
6562
6563
|
|
6564
|
+
def test_context_module
|
6565
|
+
assert_context(
|
6566
|
+
[:module],
|
6567
|
+
%q{module M; get_context; end},
|
6568
|
+
ALL_VERSIONS)
|
6569
|
+
end
|
6570
|
+
|
6563
6571
|
def test_context_sclass
|
6564
6572
|
assert_context(
|
6565
6573
|
[:sclass],
|
6566
|
-
%q{class << foo;},
|
6574
|
+
%q{class << foo; get_context; end},
|
6567
6575
|
ALL_VERSIONS)
|
6568
6576
|
end
|
6569
6577
|
|
6570
6578
|
def test_context_def
|
6571
|
-
|
6572
|
-
|
6573
|
-
%q{def m;}
|
6574
|
-
|
6579
|
+
[
|
6580
|
+
%q{def m; get_context; end},
|
6581
|
+
%q{def m(a = get_context); end}
|
6582
|
+
].each do |code|
|
6583
|
+
assert_context([:def], code, ALL_VERSIONS)
|
6584
|
+
end
|
6585
|
+
|
6586
|
+
[
|
6587
|
+
%q{def m() = get_context},
|
6588
|
+
%q{def m(a = get_context) = 42}
|
6589
|
+
].each do |code|
|
6590
|
+
assert_context([:def], code, SINCE_3_0)
|
6591
|
+
end
|
6575
6592
|
end
|
6576
6593
|
|
6577
6594
|
def test_context_defs
|
6578
|
-
|
6579
|
-
|
6580
|
-
%q{def foo.m;}
|
6581
|
-
|
6595
|
+
[
|
6596
|
+
%q{def foo.m; get_context; end},
|
6597
|
+
%q{def foo.m(a = get_context); end}
|
6598
|
+
].each do |code|
|
6599
|
+
assert_context([:defs], code, ALL_VERSIONS)
|
6600
|
+
end
|
6601
|
+
|
6602
|
+
[
|
6603
|
+
%q{def foo.m() = get_context},
|
6604
|
+
%q{def foo.m(a = get_context) = 42}
|
6605
|
+
].each do |code|
|
6606
|
+
assert_context([:defs], code, SINCE_3_0)
|
6607
|
+
end
|
6582
6608
|
end
|
6583
6609
|
|
6584
6610
|
def test_context_cmd_brace_block
|
6585
6611
|
[
|
6586
|
-
'tap foo {',
|
6587
|
-
'foo.tap foo {',
|
6588
|
-
'foo::tap foo {'
|
6612
|
+
'tap foo { get_context }',
|
6613
|
+
'foo.tap foo { get_context }',
|
6614
|
+
'foo::tap foo { get_context }'
|
6589
6615
|
].each do |code|
|
6590
6616
|
assert_context([:block], code, ALL_VERSIONS)
|
6591
6617
|
end
|
@@ -6593,12 +6619,12 @@ class TestParser < Minitest::Test
|
|
6593
6619
|
|
6594
6620
|
def test_context_brace_block
|
6595
6621
|
[
|
6596
|
-
'tap {',
|
6597
|
-
'foo.tap {',
|
6598
|
-
'foo::tap {',
|
6599
|
-
'tap do',
|
6600
|
-
'foo.tap do',
|
6601
|
-
'foo::tap do'
|
6622
|
+
'tap { get_context }',
|
6623
|
+
'foo.tap { get_context }',
|
6624
|
+
'foo::tap { get_context }',
|
6625
|
+
'tap do get_context end',
|
6626
|
+
'foo.tap do get_context end',
|
6627
|
+
'foo::tap do get_context end'
|
6602
6628
|
].each do |code|
|
6603
6629
|
assert_context([:block], code, ALL_VERSIONS)
|
6604
6630
|
end
|
@@ -6606,9 +6632,9 @@ class TestParser < Minitest::Test
|
|
6606
6632
|
|
6607
6633
|
def test_context_do_block
|
6608
6634
|
[
|
6609
|
-
%q{tap 1 do},
|
6610
|
-
%q{foo.tap do},
|
6611
|
-
%q{foo::tap do}
|
6635
|
+
%q{tap 1 do get_context end},
|
6636
|
+
%q{foo.tap do get_context end},
|
6637
|
+
%q{foo::tap do get_context end}
|
6612
6638
|
].each do |code|
|
6613
6639
|
assert_context([:block], code, ALL_VERSIONS)
|
6614
6640
|
end
|
@@ -6616,8 +6642,12 @@ class TestParser < Minitest::Test
|
|
6616
6642
|
|
6617
6643
|
def test_context_lambda
|
6618
6644
|
[
|
6619
|
-
'->() {',
|
6620
|
-
'->() do'
|
6645
|
+
'->() { get_context }',
|
6646
|
+
'->() do get_context end',
|
6647
|
+
'-> { get_context }',
|
6648
|
+
'-> do get_context end',
|
6649
|
+
'->(a = get_context) {}',
|
6650
|
+
'->(a = get_context) do end'
|
6621
6651
|
].each do |code|
|
6622
6652
|
assert_context([:lambda], code, SINCE_1_9)
|
6623
6653
|
end
|
@@ -6625,28 +6655,61 @@ class TestParser < Minitest::Test
|
|
6625
6655
|
|
6626
6656
|
def test_context_nested
|
6627
6657
|
assert_context(
|
6628
|
-
[:class, :sclass, :defs, :def, :block],
|
6629
|
-
%q{
|
6658
|
+
[:class, :module, :sclass, :defs, :def, :block],
|
6659
|
+
%q{
|
6660
|
+
class A
|
6661
|
+
module M
|
6662
|
+
class << foo
|
6663
|
+
def bar.m
|
6664
|
+
def m
|
6665
|
+
tap do
|
6666
|
+
get_context
|
6667
|
+
end
|
6668
|
+
end
|
6669
|
+
end
|
6670
|
+
end
|
6671
|
+
end
|
6672
|
+
end
|
6673
|
+
},
|
6630
6674
|
ALL_VERSIONS)
|
6631
6675
|
|
6632
6676
|
assert_context(
|
6633
|
-
[:class, :sclass, :defs, :def, :lambda, :block],
|
6634
|
-
%q{
|
6677
|
+
[:class, :module, :sclass, :defs, :def, :lambda, :block],
|
6678
|
+
%q{
|
6679
|
+
class A
|
6680
|
+
module M
|
6681
|
+
class << foo
|
6682
|
+
def bar.m
|
6683
|
+
def m
|
6684
|
+
-> do
|
6685
|
+
tap do
|
6686
|
+
get_context
|
6687
|
+
end
|
6688
|
+
end
|
6689
|
+
end
|
6690
|
+
end
|
6691
|
+
end
|
6692
|
+
end
|
6693
|
+
end
|
6694
|
+
},
|
6635
6695
|
SINCE_1_9)
|
6636
6696
|
|
6637
6697
|
assert_context(
|
6638
6698
|
[],
|
6639
6699
|
%q{
|
6640
6700
|
class A
|
6641
|
-
|
6642
|
-
|
6643
|
-
def m
|
6644
|
-
|
6701
|
+
module M
|
6702
|
+
class << foo
|
6703
|
+
def bar.m
|
6704
|
+
def m
|
6705
|
+
tap do
|
6706
|
+
end
|
6645
6707
|
end
|
6646
6708
|
end
|
6647
6709
|
end
|
6648
6710
|
end
|
6649
6711
|
end
|
6712
|
+
get_context
|
6650
6713
|
},
|
6651
6714
|
ALL_VERSIONS)
|
6652
6715
|
|
@@ -6654,17 +6717,20 @@ class TestParser < Minitest::Test
|
|
6654
6717
|
[],
|
6655
6718
|
%q{
|
6656
6719
|
class A
|
6657
|
-
|
6658
|
-
|
6659
|
-
def m
|
6660
|
-
|
6661
|
-
|
6720
|
+
module M
|
6721
|
+
class << foo
|
6722
|
+
def bar.m
|
6723
|
+
def m
|
6724
|
+
-> do
|
6725
|
+
tap do
|
6726
|
+
end
|
6662
6727
|
end
|
6663
6728
|
end
|
6664
6729
|
end
|
6665
6730
|
end
|
6666
6731
|
end
|
6667
6732
|
end
|
6733
|
+
get_context
|
6668
6734
|
},
|
6669
6735
|
SINCE_1_9)
|
6670
6736
|
end
|
@@ -7448,7 +7514,7 @@ class TestParser < Minitest::Test
|
|
7448
7514
|
s(:nil))),
|
7449
7515
|
%q{proc {_1 = nil}},
|
7450
7516
|
%q{},
|
7451
|
-
|
7517
|
+
%w(2.7))
|
7452
7518
|
|
7453
7519
|
assert_diagnoses(
|
7454
7520
|
[:error, :cant_assign_to_numparam, { :name => '_1' }],
|
@@ -7476,7 +7542,7 @@ class TestParser < Minitest::Test
|
|
7476
7542
|
|
7477
7543
|
refute_diagnoses(
|
7478
7544
|
%q{proc { _1 = nil; _1}},
|
7479
|
-
|
7545
|
+
%w(2.7))
|
7480
7546
|
end
|
7481
7547
|
|
7482
7548
|
def test_numparams_in_nested_blocks
|
@@ -7748,7 +7814,8 @@ class TestParser < Minitest::Test
|
|
7748
7814
|
end
|
7749
7815
|
end
|
7750
7816
|
|
7751
|
-
def
|
7817
|
+
def test_forward_args_legacy
|
7818
|
+
Parser::Builders::Default.emit_forward_arg = false
|
7752
7819
|
assert_parses(
|
7753
7820
|
s(:def, :foo,
|
7754
7821
|
s(:forward_args),
|
@@ -7780,7 +7847,27 @@ class TestParser < Minitest::Test
|
|
7780
7847
|
%q{def foo(...); end},
|
7781
7848
|
%q{},
|
7782
7849
|
SINCE_2_7)
|
7850
|
+
ensure
|
7851
|
+
Parser::Builders::Default.emit_forward_arg = true
|
7852
|
+
end
|
7853
|
+
|
7854
|
+
def test_forward_arg
|
7855
|
+
assert_parses(
|
7856
|
+
s(:def, :foo,
|
7857
|
+
s(:args,
|
7858
|
+
s(:forward_arg)),
|
7859
|
+
s(:send, nil, :bar,
|
7860
|
+
s(:forwarded_args))),
|
7861
|
+
%q{def foo(...); bar(...); end},
|
7862
|
+
%q{ ~ begin (args)
|
7863
|
+
| ~~~~~ expression (args)
|
7864
|
+
| ~ end (args)
|
7865
|
+
| ~~~ expression (args.forward_arg)
|
7866
|
+
| ~~~ expression (send.forwarded_args)},
|
7867
|
+
SINCE_2_7)
|
7868
|
+
end
|
7783
7869
|
|
7870
|
+
def test_forward_args_invalid
|
7784
7871
|
assert_diagnoses(
|
7785
7872
|
[:error, :block_and_blockarg],
|
7786
7873
|
%q{def foo(...) bar(...) { }; end},
|
@@ -7806,6 +7893,12 @@ class TestParser < Minitest::Test
|
|
7806
7893
|
%q{ ^^^ location},
|
7807
7894
|
SINCE_2_7)
|
7808
7895
|
|
7896
|
+
assert_diagnoses(
|
7897
|
+
[:error, :unexpected_token, { :token => 'tBDOT3' }],
|
7898
|
+
%q{def foo(x,y,z); bar(x, y, z, ...); end},
|
7899
|
+
%q{ ^^^ location},
|
7900
|
+
SINCE_3_0)
|
7901
|
+
|
7809
7902
|
assert_diagnoses(
|
7810
7903
|
[:error, :unexpected_token, { :token => 'tBDOT3' }],
|
7811
7904
|
%q{def foo(x,y,z); super(...); end},
|
@@ -7822,7 +7915,13 @@ class TestParser < Minitest::Test
|
|
7822
7915
|
[:error, :unexpected_token, { :token => 'tBDOT3' }],
|
7823
7916
|
%q{->(...) {}},
|
7824
7917
|
%q{ ^^^ location},
|
7825
|
-
|
7918
|
+
['2.7'])
|
7919
|
+
|
7920
|
+
assert_diagnoses(
|
7921
|
+
[:error, :unexpected_token, { :token => 'tDOT3' }],
|
7922
|
+
%q{->(...) {}},
|
7923
|
+
%q{ ^^^ location},
|
7924
|
+
SINCE_3_0)
|
7826
7925
|
|
7827
7926
|
# Here and below the parser asssumes that
|
7828
7927
|
# it can be a beginningless range, so the error comes after reducing right paren
|
@@ -7875,6 +7974,26 @@ class TestParser < Minitest::Test
|
|
7875
7974
|
SINCE_2_7)
|
7876
7975
|
end
|
7877
7976
|
|
7977
|
+
def test_trailing_forward_arg
|
7978
|
+
assert_parses(
|
7979
|
+
s(:def, :foo,
|
7980
|
+
s(:args,
|
7981
|
+
s(:arg, :a),
|
7982
|
+
s(:arg, :b),
|
7983
|
+
s(:forward_arg)),
|
7984
|
+
s(:send, nil, :bar,
|
7985
|
+
s(:lvar, :a),
|
7986
|
+
s(:int, 42),
|
7987
|
+
s(:forwarded_args))),
|
7988
|
+
%q{def foo(a, b, ...); bar(a, 42, ...); end},
|
7989
|
+
%q{ ~ begin (args)
|
7990
|
+
| ~~~~~~~~~~~ expression (args)
|
7991
|
+
| ~ end (args)
|
7992
|
+
| ~~~ expression (args.forward_arg)},
|
7993
|
+
SINCE_3_0)
|
7994
|
+
end
|
7995
|
+
|
7996
|
+
|
7878
7997
|
def test_erange_without_parentheses_at_eol
|
7879
7998
|
assert_diagnoses(
|
7880
7999
|
[:warning, :triple_dot_at_eol],
|
@@ -8344,7 +8463,7 @@ class TestParser < Minitest::Test
|
|
8344
8463
|
nil),
|
8345
8464
|
"#{case_pre}#{code}; end",
|
8346
8465
|
source_maps,
|
8347
|
-
|
8466
|
+
versions
|
8348
8467
|
)
|
8349
8468
|
end
|
8350
8469
|
|
@@ -8790,6 +8909,21 @@ class TestParser < Minitest::Test
|
|
8790
8909
|
%q{}
|
8791
8910
|
)
|
8792
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
|
+
|
8793
8927
|
assert_parses_pattern_match(
|
8794
8928
|
s(:in_pattern,
|
8795
8929
|
s(:hash_pattern,
|
@@ -8933,6 +9067,22 @@ class TestParser < Minitest::Test
|
|
8933
9067
|
%q{ ~~~~~~~ location},
|
8934
9068
|
SINCE_2_7
|
8935
9069
|
)
|
9070
|
+
|
9071
|
+
assert_diagnoses(
|
9072
|
+
[:error, :pm_interp_in_var_name],
|
9073
|
+
%q{case a; in "#{a}": 1; end},
|
9074
|
+
%q{ ~~~~~~~ location},
|
9075
|
+
SINCE_2_7
|
9076
|
+
)
|
9077
|
+
end
|
9078
|
+
|
9079
|
+
def test_pattern_matching_invalid_lvar_name
|
9080
|
+
assert_diagnoses(
|
9081
|
+
[:error, :lvar_name, { name: :a? }],
|
9082
|
+
%q{case a; in a?:; end},
|
9083
|
+
%q{ ~~ location},
|
9084
|
+
SINCE_2_7
|
9085
|
+
)
|
8936
9086
|
end
|
8937
9087
|
|
8938
9088
|
def test_pattern_matching_keyword_variable
|
@@ -9210,8 +9360,7 @@ class TestParser < Minitest::Test
|
|
9210
9360
|
code = "case 1; #{match_code}; then [#{lvar_names.join(', ')}]; end"
|
9211
9361
|
|
9212
9362
|
with_versions(versions) do |version, parser|
|
9213
|
-
source_file = Parser::Source::Buffer.new('(assert_context)')
|
9214
|
-
source_file.source = code
|
9363
|
+
source_file = Parser::Source::Buffer.new('(assert_context)', source: code)
|
9215
9364
|
|
9216
9365
|
lvar_names.each do |lvar_name|
|
9217
9366
|
refute parser.static_env.declared?(lvar_name),
|
@@ -9221,7 +9370,7 @@ class TestParser < Minitest::Test
|
|
9221
9370
|
before = parser.static_env.instance_variable_get(:@variables).to_a
|
9222
9371
|
|
9223
9372
|
begin
|
9224
|
-
|
9373
|
+
_parsed_ast = parser.parse(source_file)
|
9225
9374
|
rescue Parser::SyntaxError => exc
|
9226
9375
|
backtrace = exc.backtrace
|
9227
9376
|
Exception.instance_method(:initialize).bind(exc).
|
@@ -9427,4 +9576,411 @@ class TestParser < Minitest::Test
|
|
9427
9576
|
%{},
|
9428
9577
|
SINCE_1_9)
|
9429
9578
|
end
|
9579
|
+
|
9580
|
+
def test_endless_method
|
9581
|
+
assert_parses(
|
9582
|
+
s(:def, :foo,
|
9583
|
+
s(:args),
|
9584
|
+
s(:int, 42)),
|
9585
|
+
%q{def foo() = 42},
|
9586
|
+
%q{~~~ keyword
|
9587
|
+
| ~~~ name
|
9588
|
+
| ^ assignment
|
9589
|
+
|! end
|
9590
|
+
|~~~~~~~~~~~~~~ expression},
|
9591
|
+
SINCE_3_0)
|
9592
|
+
|
9593
|
+
assert_parses(
|
9594
|
+
s(:def, :inc,
|
9595
|
+
s(:args, s(:arg, :x)),
|
9596
|
+
s(:send,
|
9597
|
+
s(:lvar, :x), :+,
|
9598
|
+
s(:int, 1))),
|
9599
|
+
%q{def inc(x) = x + 1},
|
9600
|
+
%q{~~~ keyword
|
9601
|
+
| ~~~ name
|
9602
|
+
| ^ assignment
|
9603
|
+
|~~~~~~~~~~~~~~~~~~ expression},
|
9604
|
+
SINCE_3_0)
|
9605
|
+
|
9606
|
+
assert_parses(
|
9607
|
+
s(:defs, s(:send, nil, :obj), :foo,
|
9608
|
+
s(:args),
|
9609
|
+
s(:int, 42)),
|
9610
|
+
%q{def obj.foo() = 42},
|
9611
|
+
%q{~~~ keyword
|
9612
|
+
| ^ operator
|
9613
|
+
| ~~~ name
|
9614
|
+
| ^ assignment
|
9615
|
+
|~~~~~~~~~~~~~~~~~~ expression},
|
9616
|
+
SINCE_3_0)
|
9617
|
+
|
9618
|
+
assert_parses(
|
9619
|
+
s(:defs, s(:send, nil, :obj), :inc,
|
9620
|
+
s(:args, s(:arg, :x)),
|
9621
|
+
s(:send,
|
9622
|
+
s(:lvar, :x), :+,
|
9623
|
+
s(:int, 1))),
|
9624
|
+
%q{def obj.inc(x) = x + 1},
|
9625
|
+
%q{~~~ keyword
|
9626
|
+
| ~~~ name
|
9627
|
+
| ^ operator
|
9628
|
+
| ^ assignment
|
9629
|
+
|~~~~~~~~~~~~~~~~~~~~~~ expression},
|
9630
|
+
SINCE_3_0)
|
9631
|
+
end
|
9632
|
+
|
9633
|
+
def test_endless_method_forwarded_args_legacy
|
9634
|
+
Parser::Builders::Default.emit_forward_arg = false
|
9635
|
+
assert_parses(
|
9636
|
+
s(:def, :foo,
|
9637
|
+
s(:forward_args),
|
9638
|
+
s(:send, nil, :bar,
|
9639
|
+
s(:forwarded_args))),
|
9640
|
+
%q{def foo(...) = bar(...)},
|
9641
|
+
%q{~~~ keyword
|
9642
|
+
| ~~~ name
|
9643
|
+
| ^ assignment
|
9644
|
+
|~~~~~~~~~~~~~~~~~~~~~~~ expression},
|
9645
|
+
SINCE_3_0)
|
9646
|
+
Parser::Builders::Default.emit_forward_arg = true
|
9647
|
+
end
|
9648
|
+
|
9649
|
+
def test_endless_method_without_brackets
|
9650
|
+
assert_diagnoses(
|
9651
|
+
[:error, :unexpected_token, { :token => 'tEQL' }],
|
9652
|
+
%Q{def foo = 42},
|
9653
|
+
%q{ ^ location},
|
9654
|
+
SINCE_3_0)
|
9655
|
+
|
9656
|
+
assert_diagnoses(
|
9657
|
+
[:error, :unexpected_token, { :token => 'tEQL' }],
|
9658
|
+
%Q{def obj.foo = 42},
|
9659
|
+
%q{ ^ location},
|
9660
|
+
SINCE_3_0
|
9661
|
+
)
|
9662
|
+
end
|
9663
|
+
|
9664
|
+
def test_endless_method_with_rescue_mod
|
9665
|
+
assert_parses(
|
9666
|
+
s(:def, :m,
|
9667
|
+
s(:args),
|
9668
|
+
s(:rescue,
|
9669
|
+
s(:int, 1),
|
9670
|
+
s(:resbody, nil, nil,
|
9671
|
+
s(:int, 2)), nil)),
|
9672
|
+
%q{def m() = 1 rescue 2},
|
9673
|
+
%q{},
|
9674
|
+
SINCE_3_0)
|
9675
|
+
|
9676
|
+
assert_parses(
|
9677
|
+
s(:defs,
|
9678
|
+
s(:self), :m,
|
9679
|
+
s(:args),
|
9680
|
+
s(:rescue,
|
9681
|
+
s(:int, 1),
|
9682
|
+
s(:resbody, nil, nil,
|
9683
|
+
s(:int, 2)), nil)),
|
9684
|
+
%q{def self.m() = 1 rescue 2},
|
9685
|
+
%q{},
|
9686
|
+
SINCE_3_0)
|
9687
|
+
end
|
9688
|
+
|
9689
|
+
def test_rasgn
|
9690
|
+
assert_parses(
|
9691
|
+
s(:lvasgn, :a,
|
9692
|
+
s(:int, 1)),
|
9693
|
+
%q{1 => a},
|
9694
|
+
%q{~~~~~~ expression
|
9695
|
+
| ^^ operator},
|
9696
|
+
SINCE_3_0)
|
9697
|
+
|
9698
|
+
assert_parses(
|
9699
|
+
s(:gvasgn, :$a,
|
9700
|
+
s(:send, s(:int, 1), :+, s(:int, 2))),
|
9701
|
+
%q{1 + 2 => $a},
|
9702
|
+
%q{~~~~~~~~~~~ expression
|
9703
|
+
| ^^ operator},
|
9704
|
+
SINCE_3_0)
|
9705
|
+
end
|
9706
|
+
|
9707
|
+
def test_mrasgn
|
9708
|
+
assert_parses(
|
9709
|
+
s(:masgn,
|
9710
|
+
s(:mlhs, s(:lvasgn, :a), s(:lvasgn, :b)),
|
9711
|
+
s(:send, s(:int, 13), :divmod, s(:int, 5))),
|
9712
|
+
%q{13.divmod(5) => a,b},
|
9713
|
+
%q{~~~~~~~~~~~~~~~~~~~ expression
|
9714
|
+
| ^^ operator},
|
9715
|
+
SINCE_3_0)
|
9716
|
+
|
9717
|
+
assert_parses(
|
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
|
+
),
|
9724
|
+
%q{13.divmod(5) => a,b => c, d},
|
9725
|
+
%q{~~~~~~~~~~~~~~~~~~~ expression (masgn)
|
9726
|
+
|~~~~~~~~~~~~~~~~~~~~~~~~~~~ expression},
|
9727
|
+
SINCE_3_0)
|
9728
|
+
end
|
9729
|
+
|
9730
|
+
def test_rasgn_line_continuation
|
9731
|
+
assert_diagnoses(
|
9732
|
+
[:error, :unexpected_token, { :token => 'tASSOC' }],
|
9733
|
+
%Q{13.divmod(5)\n=> a,b; [a, b]},
|
9734
|
+
%{ ^^ location},
|
9735
|
+
SINCE_3_0)
|
9736
|
+
end
|
9737
|
+
|
9738
|
+
def test_find_pattern
|
9739
|
+
assert_parses_pattern_match(
|
9740
|
+
s(:in_pattern,
|
9741
|
+
s(:find_pattern,
|
9742
|
+
s(:match_rest,
|
9743
|
+
s(:match_var, :x)),
|
9744
|
+
s(:match_as,
|
9745
|
+
s(:int, 1),
|
9746
|
+
s(:match_var, :a)),
|
9747
|
+
s(:match_rest,
|
9748
|
+
s(:match_var, :y))),
|
9749
|
+
nil,
|
9750
|
+
s(:true)),
|
9751
|
+
%q{in [*x, 1 => a, *y] then true},
|
9752
|
+
%q{ ~~~~~~~~~~~~~~~~ expression (in_pattern.find_pattern)
|
9753
|
+
| ~ begin (in_pattern.find_pattern)
|
9754
|
+
| ~ end (in_pattern.find_pattern)
|
9755
|
+
| ~~ expression (in_pattern.find_pattern.match_rest/1)
|
9756
|
+
| ~~ expression (in_pattern.find_pattern.match_rest/2)},
|
9757
|
+
SINCE_3_0)
|
9758
|
+
|
9759
|
+
assert_parses_pattern_match(
|
9760
|
+
s(:in_pattern,
|
9761
|
+
s(:const_pattern,
|
9762
|
+
s(:const, nil, :String),
|
9763
|
+
s(:find_pattern,
|
9764
|
+
s(:match_rest),
|
9765
|
+
s(:int, 1),
|
9766
|
+
s(:match_rest))),
|
9767
|
+
nil,
|
9768
|
+
s(:true)),
|
9769
|
+
%q{in String(*, 1, *) then true},
|
9770
|
+
%q{ ~~~~~~~ expression (in_pattern.const_pattern.find_pattern)},
|
9771
|
+
SINCE_3_0)
|
9772
|
+
|
9773
|
+
assert_parses_pattern_match(
|
9774
|
+
s(:in_pattern,
|
9775
|
+
s(:const_pattern,
|
9776
|
+
s(:const, nil, :Array),
|
9777
|
+
s(:find_pattern,
|
9778
|
+
s(:match_rest),
|
9779
|
+
s(:int, 1),
|
9780
|
+
s(:match_rest))),
|
9781
|
+
nil,
|
9782
|
+
s(:true)),
|
9783
|
+
%q{in Array[*, 1, *] then true},
|
9784
|
+
%q{ ~~~~~~~ expression (in_pattern.const_pattern.find_pattern)},
|
9785
|
+
SINCE_3_0)
|
9786
|
+
|
9787
|
+
assert_parses_pattern_match(
|
9788
|
+
s(:in_pattern,
|
9789
|
+
s(:find_pattern,
|
9790
|
+
s(:match_rest),
|
9791
|
+
s(:int, 42),
|
9792
|
+
s(:match_rest)),
|
9793
|
+
nil,
|
9794
|
+
s(:true)),
|
9795
|
+
%q{in *, 42, * then true},
|
9796
|
+
%q{ ~~~~~~~~ expression (in_pattern.find_pattern)},
|
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)
|
9985
|
+
end
|
9430
9986
|
end
|