parser 2.0.0.pre2 → 2.0.0.pre3
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/.yardopts +2 -2
- data/CHANGELOG.md +55 -0
- data/Gemfile +0 -2
- data/README.md +58 -4
- data/lib/gauntlet_parser.rb +121 -0
- data/lib/parser.rb +31 -24
- data/lib/parser/ast/node.rb +6 -4
- data/lib/parser/ast/processor.rb +3 -0
- data/lib/parser/base.rb +18 -17
- data/lib/parser/builders/default.rb +61 -9
- data/lib/parser/compatibility/ruby1_8.rb +7 -0
- data/lib/parser/diagnostic.rb +18 -5
- data/lib/parser/diagnostic/engine.rb +12 -11
- data/lib/parser/lexer.rl +288 -133
- data/lib/parser/lexer/explanation.rb +1 -1
- data/lib/parser/lexer/literal.rb +49 -17
- data/lib/parser/rewriter.rb +2 -0
- data/lib/parser/ruby18.y +1 -17
- data/lib/parser/ruby19.y +7 -18
- data/lib/parser/ruby20.y +9 -28
- data/lib/parser/ruby21.y +11 -34
- data/lib/parser/runner.rb +6 -1
- data/lib/parser/source/buffer.rb +44 -21
- data/lib/parser/source/comment.rb +35 -0
- data/lib/parser/source/comment/associator.rb +3 -0
- data/lib/parser/source/map.rb +2 -4
- data/lib/parser/source/range.rb +7 -0
- data/lib/parser/source/rewriter.rb +3 -0
- data/lib/parser/source/rewriter/action.rb +3 -0
- data/lib/parser/syntax_error.rb +7 -2
- data/lib/parser/version.rb +1 -1
- data/parser.gemspec +2 -0
- data/test/parse_helper.rb +5 -3
- data/test/test_encoding.rb +29 -0
- data/test/test_lexer.rb +780 -514
- data/test/test_parser.rb +185 -11
- metadata +17 -2
data/test/test_parser.rb
CHANGED
@@ -794,12 +794,12 @@ class TestParser < Minitest::Test
|
|
794
794
|
assert_diagnoses(
|
795
795
|
[:error, :dynamic_const],
|
796
796
|
%q{def f; Foo::Bar = 1; end},
|
797
|
-
%q{
|
797
|
+
%q{ ~~~~~~~~ location})
|
798
798
|
|
799
799
|
assert_diagnoses(
|
800
800
|
[:error, :dynamic_const],
|
801
801
|
%q{def f; ::Bar = 1; end},
|
802
|
-
%q{
|
802
|
+
%q{ ~~~~~ location})
|
803
803
|
end
|
804
804
|
|
805
805
|
# Multiple assignment
|
@@ -1044,12 +1044,12 @@ class TestParser < Minitest::Test
|
|
1044
1044
|
assert_diagnoses(
|
1045
1045
|
[:error, :dynamic_const],
|
1046
1046
|
%q{def f; self::A, foo = foo; end},
|
1047
|
-
%q{
|
1047
|
+
%q{ ~~~~~~~ location})
|
1048
1048
|
|
1049
1049
|
assert_diagnoses(
|
1050
1050
|
[:error, :dynamic_const],
|
1051
1051
|
%q{def f; ::A, foo = foo; end},
|
1052
|
-
%q{
|
1052
|
+
%q{ ~~~ location})
|
1053
1053
|
end
|
1054
1054
|
|
1055
1055
|
# Variable binary operator-assignment
|
@@ -1114,6 +1114,24 @@ class TestParser < Minitest::Test
|
|
1114
1114
|
%q{B::A += 1},
|
1115
1115
|
%q{},
|
1116
1116
|
ALL_VERSIONS - %w(1.8 1.9))
|
1117
|
+
|
1118
|
+
assert_parses(
|
1119
|
+
s(:def, :x, s(:args),
|
1120
|
+
s(:or_asgn,
|
1121
|
+
s(:casgn, s(:self), :A),
|
1122
|
+
s(:int, 1))),
|
1123
|
+
%q{def x; self::A ||= 1; end},
|
1124
|
+
%q{},
|
1125
|
+
ALL_VERSIONS - %w(1.8 1.9))
|
1126
|
+
|
1127
|
+
assert_parses(
|
1128
|
+
s(:def, :x, s(:args),
|
1129
|
+
s(:or_asgn,
|
1130
|
+
s(:casgn, s(:cbase), :A),
|
1131
|
+
s(:int, 1))),
|
1132
|
+
%q{def x; ::A ||= 1; end},
|
1133
|
+
%q{},
|
1134
|
+
ALL_VERSIONS - %w(1.8 1.9))
|
1117
1135
|
end
|
1118
1136
|
|
1119
1137
|
def test_const_op_asgn_invalid
|
@@ -1132,12 +1150,14 @@ class TestParser < Minitest::Test
|
|
1132
1150
|
assert_diagnoses(
|
1133
1151
|
[:error, :dynamic_const],
|
1134
1152
|
%q{def foo; Foo::Bar += 1; end},
|
1135
|
-
%q{ ~~~ location}
|
1153
|
+
%q{ ~~~ location},
|
1154
|
+
%w(1.8 1.9))
|
1136
1155
|
|
1137
1156
|
assert_diagnoses(
|
1138
1157
|
[:error, :dynamic_const],
|
1139
1158
|
%q{def foo; ::Bar += 1; end},
|
1140
|
-
%q{ ~~~ location}
|
1159
|
+
%q{ ~~~ location},
|
1160
|
+
%w(1.8 1.9))
|
1141
1161
|
end
|
1142
1162
|
|
1143
1163
|
# Method binary operator-assignment
|
@@ -2191,6 +2211,14 @@ class TestParser < Minitest::Test
|
|
2191
2211
|
ALL_VERSIONS - %w(1.8 1.9))
|
2192
2212
|
end
|
2193
2213
|
|
2214
|
+
def test_block_kwarg
|
2215
|
+
assert_parses_blockargs(
|
2216
|
+
s(:args,
|
2217
|
+
s(:kwarg, :foo)),
|
2218
|
+
%q{|foo:|},
|
2219
|
+
ALL_VERSIONS - %w(1.8 1.9 2.0))
|
2220
|
+
end
|
2221
|
+
|
2194
2222
|
def test_arg_invalid
|
2195
2223
|
assert_diagnoses(
|
2196
2224
|
[:error, :argument_const],
|
@@ -2312,6 +2340,22 @@ class TestParser < Minitest::Test
|
|
2312
2340
|
ALL_VERSIONS - %w(1.8 1.9))
|
2313
2341
|
end
|
2314
2342
|
|
2343
|
+
def test_arg_duplicate_proc
|
2344
|
+
assert_parses(
|
2345
|
+
s(:block, s(:send, nil, :proc),
|
2346
|
+
s(:args, s(:arg, :a), s(:arg, :a)),
|
2347
|
+
nil),
|
2348
|
+
%q{proc{|a,a|}},
|
2349
|
+
%q{},
|
2350
|
+
%w(1.8))
|
2351
|
+
|
2352
|
+
assert_diagnoses(
|
2353
|
+
[:error, :duplicate_argument],
|
2354
|
+
%q{proc{|a,a|}},
|
2355
|
+
%q{},
|
2356
|
+
ALL_VERSIONS - %w(1.8))
|
2357
|
+
end
|
2358
|
+
|
2315
2359
|
def test_kwarg_invalid
|
2316
2360
|
assert_diagnoses(
|
2317
2361
|
[:error, :argument_const],
|
@@ -3180,17 +3224,37 @@ class TestParser < Minitest::Test
|
|
3180
3224
|
s(:args), nil),
|
3181
3225
|
%q{fun (1) {}})
|
3182
3226
|
|
3227
|
+
assert_parses(
|
3228
|
+
s(:block,
|
3229
|
+
s(:send, s(:lvar, :foo), :fun, s(:int, 1)),
|
3230
|
+
s(:args), nil),
|
3231
|
+
%q{foo.fun (1) {}},
|
3232
|
+
%q{},
|
3233
|
+
%w(1.8))
|
3234
|
+
|
3183
3235
|
assert_parses(
|
3184
3236
|
s(:block,
|
3185
3237
|
s(:send, s(:lvar, :foo), :fun, s(:begin, s(:int, 1))),
|
3186
3238
|
s(:args), nil),
|
3187
|
-
%q{foo.fun (1) {}}
|
3239
|
+
%q{foo.fun (1) {}},
|
3240
|
+
%q{},
|
3241
|
+
ALL_VERSIONS - %w(1.8))
|
3242
|
+
|
3243
|
+
assert_parses(
|
3244
|
+
s(:block,
|
3245
|
+
s(:send, s(:lvar, :foo), :fun, s(:int, 1)),
|
3246
|
+
s(:args), nil),
|
3247
|
+
%q{foo::fun (1) {}},
|
3248
|
+
%q{},
|
3249
|
+
%w(1.8))
|
3188
3250
|
|
3189
3251
|
assert_parses(
|
3190
3252
|
s(:block,
|
3191
3253
|
s(:send, s(:lvar, :foo), :fun, s(:begin, s(:int, 1))),
|
3192
3254
|
s(:args), nil),
|
3193
|
-
%q{foo::fun (1) {}}
|
3255
|
+
%q{foo::fun (1) {}},
|
3256
|
+
%q{},
|
3257
|
+
ALL_VERSIONS - %w(1.8))
|
3194
3258
|
end
|
3195
3259
|
|
3196
3260
|
def test_space_args_arg_call
|
@@ -3667,12 +3731,28 @@ class TestParser < Minitest::Test
|
|
3667
3731
|
assert_diagnoses(
|
3668
3732
|
[:error, :masgn_as_condition],
|
3669
3733
|
%q{if foo && (a, b = bar); end},
|
3670
|
-
%q{ ~~~~~~~~~~ location}
|
3734
|
+
%q{ ~~~~~~~~~~ location},
|
3735
|
+
ALL_VERSIONS - %w(1.8))
|
3671
3736
|
|
3672
3737
|
assert_diagnoses(
|
3673
3738
|
[:error, :masgn_as_condition],
|
3674
3739
|
%q{if foo || (a, b = bar); end},
|
3675
|
-
%q{ ~~~~~~~~~~ location}
|
3740
|
+
%q{ ~~~~~~~~~~ location},
|
3741
|
+
ALL_VERSIONS - %w(1.8))
|
3742
|
+
|
3743
|
+
assert_parses(
|
3744
|
+
s(:if,
|
3745
|
+
s(:and,
|
3746
|
+
s(:begin,
|
3747
|
+
s(:masgn,
|
3748
|
+
s(:mlhs,
|
3749
|
+
s(:lvasgn, :a), s(:lvasgn, :b)),
|
3750
|
+
s(:lvar, :foo))),
|
3751
|
+
s(:lvar, :bar)),
|
3752
|
+
nil, nil),
|
3753
|
+
%q{if (a, b = foo) && bar; end},
|
3754
|
+
%q{},
|
3755
|
+
%w(1.8))
|
3676
3756
|
end
|
3677
3757
|
|
3678
3758
|
def test_cond_iflipflop
|
@@ -4297,7 +4377,7 @@ class TestParser < Minitest::Test
|
|
4297
4377
|
assert_equal s(:lvar, :foo),
|
4298
4378
|
ast
|
4299
4379
|
|
4300
|
-
assert_equal range.call(
|
4380
|
+
assert_equal range.call(1, 4),
|
4301
4381
|
ast.loc.expression
|
4302
4382
|
end
|
4303
4383
|
end
|
@@ -4315,6 +4395,46 @@ class TestParser < Minitest::Test
|
|
4315
4395
|
ALL_VERSIONS - %w(1.8 1.9))
|
4316
4396
|
end
|
4317
4397
|
|
4398
|
+
def test_bug_cmdarg
|
4399
|
+
assert_parses(
|
4400
|
+
s(:send, nil, :meth,
|
4401
|
+
s(:begin,
|
4402
|
+
s(:block,
|
4403
|
+
s(:send, nil, :lambda),
|
4404
|
+
s(:args), nil))),
|
4405
|
+
%q{meth (lambda do end)},
|
4406
|
+
%q{},
|
4407
|
+
%w(1.8))
|
4408
|
+
|
4409
|
+
assert_parses(
|
4410
|
+
s(:send, nil, :assert,
|
4411
|
+
s(:send, nil, :dogs)),
|
4412
|
+
%q{assert dogs})
|
4413
|
+
|
4414
|
+
assert_parses(
|
4415
|
+
s(:send, nil, :assert,
|
4416
|
+
s(:hash,
|
4417
|
+
s(:pair, s(:sym, :do), s(:true)))),
|
4418
|
+
%q{assert do: true},
|
4419
|
+
%q{},
|
4420
|
+
ALL_VERSIONS - %w(1.8))
|
4421
|
+
|
4422
|
+
assert_parses(
|
4423
|
+
s(:send, nil, :f,
|
4424
|
+
s(:hash,
|
4425
|
+
s(:pair,
|
4426
|
+
s(:sym, :x),
|
4427
|
+
s(:block,
|
4428
|
+
s(:send, nil, :lambda),
|
4429
|
+
s(:args),
|
4430
|
+
s(:block,
|
4431
|
+
s(:send, nil, :meth),
|
4432
|
+
s(:args), nil))))),
|
4433
|
+
%q{f x: -> do meth do end end},
|
4434
|
+
%q{},
|
4435
|
+
ALL_VERSIONS - %w(1.8))
|
4436
|
+
end
|
4437
|
+
|
4318
4438
|
def test_file_line_non_literals
|
4319
4439
|
with_versions(ALL_VERSIONS) do |_ver, parser|
|
4320
4440
|
parser.builder.emit_file_line_as_literals = false
|
@@ -4349,6 +4469,18 @@ class TestParser < Minitest::Test
|
|
4349
4469
|
%q{},
|
4350
4470
|
%w(1.9 2.0 2.1))
|
4351
4471
|
end
|
4472
|
+
|
4473
|
+
def test_regexp_encoding
|
4474
|
+
assert_parses(
|
4475
|
+
s(:match_with_lvasgn,
|
4476
|
+
s(:regexp,
|
4477
|
+
s(:str, "\\xa8"),
|
4478
|
+
s(:regopt, :n)),
|
4479
|
+
s(:str, "")),
|
4480
|
+
%q{/\xa8/n =~ ""}.force_encoding(Encoding::UTF_8),
|
4481
|
+
%{},
|
4482
|
+
ALL_VERSIONS - %w(1.8))
|
4483
|
+
end
|
4352
4484
|
end
|
4353
4485
|
|
4354
4486
|
#
|
@@ -4480,4 +4612,46 @@ class TestParser < Minitest::Test
|
|
4480
4612
|
s(:def, :foo, s(:args), nil),
|
4481
4613
|
%Q{def foo\n=begin\n=end\nend})
|
4482
4614
|
end
|
4615
|
+
|
4616
|
+
def test_bug_while_not_parens_do
|
4617
|
+
assert_parses(
|
4618
|
+
s(:while, s(:send, s(:begin, s(:true)), :"!"), nil),
|
4619
|
+
%q{while not (true) do end},
|
4620
|
+
%q{},
|
4621
|
+
ALL_VERSIONS - %w(1.8))
|
4622
|
+
end
|
4623
|
+
|
4624
|
+
def test_bug_rescue_empty_else
|
4625
|
+
assert_parses(
|
4626
|
+
s(:kwbegin,
|
4627
|
+
s(:rescue, nil,
|
4628
|
+
s(:resbody,
|
4629
|
+
s(:array,
|
4630
|
+
s(:const, nil, :LoadError)), nil, nil), nil)),
|
4631
|
+
%q{begin; rescue LoadError; else; end},
|
4632
|
+
%q{ ~~~~ else (rescue)
|
4633
|
+
| ~~~~~~~~~~~~~~~~~~~~~~ expression (rescue)})
|
4634
|
+
end
|
4635
|
+
|
4636
|
+
def test_bug_heredoc_do
|
4637
|
+
assert_parses(
|
4638
|
+
s(:block,
|
4639
|
+
s(:send, nil, :f,
|
4640
|
+
s(:dstr)),
|
4641
|
+
s(:args), nil),
|
4642
|
+
%Q{f <<-TABLE do\nTABLE\nend})
|
4643
|
+
end
|
4644
|
+
|
4645
|
+
def test_bug_lambda_leakage
|
4646
|
+
assert_parses(
|
4647
|
+
s(:begin,
|
4648
|
+
s(:block,
|
4649
|
+
s(:send, nil, :lambda),
|
4650
|
+
s(:args,
|
4651
|
+
s(:arg, :scope)), nil),
|
4652
|
+
s(:send, nil, :scope)),
|
4653
|
+
%q{->(scope) {}; scope},
|
4654
|
+
%q{},
|
4655
|
+
ALL_VERSIONS - %w(1.8))
|
4656
|
+
end
|
4483
4657
|
end
|
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.0.0.
|
4
|
+
version: 2.0.0.pre3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Peter Zotov
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-07-
|
11
|
+
date: 2013-07-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: ast
|
@@ -198,6 +198,20 @@ dependencies:
|
|
198
198
|
- - '>='
|
199
199
|
- !ruby/object:Gem::Version
|
200
200
|
version: '0'
|
201
|
+
- !ruby/object:Gem::Dependency
|
202
|
+
name: gauntlet
|
203
|
+
requirement: !ruby/object:Gem::Requirement
|
204
|
+
requirements:
|
205
|
+
- - '>='
|
206
|
+
- !ruby/object:Gem::Version
|
207
|
+
version: '0'
|
208
|
+
type: :development
|
209
|
+
prerelease: false
|
210
|
+
version_requirements: !ruby/object:Gem::Requirement
|
211
|
+
requirements:
|
212
|
+
- - '>='
|
213
|
+
- !ruby/object:Gem::Version
|
214
|
+
version: '0'
|
201
215
|
description: A Ruby parser written in pure Ruby.
|
202
216
|
email:
|
203
217
|
- whitequark@whitequark.org
|
@@ -224,6 +238,7 @@ files:
|
|
224
238
|
- doc/INTERNALS.md
|
225
239
|
- doc/css/.gitkeep
|
226
240
|
- doc/css/common.css
|
241
|
+
- lib/gauntlet_parser.rb
|
227
242
|
- lib/parser.rb
|
228
243
|
- lib/parser/all.rb
|
229
244
|
- lib/parser/ast/node.rb
|