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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d60fb908af77ff2aab17f451c37a9f89e2b2af54a5b9aa24b082906286378158
4
- data.tar.gz: a806d11b423f746ee2004b9467eb976132f1c3053b3986cb0e75e32291730dd6
3
+ metadata.gz: 34cd9673c3a822eb4c9b41930aa069b8c8494d6e81091c37b0184864f302f94d
4
+ data.tar.gz: 852ff317acabb0d20528a168d6639b10b9ac576f1c70f64af2e17923762addaa
5
5
  SHA512:
6
- metadata.gz: c24af6d0aa4fc55d3a6f35dca86fbcdca5fb66b3e6ba6a8d6e0404da07e0418a2b922ec6d2b4550878c2e422db1befa1f41010c9904eda246753e088bc1c9ea2
7
- data.tar.gz: c59443f7272ec4b13043fe79bf042b51d8de510143501fcf1d50e1a4fbc6d1d69cba79b007f6854550277bf98d74cef9f71c7aba15a7be6ffa34ea5c275e00da
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
- ArgumentsNode.new(children[1])
81
+ children[1]
105
82
  when :defs
106
- ArgumentsNode.new(children[2])
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 :hash == type && method_name.to_s.include?('_value')
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 :hash == type && method_name.to_s.include?('_value')
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 pipe]
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[class name]
354
- loc.name
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 - 4, 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.loc.expression.source
454
- when Array, ArgumentsNode
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]
@@ -3,4 +3,4 @@
3
3
  module Synvert::Core
4
4
  class Rewriter::AnyValue
5
5
  end
6
- end
6
+ end
@@ -302,7 +302,7 @@ module Synvert::Core
302
302
 
303
303
  begin_pos = @actions[i].begin_pos
304
304
  while j > -1
305
- if begin_pos <= @actions[j].end_pos
305
+ if begin_pos < @actions[j].end_pos
306
306
  conflict_actions << @actions.delete_at(j)
307
307
  else
308
308
  i = j
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Synvert
4
4
  module Core
5
- VERSION = '0.30.0'
5
+ VERSION = '0.34.0'
6
6
  end
7
7
  end
@@ -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.map { |argument| argument.to_source }).to eq %w[foo bar]
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.map { |argument| argument.to_source }).to eq %w[foo bar]
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.map { |argument| argument.to_source }).to eq ['config']
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 pipe' do
450
+ it 'checks pipes' do
424
451
  node = parse('Factory.define :user do |user|; end')
425
- range = node.child_node_range(:pipe)
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 ArgumentsNode' do
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.30.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-04-26 00:00:00.000000000 Z
11
+ date: 2021-05-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport