parser 2.7.1.3 → 2.7.1.4
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 +7 -7
- data/CHANGELOG.md +16 -1
- data/README.md +1 -0
- data/doc/AST_FORMAT.md +56 -2
- data/lib/parser/ast/processor.rb +2 -0
- data/lib/parser/builders/default.rb +50 -3
- data/lib/parser/context.rb +1 -0
- data/lib/parser/lexer.rl +8 -1
- data/lib/parser/macruby.y +14 -4
- data/lib/parser/meta.rb +2 -2
- data/lib/parser/ruby18.y +2 -0
- data/lib/parser/ruby19.y +14 -4
- data/lib/parser/ruby20.y +14 -4
- data/lib/parser/ruby21.y +9 -2
- data/lib/parser/ruby22.y +9 -2
- data/lib/parser/ruby23.y +9 -2
- data/lib/parser/ruby24.y +9 -2
- data/lib/parser/ruby25.y +9 -2
- data/lib/parser/ruby26.y +9 -2
- data/lib/parser/ruby27.y +15 -6
- data/lib/parser/ruby28.y +65 -38
- data/lib/parser/rubymotion.y +14 -4
- data/lib/parser/runner.rb +1 -1
- data/lib/parser/source/range.rb +1 -1
- data/lib/parser/source/tree_rewriter.rb +67 -1
- data/lib/parser/source/tree_rewriter/action.rb +39 -0
- data/lib/parser/version.rb +1 -1
- data/parser.gemspec +1 -1
- data/test/helper.rb +24 -0
- data/test/parse_helper.rb +16 -6
- data/test/test_parser.rb +225 -41
- data/test/test_source_tree_rewriter.rb +109 -11
- metadata +10 -10
@@ -3,20 +3,25 @@
|
|
3
3
|
require 'helper'
|
4
4
|
|
5
5
|
class TestSourceTreeRewriter < Minitest::Test
|
6
|
-
|
7
|
-
|
8
|
-
|
6
|
+
module Setup
|
7
|
+
def setup
|
8
|
+
@buf = Parser::Source::Buffer.new('(rewriter)',
|
9
|
+
source: 'puts(:hello, :world)')
|
10
|
+
|
11
|
+
@hello = range(5, 6)
|
12
|
+
@ll = range(8, 2)
|
13
|
+
@comma_space = range(11,2)
|
14
|
+
@world = range(13,6)
|
15
|
+
@whole = range(0, @buf.source.length)
|
16
|
+
end
|
9
17
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
@whole = range(0, @buf.source.length)
|
18
|
+
def range(from, len = nil)
|
19
|
+
from, len = from.begin, from.end - from.begin unless len
|
20
|
+
Parser::Source::Range.new(@buf, from, from + len)
|
21
|
+
end
|
15
22
|
end
|
16
23
|
|
17
|
-
|
18
|
-
Parser::Source::Range.new(@buf, from, from + len)
|
19
|
-
end
|
24
|
+
include Setup
|
20
25
|
|
21
26
|
# Returns either:
|
22
27
|
# - yield rewriter
|
@@ -260,4 +265,97 @@ DIAGNOSTIC
|
|
260
265
|
[:wrap, @hello.join(@world), '@', '@'],
|
261
266
|
])
|
262
267
|
end
|
268
|
+
|
269
|
+
def representation_example
|
270
|
+
Parser::Source::TreeRewriter.new(@buf)
|
271
|
+
.wrap(range(1...10), '(', ')')
|
272
|
+
.insert_after(range(2...6), '!')
|
273
|
+
.replace(range(2...4), 'foo')
|
274
|
+
.remove(range(5...6))
|
275
|
+
end
|
276
|
+
|
277
|
+
def test_nested_actions
|
278
|
+
result = representation_example.as_nested_actions
|
279
|
+
|
280
|
+
assert_equal( [ [:wrap, 1...10, '(', ')'],
|
281
|
+
[:wrap, 2...6, '', '!'], # aka "insert_after"
|
282
|
+
[:replace, 2...4, 'foo'],
|
283
|
+
[:replace, 5...6, ''], # aka "removal"
|
284
|
+
],
|
285
|
+
result.each {|arr| arr[1] = arr[1].to_range }
|
286
|
+
)
|
287
|
+
end
|
288
|
+
|
289
|
+
def test_ordered_replacements
|
290
|
+
result = representation_example.as_replacements
|
291
|
+
|
292
|
+
assert_equal( [ [ 1...1, '('],
|
293
|
+
[ 2...4, 'foo'],
|
294
|
+
[ 5...6, ''],
|
295
|
+
[ 6...6, '!'],
|
296
|
+
[ 10...10, ')'],
|
297
|
+
],
|
298
|
+
result.map {|r, s| [r.to_range, s]}
|
299
|
+
)
|
300
|
+
end
|
301
|
+
end
|
302
|
+
|
303
|
+
class TestSourceTreeRewriterImport < Minitest::Test
|
304
|
+
include TestSourceTreeRewriter::Setup
|
305
|
+
def setup
|
306
|
+
super
|
307
|
+
@buf2 = Parser::Source::Buffer.new('(rewriter 2)',
|
308
|
+
source: ':hello')
|
309
|
+
|
310
|
+
@rewriter = Parser::Source::TreeRewriter.new(@buf)
|
311
|
+
|
312
|
+
@rewriter2 = Parser::Source::TreeRewriter.new(@buf2)
|
313
|
+
|
314
|
+
@hello2 = range2(0, 6)
|
315
|
+
@ll2 = range2(3, 2)
|
316
|
+
end
|
317
|
+
|
318
|
+
def range2(from, len)
|
319
|
+
Parser::Source::Range.new(@buf2, from, from + len)
|
320
|
+
end
|
321
|
+
|
322
|
+
def test_import_with_offset
|
323
|
+
@rewriter2.wrap(@hello2, '[', ']')
|
324
|
+
@rewriter.wrap(@hello.join(@world), '{', '}')
|
325
|
+
@rewriter.import!(@rewriter2, offset: @hello.begin_pos)
|
326
|
+
assert_equal 'puts({[:hello], :world})', @rewriter.process
|
327
|
+
end
|
328
|
+
|
329
|
+
def test_import_with_offset_from_bigger_source
|
330
|
+
@rewriter2.wrap(@ll2, '[', ']')
|
331
|
+
@rewriter.wrap(@hello, '{', '}')
|
332
|
+
@rewriter2.import!(@rewriter, offset: -@hello.begin_pos)
|
333
|
+
assert_equal '{:he[ll]o}', @rewriter2.process
|
334
|
+
end
|
335
|
+
|
336
|
+
def test_import_with_offset_and_self
|
337
|
+
@rewriter.wrap(@ll, '[', ']')
|
338
|
+
@rewriter.import!(@rewriter, offset: +3)
|
339
|
+
@rewriter.replace(range(8,1), '**')
|
340
|
+
assert_equal 'puts(:he[**l]o[, ]:world)', @rewriter.process
|
341
|
+
@rewriter.import!(@rewriter, offset: -6)
|
342
|
+
assert_equal 'pu[**s]([:h]e[**l]o[, ]:world)', @rewriter.process
|
343
|
+
end
|
344
|
+
|
345
|
+
def test_import_with_invalid_offset
|
346
|
+
@rewriter.wrap(@ll, '[', ']')
|
347
|
+
m = @rewriter.dup.import!(@rewriter, offset: -@ll.begin_pos)
|
348
|
+
assert_equal '[pu]ts(:he[ll]o, :world)', m.process
|
349
|
+
off = @buf.source.size - @ll.end_pos
|
350
|
+
m = @rewriter.dup.import!(@rewriter, offset: off)
|
351
|
+
assert_equal 'puts(:he[ll]o, :worl[d)]', m.process
|
352
|
+
assert_raises { @rewriter.import!(@rewriter, offset: -@ll.begin_pos - 1) }
|
353
|
+
assert_raises { @rewriter.import!(@rewriter, offset: off + 1) }
|
354
|
+
assert_equal 'puts(:he[ll]o, :world)', @rewriter.process # Test atomicity of import!
|
355
|
+
end
|
356
|
+
|
357
|
+
def test_empty_import
|
358
|
+
assert_equal @rewriter, @rewriter.import!(@rewriter2)
|
359
|
+
assert_equal @rewriter, @rewriter.import!(@rewriter, offset: 42)
|
360
|
+
end
|
263
361
|
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.7.1.
|
4
|
+
version: 2.7.1.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- whitequark
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-06-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: ast
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 2.4.
|
19
|
+
version: 2.4.1
|
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.4.
|
26
|
+
version: 2.4.1
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: bundler
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -302,10 +302,10 @@ licenses:
|
|
302
302
|
- MIT
|
303
303
|
metadata:
|
304
304
|
bug_tracker_uri: https://github.com/whitequark/parser/issues
|
305
|
-
changelog_uri: https://github.com/whitequark/parser/blob/v2.7.1.
|
306
|
-
documentation_uri: https://www.rubydoc.info/gems/parser/2.7.1.
|
307
|
-
source_code_uri: https://github.com/whitequark/parser/tree/v2.7.1.
|
308
|
-
post_install_message:
|
305
|
+
changelog_uri: https://github.com/whitequark/parser/blob/v2.7.1.4/CHANGELOG.md
|
306
|
+
documentation_uri: https://www.rubydoc.info/gems/parser/2.7.1.4
|
307
|
+
source_code_uri: https://github.com/whitequark/parser/tree/v2.7.1.4
|
308
|
+
post_install_message:
|
309
309
|
rdoc_options: []
|
310
310
|
require_paths:
|
311
311
|
- lib
|
@@ -321,7 +321,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
321
321
|
version: '0'
|
322
322
|
requirements: []
|
323
323
|
rubygems_version: 3.0.6
|
324
|
-
signing_key:
|
324
|
+
signing_key:
|
325
325
|
specification_version: 4
|
326
326
|
summary: A Ruby parser written in pure Ruby.
|
327
327
|
test_files:
|