parser 2.2.2.6 → 2.2.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +2 -0
- data/.yardopts +3 -0
- data/CHANGELOG.md +25 -0
- data/README.md +6 -0
- data/Rakefile +3 -1
- data/doc/AST_FORMAT.md +74 -0
- data/lib/parser.rb +1 -0
- data/lib/parser/builders/default.rb +37 -0
- data/lib/parser/current.rb +11 -3
- data/lib/parser/lexer.rl +1 -1
- data/lib/parser/macruby.y +2171 -0
- data/lib/parser/ruby21.y +10 -2
- data/lib/parser/ruby22.y +10 -2
- data/lib/parser/rubymotion.y +2144 -0
- data/lib/parser/runner.rb +10 -0
- data/lib/parser/source/buffer.rb +5 -3
- data/lib/parser/source/map/objc_kwarg.rb +17 -0
- data/lib/parser/version.rb +1 -1
- data/parser.gemspec +3 -1
- data/test/parse_helper.rb +5 -1
- data/test/test_parser.rb +171 -65
- metadata +8 -3
data/lib/parser/runner.rb
CHANGED
@@ -82,6 +82,16 @@ module Parser
|
|
82
82
|
@parser_class = Parser::Ruby22
|
83
83
|
end
|
84
84
|
|
85
|
+
opts.on '--mac', 'Parse as MacRuby 0.12 would' do
|
86
|
+
require 'parser/macruby'
|
87
|
+
@parser_class = Parser::MacRuby
|
88
|
+
end
|
89
|
+
|
90
|
+
opts.on '--ios', 'Parse as mid-2015 RubyMotion would' do
|
91
|
+
require 'parser/rubymotion'
|
92
|
+
@parser_class = Parser::RubyMotion
|
93
|
+
end
|
94
|
+
|
85
95
|
opts.on '-w', '--warnings', 'Enable warnings' do |w|
|
86
96
|
@warnings = w
|
87
97
|
end
|
data/lib/parser/source/buffer.rb
CHANGED
@@ -40,6 +40,8 @@ module Parser
|
|
40
40
|
)
|
41
41
|
/x
|
42
42
|
|
43
|
+
NEW_LINE = "\n".freeze
|
44
|
+
|
43
45
|
##
|
44
46
|
# Try to recognize encoding of `string` as Ruby would, i.e. by looking for
|
45
47
|
# magic encoding comment or UTF-8 BOM. `string` can be in any encoding.
|
@@ -173,7 +175,7 @@ module Parser
|
|
173
175
|
raise ArgumentError, 'Source::Buffer is immutable'
|
174
176
|
end
|
175
177
|
|
176
|
-
@source = input.gsub("\r\n",
|
178
|
+
@source = input.gsub("\r\n", NEW_LINE).freeze
|
177
179
|
end
|
178
180
|
|
179
181
|
##
|
@@ -198,7 +200,7 @@ module Parser
|
|
198
200
|
def source_line(lineno)
|
199
201
|
unless @lines
|
200
202
|
@lines = @source.lines.to_a
|
201
|
-
@lines.each { |line| line.chomp!(
|
203
|
+
@lines.each { |line| line.chomp!(NEW_LINE) }
|
202
204
|
|
203
205
|
# If a file ends with a newline, the EOF token will appear
|
204
206
|
# to be one line further than the end of file.
|
@@ -215,7 +217,7 @@ module Parser
|
|
215
217
|
@line_begins, index = [ [ 0, 0 ] ], 1
|
216
218
|
|
217
219
|
@source.each_char do |char|
|
218
|
-
if char ==
|
220
|
+
if char == NEW_LINE
|
219
221
|
@line_begins.unshift [ @line_begins.length, index ]
|
220
222
|
end
|
221
223
|
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module Parser
|
2
|
+
module Source
|
3
|
+
|
4
|
+
class Map::ObjcKwarg < Map
|
5
|
+
attr_reader :keyword
|
6
|
+
attr_reader :operator
|
7
|
+
attr_reader :argument
|
8
|
+
|
9
|
+
def initialize(keyword_l, operator_l, argument_l, expression_l)
|
10
|
+
@keyword, @operator, @argument = keyword_l, operator_l, argument_l
|
11
|
+
|
12
|
+
super(expression_l)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
17
|
+
end
|
data/lib/parser/version.rb
CHANGED
data/parser.gemspec
CHANGED
@@ -5,7 +5,7 @@ require File.expand_path('../lib/parser/version', __FILE__)
|
|
5
5
|
Gem::Specification.new do |spec|
|
6
6
|
spec.name = 'parser'
|
7
7
|
spec.version = Parser::VERSION
|
8
|
-
spec.authors = ['
|
8
|
+
spec.authors = ['whitequark']
|
9
9
|
spec.email = ['whitequark@whitequark.org']
|
10
10
|
spec.description = 'A Ruby parser written in pure Ruby.'
|
11
11
|
spec.summary = spec.description
|
@@ -20,6 +20,8 @@ Gem::Specification.new do |spec|
|
|
20
20
|
lib/parser/ruby20.rb
|
21
21
|
lib/parser/ruby21.rb
|
22
22
|
lib/parser/ruby22.rb
|
23
|
+
lib/parser/macruby.rb
|
24
|
+
lib/parser/rubymotion.rb
|
23
25
|
)
|
24
26
|
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
25
27
|
spec.test_files = spec.files.grep(%r{^test/})
|
data/test/parse_helper.rb
CHANGED
@@ -8,8 +8,10 @@ module ParseHelper
|
|
8
8
|
else
|
9
9
|
require 'parser/all'
|
10
10
|
require 'parser/ruby22'
|
11
|
+
require 'parser/macruby'
|
12
|
+
require 'parser/rubymotion'
|
11
13
|
|
12
|
-
ALL_VERSIONS = %w(1.8 1.9 2.0 2.1 2.2)
|
14
|
+
ALL_VERSIONS = %w(1.8 1.9 2.0 2.1 2.2 mac ios)
|
13
15
|
end
|
14
16
|
|
15
17
|
def setup
|
@@ -25,6 +27,8 @@ module ParseHelper
|
|
25
27
|
when '2.0' then parser = Parser::Ruby20.new
|
26
28
|
when '2.1' then parser = Parser::Ruby21.new
|
27
29
|
when '2.2' then parser = Parser::Ruby22.new
|
30
|
+
when 'mac' then parser = Parser::MacRuby.new
|
31
|
+
when 'ios' then parser = Parser::RubyMotion.new
|
28
32
|
else raise "Unrecognized Ruby version #{version}"
|
29
33
|
end
|
30
34
|
|
data/test/test_parser.rb
CHANGED
@@ -121,13 +121,13 @@ class TestParser < Minitest::Test
|
|
121
121
|
s(:rational, Rational(42)),
|
122
122
|
%q{42r},
|
123
123
|
%q{~~~ expression},
|
124
|
-
ALL_VERSIONS - %w(1.8 1.9 2.0))
|
124
|
+
ALL_VERSIONS - %w(1.8 1.9 mac ios 2.0))
|
125
125
|
|
126
126
|
assert_parses(
|
127
127
|
s(:rational, Rational(421, 10)),
|
128
128
|
%q{42.1r},
|
129
129
|
%q{~~~~~ expression},
|
130
|
-
ALL_VERSIONS - %w(1.8 1.9 2.0))
|
130
|
+
ALL_VERSIONS - %w(1.8 1.9 mac ios 2.0))
|
131
131
|
end
|
132
132
|
|
133
133
|
def test_complex
|
@@ -135,25 +135,25 @@ class TestParser < Minitest::Test
|
|
135
135
|
s(:complex, Complex(0, 42)),
|
136
136
|
%q{42i},
|
137
137
|
%q{~~~ expression},
|
138
|
-
ALL_VERSIONS - %w(1.8 1.9 2.0))
|
138
|
+
ALL_VERSIONS - %w(1.8 1.9 mac ios 2.0))
|
139
139
|
|
140
140
|
assert_parses(
|
141
141
|
s(:complex, Complex(0, Rational(42))),
|
142
142
|
%q{42ri},
|
143
143
|
%q{~~~~ expression},
|
144
|
-
ALL_VERSIONS - %w(1.8 1.9 2.0))
|
144
|
+
ALL_VERSIONS - %w(1.8 1.9 mac ios 2.0))
|
145
145
|
|
146
146
|
assert_parses(
|
147
147
|
s(:complex, Complex(0, 42.1)),
|
148
148
|
%q{42.1i},
|
149
149
|
%q{~~~~~ expression},
|
150
|
-
ALL_VERSIONS - %w(1.8 1.9 2.0))
|
150
|
+
ALL_VERSIONS - %w(1.8 1.9 mac ios 2.0))
|
151
151
|
|
152
152
|
assert_parses(
|
153
153
|
s(:complex, Complex(0, Rational(421, 10))),
|
154
154
|
%q{42.1ri},
|
155
155
|
%q{~~~~~~ expression},
|
156
|
-
ALL_VERSIONS - %w(1.8 1.9 2.0))
|
156
|
+
ALL_VERSIONS - %w(1.8 1.9 mac ios 2.0))
|
157
157
|
end
|
158
158
|
|
159
159
|
# Strings
|
@@ -491,7 +491,7 @@ class TestParser < Minitest::Test
|
|
491
491
|
| ^ end
|
492
492
|
| ~~~ expression (sym)
|
493
493
|
|~~~~~~~~~~~ expression},
|
494
|
-
ALL_VERSIONS - %w(1.8 1.9))
|
494
|
+
ALL_VERSIONS - %w(1.8 1.9 mac ios))
|
495
495
|
end
|
496
496
|
|
497
497
|
def test_array_symbols_interp
|
@@ -508,7 +508,7 @@ class TestParser < Minitest::Test
|
|
508
508
|
| ~~~~~~ expression (dsym.begin)
|
509
509
|
| ~~~ expression (dsym.begin.lvar)
|
510
510
|
|~~~~~~~~~~~~~~ expression},
|
511
|
-
ALL_VERSIONS - %w(1.8 1.9))
|
511
|
+
ALL_VERSIONS - %w(1.8 1.9 mac ios))
|
512
512
|
|
513
513
|
assert_parses(
|
514
514
|
s(:array,
|
@@ -517,7 +517,7 @@ class TestParser < Minitest::Test
|
|
517
517
|
s(:begin, s(:lvar, :bar)))),
|
518
518
|
%q{%I[foo#{bar}]},
|
519
519
|
%q{},
|
520
|
-
ALL_VERSIONS - %w(1.8 1.9))
|
520
|
+
ALL_VERSIONS - %w(1.8 1.9 mac ios))
|
521
521
|
end
|
522
522
|
|
523
523
|
def test_array_symbols_empty
|
@@ -527,13 +527,13 @@ class TestParser < Minitest::Test
|
|
527
527
|
%q{^^^ begin
|
528
528
|
| ^ end
|
529
529
|
|~~~~ expression},
|
530
|
-
ALL_VERSIONS - %w(1.8 1.9))
|
530
|
+
ALL_VERSIONS - %w(1.8 1.9 mac ios))
|
531
531
|
|
532
532
|
assert_parses(
|
533
533
|
s(:array),
|
534
534
|
%q{%I()},
|
535
535
|
%q{},
|
536
|
-
ALL_VERSIONS - %w(1.8 1.9))
|
536
|
+
ALL_VERSIONS - %w(1.8 1.9 mac ios))
|
537
537
|
end
|
538
538
|
|
539
539
|
# Hashes
|
@@ -589,7 +589,7 @@ class TestParser < Minitest::Test
|
|
589
589
|
| ~~~~~ expression (pair.sym)
|
590
590
|
| ~~~~~~~~ expression (pair)
|
591
591
|
|~~~~~~~~~~~~ expression},
|
592
|
-
ALL_VERSIONS - %w(1.8 1.9 2.0 2.1))
|
592
|
+
ALL_VERSIONS - %w(1.8 1.9 mac ios 2.0 2.1))
|
593
593
|
|
594
594
|
assert_parses(
|
595
595
|
s(:hash,
|
@@ -597,7 +597,7 @@ class TestParser < Minitest::Test
|
|
597
597
|
s(:pair, s(:sym, :bar), s(:hash))),
|
598
598
|
%q[{ 'foo': 2, 'bar': {}}],
|
599
599
|
%q{},
|
600
|
-
ALL_VERSIONS - %w(1.8 1.9 2.0 2.1))
|
600
|
+
ALL_VERSIONS - %w(1.8 1.9 mac ios 2.0 2.1))
|
601
601
|
|
602
602
|
assert_parses(
|
603
603
|
s(:send, nil, :f,
|
@@ -606,7 +606,7 @@ class TestParser < Minitest::Test
|
|
606
606
|
s(:int, 1))),
|
607
607
|
%q{f(a ? "a":1)},
|
608
608
|
%q{},
|
609
|
-
ALL_VERSIONS - %w(1.8 1.9 2.0 2.1))
|
609
|
+
ALL_VERSIONS - %w(1.8 1.9 mac ios 2.0 2.1))
|
610
610
|
end
|
611
611
|
|
612
612
|
def test_hash_kwsplat
|
@@ -617,7 +617,7 @@ class TestParser < Minitest::Test
|
|
617
617
|
%q[{ foo: 2, **bar }],
|
618
618
|
%q{ ^^ operator (kwsplat)
|
619
619
|
| ~~~~~ expression (kwsplat)},
|
620
|
-
ALL_VERSIONS - %w(1.8 1.9))
|
620
|
+
ALL_VERSIONS - %w(1.8 1.9 mac ios))
|
621
621
|
end
|
622
622
|
|
623
623
|
def test_hash_no_hashrocket
|
@@ -837,7 +837,7 @@ class TestParser < Minitest::Test
|
|
837
837
|
s(:send, nil, :m, s(:lvar, :foo)))),
|
838
838
|
%q{foo = bar = m foo},
|
839
839
|
%q{},
|
840
|
-
ALL_VERSIONS - %w(1.8))
|
840
|
+
ALL_VERSIONS - %w(1.8 mac ios))
|
841
841
|
end
|
842
842
|
|
843
843
|
def test_asgn_keyword_invalid
|
@@ -1233,7 +1233,7 @@ class TestParser < Minitest::Test
|
|
1233
1233
|
s(:int, 1)),
|
1234
1234
|
%q{::A += 1},
|
1235
1235
|
%q{},
|
1236
|
-
ALL_VERSIONS - %w(1.8 1.9))
|
1236
|
+
ALL_VERSIONS - %w(1.8 1.9 mac ios))
|
1237
1237
|
|
1238
1238
|
assert_parses(
|
1239
1239
|
s(:op_asgn,
|
@@ -1241,7 +1241,7 @@ class TestParser < Minitest::Test
|
|
1241
1241
|
s(:int, 1)),
|
1242
1242
|
%q{B::A += 1},
|
1243
1243
|
%q{},
|
1244
|
-
ALL_VERSIONS - %w(1.8 1.9))
|
1244
|
+
ALL_VERSIONS - %w(1.8 1.9 mac ios))
|
1245
1245
|
|
1246
1246
|
assert_parses(
|
1247
1247
|
s(:def, :x, s(:args),
|
@@ -1250,7 +1250,7 @@ class TestParser < Minitest::Test
|
|
1250
1250
|
s(:int, 1))),
|
1251
1251
|
%q{def x; self::A ||= 1; end},
|
1252
1252
|
%q{},
|
1253
|
-
ALL_VERSIONS - %w(1.8 1.9))
|
1253
|
+
ALL_VERSIONS - %w(1.8 1.9 mac ios))
|
1254
1254
|
|
1255
1255
|
assert_parses(
|
1256
1256
|
s(:def, :x, s(:args),
|
@@ -1259,7 +1259,7 @@ class TestParser < Minitest::Test
|
|
1259
1259
|
s(:int, 1))),
|
1260
1260
|
%q{def x; ::A ||= 1; end},
|
1261
1261
|
%q{},
|
1262
|
-
ALL_VERSIONS - %w(1.8 1.9))
|
1262
|
+
ALL_VERSIONS - %w(1.8 1.9 mac ios))
|
1263
1263
|
end
|
1264
1264
|
|
1265
1265
|
def test_const_op_asgn_invalid
|
@@ -1267,25 +1267,25 @@ class TestParser < Minitest::Test
|
|
1267
1267
|
[:error, :dynamic_const],
|
1268
1268
|
%q{Foo::Bar += 1},
|
1269
1269
|
%q{ ~~~ location},
|
1270
|
-
%w(1.8 1.9))
|
1270
|
+
%w(1.8 1.9 mac ios))
|
1271
1271
|
|
1272
1272
|
assert_diagnoses(
|
1273
1273
|
[:error, :dynamic_const],
|
1274
1274
|
%q{::Bar += 1},
|
1275
1275
|
%q{ ~~~ location},
|
1276
|
-
%w(1.8 1.9))
|
1276
|
+
%w(1.8 1.9 mac ios))
|
1277
1277
|
|
1278
1278
|
assert_diagnoses(
|
1279
1279
|
[:error, :dynamic_const],
|
1280
1280
|
%q{def foo; Foo::Bar += 1; end},
|
1281
1281
|
%q{ ~~~ location},
|
1282
|
-
%w(1.8 1.9))
|
1282
|
+
%w(1.8 1.9 mac ios))
|
1283
1283
|
|
1284
1284
|
assert_diagnoses(
|
1285
1285
|
[:error, :dynamic_const],
|
1286
1286
|
%q{def foo; ::Bar += 1; end},
|
1287
1287
|
%q{ ~~~ location},
|
1288
|
-
%w(1.8 1.9))
|
1288
|
+
%w(1.8 1.9 mac ios))
|
1289
1289
|
end
|
1290
1290
|
|
1291
1291
|
# Method binary operator-assignment
|
@@ -1339,7 +1339,7 @@ class TestParser < Minitest::Test
|
|
1339
1339
|
s(:send, nil, :m, s(:lvar, :foo))),
|
1340
1340
|
%q{foo::A += m foo},
|
1341
1341
|
%q{},
|
1342
|
-
ALL_VERSIONS - %w(1.8))
|
1342
|
+
ALL_VERSIONS - %w(1.8 ios))
|
1343
1343
|
end
|
1344
1344
|
|
1345
1345
|
def test_op_asgn_index
|
@@ -1535,7 +1535,7 @@ class TestParser < Minitest::Test
|
|
1535
1535
|
nil),
|
1536
1536
|
%q{class Foo < a:b; end},
|
1537
1537
|
%q{},
|
1538
|
-
ALL_VERSIONS - %w(1.8 1.9))
|
1538
|
+
ALL_VERSIONS - %w(1.8 1.9 mac ios))
|
1539
1539
|
end
|
1540
1540
|
|
1541
1541
|
def test_class_invalid
|
@@ -1771,7 +1771,7 @@ class TestParser < Minitest::Test
|
|
1771
1771
|
%q{def f(foo:); end},
|
1772
1772
|
%q{ ~~~ name (args.kwarg)
|
1773
1773
|
| ~~~~ expression (args.kwarg)},
|
1774
|
-
ALL_VERSIONS - %w(1.8 1.9 2.0))
|
1774
|
+
ALL_VERSIONS - %w(1.8 1.9 mac ios 2.0))
|
1775
1775
|
end
|
1776
1776
|
|
1777
1777
|
def test_kwoptarg
|
@@ -1782,7 +1782,7 @@ class TestParser < Minitest::Test
|
|
1782
1782
|
%q{def f(foo: 1); end},
|
1783
1783
|
%q{ ~~~ name (args.kwoptarg)
|
1784
1784
|
| ~~~~~~ expression (args.kwoptarg)},
|
1785
|
-
ALL_VERSIONS - %w(1.8 1.9))
|
1785
|
+
ALL_VERSIONS - %w(1.8 1.9 mac ios))
|
1786
1786
|
end
|
1787
1787
|
|
1788
1788
|
def test_kwrestarg_named
|
@@ -1793,7 +1793,7 @@ class TestParser < Minitest::Test
|
|
1793
1793
|
%q{def f(**foo); end},
|
1794
1794
|
%q{ ~~~ name (args.kwrestarg)
|
1795
1795
|
| ~~~~~ expression (args.kwrestarg)},
|
1796
|
-
ALL_VERSIONS - %w(1.8 1.9))
|
1796
|
+
ALL_VERSIONS - %w(1.8 1.9 mac ios))
|
1797
1797
|
end
|
1798
1798
|
|
1799
1799
|
def test_kwrestarg_unnamed
|
@@ -1803,7 +1803,7 @@ class TestParser < Minitest::Test
|
|
1803
1803
|
nil),
|
1804
1804
|
%q{def f(**); end},
|
1805
1805
|
%q{ ~~ expression (args.kwrestarg)},
|
1806
|
-
ALL_VERSIONS - %w(1.8 1.9))
|
1806
|
+
ALL_VERSIONS - %w(1.8 1.9 mac ios))
|
1807
1807
|
end
|
1808
1808
|
|
1809
1809
|
def test_blockarg
|
@@ -1816,6 +1816,30 @@ class TestParser < Minitest::Test
|
|
1816
1816
|
| ~~~~~~ expression (args.blockarg)})
|
1817
1817
|
end
|
1818
1818
|
|
1819
|
+
def test_objc_arg
|
1820
|
+
assert_parses(
|
1821
|
+
s(:def, :f,
|
1822
|
+
s(:args, s(:arg, :a), s(:objc_kwarg, :b, :c)),
|
1823
|
+
nil),
|
1824
|
+
%q{def f(a, b: c); end},
|
1825
|
+
%q{ ~ keyword (args.objc_kwarg)
|
1826
|
+
| ~ operator (args.objc_kwarg)
|
1827
|
+
| ~ argument (args.objc_kwarg)
|
1828
|
+
| ~~~~ expression (args.objc_kwarg)},
|
1829
|
+
%w(mac))
|
1830
|
+
|
1831
|
+
assert_parses(
|
1832
|
+
s(:def, :f,
|
1833
|
+
s(:args, s(:arg, :a), s(:objc_kwarg, :b, :c)),
|
1834
|
+
nil),
|
1835
|
+
%q{def f(a, b => c); end},
|
1836
|
+
%q{ ~ keyword (args.objc_kwarg)
|
1837
|
+
| ~~ operator (args.objc_kwarg)
|
1838
|
+
| ~ argument (args.objc_kwarg)
|
1839
|
+
| ~~~~~~ expression (args.objc_kwarg)},
|
1840
|
+
%w(mac))
|
1841
|
+
end
|
1842
|
+
|
1819
1843
|
def test_arg_scope
|
1820
1844
|
# [ruby-core:61299] [Bug #9593]
|
1821
1845
|
assert_parses(
|
@@ -1824,7 +1848,7 @@ class TestParser < Minitest::Test
|
|
1824
1848
|
s(:lvar, :var)),
|
1825
1849
|
%q{def f(var = defined?(var)) var end},
|
1826
1850
|
%q{},
|
1827
|
-
ALL_VERSIONS - %w(1.8 1.9 2.0))
|
1851
|
+
ALL_VERSIONS - %w(1.8 1.9 mac ios 2.0))
|
1828
1852
|
|
1829
1853
|
assert_parses(
|
1830
1854
|
s(:def, :f,
|
@@ -1832,7 +1856,7 @@ class TestParser < Minitest::Test
|
|
1832
1856
|
s(:lvar, :var)),
|
1833
1857
|
%q{def f(var: defined?(var)) var end},
|
1834
1858
|
%q{},
|
1835
|
-
ALL_VERSIONS - %w(1.8 1.9 2.0))
|
1859
|
+
ALL_VERSIONS - %w(1.8 1.9 mac ios 2.0))
|
1836
1860
|
end
|
1837
1861
|
|
1838
1862
|
def assert_parses_args(ast, code, versions=ALL_VERSIONS)
|
@@ -1978,7 +2002,7 @@ class TestParser < Minitest::Test
|
|
1978
2002
|
s(:kwrestarg, :baz),
|
1979
2003
|
s(:blockarg, :b)),
|
1980
2004
|
%q{(foo: 1, bar: 2, **baz, &b)},
|
1981
|
-
ALL_VERSIONS - %w(1.8 1.9))
|
2005
|
+
ALL_VERSIONS - %w(1.8 1.9 mac ios))
|
1982
2006
|
|
1983
2007
|
# f_kwarg opt_f_block_arg
|
1984
2008
|
assert_parses_args(
|
@@ -1986,7 +2010,7 @@ class TestParser < Minitest::Test
|
|
1986
2010
|
s(:kwoptarg, :foo, s(:int, 1)),
|
1987
2011
|
s(:blockarg, :b)),
|
1988
2012
|
%q{(foo: 1, &b)},
|
1989
|
-
ALL_VERSIONS - %w(1.8 1.9))
|
2013
|
+
ALL_VERSIONS - %w(1.8 1.9 mac ios))
|
1990
2014
|
|
1991
2015
|
# f_kwrest opt_f_block_arg
|
1992
2016
|
assert_parses_args(
|
@@ -1994,14 +2018,14 @@ class TestParser < Minitest::Test
|
|
1994
2018
|
s(:kwrestarg, :baz),
|
1995
2019
|
s(:blockarg, :b)),
|
1996
2020
|
%q{**baz, &b},
|
1997
|
-
ALL_VERSIONS - %w(1.8 1.9))
|
2021
|
+
ALL_VERSIONS - %w(1.8 1.9 mac ios))
|
1998
2022
|
|
1999
2023
|
assert_parses_args(
|
2000
2024
|
s(:args,
|
2001
2025
|
s(:restarg),
|
2002
2026
|
s(:kwrestarg)),
|
2003
2027
|
%q{*, **},
|
2004
|
-
ALL_VERSIONS - %w(1.8 1.9))
|
2028
|
+
ALL_VERSIONS - %w(1.8 1.9 mac ios))
|
2005
2029
|
end
|
2006
2030
|
|
2007
2031
|
def test_kwarg_no_paren
|
@@ -2009,13 +2033,13 @@ class TestParser < Minitest::Test
|
|
2009
2033
|
s(:args,
|
2010
2034
|
s(:kwarg, :foo)),
|
2011
2035
|
%Q{foo:\n},
|
2012
|
-
ALL_VERSIONS - %w(1.8 1.9 2.0))
|
2036
|
+
ALL_VERSIONS - %w(1.8 1.9 mac ios 2.0))
|
2013
2037
|
|
2014
2038
|
assert_parses_args(
|
2015
2039
|
s(:args,
|
2016
2040
|
s(:kwoptarg, :foo, s(:int, -1))),
|
2017
2041
|
%Q{foo: -1\n},
|
2018
|
-
ALL_VERSIONS - %w(1.8 1.9 2.0))
|
2042
|
+
ALL_VERSIONS - %w(1.8 1.9 mac ios 2.0))
|
2019
2043
|
end
|
2020
2044
|
|
2021
2045
|
def assert_parses_margs(ast, code, versions=ALL_VERSIONS - %w(1.8))
|
@@ -2078,6 +2102,20 @@ class TestParser < Minitest::Test
|
|
2078
2102
|
%q{(*, p)})
|
2079
2103
|
end
|
2080
2104
|
|
2105
|
+
def test_marg_objc_restarg
|
2106
|
+
assert_parses(
|
2107
|
+
s(:def, :f,
|
2108
|
+
s(:args,
|
2109
|
+
s(:arg, :a),
|
2110
|
+
s(:mlhs,
|
2111
|
+
s(:objc_restarg, s(:objc_kwarg, :b, :c)))),
|
2112
|
+
nil),
|
2113
|
+
%Q{def f(a, (*b: c)); end},
|
2114
|
+
%q{ ~ operator (args.mlhs.objc_restarg)
|
2115
|
+
| ~~~~~ expression (args.mlhs.objc_restarg)},
|
2116
|
+
%w(mac))
|
2117
|
+
end
|
2118
|
+
|
2081
2119
|
def assert_parses_blockargs(ast, code, versions=ALL_VERSIONS)
|
2082
2120
|
assert_parses(
|
2083
2121
|
s(:block,
|
@@ -2108,7 +2146,7 @@ class TestParser < Minitest::Test
|
|
2108
2146
|
assert_parses_blockargs(
|
2109
2147
|
s(:args, s(:shadowarg, :a)),
|
2110
2148
|
%Q{|;\na\n|},
|
2111
|
-
ALL_VERSIONS - %w(1.8 1.9))
|
2149
|
+
ALL_VERSIONS - %w(1.8 1.9 mac ios))
|
2112
2150
|
|
2113
2151
|
# tOROP
|
2114
2152
|
assert_parses_blockargs(
|
@@ -2346,7 +2384,7 @@ class TestParser < Minitest::Test
|
|
2346
2384
|
s(:kwrestarg, :baz),
|
2347
2385
|
s(:blockarg, :b)),
|
2348
2386
|
%q{|foo: 1, bar: 2, **baz, &b|},
|
2349
|
-
ALL_VERSIONS - %w(1.8 1.9))
|
2387
|
+
ALL_VERSIONS - %w(1.8 1.9 mac ios))
|
2350
2388
|
|
2351
2389
|
# f_block_kwarg opt_f_block_arg
|
2352
2390
|
assert_parses_blockargs(
|
@@ -2354,7 +2392,7 @@ class TestParser < Minitest::Test
|
|
2354
2392
|
s(:kwoptarg, :foo, s(:int, 1)),
|
2355
2393
|
s(:blockarg, :b)),
|
2356
2394
|
%q{|foo: 1, &b|},
|
2357
|
-
ALL_VERSIONS - %w(1.8 1.9))
|
2395
|
+
ALL_VERSIONS - %w(1.8 1.9 mac ios))
|
2358
2396
|
|
2359
2397
|
# f_kwrest opt_f_block_arg
|
2360
2398
|
assert_parses_blockargs(
|
@@ -2362,7 +2400,7 @@ class TestParser < Minitest::Test
|
|
2362
2400
|
s(:kwrestarg, :baz),
|
2363
2401
|
s(:blockarg, :b)),
|
2364
2402
|
%q{|**baz, &b|},
|
2365
|
-
ALL_VERSIONS - %w(1.8 1.9))
|
2403
|
+
ALL_VERSIONS - %w(1.8 1.9 mac ios))
|
2366
2404
|
end
|
2367
2405
|
|
2368
2406
|
def test_block_kwarg
|
@@ -2370,7 +2408,7 @@ class TestParser < Minitest::Test
|
|
2370
2408
|
s(:args,
|
2371
2409
|
s(:kwarg, :foo)),
|
2372
2410
|
%q{|foo:|},
|
2373
|
-
ALL_VERSIONS - %w(1.8 1.9 2.0))
|
2411
|
+
ALL_VERSIONS - %w(1.8 1.9 mac ios 2.0))
|
2374
2412
|
end
|
2375
2413
|
|
2376
2414
|
def test_arg_invalid
|
@@ -2447,21 +2485,21 @@ class TestParser < Minitest::Test
|
|
2447
2485
|
%q{def foo(aa, aa: 1); end},
|
2448
2486
|
%q{ ^^ location
|
2449
2487
|
| ~~ highlights (0)},
|
2450
|
-
ALL_VERSIONS - %w(1.8 1.9))
|
2488
|
+
ALL_VERSIONS - %w(1.8 1.9 mac ios))
|
2451
2489
|
|
2452
2490
|
assert_diagnoses(
|
2453
2491
|
[:error, :duplicate_argument],
|
2454
2492
|
%q{def foo(aa, **aa); end},
|
2455
2493
|
%q{ ^^ location
|
2456
2494
|
| ~~ highlights (0)},
|
2457
|
-
ALL_VERSIONS - %w(1.8 1.9))
|
2495
|
+
ALL_VERSIONS - %w(1.8 1.9 mac ios))
|
2458
2496
|
|
2459
2497
|
assert_diagnoses(
|
2460
2498
|
[:error, :duplicate_argument],
|
2461
2499
|
%q{def foo(aa, aa:); end},
|
2462
2500
|
%q{ ^^ location
|
2463
2501
|
| ~~ highlights (0)},
|
2464
|
-
ALL_VERSIONS - %w(1.8 1.9 2.0))
|
2502
|
+
ALL_VERSIONS - %w(1.8 1.9 mac ios 2.0))
|
2465
2503
|
end
|
2466
2504
|
|
2467
2505
|
def test_arg_duplicate_ignored
|
@@ -2483,7 +2521,7 @@ class TestParser < Minitest::Test
|
|
2483
2521
|
[:error, :duplicate_argument],
|
2484
2522
|
%q{def foo(_a, _a); end},
|
2485
2523
|
%q{},
|
2486
|
-
%w(1.8 1.9))
|
2524
|
+
%w(1.8 1.9 mac ios))
|
2487
2525
|
|
2488
2526
|
assert_parses(
|
2489
2527
|
s(:def, :foo,
|
@@ -2491,7 +2529,7 @@ class TestParser < Minitest::Test
|
|
2491
2529
|
nil),
|
2492
2530
|
%q{def foo(_a, _a); end},
|
2493
2531
|
%q{},
|
2494
|
-
ALL_VERSIONS - %w(1.8 1.9))
|
2532
|
+
ALL_VERSIONS - %w(1.8 1.9 mac ios))
|
2495
2533
|
end
|
2496
2534
|
|
2497
2535
|
def test_arg_duplicate_proc
|
@@ -2515,13 +2553,13 @@ class TestParser < Minitest::Test
|
|
2515
2553
|
[:error, :argument_const],
|
2516
2554
|
%q{def foo(Abc: 1); end},
|
2517
2555
|
%q{ ~~~~ location},
|
2518
|
-
ALL_VERSIONS - %w(1.8 1.9))
|
2556
|
+
ALL_VERSIONS - %w(1.8 1.9 mac ios))
|
2519
2557
|
|
2520
2558
|
assert_diagnoses(
|
2521
2559
|
[:error, :argument_const],
|
2522
2560
|
%q{def foo(Abc:); end},
|
2523
2561
|
%q{ ~~~~ location},
|
2524
|
-
ALL_VERSIONS - %w(1.8 1.9 2.0))
|
2562
|
+
ALL_VERSIONS - %w(1.8 1.9 mac ios 2.0))
|
2525
2563
|
end
|
2526
2564
|
|
2527
2565
|
def test_arg_label
|
@@ -2604,6 +2642,17 @@ class TestParser < Minitest::Test
|
|
2604
2642
|
| ~~ highlights (0)})
|
2605
2643
|
end
|
2606
2644
|
|
2645
|
+
def test_send_objc_vararg
|
2646
|
+
assert_parses(
|
2647
|
+
s(:send, nil, :fun,
|
2648
|
+
s(:int, 1),
|
2649
|
+
s(:hash,
|
2650
|
+
s(:pair, s(:sym, :bar), s(:objc_varargs, s(:int, 2), s(:int, 3), s(:nil))))),
|
2651
|
+
%q{fun(1, bar: 2, 3, nil)},
|
2652
|
+
%q{ ~~~~~~~~~ expression (hash.pair.objc_varargs)},
|
2653
|
+
%w(mac))
|
2654
|
+
end
|
2655
|
+
|
2607
2656
|
# To receiver
|
2608
2657
|
|
2609
2658
|
def test_send_plain
|
@@ -2687,7 +2736,7 @@ class TestParser < Minitest::Test
|
|
2687
2736
|
[:warning, :ambiguous_prefix, { :prefix => '**' }],
|
2688
2737
|
%q{m **foo},
|
2689
2738
|
%q{ ^^ location},
|
2690
|
-
ALL_VERSIONS - %w(1.8 1.9))
|
2739
|
+
ALL_VERSIONS - %w(1.8 1.9 mac ios))
|
2691
2740
|
end
|
2692
2741
|
|
2693
2742
|
def test_send_block_chain_cmd
|
@@ -2749,7 +2798,7 @@ class TestParser < Minitest::Test
|
|
2749
2798
|
s(:args), nil),
|
2750
2799
|
%q{meth 1 do end.fun bar do end},
|
2751
2800
|
%q{},
|
2752
|
-
ALL_VERSIONS - %w(1.8 1.9))
|
2801
|
+
ALL_VERSIONS - %w(1.8 1.9 mac ios))
|
2753
2802
|
|
2754
2803
|
assert_parses(
|
2755
2804
|
s(:block,
|
@@ -2761,7 +2810,7 @@ class TestParser < Minitest::Test
|
|
2761
2810
|
s(:args), nil),
|
2762
2811
|
%q{meth 1 do end.fun(bar) {}},
|
2763
2812
|
%q{},
|
2764
|
-
ALL_VERSIONS - %w(1.8 1.9))
|
2813
|
+
ALL_VERSIONS - %w(1.8 1.9 mac ios))
|
2765
2814
|
|
2766
2815
|
assert_parses(
|
2767
2816
|
s(:block,
|
@@ -2773,7 +2822,7 @@ class TestParser < Minitest::Test
|
|
2773
2822
|
s(:args), nil),
|
2774
2823
|
%q{meth 1 do end.fun {}},
|
2775
2824
|
%q{},
|
2776
|
-
ALL_VERSIONS - %w(1.8 1.9))
|
2825
|
+
ALL_VERSIONS - %w(1.8 1.9 mac ios))
|
2777
2826
|
end
|
2778
2827
|
|
2779
2828
|
def test_send_paren_block_cmd
|
@@ -3110,7 +3159,7 @@ class TestParser < Minitest::Test
|
|
3110
3159
|
nil),
|
3111
3160
|
%q{-> (a) { }},
|
3112
3161
|
%q{},
|
3113
|
-
ALL_VERSIONS - %w(1.8 1.9))
|
3162
|
+
ALL_VERSIONS - %w(1.8 1.9 mac ios))
|
3114
3163
|
end
|
3115
3164
|
|
3116
3165
|
def test_send_lambda_args_shadow
|
@@ -3126,6 +3175,26 @@ class TestParser < Minitest::Test
|
|
3126
3175
|
ALL_VERSIONS - %w(1.8))
|
3127
3176
|
end
|
3128
3177
|
|
3178
|
+
def test_send_lambda_args_noparen
|
3179
|
+
assert_parses(
|
3180
|
+
s(:block, s(:send, nil, :lambda),
|
3181
|
+
s(:args,
|
3182
|
+
s(:kwoptarg, :a, s(:int, 1))),
|
3183
|
+
nil),
|
3184
|
+
%q{-> a: 1 { }},
|
3185
|
+
%q{},
|
3186
|
+
ALL_VERSIONS - %w(1.8 1.9 mac ios))
|
3187
|
+
|
3188
|
+
assert_parses(
|
3189
|
+
s(:block, s(:send, nil, :lambda),
|
3190
|
+
s(:args,
|
3191
|
+
s(:kwarg, :a)),
|
3192
|
+
nil),
|
3193
|
+
%q{-> a: { }},
|
3194
|
+
%q{},
|
3195
|
+
ALL_VERSIONS - %w(1.8 1.9 mac ios 2.0))
|
3196
|
+
end
|
3197
|
+
|
3129
3198
|
def test_send_call
|
3130
3199
|
assert_parses(
|
3131
3200
|
s(:send, s(:lvar, :foo), :call,
|
@@ -3422,6 +3491,14 @@ class TestParser < Minitest::Test
|
|
3422
3491
|
%q{fun (1)})
|
3423
3492
|
end
|
3424
3493
|
|
3494
|
+
def test_space_args_arg_newline
|
3495
|
+
assert_parses(
|
3496
|
+
s(:send, nil, :fun, s(:begin, s(:int, 1))),
|
3497
|
+
%Q{fun (1\n)},
|
3498
|
+
%q{},
|
3499
|
+
ALL_VERSIONS - %w(mac))
|
3500
|
+
end
|
3501
|
+
|
3425
3502
|
def test_space_args_arg_block
|
3426
3503
|
assert_parses(
|
3427
3504
|
s(:block,
|
@@ -3702,7 +3779,7 @@ class TestParser < Minitest::Test
|
|
3702
3779
|
s(:args), nil),
|
3703
3780
|
%q{fun () {}},
|
3704
3781
|
%q{ ~~ expression (send.begin)},
|
3705
|
-
ALL_VERSIONS - %w(1.8 1.9))
|
3782
|
+
ALL_VERSIONS - %w(1.8 1.9 mac ios))
|
3706
3783
|
end
|
3707
3784
|
|
3708
3785
|
#
|
@@ -4255,7 +4332,7 @@ class TestParser < Minitest::Test
|
|
4255
4332
|
%q{break fun foo do end},
|
4256
4333
|
%q{ ~~~~~~~~~~~~~~ expression (block)
|
4257
4334
|
|~~~~~~~~~~~~~~~~~~~~ expression},
|
4258
|
-
ALL_VERSIONS - %w(1.8))
|
4335
|
+
ALL_VERSIONS - %w(1.8 ios))
|
4259
4336
|
end
|
4260
4337
|
|
4261
4338
|
def test_return
|
@@ -4302,7 +4379,7 @@ class TestParser < Minitest::Test
|
|
4302
4379
|
%q{return fun foo do end},
|
4303
4380
|
%q{ ~~~~~~~~~~~~~~ expression (block)
|
4304
4381
|
|~~~~~~~~~~~~~~~~~~~~~ expression},
|
4305
|
-
ALL_VERSIONS - %w(1.8))
|
4382
|
+
ALL_VERSIONS - %w(1.8 ios))
|
4306
4383
|
end
|
4307
4384
|
|
4308
4385
|
def test_next
|
@@ -4349,7 +4426,7 @@ class TestParser < Minitest::Test
|
|
4349
4426
|
%q{next fun foo do end},
|
4350
4427
|
%q{ ~~~~~~~~~~~~~~ expression (block)
|
4351
4428
|
|~~~~~~~~~~~~~~~~~~~ expression},
|
4352
|
-
ALL_VERSIONS - %w(1.8))
|
4429
|
+
ALL_VERSIONS - %w(1.8 ios))
|
4353
4430
|
end
|
4354
4431
|
|
4355
4432
|
def test_redo
|
@@ -4580,7 +4657,7 @@ class TestParser < Minitest::Test
|
|
4580
4657
|
%q{def f; BEGIN{}; end},
|
4581
4658
|
%q{ ~~~~~ location},
|
4582
4659
|
# Yes. *Exclude 1.9*. Sigh.
|
4583
|
-
ALL_VERSIONS - %w(1.9))
|
4660
|
+
ALL_VERSIONS - %w(1.9 mac ios))
|
4584
4661
|
end
|
4585
4662
|
|
4586
4663
|
def test_postexe
|
@@ -4634,7 +4711,7 @@ class TestParser < Minitest::Test
|
|
4634
4711
|
s(:int, 1)))),
|
4635
4712
|
%q{p begin 1.times do 1 end end},
|
4636
4713
|
%{},
|
4637
|
-
ALL_VERSIONS - %w(1.8 1.9))
|
4714
|
+
ALL_VERSIONS - %w(1.8 1.9 mac ios))
|
4638
4715
|
end
|
4639
4716
|
|
4640
4717
|
def test_bug_cmdarg
|
@@ -4864,7 +4941,7 @@ class TestParser < Minitest::Test
|
|
4864
4941
|
s(:args), nil))),
|
4865
4942
|
%q{tap (proc do end)},
|
4866
4943
|
%q{},
|
4867
|
-
ALL_VERSIONS - %w(1.8))
|
4944
|
+
ALL_VERSIONS - %w(1.8 mac ios))
|
4868
4945
|
end
|
4869
4946
|
|
4870
4947
|
def test_bug_interp_single
|
@@ -4917,7 +4994,7 @@ class TestParser < Minitest::Test
|
|
4917
4994
|
s(:def, :a, s(:args, s(:kwarg, :b)), s(:return)),
|
4918
4995
|
%Q{def a b:\nreturn\nend},
|
4919
4996
|
%q{},
|
4920
|
-
ALL_VERSIONS - %w(1.8 1.9 2.0))
|
4997
|
+
ALL_VERSIONS - %w(1.8 1.9 mac ios 2.0))
|
4921
4998
|
|
4922
4999
|
assert_parses(
|
4923
5000
|
s(:lvasgn, :o,
|
@@ -4925,7 +5002,7 @@ class TestParser < Minitest::Test
|
|
4925
5002
|
s(:pair, s(:sym, :a), s(:int, 1)))),
|
4926
5003
|
%Q{o = {\na:\n1\n}},
|
4927
5004
|
%q{},
|
4928
|
-
ALL_VERSIONS - %w(1.8 1.9 2.0))
|
5005
|
+
ALL_VERSIONS - %w(1.8 1.9 mac ios 2.0))
|
4929
5006
|
end
|
4930
5007
|
|
4931
5008
|
def test_ruby_bug_10279
|
@@ -4935,7 +5012,36 @@ class TestParser < Minitest::Test
|
|
4935
5012
|
s(:if, s(:true), s(:int, 42), nil))),
|
4936
5013
|
%q{{a: if true then 42 end}},
|
4937
5014
|
%q{},
|
4938
|
-
ALL_VERSIONS - %w(1.8 1.9 2.0))
|
5015
|
+
ALL_VERSIONS - %w(1.8 1.9 mac ios 2.0))
|
5016
|
+
end
|
5017
|
+
|
5018
|
+
def test_ruby_bug_11107
|
5019
|
+
assert_parses(
|
5020
|
+
s(:send, nil, :p,
|
5021
|
+
s(:block,
|
5022
|
+
s(:send, nil, :lambda),
|
5023
|
+
s(:args),
|
5024
|
+
s(:block, s(:send, nil, :a), s(:args), nil))),
|
5025
|
+
%q{p ->() do a() do end end},
|
5026
|
+
%q{},
|
5027
|
+
ALL_VERSIONS - %w(1.8 1.9 mac ios 2.0)) # no 1.9 backport
|
5028
|
+
end
|
5029
|
+
|
5030
|
+
def test_ruby_bug_11380
|
5031
|
+
assert_parses(
|
5032
|
+
s(:block,
|
5033
|
+
s(:send, nil, :p,
|
5034
|
+
s(:block,
|
5035
|
+
s(:send, nil, :lambda),
|
5036
|
+
s(:args),
|
5037
|
+
s(:sym, :hello)),
|
5038
|
+
s(:hash,
|
5039
|
+
s(:pair, s(:sym, :a), s(:int, 1)))),
|
5040
|
+
s(:args),
|
5041
|
+
nil),
|
5042
|
+
%q{p -> { :hello }, a: 1 do end},
|
5043
|
+
%q{},
|
5044
|
+
ALL_VERSIONS - %w(1.8 1.9 mac ios 2.0)) # no 1.9 backport
|
4939
5045
|
end
|
4940
5046
|
|
4941
5047
|
def test_parser_bug_198
|