synvert-core 0.31.0 → 0.35.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +17 -0
- data/lib/synvert/core/node_ext.rb +21 -38
- data/lib/synvert/core/rewriter/instance.rb +1 -1
- data/lib/synvert/core/version.rb +1 -1
- data/spec/synvert/core/node_ext_spec.rb +41 -8
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9c718983fb8e6e6216ac660fba2aa1b9beeacf96db451d65b4df3df827a396c0
|
4
|
+
data.tar.gz: a6fd2918b8de9d92bfe4a50f1c135154d5b94eacd21b3e88c740e1869e4c4686
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8a828ec38b3d152a6620dd8fb5101a4fa0594da95eaede5612dd805f8b719bc52ebcaa1c00de48bb17fb306ebcf0cd6a7beb109dc91602afd5e305aafe521e47
|
7
|
+
data.tar.gz: 496d20ef84817d2e8073573b67635f8cb520fc430a647eba909ff9a49dce8fa4f9f5c99245123aa390d7b7d0356c955ca1f78c8073ee17984e1dfa14a8914e51
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,22 @@
|
|
1
1
|
# CHANGELOG
|
2
2
|
|
3
|
+
## 0.35.0 (2021-05-17)
|
4
|
+
|
5
|
+
* Add `contain` rule
|
6
|
+
|
7
|
+
## 0.34.0 (2021-05-16)
|
8
|
+
|
9
|
+
* `child_node_name` supports [:def, :parentheses] and [:defs, :parentheses]
|
10
|
+
* Rename `pipe` to `pipes`
|
11
|
+
|
12
|
+
## 0.33.0 (2021-05-10)
|
13
|
+
|
14
|
+
* Add `body` for `class` node
|
15
|
+
|
16
|
+
## 0.32.0 (2021-05-07)
|
17
|
+
|
18
|
+
* Remove `ArgumentsNode`
|
19
|
+
|
3
20
|
## 0.31.0 (2021-04-27)
|
4
21
|
|
5
22
|
* Add `in` and `not_in` rules
|
@@ -1,29 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module Parser::AST
|
4
|
-
# ArgumentsNode allows to handle all args as one node or handle all args as an array.
|
5
|
-
class ArgumentsNode
|
6
|
-
# Initialize
|
7
|
-
#
|
8
|
-
# @param node [Parser::AST::Node] args node.
|
9
|
-
def initialize(node)
|
10
|
-
@node = node
|
11
|
-
end
|
12
|
-
|
13
|
-
# If args node responds method itself, call method on args node.
|
14
|
-
# If args children (array) responds method, call method on args children.
|
15
|
-
# Otherwise raise method missing error.
|
16
|
-
def method_missing(meth, *args, &block)
|
17
|
-
if @node.respond_to?(meth)
|
18
|
-
@node.send meth, *args, &block
|
19
|
-
elsif @node.children.respond_to?(meth)
|
20
|
-
@node.children.send meth, *args, &block
|
21
|
-
else
|
22
|
-
super
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
4
|
# Parser::AST::Node monkey patch.
|
28
5
|
class Node
|
29
6
|
# Get name node of :class, :module, :const, :mlhs, :def and :defs node.
|
@@ -101,9 +78,9 @@ module Parser::AST
|
|
101
78
|
def arguments
|
102
79
|
case type
|
103
80
|
when :def, :block
|
104
|
-
|
81
|
+
children[1]
|
105
82
|
when :defs
|
106
|
-
|
83
|
+
children[2]
|
107
84
|
when :send
|
108
85
|
children[2..-1]
|
109
86
|
when :defined?
|
@@ -133,7 +110,7 @@ module Parser::AST
|
|
133
110
|
case type
|
134
111
|
when :begin
|
135
112
|
children
|
136
|
-
when :def, :block
|
113
|
+
when :def, :block, :class
|
137
114
|
return [] if children[2].nil?
|
138
115
|
|
139
116
|
:begin == children[2].type ? children[2].body : children[2..-1]
|
@@ -285,7 +262,9 @@ module Parser::AST
|
|
285
262
|
# Current node is s(:hash, s(:pair, s(:sym, :number), s(:int, 10)))
|
286
263
|
# node.number_value is 10
|
287
264
|
def method_missing(method_name, *args, &block)
|
288
|
-
if :
|
265
|
+
if :args == type && children.respond_to?(method_name)
|
266
|
+
return children.send(method_name, *args, &block)
|
267
|
+
elsif :hash == type && method_name.to_s.include?('_value')
|
289
268
|
key = method_name.to_s.sub('_value', '')
|
290
269
|
return hash_value(key.to_sym)&.to_value if key?(key.to_sym)
|
291
270
|
return hash_value(key.to_s)&.to_value if key?(key.to_s)
|
@@ -297,7 +276,9 @@ module Parser::AST
|
|
297
276
|
end
|
298
277
|
|
299
278
|
def respond_to_missing?(method_name, *args)
|
300
|
-
if :
|
279
|
+
if :args == type && children.respond_to?(method_name)
|
280
|
+
return true
|
281
|
+
elsif :hash == type && method_name.to_s.include?('_value')
|
301
282
|
key = method_name.to_s.sub('_value', '')
|
302
283
|
return true if key?(key.to_sym) || key?(key.to_s)
|
303
284
|
end
|
@@ -348,18 +329,16 @@ module Parser::AST
|
|
348
329
|
# @return [Parser::Source::Range] source range of child node.
|
349
330
|
def child_node_range(child_name)
|
350
331
|
case [type, child_name]
|
351
|
-
when %i[block
|
332
|
+
when %i[block pipes], %i[def parentheses], %i[defs parentheses]
|
352
333
|
Parser::Source::Range.new('(string)', arguments.loc.expression.begin_pos, arguments.loc.expression.end_pos)
|
353
|
-
when %i[
|
354
|
-
loc.
|
355
|
-
when %i[def name]
|
356
|
-
loc.name
|
357
|
-
when %i[defs name]
|
334
|
+
when %i[block arguments], %i[def arguments], %i[defs arguments]
|
335
|
+
Parser::Source::Range.new('(string)', arguments.first.loc.expression.begin_pos, arguments.last.loc.expression.end_pos)
|
336
|
+
when %i[class name], %i[def name], %i[defs name]
|
358
337
|
loc.name
|
359
338
|
when %i[defs dot]
|
360
339
|
loc.operator
|
361
340
|
when %i[defs self]
|
362
|
-
Parser::Source::Range.new('(string)', loc.operator.begin_pos -
|
341
|
+
Parser::Source::Range.new('(string)', loc.operator.begin_pos - 'self'.length, loc.operator.begin_pos)
|
363
342
|
when %i[send dot]
|
364
343
|
loc.dot
|
365
344
|
when %i[send message]
|
@@ -420,7 +399,7 @@ module Parser::AST
|
|
420
399
|
def match?(rules)
|
421
400
|
flat_hash(rules).keys.all? do |multi_keys|
|
422
401
|
case multi_keys.last
|
423
|
-
when :any
|
402
|
+
when :any, :contain
|
424
403
|
actual_values = actual_value(self, multi_keys[0...-1])
|
425
404
|
expected = expected_value(rules, multi_keys)
|
426
405
|
actual_values.any? { |actual| match_value?(actual, expected) }
|
@@ -458,8 +437,12 @@ module Parser::AST
|
|
458
437
|
evaluated = instance_eval old_code
|
459
438
|
case evaluated
|
460
439
|
when Parser::AST::Node
|
461
|
-
evaluated.
|
462
|
-
|
440
|
+
if evaluated.type == :args
|
441
|
+
evaluated.loc.expression.source[1...-1]
|
442
|
+
else
|
443
|
+
evaluated.loc.expression.source
|
444
|
+
end
|
445
|
+
when Array
|
463
446
|
if evaluated.size > 0
|
464
447
|
file_source = evaluated.first.loc.expression.source_buffer.source
|
465
448
|
source = file_source[evaluated.first.loc.expression.begin_pos...evaluated.last.loc.expression.end_pos]
|
data/lib/synvert/core/version.rb
CHANGED
@@ -104,17 +104,17 @@ describe Parser::AST::Node do
|
|
104
104
|
describe '#arguments' do
|
105
105
|
it 'gets for def node' do
|
106
106
|
node = parse('def test(foo, bar); foo + bar; end')
|
107
|
-
expect(node.arguments.
|
107
|
+
expect(node.arguments.type).to eq :args
|
108
108
|
end
|
109
109
|
|
110
110
|
it 'gets for defs node' do
|
111
111
|
node = parse('def self.test(foo, bar); foo + bar; end')
|
112
|
-
expect(node.arguments.
|
112
|
+
expect(node.arguments.type).to eq :args
|
113
113
|
end
|
114
114
|
|
115
115
|
it 'gets for block node' do
|
116
116
|
node = parse('RSpec.configure do |config|; end')
|
117
|
-
expect(node.arguments.
|
117
|
+
expect(node.arguments.type).to eq :args
|
118
118
|
end
|
119
119
|
|
120
120
|
it 'gets for send node' do
|
@@ -146,6 +146,21 @@ describe Parser::AST::Node do
|
|
146
146
|
expect(node.body).to eq [parse('include EmailSpec::Helpers'), parse('include EmailSpec::Matchers')]
|
147
147
|
end
|
148
148
|
|
149
|
+
it 'gets empty for class node' do
|
150
|
+
node = parse('class User; end')
|
151
|
+
expect(node.body).to be_empty
|
152
|
+
end
|
153
|
+
|
154
|
+
it 'gets one line for class node' do
|
155
|
+
node = parse('class User; attr_accessor :email; end')
|
156
|
+
expect(node.body).to eq [parse('attr_accessor :email')]
|
157
|
+
end
|
158
|
+
|
159
|
+
it 'gets one line for class node' do
|
160
|
+
node = parse('class User; attr_accessor :email; attr_accessor :username; end')
|
161
|
+
expect(node.body).to eq [parse('attr_accessor :email'), parse('attr_accessor :username')]
|
162
|
+
end
|
163
|
+
|
149
164
|
it 'gets for begin node' do
|
150
165
|
node = parse('foo; bar')
|
151
166
|
expect(node.body).to eq [parse('foo'), parse('bar')]
|
@@ -399,6 +414,12 @@ describe Parser::AST::Node do
|
|
399
414
|
expect(node).to be_match(type: 'send', arguments: { any: 'Lifo::Cache' })
|
400
415
|
end
|
401
416
|
|
417
|
+
it 'matches arguments contain' do
|
418
|
+
source = 'def slow(foo, bar, &block); end'
|
419
|
+
node = parse(source)
|
420
|
+
expect(node).to be_match(type: 'def', arguments: { contain: '&block' })
|
421
|
+
end
|
422
|
+
|
402
423
|
it 'matches not' do
|
403
424
|
source = 'class Synvert; end'
|
404
425
|
node = parse(source)
|
@@ -408,13 +429,13 @@ describe Parser::AST::Node do
|
|
408
429
|
it 'matches in' do
|
409
430
|
source = 'FactoryBot.create(:user)'
|
410
431
|
node = parse(source)
|
411
|
-
expect(node).to be_match(type: 'send', message: { in: [
|
432
|
+
expect(node).to be_match(type: 'send', message: { in: %i[create build] })
|
412
433
|
end
|
413
434
|
|
414
435
|
it 'matches not_in' do
|
415
436
|
source = 'FactoryBot.create(:user)'
|
416
437
|
node = parse(source)
|
417
|
-
expect(node).not_to be_match(type: 'send', message: { not_in: [
|
438
|
+
expect(node).not_to be_match(type: 'send', message: { not_in: %i[create build] })
|
418
439
|
end
|
419
440
|
end
|
420
441
|
|
@@ -432,9 +453,9 @@ describe Parser::AST::Node do
|
|
432
453
|
expect(range.to_range).to eq(25...29)
|
433
454
|
end
|
434
455
|
|
435
|
-
it 'checks
|
456
|
+
it 'checks pipes' do
|
436
457
|
node = parse('Factory.define :user do |user|; end')
|
437
|
-
range = node.child_node_range(:
|
458
|
+
range = node.child_node_range(:pipes)
|
438
459
|
expect(range.to_range).to eq(24...30)
|
439
460
|
end
|
440
461
|
end
|
@@ -469,6 +490,12 @@ describe Parser::AST::Node do
|
|
469
490
|
range = node.child_node_range(:arguments)
|
470
491
|
expect(range.to_range).to eq(8...11)
|
471
492
|
end
|
493
|
+
|
494
|
+
it 'checks parentheses' do
|
495
|
+
node = parse('def foo(bar); end')
|
496
|
+
range = node.child_node_range(:parentheses)
|
497
|
+
expect(range.to_range).to eq(7...12)
|
498
|
+
end
|
472
499
|
end
|
473
500
|
|
474
501
|
context 'defs node' do
|
@@ -495,6 +522,12 @@ describe Parser::AST::Node do
|
|
495
522
|
range = node.child_node_range(:arguments)
|
496
523
|
expect(range.to_range).to eq(13...16)
|
497
524
|
end
|
525
|
+
|
526
|
+
it 'checks parentheses' do
|
527
|
+
node = parse('def self.foo(bar); end')
|
528
|
+
range = node.child_node_range(:parentheses)
|
529
|
+
expect(range.to_range).to eq(12...17)
|
530
|
+
end
|
498
531
|
end
|
499
532
|
|
500
533
|
context 'send node' do
|
@@ -566,7 +599,7 @@ describe Parser::AST::Node do
|
|
566
599
|
expect(node.rewritten_source('{{name}}')).to eq 'Synvert'
|
567
600
|
end
|
568
601
|
|
569
|
-
it 'rewrites for
|
602
|
+
it 'rewrites for arguments' do
|
570
603
|
source = 'test { |a, b| }'
|
571
604
|
node = parse(source)
|
572
605
|
expect(node.rewritten_source('{{arguments}}')).to eq 'a, b'
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: synvert-core
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.35.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Richard Huang
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-
|
11
|
+
date: 2021-05-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|