parser 2.7.1.2 → 2.7.1.3
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 +4 -6
- data/CHANGELOG.md +17 -1
- data/README.md +1 -2
- data/Rakefile +1 -1
- data/doc/AST_FORMAT.md +22 -0
- data/lib/parser/ast/processor.rb +3 -0
- data/lib/parser/builders/default.rb +9 -0
- data/lib/parser/diagnostic.rb +1 -1
- data/lib/parser/diagnostic/engine.rb +1 -2
- data/lib/parser/lexer.rl +7 -0
- data/lib/parser/messages.rb +15 -0
- data/lib/parser/meta.rb +1 -1
- data/lib/parser/ruby28.y +62 -20
- data/lib/parser/runner.rb +21 -2
- data/lib/parser/runner/ruby_rewrite.rb +2 -2
- data/lib/parser/source/buffer.rb +3 -1
- data/lib/parser/source/comment/associator.rb +14 -4
- data/lib/parser/source/range.rb +7 -0
- data/lib/parser/source/tree_rewriter.rb +1 -1
- data/lib/parser/tree_rewriter.rb +1 -2
- data/lib/parser/version.rb +1 -1
- data/parser.gemspec +1 -1
- data/test/helper.rb +24 -6
- data/test/parse_helper.rb +9 -16
- data/test/test_ast_processor.rb +32 -0
- data/test/test_base.rb +1 -1
- data/test/test_diagnostic.rb +6 -7
- data/test/test_diagnostic_engine.rb +5 -8
- data/test/test_lexer.rb +5 -8
- data/test/test_meta.rb +12 -0
- data/test/test_parser.rb +84 -13
- 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 +16 -11
- data/test/test_source_rewriter.rb +4 -4
- data/test/test_source_rewriter_action.rb +2 -2
- data/test/test_source_tree_rewriter.rb +3 -3
- metadata +11 -7
data/test/test_runner_parse.rb
CHANGED
@@ -7,7 +7,7 @@ class TestRunnerParse < Minitest::Test
|
|
7
7
|
PATH_TO_RUBY_PARSE = File.expand_path('../bin/ruby-parse', __dir__).freeze
|
8
8
|
|
9
9
|
def assert_prints(argv, expected_output)
|
10
|
-
stdout,
|
10
|
+
stdout, _stderr, status = Open3.capture3(PATH_TO_RUBY_PARSE, *argv)
|
11
11
|
|
12
12
|
assert_equal 0, status.to_i
|
13
13
|
assert_includes(stdout, expected_output)
|
@@ -18,6 +18,27 @@ class TestRunnerParse < Minitest::Test
|
|
18
18
|
's(:int, 123)'
|
19
19
|
end
|
20
20
|
|
21
|
+
def test_emit_modern_ruby
|
22
|
+
assert_prints ['-e', '->{}'],
|
23
|
+
'(lambda)'
|
24
|
+
assert_prints ['-e', 'self[1] = 2'],
|
25
|
+
'indexasgn'
|
26
|
+
end
|
27
|
+
|
28
|
+
def test_emit_legacy
|
29
|
+
assert_prints ['--legacy', '-e', '->{}'],
|
30
|
+
'(send nil :lambda)'
|
31
|
+
assert_prints ['--legacy', '-e', 'self[1] = 2'],
|
32
|
+
':[]='
|
33
|
+
end
|
34
|
+
|
35
|
+
def test_emit_legacy_lambda
|
36
|
+
assert_prints ['--legacy-lambda', '-e', '->{}'],
|
37
|
+
'(send nil :lambda)'
|
38
|
+
assert_prints ['--legacy-lambda', '-e', 'self[1] = 2'],
|
39
|
+
'indexasgn'
|
40
|
+
end
|
41
|
+
|
21
42
|
def test_emit_json
|
22
43
|
assert_prints ['--emit-json', '-e', '123'],
|
23
44
|
'["int",123]'
|
data/test/test_runner_rewrite.rb
CHANGED
@@ -21,7 +21,7 @@ class TestRunnerRewrite < Minitest::Test
|
|
21
21
|
expected_file = @fixtures_dir + output
|
22
22
|
|
23
23
|
FileUtils.cp(@fixtures_dir + input, sample_file_expanded)
|
24
|
-
stdout, stderr,
|
24
|
+
stdout, stderr, _exit_code = Dir.chdir @test_dir do
|
25
25
|
Open3.capture3 %Q{
|
26
26
|
#{Shellwords.escape(@ruby_rewrite.to_s)} #{args} \
|
27
27
|
#{Shellwords.escape(sample_file_expanded.to_s)}
|
data/test/test_source_buffer.rb
CHANGED
@@ -20,6 +20,9 @@ class TestSourceBuffer < Minitest::Test
|
|
20
20
|
|
21
21
|
buffer = Parser::Source::Buffer.new('(string)', 5)
|
22
22
|
assert_equal 5, buffer.first_line
|
23
|
+
|
24
|
+
buffer = Parser::Source::Buffer.new('(string)', source: '2+2')
|
25
|
+
assert_equal '2+2', buffer.source
|
23
26
|
end
|
24
27
|
|
25
28
|
def test_source_setter
|
@@ -45,7 +48,7 @@ class TestSourceBuffer < Minitest::Test
|
|
45
48
|
].join("\n")
|
46
49
|
end
|
47
50
|
|
48
|
-
assert_match
|
51
|
+
assert_match(/invalid byte sequence in UTF\-8/, error.message)
|
49
52
|
end
|
50
53
|
|
51
54
|
def test_read
|
data/test/test_source_comment.rb
CHANGED
@@ -4,8 +4,8 @@ require 'helper'
|
|
4
4
|
|
5
5
|
class TestSourceComment < Minitest::Test
|
6
6
|
def setup
|
7
|
-
@buf = Parser::Source::Buffer.new('(string)'
|
8
|
-
|
7
|
+
@buf = Parser::Source::Buffer.new('(string)',
|
8
|
+
source: "# foo\n=begin foo\nbar\n=end baz\n")
|
9
9
|
end
|
10
10
|
|
11
11
|
def range(s, e)
|
@@ -95,7 +95,7 @@ class Foo
|
|
95
95
|
end
|
96
96
|
END
|
97
97
|
|
98
|
-
|
98
|
+
_klass_node = ast
|
99
99
|
method_node = ast.children[2]
|
100
100
|
body = method_node.children[2]
|
101
101
|
f1_1_node = body.children[0]
|
@@ -175,7 +175,7 @@ class Foo
|
|
175
175
|
end
|
176
176
|
END
|
177
177
|
|
178
|
-
|
178
|
+
_klass_node = ast
|
179
179
|
method_node = ast.children[2]
|
180
180
|
body = method_node.children[2]
|
181
181
|
f1_1_node = body.children[0]
|
@@ -201,12 +201,12 @@ end
|
|
201
201
|
end
|
202
202
|
|
203
203
|
def test_associate_empty_tree
|
204
|
-
|
204
|
+
_ast, associations = associate("")
|
205
205
|
assert_equal 0, associations.size
|
206
206
|
end
|
207
207
|
|
208
208
|
def test_associate_shebang_only
|
209
|
-
|
209
|
+
_ast, associations = associate(<<-END)
|
210
210
|
#!ruby
|
211
211
|
class Foo
|
212
212
|
end
|
@@ -216,7 +216,7 @@ end
|
|
216
216
|
end
|
217
217
|
|
218
218
|
def test_associate_frozen_string_literal
|
219
|
-
|
219
|
+
_ast, associations = associate(<<-END)
|
220
220
|
# frozen_string_literal: true
|
221
221
|
class Foo
|
222
222
|
end
|
@@ -226,7 +226,7 @@ end
|
|
226
226
|
end
|
227
227
|
|
228
228
|
def test_associate_frozen_string_literal_dash_star_dash
|
229
|
-
|
229
|
+
_ast, associations = associate(<<-END)
|
230
230
|
# -*- frozen_string_literal: true -*-
|
231
231
|
class Foo
|
232
232
|
end
|
@@ -236,7 +236,7 @@ end
|
|
236
236
|
end
|
237
237
|
|
238
238
|
def test_associate_frozen_string_literal_no_space_after_colon
|
239
|
-
|
239
|
+
_ast, associations = associate(<<-END)
|
240
240
|
# frozen_string_literal:true
|
241
241
|
class Foo
|
242
242
|
end
|
@@ -246,7 +246,7 @@ end
|
|
246
246
|
end
|
247
247
|
|
248
248
|
def test_associate_warn_indent
|
249
|
-
|
249
|
+
_ast, associations = associate(<<-END)
|
250
250
|
# warn_indent: true
|
251
251
|
class Foo
|
252
252
|
end
|
@@ -256,7 +256,7 @@ end
|
|
256
256
|
end
|
257
257
|
|
258
258
|
def test_associate_warn_indent_dash_star_dash
|
259
|
-
|
259
|
+
_ast, associations = associate(<<-END)
|
260
260
|
# -*- warn_indent: true -*-
|
261
261
|
class Foo
|
262
262
|
end
|
@@ -266,7 +266,7 @@ end
|
|
266
266
|
end
|
267
267
|
|
268
268
|
def test_associate_warn_past_scope
|
269
|
-
|
269
|
+
_ast, associations = associate(<<-END)
|
270
270
|
# warn_past_scope: true
|
271
271
|
class Foo
|
272
272
|
end
|
@@ -276,7 +276,7 @@ end
|
|
276
276
|
end
|
277
277
|
|
278
278
|
def test_associate_warn_past_scope_dash_star_dash
|
279
|
-
|
279
|
+
_ast, associations = associate(<<-END)
|
280
280
|
# -*- warn_past_scope: true -*-
|
281
281
|
class Foo
|
282
282
|
end
|
@@ -286,7 +286,7 @@ end
|
|
286
286
|
end
|
287
287
|
|
288
288
|
def test_associate_multiple
|
289
|
-
|
289
|
+
_ast, associations = associate(<<-END)
|
290
290
|
# frozen_string_literal: true; warn_indent: true
|
291
291
|
class Foo
|
292
292
|
end
|
@@ -296,7 +296,7 @@ end
|
|
296
296
|
end
|
297
297
|
|
298
298
|
def test_associate_multiple_dash_star_dash
|
299
|
-
|
299
|
+
_ast, associations = associate(<<-END)
|
300
300
|
# -*- frozen_string_literal: true; warn_indent: true -*-
|
301
301
|
class Foo
|
302
302
|
end
|
@@ -306,7 +306,7 @@ end
|
|
306
306
|
end
|
307
307
|
|
308
308
|
def test_associate_no_comments
|
309
|
-
|
309
|
+
_ast, associations = associate(<<-END)
|
310
310
|
class Foo
|
311
311
|
end
|
312
312
|
END
|
@@ -315,7 +315,7 @@ end
|
|
315
315
|
end
|
316
316
|
|
317
317
|
def test_associate_comments_after_root_node
|
318
|
-
|
318
|
+
_ast, associations = associate(<<-END)
|
319
319
|
class Foo
|
320
320
|
end
|
321
321
|
# not associated
|
@@ -364,4 +364,36 @@ x
|
|
364
364
|
assert_equal ['# bar'],
|
365
365
|
associations[send_node].map(&:text)
|
366
366
|
end
|
367
|
+
|
368
|
+
def test_associate_conditional_parent_class
|
369
|
+
ast, associations = associate(<<-END)
|
370
|
+
class Foo
|
371
|
+
# bar
|
372
|
+
class Bar
|
373
|
+
end
|
374
|
+
end if some_condition
|
375
|
+
END
|
376
|
+
|
377
|
+
if_node = ast
|
378
|
+
_condition, foo_class = if_node.children
|
379
|
+
_foo, _sub_class, bar_class = foo_class.children
|
380
|
+
|
381
|
+
assert_equal 1, associations.size
|
382
|
+
assert_equal ['# bar'],
|
383
|
+
associations[bar_class].map(&:text)
|
384
|
+
end
|
385
|
+
|
386
|
+
def test_children_in_source_order
|
387
|
+
obj = Parser::Source::Comment::Associator.new(nil, nil)
|
388
|
+
for_each_node do |node|
|
389
|
+
with_loc = node.children.select do |child|
|
390
|
+
child.is_a?(AST::Node) && child.loc && child.loc.expression
|
391
|
+
end
|
392
|
+
slow_sort = with_loc.sort_by.with_index do |child, index| # Index to ensure stable sort
|
393
|
+
[child.loc.expression.begin_pos, index]
|
394
|
+
end
|
395
|
+
optimized = obj.send(:children_in_source_order, node)
|
396
|
+
assert_equal slow_sort, optimized, "children_in_source_order incorrect for #{node}"
|
397
|
+
end
|
398
|
+
end
|
367
399
|
end
|
data/test/test_source_map.rb
CHANGED
@@ -7,8 +7,7 @@ class TestSourceMap < Minitest::Test
|
|
7
7
|
include ParseHelper
|
8
8
|
|
9
9
|
def test_to_hash
|
10
|
-
buf = Parser::Source::Buffer.new("<input>")
|
11
|
-
buf.source = "1"
|
10
|
+
buf = Parser::Source::Buffer.new("<input>", source: "1")
|
12
11
|
ast = parser_for_ruby_version('1.8').parse(buf)
|
13
12
|
assert_equal [:expression, :operator], ast.loc.to_hash.keys.sort_by(&:to_s)
|
14
13
|
end
|
data/test/test_source_range.rb
CHANGED
@@ -4,8 +4,8 @@ require 'helper'
|
|
4
4
|
|
5
5
|
class TestSourceRange < Minitest::Test
|
6
6
|
def setup
|
7
|
-
@buf = Parser::Source::Buffer.new('(string)'
|
8
|
-
|
7
|
+
@buf = Parser::Source::Buffer.new('(string)',
|
8
|
+
source: "foobar\nbaz")
|
9
9
|
@sr1_3 = Parser::Source::Range.new(@buf, 1, 3)
|
10
10
|
@sr2_2 = Parser::Source::Range.new(@buf, 2, 2)
|
11
11
|
@sr3_3 = Parser::Source::Range.new(@buf, 3, 3)
|
@@ -95,15 +95,15 @@ class TestSourceRange < Minitest::Test
|
|
95
95
|
|
96
96
|
def test_order
|
97
97
|
assert_equal 0, @sr1_3 <=> @sr1_3
|
98
|
-
assert_equal
|
99
|
-
assert_equal
|
100
|
-
assert_equal
|
98
|
+
assert_equal(-1, @sr1_3 <=> @sr5_8)
|
99
|
+
assert_equal(-1, @sr2_2 <=> @sr2_6)
|
100
|
+
assert_equal(+1, @sr2_6 <=> @sr2_2)
|
101
101
|
|
102
|
-
assert_equal
|
102
|
+
assert_equal(-1, @sr1_3 <=> @sr2_6)
|
103
103
|
|
104
|
-
assert_equal
|
105
|
-
assert_equal
|
106
|
-
assert_equal
|
104
|
+
assert_equal(+1, @sr2_2 <=> @sr1_3)
|
105
|
+
assert_equal(-1, @sr1_3 <=> @sr2_2)
|
106
|
+
assert_equal(-1, @sr5_7 <=> @sr5_8)
|
107
107
|
|
108
108
|
assert_nil @sr1_3 <=> Parser::Source::Range.new(@buf.dup, 1, 3)
|
109
109
|
assert_nil @sr1_3 <=> 4
|
@@ -155,6 +155,11 @@ class TestSourceRange < Minitest::Test
|
|
155
155
|
refute sr.is?('bar')
|
156
156
|
end
|
157
157
|
|
158
|
+
def test_to_range
|
159
|
+
sr = Parser::Source::Range.new(@buf, 10, 20)
|
160
|
+
assert_equal (10...20), sr.to_range
|
161
|
+
end
|
162
|
+
|
158
163
|
def test_to_s
|
159
164
|
sr = Parser::Source::Range.new(@buf, 8, 9)
|
160
165
|
assert_equal '(string):2:2', sr.to_s
|
@@ -178,8 +183,8 @@ class TestSourceRange < Minitest::Test
|
|
178
183
|
assert_equal true, @sr1_3.eql?(also_1_3)
|
179
184
|
assert_equal @sr1_3.hash, also_1_3.hash
|
180
185
|
|
181
|
-
buf2 = Parser::Source::Buffer.new('(string)'
|
182
|
-
|
186
|
+
buf2 = Parser::Source::Buffer.new('(string)',
|
187
|
+
source: "foobar\nbaz")
|
183
188
|
from_other_buf = Parser::Source::Range.new(buf2, 1, 3)
|
184
189
|
assert_equal false, @sr1_3.eql?(from_other_buf)
|
185
190
|
assert @sr1_3.hash != from_other_buf.hash
|
@@ -4,8 +4,8 @@ require 'helper'
|
|
4
4
|
|
5
5
|
class TestSourceRewriter < Minitest::Test
|
6
6
|
def setup
|
7
|
-
@buf = Parser::Source::Buffer.new('(rewriter)'
|
8
|
-
|
7
|
+
@buf = Parser::Source::Buffer.new('(rewriter)',
|
8
|
+
source: 'foo bar baz')
|
9
9
|
Parser::Source::Rewriter.warned_of_deprecation = true
|
10
10
|
@rewriter = Parser::Source::Rewriter.new(@buf)
|
11
11
|
end
|
@@ -522,7 +522,7 @@ class TestSourceRewriter < Minitest::Test
|
|
522
522
|
end
|
523
523
|
end
|
524
524
|
|
525
|
-
assert_match
|
525
|
+
assert_match(/nested/i, error.message)
|
526
526
|
end
|
527
527
|
|
528
528
|
def test_process_in_transaction_raises_error
|
@@ -532,7 +532,7 @@ class TestSourceRewriter < Minitest::Test
|
|
532
532
|
end
|
533
533
|
end
|
534
534
|
|
535
|
-
assert_match
|
535
|
+
assert_match(/transaction/, error.message)
|
536
536
|
end
|
537
537
|
|
538
538
|
def silence_diagnostics
|
@@ -4,8 +4,8 @@ require 'helper'
|
|
4
4
|
|
5
5
|
class TestSourceRewriterAction < Minitest::Test
|
6
6
|
def setup
|
7
|
-
@buf = Parser::Source::Buffer.new('(rewriter_action)'
|
8
|
-
|
7
|
+
@buf = Parser::Source::Buffer.new('(rewriter_action)',
|
8
|
+
source: 'foo bar baz')
|
9
9
|
end
|
10
10
|
|
11
11
|
def range(from, len)
|
@@ -4,8 +4,8 @@ require 'helper'
|
|
4
4
|
|
5
5
|
class TestSourceTreeRewriter < Minitest::Test
|
6
6
|
def setup
|
7
|
-
@buf = Parser::Source::Buffer.new('(rewriter)'
|
8
|
-
|
7
|
+
@buf = Parser::Source::Buffer.new('(rewriter)',
|
8
|
+
source: 'puts(:hello, :world)')
|
9
9
|
|
10
10
|
@hello = range(5, 6)
|
11
11
|
@ll = range(7, 2)
|
@@ -36,7 +36,7 @@ class TestSourceTreeRewriter < Minitest::Test
|
|
36
36
|
else
|
37
37
|
diags.call
|
38
38
|
end
|
39
|
-
rescue ::Parser::ClobberingError =>
|
39
|
+
rescue ::Parser::ClobberingError => _e
|
40
40
|
[::Parser::ClobberingError, diags.call]
|
41
41
|
end
|
42
42
|
|
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.7.1.
|
4
|
+
version: 2.7.1.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- whitequark
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-05-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: ast
|
@@ -50,14 +50,14 @@ dependencies:
|
|
50
50
|
requirements:
|
51
51
|
- - "~>"
|
52
52
|
- !ruby/object:Gem::Version
|
53
|
-
version:
|
53
|
+
version: 13.0.1
|
54
54
|
type: :development
|
55
55
|
prerelease: false
|
56
56
|
version_requirements: !ruby/object:Gem::Requirement
|
57
57
|
requirements:
|
58
58
|
- - "~>"
|
59
59
|
- !ruby/object:Gem::Version
|
60
|
-
version:
|
60
|
+
version: 13.0.1
|
61
61
|
- !ruby/object:Gem::Dependency
|
62
62
|
name: racc
|
63
63
|
requirement: !ruby/object:Gem::Requirement
|
@@ -272,6 +272,7 @@ files:
|
|
272
272
|
- test/helper.rb
|
273
273
|
- test/parse_helper.rb
|
274
274
|
- test/racc_coverage_helper.rb
|
275
|
+
- test/test_ast_processor.rb
|
275
276
|
- test/test_base.rb
|
276
277
|
- test/test_current.rb
|
277
278
|
- test/test_diagnostic.rb
|
@@ -279,6 +280,7 @@ files:
|
|
279
280
|
- test/test_encoding.rb
|
280
281
|
- test/test_lexer.rb
|
281
282
|
- test/test_lexer_stack_state.rb
|
283
|
+
- test/test_meta.rb
|
282
284
|
- test/test_parse_helper.rb
|
283
285
|
- test/test_parser.rb
|
284
286
|
- test/test_runner_parse.rb
|
@@ -300,9 +302,9 @@ licenses:
|
|
300
302
|
- MIT
|
301
303
|
metadata:
|
302
304
|
bug_tracker_uri: https://github.com/whitequark/parser/issues
|
303
|
-
changelog_uri: https://github.com/whitequark/parser/blob/v2.7.1.
|
304
|
-
documentation_uri: https://www.rubydoc.info/gems/parser/2.7.1.
|
305
|
-
source_code_uri: https://github.com/whitequark/parser/tree/v2.7.1.
|
305
|
+
changelog_uri: https://github.com/whitequark/parser/blob/v2.7.1.3/CHANGELOG.md
|
306
|
+
documentation_uri: https://www.rubydoc.info/gems/parser/2.7.1.3
|
307
|
+
source_code_uri: https://github.com/whitequark/parser/tree/v2.7.1.3
|
306
308
|
post_install_message:
|
307
309
|
rdoc_options: []
|
308
310
|
require_paths:
|
@@ -329,6 +331,7 @@ test_files:
|
|
329
331
|
- test/helper.rb
|
330
332
|
- test/parse_helper.rb
|
331
333
|
- test/racc_coverage_helper.rb
|
334
|
+
- test/test_ast_processor.rb
|
332
335
|
- test/test_base.rb
|
333
336
|
- test/test_current.rb
|
334
337
|
- test/test_diagnostic.rb
|
@@ -336,6 +339,7 @@ test_files:
|
|
336
339
|
- test/test_encoding.rb
|
337
340
|
- test/test_lexer.rb
|
338
341
|
- test/test_lexer_stack_state.rb
|
342
|
+
- test/test_meta.rb
|
339
343
|
- test/test_parse_helper.rb
|
340
344
|
- test/test_parser.rb
|
341
345
|
- test/test_runner_parse.rb
|