synvert-core 0.30.0 → 0.34.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 +28 -37
- data/lib/synvert/core/rewriter/any_value.rb +1 -1
- 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 +45 -6
- 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: 34cd9673c3a822eb4c9b41930aa069b8c8494d6e81091c37b0184864f302f94d
|
4
|
+
data.tar.gz: 852ff317acabb0d20528a168d6639b10b9ac576f1c70f64af2e17923762addaa
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9a23ba7d43b7eef7a6508925a6d9aa2c925e12cd392999f0d2e263be5a5df7c934a735cb00e584f4cddbdccd8779d6eed1dddd338d9d1f9838d9d983c21f74dc
|
7
|
+
data.tar.gz: 92008bfc0d05c3d71d9948e0db6a3c8c09ca05b4aff4d2a1cafb6fd93fb0308554a738f2447d962d4751b82827f22aeee9f81d2c7727fb63190018984a7a8a6e
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,22 @@
|
|
1
1
|
# CHANGELOG
|
2
2
|
|
3
|
+
## 0.34.0 (2021-05-16)
|
4
|
+
|
5
|
+
* `child_node_name` supports [:def, :parentheses] and [:defs, :parentheses]
|
6
|
+
* rename `pipe` to `pipes`
|
7
|
+
|
8
|
+
## 0.33.0 (2021-05-10)
|
9
|
+
|
10
|
+
* Add `body` for `class` node
|
11
|
+
|
12
|
+
## 0.32.0 (2021-05-07)
|
13
|
+
|
14
|
+
* Remove `ArgumentsNode`
|
15
|
+
|
16
|
+
## 0.31.0 (2021-04-27)
|
17
|
+
|
18
|
+
* Add `in` and `not_in` rules
|
19
|
+
|
3
20
|
## 0.30.0 (2021-04-26)
|
4
21
|
|
5
22
|
* `goto_node` accepts multiple child node names
|
@@ -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]
|
@@ -428,6 +407,14 @@ module Parser::AST
|
|
428
407
|
actual = actual_value(self, multi_keys[0...-1])
|
429
408
|
expected = expected_value(rules, multi_keys)
|
430
409
|
!match_value?(actual, expected)
|
410
|
+
when :in
|
411
|
+
actual = actual_value(self, multi_keys[0...-1])
|
412
|
+
expected_values = expected_value(rules, multi_keys)
|
413
|
+
expected_values.any? { |expected| match_value?(actual, expected) }
|
414
|
+
when :not_in
|
415
|
+
actual = actual_value(self, multi_keys[0...-1])
|
416
|
+
expected_values = expected_value(rules, multi_keys)
|
417
|
+
expected_values.all? { |expected| !match_value?(actual, expected) }
|
431
418
|
else
|
432
419
|
actual = actual_value(self, multi_keys)
|
433
420
|
expected = expected_value(rules, multi_keys)
|
@@ -450,8 +437,12 @@ module Parser::AST
|
|
450
437
|
evaluated = instance_eval old_code
|
451
438
|
case evaluated
|
452
439
|
when Parser::AST::Node
|
453
|
-
evaluated.
|
454
|
-
|
440
|
+
if evaluated.type == :args
|
441
|
+
evaluated.loc.expression.source[1...-1]
|
442
|
+
else
|
443
|
+
evaluated.loc.expression.source
|
444
|
+
end
|
445
|
+
when Array
|
455
446
|
if evaluated.size > 0
|
456
447
|
file_source = evaluated.first.loc.expression.source_buffer.source
|
457
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')]
|
@@ -404,6 +419,18 @@ describe Parser::AST::Node do
|
|
404
419
|
node = parse(source)
|
405
420
|
expect(node).not_to be_match(type: 'class', name: { not: 'Synvert' })
|
406
421
|
end
|
422
|
+
|
423
|
+
it 'matches in' do
|
424
|
+
source = 'FactoryBot.create(:user)'
|
425
|
+
node = parse(source)
|
426
|
+
expect(node).to be_match(type: 'send', message: { in: %i[create build] })
|
427
|
+
end
|
428
|
+
|
429
|
+
it 'matches not_in' do
|
430
|
+
source = 'FactoryBot.create(:user)'
|
431
|
+
node = parse(source)
|
432
|
+
expect(node).not_to be_match(type: 'send', message: { not_in: %i[create build] })
|
433
|
+
end
|
407
434
|
end
|
408
435
|
|
409
436
|
describe '#child_node_range' do
|
@@ -420,9 +447,9 @@ describe Parser::AST::Node do
|
|
420
447
|
expect(range.to_range).to eq(25...29)
|
421
448
|
end
|
422
449
|
|
423
|
-
it 'checks
|
450
|
+
it 'checks pipes' do
|
424
451
|
node = parse('Factory.define :user do |user|; end')
|
425
|
-
range = node.child_node_range(:
|
452
|
+
range = node.child_node_range(:pipes)
|
426
453
|
expect(range.to_range).to eq(24...30)
|
427
454
|
end
|
428
455
|
end
|
@@ -457,6 +484,12 @@ describe Parser::AST::Node do
|
|
457
484
|
range = node.child_node_range(:arguments)
|
458
485
|
expect(range.to_range).to eq(8...11)
|
459
486
|
end
|
487
|
+
|
488
|
+
it 'checks parentheses' do
|
489
|
+
node = parse('def foo(bar); end')
|
490
|
+
range = node.child_node_range(:parentheses)
|
491
|
+
expect(range.to_range).to eq(7...12)
|
492
|
+
end
|
460
493
|
end
|
461
494
|
|
462
495
|
context 'defs node' do
|
@@ -483,6 +516,12 @@ describe Parser::AST::Node do
|
|
483
516
|
range = node.child_node_range(:arguments)
|
484
517
|
expect(range.to_range).to eq(13...16)
|
485
518
|
end
|
519
|
+
|
520
|
+
it 'checks parentheses' do
|
521
|
+
node = parse('def self.foo(bar); end')
|
522
|
+
range = node.child_node_range(:parentheses)
|
523
|
+
expect(range.to_range).to eq(12...17)
|
524
|
+
end
|
486
525
|
end
|
487
526
|
|
488
527
|
context 'send node' do
|
@@ -554,7 +593,7 @@ describe Parser::AST::Node do
|
|
554
593
|
expect(node.rewritten_source('{{name}}')).to eq 'Synvert'
|
555
594
|
end
|
556
595
|
|
557
|
-
it 'rewrites for
|
596
|
+
it 'rewrites for arguments' do
|
558
597
|
source = 'test { |a, b| }'
|
559
598
|
node = parse(source)
|
560
599
|
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.34.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-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|