parser 2.4.0.0 → 2.4.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/.travis.yml +4 -4
- data/CHANGELOG.md +18 -27
- data/Rakefile +7 -2
- data/doc/AST_FORMAT.md +2 -37
- data/lib/parser/all.rb +1 -0
- data/lib/parser/builders/default.rb +18 -5
- data/lib/parser/current.rb +12 -3
- data/lib/parser/lexer.rl +4 -9
- data/lib/parser/lexer/literal.rb +1 -1
- data/lib/parser/macruby.y +20 -10
- data/lib/parser/meta.rb +4 -4
- data/lib/parser/ruby18.y +20 -10
- data/lib/parser/ruby19.y +20 -10
- data/lib/parser/ruby20.y +20 -10
- data/lib/parser/ruby21.y +10 -5
- data/lib/parser/ruby22.y +10 -5
- data/lib/parser/ruby23.y +10 -5
- data/lib/parser/ruby24.y +10 -5
- data/lib/parser/ruby25.y +2362 -0
- data/lib/parser/rubymotion.y +20 -10
- data/lib/parser/runner.rb +5 -0
- data/lib/parser/runner/ruby_rewrite.rb +1 -1
- data/lib/parser/source/buffer.rb +1 -1
- data/lib/parser/source/comment.rb +2 -3
- data/lib/parser/source/comment/associator.rb +8 -1
- data/lib/parser/source/rewriter.rb +4 -0
- data/lib/parser/version.rb +1 -1
- data/parser.gemspec +6 -5
- data/test/helper.rb +1 -1
- data/test/parse_helper.rb +7 -1
- data/test/racc_coverage_helper.rb +2 -1
- data/test/test_base.rb +1 -1
- data/test/test_current.rb +2 -0
- data/test/test_encoding.rb +6 -6
- data/test/test_lexer.rb +68 -30
- data/test/test_parse_helper.rb +3 -3
- data/test/test_parser.rb +136 -6
- data/test/test_source_comment_associator.rb +90 -0
- data/test/test_source_map.rb +1 -1
- metadata +15 -13
data/test/test_parse_helper.rb
CHANGED
@@ -65,13 +65,13 @@ class TestParseHelper < Minitest::Test
|
|
65
65
|
assert_equal ast, traverse_ast(ast, %w())
|
66
66
|
|
67
67
|
assert_equal s(:int, 1), traverse_ast(ast, %w(int))
|
68
|
-
assert_equal nil, traverse_ast(ast, %w(str))
|
69
|
-
|
70
68
|
assert_equal s(:str, 'foo'), traverse_ast(ast, %w(dstr str))
|
71
69
|
assert_equal s(:int, 2), traverse_ast(ast, %w(dstr int))
|
72
70
|
assert_equal s(:int, 2), traverse_ast(ast, %w(dstr int/1))
|
73
71
|
assert_equal s(:int, 3), traverse_ast(ast, %w(dstr int/2))
|
74
|
-
|
72
|
+
|
73
|
+
assert_nil traverse_ast(ast, %w(str))
|
74
|
+
assert_nil traverse_ast(ast, %w(dstr int/3))
|
75
75
|
end
|
76
76
|
|
77
77
|
def test_assert_parses
|
data/test/test_parser.rb
CHANGED
@@ -25,6 +25,7 @@ class TestParser < Minitest::Test
|
|
25
25
|
SINCE_2_2 = SINCE_2_1 - %w(2.1)
|
26
26
|
SINCE_2_3 = SINCE_2_2 - %w(2.2)
|
27
27
|
SINCE_2_4 = SINCE_2_3 - %w(2.3)
|
28
|
+
SINCE_2_5 = SINCE_2_4 - %w(2.4)
|
28
29
|
|
29
30
|
# Guidelines for test naming:
|
30
31
|
# * Test structure follows structure of AST_FORMAT.md.
|
@@ -98,6 +99,12 @@ class TestParser < Minitest::Test
|
|
98
99
|
%q{42},
|
99
100
|
%q{~~ expression})
|
100
101
|
|
102
|
+
assert_parses(
|
103
|
+
s(:int, 42),
|
104
|
+
%q{+42},
|
105
|
+
%q{^ operator
|
106
|
+
|~~~ expression})
|
107
|
+
|
101
108
|
assert_parses(
|
102
109
|
s(:int, -42),
|
103
110
|
%q{-42},
|
@@ -2868,7 +2875,7 @@ class TestParser < Minitest::Test
|
|
2868
2875
|
%q{fun(1, bar: 2, 3, nil)},
|
2869
2876
|
%q{ ~~~~~~~~~ expression (hash.pair.objc_varargs)},
|
2870
2877
|
%w(mac))
|
2871
|
-
|
2878
|
+
end
|
2872
2879
|
|
2873
2880
|
# To receiver
|
2874
2881
|
|
@@ -3251,13 +3258,35 @@ class TestParser < Minitest::Test
|
|
3251
3258
|
SINCE_1_9)
|
3252
3259
|
end
|
3253
3260
|
|
3254
|
-
def
|
3261
|
+
def test_unary_num_pow_precedence
|
3255
3262
|
assert_parses(
|
3256
|
-
s(:send,
|
3263
|
+
s(:send,
|
3264
|
+
s(:send,
|
3265
|
+
s(:int, 2), :**, s(:int, 10)),
|
3266
|
+
:+@),
|
3267
|
+
%q{+2 ** 10},
|
3268
|
+
%{},
|
3269
|
+
%w{2.1})
|
3270
|
+
|
3271
|
+
assert_parses(
|
3272
|
+
s(:send,
|
3273
|
+
s(:send,
|
3274
|
+
s(:float, 2.0), :**, s(:int, 10)),
|
3275
|
+
:+@),
|
3276
|
+
%q{+2.0 ** 10})
|
3277
|
+
|
3278
|
+
assert_parses(
|
3279
|
+
s(:send,
|
3280
|
+
s(:send,
|
3281
|
+
s(:int, 2), :**, s(:int, 10)),
|
3282
|
+
:-@),
|
3257
3283
|
%q{-2 ** 10})
|
3258
3284
|
|
3259
3285
|
assert_parses(
|
3260
|
-
s(:send,
|
3286
|
+
s(:send,
|
3287
|
+
s(:send,
|
3288
|
+
s(:float, 2.0), :**, s(:int, 10)),
|
3289
|
+
:-@),
|
3261
3290
|
%q{-2.0 ** 10})
|
3262
3291
|
end
|
3263
3292
|
|
@@ -4255,7 +4284,12 @@ class TestParser < Minitest::Test
|
|
4255
4284
|
def test_if_masgn__24
|
4256
4285
|
assert_parses(
|
4257
4286
|
s(:if,
|
4258
|
-
s(:begin,
|
4287
|
+
s(:begin,
|
4288
|
+
s(:masgn,
|
4289
|
+
s(:mlhs,
|
4290
|
+
s(:lvasgn, :a),
|
4291
|
+
s(:lvasgn, :b)),
|
4292
|
+
s(:lvar, :foo))), nil, nil),
|
4259
4293
|
%q{if (a, b = foo); end},
|
4260
4294
|
%q{},
|
4261
4295
|
SINCE_2_4)
|
@@ -4277,6 +4311,28 @@ class TestParser < Minitest::Test
|
|
4277
4311
|
%w(1.8 1.9 2.0 2.1 2.2 2.3 ios mac))
|
4278
4312
|
end
|
4279
4313
|
|
4314
|
+
def test_not_masgn
|
4315
|
+
assert_diagnoses(
|
4316
|
+
[:error, :masgn_as_condition],
|
4317
|
+
%q{!(a, b = foo)},
|
4318
|
+
%q{ ~~~~~~~~~~ location},
|
4319
|
+
%w(1.8 1.9 2.0 2.1 2.2 2.3 ios mac))
|
4320
|
+
end
|
4321
|
+
|
4322
|
+
def test_not_masgn__24
|
4323
|
+
assert_parses(
|
4324
|
+
s(:send,
|
4325
|
+
s(:begin,
|
4326
|
+
s(:masgn,
|
4327
|
+
s(:mlhs,
|
4328
|
+
s(:lvasgn, :a),
|
4329
|
+
s(:lvasgn, :b)),
|
4330
|
+
s(:lvar, :foo))), :'!'),
|
4331
|
+
%q{!(a, b = foo)},
|
4332
|
+
%q{},
|
4333
|
+
SINCE_2_4)
|
4334
|
+
end
|
4335
|
+
|
4280
4336
|
def test_cond_begin
|
4281
4337
|
assert_parses(
|
4282
4338
|
s(:if,
|
@@ -4333,6 +4389,20 @@ class TestParser < Minitest::Test
|
|
4333
4389
|
%q{if foo..bar; end},
|
4334
4390
|
%q{ ~~~~~~~~ expression (iflipflop)
|
4335
4391
|
| ~~ operator (iflipflop)})
|
4392
|
+
|
4393
|
+
assert_parses(
|
4394
|
+
s(:not, s(:begin, s(:iflipflop, s(:lvar, :foo), s(:lvar, :bar)))),
|
4395
|
+
%q{!(foo..bar)},
|
4396
|
+
%q{ ~~~~~~~~ expression (begin.iflipflop)
|
4397
|
+
| ~~ operator (begin.iflipflop)},
|
4398
|
+
%w(1.8))
|
4399
|
+
|
4400
|
+
assert_parses(
|
4401
|
+
s(:send, s(:begin, s(:iflipflop, s(:lvar, :foo), s(:lvar, :bar))), :'!'),
|
4402
|
+
%q{!(foo..bar)},
|
4403
|
+
%q{ ~~~~~~~~ expression (begin.iflipflop)
|
4404
|
+
| ~~ operator (begin.iflipflop)},
|
4405
|
+
SINCE_1_9)
|
4336
4406
|
end
|
4337
4407
|
|
4338
4408
|
def test_cond_eflipflop
|
@@ -4342,6 +4412,20 @@ class TestParser < Minitest::Test
|
|
4342
4412
|
%q{if foo...bar; end},
|
4343
4413
|
%q{ ~~~~~~~~~ expression (eflipflop)
|
4344
4414
|
| ~~~ operator (eflipflop)})
|
4415
|
+
|
4416
|
+
assert_parses(
|
4417
|
+
s(:not, s(:begin, s(:eflipflop, s(:lvar, :foo), s(:lvar, :bar)))),
|
4418
|
+
%q{!(foo...bar)},
|
4419
|
+
%q{ ~~~~~~~~~ expression (begin.eflipflop)
|
4420
|
+
| ~~~ operator (begin.eflipflop)},
|
4421
|
+
%w(1.8))
|
4422
|
+
|
4423
|
+
assert_parses(
|
4424
|
+
s(:send, s(:begin, s(:eflipflop, s(:lvar, :foo), s(:lvar, :bar))), :'!'),
|
4425
|
+
%q{!(foo...bar)},
|
4426
|
+
%q{ ~~~~~~~~~ expression (begin.eflipflop)
|
4427
|
+
| ~~~ operator (begin.eflipflop)},
|
4428
|
+
SINCE_1_9)
|
4345
4429
|
end
|
4346
4430
|
|
4347
4431
|
def test_cond_match_current_line
|
@@ -4354,6 +4438,27 @@ class TestParser < Minitest::Test
|
|
4354
4438
|
nil, nil),
|
4355
4439
|
%q{if /wat/; end},
|
4356
4440
|
%q{ ~~~~~ expression (match_current_line)})
|
4441
|
+
|
4442
|
+
assert_parses(
|
4443
|
+
s(:not,
|
4444
|
+
s(:match_current_line,
|
4445
|
+
s(:regexp,
|
4446
|
+
s(:str, 'wat'),
|
4447
|
+
s(:regopt)))),
|
4448
|
+
%q{!/wat/},
|
4449
|
+
%q{ ~~~~~ expression (match_current_line)},
|
4450
|
+
%w(1.8))
|
4451
|
+
|
4452
|
+
assert_parses(
|
4453
|
+
s(:send,
|
4454
|
+
s(:match_current_line,
|
4455
|
+
s(:regexp,
|
4456
|
+
s(:str, 'wat'),
|
4457
|
+
s(:regopt))),
|
4458
|
+
:'!'),
|
4459
|
+
%q{!/wat/},
|
4460
|
+
%q{ ~~~~~ expression (match_current_line)},
|
4461
|
+
SINCE_1_9)
|
4357
4462
|
end
|
4358
4463
|
|
4359
4464
|
# Case matching
|
@@ -4887,6 +4992,23 @@ class TestParser < Minitest::Test
|
|
4887
4992
|
SINCE_1_9)
|
4888
4993
|
end
|
4889
4994
|
|
4995
|
+
def test_rescue_without_begin_end
|
4996
|
+
assert_parses(
|
4997
|
+
s(:block,
|
4998
|
+
s(:send, nil, :meth),
|
4999
|
+
s(:args),
|
5000
|
+
s(:rescue,
|
5001
|
+
s(:lvar, :foo),
|
5002
|
+
s(:resbody, nil, nil,
|
5003
|
+
s(:lvar, :bar)),
|
5004
|
+
nil)),
|
5005
|
+
%q{meth do; foo; rescue; bar; end},
|
5006
|
+
%q{ ~~~~~~ keyword (rescue.resbody)
|
5007
|
+
| ~~~~~~~~~~~ expression (rescue.resbody)
|
5008
|
+
| ~~~~~~~~~~~~~~~~ expression (rescue)},
|
5009
|
+
SINCE_2_5)
|
5010
|
+
end
|
5011
|
+
|
4890
5012
|
def test_resbody_list
|
4891
5013
|
assert_parses(
|
4892
5014
|
s(:kwbegin,
|
@@ -5229,7 +5351,7 @@ class TestParser < Minitest::Test
|
|
5229
5351
|
|
5230
5352
|
ast, comments, tokens = parser.tokenize(source_file, true)
|
5231
5353
|
|
5232
|
-
|
5354
|
+
assert_nil ast
|
5233
5355
|
|
5234
5356
|
assert_equal [
|
5235
5357
|
Parser::Source::Comment.new(range.call(4, 9))
|
@@ -5320,6 +5442,14 @@ class TestParser < Minitest::Test
|
|
5320
5442
|
| ~~~~~~~~~~~~~~~~~~~~~~ expression (rescue)})
|
5321
5443
|
end
|
5322
5444
|
|
5445
|
+
def test_bug_def_empty_else
|
5446
|
+
assert_parses(
|
5447
|
+
s(:def, :foo, s(:args),
|
5448
|
+
s(:begin,
|
5449
|
+
s(:begin, nil))),
|
5450
|
+
%q{def foo; else; end})
|
5451
|
+
end
|
5452
|
+
|
5323
5453
|
def test_bug_heredoc_do
|
5324
5454
|
assert_parses(
|
5325
5455
|
s(:block,
|
@@ -213,6 +213,96 @@ end
|
|
213
213
|
assert_equal 0, associations.size
|
214
214
|
end
|
215
215
|
|
216
|
+
def test_associate_frozen_string_literal
|
217
|
+
ast, associations = associate(<<-END)
|
218
|
+
# frozen_string_literal: true
|
219
|
+
class Foo
|
220
|
+
end
|
221
|
+
END
|
222
|
+
|
223
|
+
assert_equal 0, associations.size
|
224
|
+
end
|
225
|
+
|
226
|
+
def test_associate_frozen_string_literal_dash_star_dash
|
227
|
+
ast, associations = associate(<<-END)
|
228
|
+
# -*- frozen_string_literal: true -*-
|
229
|
+
class Foo
|
230
|
+
end
|
231
|
+
END
|
232
|
+
|
233
|
+
assert_equal 0, associations.size
|
234
|
+
end
|
235
|
+
|
236
|
+
def test_associate_frozen_string_literal_no_space_after_colon
|
237
|
+
ast, associations = associate(<<-END)
|
238
|
+
# frozen_string_literal:true
|
239
|
+
class Foo
|
240
|
+
end
|
241
|
+
END
|
242
|
+
|
243
|
+
assert_equal 0, associations.size
|
244
|
+
end
|
245
|
+
|
246
|
+
def test_associate_warn_indent
|
247
|
+
ast, associations = associate(<<-END)
|
248
|
+
# warn_indent: true
|
249
|
+
class Foo
|
250
|
+
end
|
251
|
+
END
|
252
|
+
|
253
|
+
assert_equal 0, associations.size
|
254
|
+
end
|
255
|
+
|
256
|
+
def test_associate_warn_indent_dash_star_dash
|
257
|
+
ast, associations = associate(<<-END)
|
258
|
+
# -*- warn_indent: true -*-
|
259
|
+
class Foo
|
260
|
+
end
|
261
|
+
END
|
262
|
+
|
263
|
+
assert_equal 0, associations.size
|
264
|
+
end
|
265
|
+
|
266
|
+
def test_associate_warn_past_scope
|
267
|
+
ast, associations = associate(<<-END)
|
268
|
+
# warn_past_scope: true
|
269
|
+
class Foo
|
270
|
+
end
|
271
|
+
END
|
272
|
+
|
273
|
+
assert_equal 0, associations.size
|
274
|
+
end
|
275
|
+
|
276
|
+
def test_associate_warn_past_scope_dash_star_dash
|
277
|
+
ast, associations = associate(<<-END)
|
278
|
+
# -*- warn_past_scope: true -*-
|
279
|
+
class Foo
|
280
|
+
end
|
281
|
+
END
|
282
|
+
|
283
|
+
assert_equal 0, associations.size
|
284
|
+
end
|
285
|
+
|
286
|
+
def test_associate_multiple
|
287
|
+
ast, associations = associate(<<-END)
|
288
|
+
# frozen_string_literal: true; warn_indent: true
|
289
|
+
class Foo
|
290
|
+
end
|
291
|
+
END
|
292
|
+
|
293
|
+
assert_equal 0, associations.size
|
294
|
+
end
|
295
|
+
|
296
|
+
def test_associate_multiple_dash_star_dash
|
297
|
+
ast, associations = associate(<<-END)
|
298
|
+
# -*- frozen_string_literal: true; warn_indent: true -*-
|
299
|
+
class Foo
|
300
|
+
end
|
301
|
+
END
|
302
|
+
|
303
|
+
assert_equal 0, associations.size
|
304
|
+
end
|
305
|
+
|
216
306
|
def test_associate_no_comments
|
217
307
|
ast, associations = associate(<<-END)
|
218
308
|
class Foo
|
data/test/test_source_map.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: parser
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.4.0.
|
4
|
+
version: 2.4.0.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- whitequark
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-11-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: ast
|
@@ -16,28 +16,28 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '2.
|
19
|
+
version: '2.3'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '2.
|
26
|
+
version: '2.3'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: bundler
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '1.
|
33
|
+
version: '1.16'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '1.
|
40
|
+
version: '1.16'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: rake
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -72,14 +72,14 @@ dependencies:
|
|
72
72
|
requirements:
|
73
73
|
- - "~>"
|
74
74
|
- !ruby/object:Gem::Version
|
75
|
-
version: 0.3.
|
75
|
+
version: 0.3.2
|
76
76
|
type: :development
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
80
|
- - "~>"
|
81
81
|
- !ruby/object:Gem::Version
|
82
|
-
version: 0.3.
|
82
|
+
version: 0.3.2
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
84
|
name: yard
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
@@ -114,28 +114,28 @@ dependencies:
|
|
114
114
|
requirements:
|
115
115
|
- - "~>"
|
116
116
|
- !ruby/object:Gem::Version
|
117
|
-
version: '5.
|
117
|
+
version: '5.10'
|
118
118
|
type: :development
|
119
119
|
prerelease: false
|
120
120
|
version_requirements: !ruby/object:Gem::Requirement
|
121
121
|
requirements:
|
122
122
|
- - "~>"
|
123
123
|
- !ruby/object:Gem::Version
|
124
|
-
version: '5.
|
124
|
+
version: '5.10'
|
125
125
|
- !ruby/object:Gem::Dependency
|
126
126
|
name: simplecov
|
127
127
|
requirement: !ruby/object:Gem::Requirement
|
128
128
|
requirements:
|
129
129
|
- - "~>"
|
130
130
|
- !ruby/object:Gem::Version
|
131
|
-
version: 0.
|
131
|
+
version: 0.15.1
|
132
132
|
type: :development
|
133
133
|
prerelease: false
|
134
134
|
version_requirements: !ruby/object:Gem::Requirement
|
135
135
|
requirements:
|
136
136
|
- - "~>"
|
137
137
|
- !ruby/object:Gem::Version
|
138
|
-
version: 0.
|
138
|
+
version: 0.15.1
|
139
139
|
- !ruby/object:Gem::Dependency
|
140
140
|
name: gauntlet
|
141
141
|
requirement: !ruby/object:Gem::Requirement
|
@@ -213,6 +213,8 @@ files:
|
|
213
213
|
- lib/parser/ruby23.y
|
214
214
|
- lib/parser/ruby24.rb
|
215
215
|
- lib/parser/ruby24.y
|
216
|
+
- lib/parser/ruby25.rb
|
217
|
+
- lib/parser/ruby25.y
|
216
218
|
- lib/parser/rubymotion.rb
|
217
219
|
- lib/parser/rubymotion.y
|
218
220
|
- lib/parser/runner.rb
|
@@ -286,7 +288,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
286
288
|
version: '0'
|
287
289
|
requirements: []
|
288
290
|
rubyforge_project:
|
289
|
-
rubygems_version: 2.5.2
|
291
|
+
rubygems_version: 2.5.2.1
|
290
292
|
signing_key:
|
291
293
|
specification_version: 4
|
292
294
|
summary: A Ruby parser written in pure Ruby.
|