synvert-core 0.27.1 → 0.28.1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: cb60c127f3d144f90a63f896297a53d0dd8470c8af33df21db0b6c8e0b3e98ac
4
- data.tar.gz: 4f94a007e769fda2d174c89a7882b56b7708501ff829b2090c3f94833af939ab
3
+ metadata.gz: b240936c7390b45a27e9352da7acec3784499d38d5ec10aae3b3403036df36b5
4
+ data.tar.gz: a9c9a91d25352ef1c5fc09bd1cc0d8751d4239513a2fcff0e2618ccec6e93855
5
5
  SHA512:
6
- metadata.gz: 51f4397c0f9d50f0ab447d5958ada0b89dc6b163a5356d7131be7f1500d880147f2c033a2ec8b8b227d4bb654b23de1b2b3e7e74c44bcd2fc4444da60dc0fed1
7
- data.tar.gz: 323790b368a9241314aef449420950a83dc8051520fb4509f4614679f425bd2048e80eba3c3317f96a1c22eb7d80f359dda1731c53ceed54b227e4a8bb6b50fd
6
+ metadata.gz: 92298a2a06c408cac4aa99870f85138bc754dcb286b636976a01eb88f63613e6f81b80a1d0fc680922a394ab6b7167b9bdd70d6bf2b14a89a7f1a6faaf5292d0
7
+ data.tar.gz: f5c10e0e949dd459035e92fb172ed20ad7717369923a93e77dfb8077c7ba7c45c31da3ef1756768215ccdeff8b6b36fef063fe0b6db9fa53b3b9457bd895c8ae
data/CHANGELOG.md CHANGED
@@ -1,7 +1,13 @@
1
1
  # CHANGELOG
2
2
 
3
- ## 0.27.1 (2021-03-31)
3
+ ## 0.28.1 (2021-04-09)
4
4
 
5
+ * Make `child_name_range` support [:block, :pipe]
6
+
7
+ ## 0.28.0 (2021-04-07)
8
+
9
+ * Make `child_name_range` support all dsl nodes
10
+ * Make `replace` action support multi child names
5
11
  * Fix `delete` action arguments
6
12
 
7
13
  ## 0.27.0 (2021-03-31)
@@ -101,9 +101,9 @@ module Parser::AST
101
101
  def arguments
102
102
  case type
103
103
  when :def, :block
104
- ArgumentsNode.new children[1]
104
+ ArgumentsNode.new(children[1])
105
105
  when :defs
106
- ArgumentsNode.new children[2]
106
+ ArgumentsNode.new(children[2])
107
107
  when :send
108
108
  children[2..-1]
109
109
  when :defined?
@@ -322,26 +322,35 @@ module Parser::AST
322
322
  # @param [String] name of child node.
323
323
  # @return [Parser::Source::Range] source range of child node.
324
324
  def child_node_range(child_name)
325
- case type
326
- when :class
327
- case child_name
328
- when :name
329
- loc.name
330
- when :parent_class
331
- parent_class&.loc&.expression
332
- end
333
- when :send
334
- case child_name
335
- when :receiver
336
- receiver&.loc&.expression
337
- when :dot
338
- loc.dot
339
- when :message
340
- loc.selector
341
- when :arguments
342
- Parser::Source::Range.new('(string)', arguments.first.loc.expression.begin_pos, arguments.last.loc.expression.end_pos) unless arguments.empty?
343
- end
325
+ case [type, child_name]
326
+ when [:block, :pipe]
327
+ Parser::Source::Range.new('(string)', arguments.loc.expression.begin_pos, arguments.loc.expression.end_pos)
328
+ when [:class, :name]
329
+ loc.name
330
+ when [:def, :name]
331
+ loc.name
332
+ when [:defs, :name]
333
+ loc.name
334
+ when [:defs, :dot]
335
+ loc.operator
336
+ when [:defs, :self]
337
+ Parser::Source::Range.new('(string)', loc.operator.begin_pos - 4, loc.operator.begin_pos)
338
+ when [:send, :dot]
339
+ loc.dot
340
+ when [:send, :message]
341
+ loc.operator ? Parser::Source::Range.new('(string)', loc.selector.begin_pos, loc.operator.end_pos) : loc.selector
344
342
  else
343
+ if respond_to?(child_name)
344
+ child_node = send(child_name)
345
+ return nil if child_node.nil?
346
+ if child_node.is_a?(Parser::AST::Node)
347
+ return Parser::Source::Range.new('(string)', child_node.loc.expression.begin_pos, child_node.loc.expression.end_pos)
348
+ end
349
+ # arguments
350
+ return nil if child_node.empty?
351
+ return Parser::Source::Range.new('(string)', child_node.first.loc.expression.begin_pos, child_node.last.loc.expression.end_pos)
352
+ end
353
+
345
354
  raise Synvert::Core::MethodNotSupported, "child_node_range is not handled for #{evaluated.inspect}, child_name: #{child_name}"
346
355
  end
347
356
  end
@@ -3,9 +3,9 @@
3
3
  module Synvert::Core
4
4
  # ReplaceAction to replace child node with code.
5
5
  class Rewriter::ReplaceAction < Rewriter::Action
6
- def initialize(instance, selector, with:)
6
+ def initialize(instance, *selectors, with:)
7
7
  @instance = instance
8
- @selector = selector
8
+ @selectors = selectors
9
9
  @code = with
10
10
  @node = @instance.current_node
11
11
  end
@@ -14,14 +14,14 @@ module Synvert::Core
14
14
  #
15
15
  # @return [Integer] begin position.
16
16
  def begin_pos
17
- @node.child_node_range(@selector).begin_pos
17
+ @selectors.map { |selector| @node.child_node_range(selector).begin_pos }.min
18
18
  end
19
19
 
20
20
  # End position of code to replace.
21
21
  #
22
22
  # @return [Integer] end position.
23
23
  def end_pos
24
- @node.child_node_range(@selector).end_pos
24
+ @selectors.map { |selector| @node.child_node_range(selector).end_pos }.max
25
25
  end
26
26
 
27
27
  # The rewritten source code.
@@ -252,12 +252,12 @@ module Synvert::Core
252
252
  end
253
253
 
254
254
  # Parse replace with dsl, it creates a [Synvert::Core::Rewriter::ReplaceAction] to
255
- # replace child node with code.
255
+ # replace child nodes with code.
256
256
  #
257
- # @param selector [Symbol] selector name of child node.
257
+ # @param selectors [Array<Symbol>] selector names of child node.
258
258
  # @param with [String] code need to be replaced with.
259
- def replace(selector, with:)
260
- @actions << Rewriter::ReplaceAction.new(self, selector, with: with)
259
+ def replace(*selectors, with:)
260
+ @actions << Rewriter::ReplaceAction.new(self, *selectors, with: with)
261
261
  end
262
262
 
263
263
  # Parse replace_erb_stmt_with_expr dsl, it creates a [Synvert::Core::Rewriter::ReplaceErbStmtWithExprAction] to
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Synvert
4
4
  module Core
5
- VERSION = '0.27.1'
5
+ VERSION = '0.28.1'
6
6
  end
7
7
  end
@@ -395,6 +395,84 @@ describe Parser::AST::Node do
395
395
  end
396
396
 
397
397
  describe '#child_node_range' do
398
+ context 'block node' do
399
+ it 'checks caller' do
400
+ node = parse('Factory.define :user do |user|; end')
401
+ range = node.child_node_range(:caller)
402
+ expect(range.to_range).to eq(0...20)
403
+ end
404
+
405
+ it 'checks arguments' do
406
+ node = parse('Factory.define :user do |user|; end')
407
+ range = node.child_node_range(:arguments)
408
+ expect(range.to_range).to eq(25...29)
409
+ end
410
+
411
+ it 'checks pipe' do
412
+ node = parse('Factory.define :user do |user|; end')
413
+ range = node.child_node_range(:pipe)
414
+ expect(range.to_range).to eq(24...30)
415
+ end
416
+ end
417
+
418
+ context 'class node' do
419
+ it 'checks name' do
420
+ node = parse('class Post < ActiveRecord::Base; end')
421
+ range = node.child_node_range(:name)
422
+ expect(range.to_range).to eq(6...10)
423
+ end
424
+
425
+ it 'checks parent_class' do
426
+ node = parse('class Post < ActiveRecord::Base; end')
427
+ range = node.child_node_range(:parent_class)
428
+ expect(range.to_range).to eq(13...31)
429
+
430
+ node = parse('class Post; end')
431
+ range = node.child_node_range(:parent_class)
432
+ expect(range).to be_nil
433
+ end
434
+ end
435
+
436
+ context 'def node' do
437
+ it 'checks name' do
438
+ node = parse('def foo(bar); end')
439
+ range = node.child_node_range(:name)
440
+ expect(range.to_range).to eq(4...7)
441
+ end
442
+
443
+ it 'checks arguments' do
444
+ node = parse('def foo(bar); end')
445
+ range = node.child_node_range(:arguments)
446
+ expect(range.to_range).to eq(8...11)
447
+ end
448
+ end
449
+
450
+ context 'defs node' do
451
+ it 'checks self' do
452
+ node = parse('def self.foo(bar); end')
453
+ range = node.child_node_range(:self)
454
+ expect(range.to_range).to eq(4...8)
455
+ end
456
+
457
+ it 'checks dot' do
458
+ node = parse('def self.foo(bar); end')
459
+ range = node.child_node_range(:dot)
460
+ expect(range.to_range).to eq(8...9)
461
+ end
462
+
463
+ it 'checks name' do
464
+ node = parse('def self.foo(bar); end')
465
+ range = node.child_node_range(:name)
466
+ expect(range.to_range).to eq(9...12)
467
+ end
468
+
469
+ it 'checks arguments' do
470
+ node = parse('def self.foo(bar); end')
471
+ range = node.child_node_range(:arguments)
472
+ expect(range.to_range).to eq(13...16)
473
+ end
474
+ end
475
+
398
476
  context 'send node' do
399
477
  it 'checks receiver' do
400
478
  node = parse('foo.bar(test)')
@@ -421,6 +499,10 @@ describe Parser::AST::Node do
421
499
  range = node.child_node_range(:message)
422
500
  expect(range.to_range).to eq(4...7)
423
501
 
502
+ node = parse('foo.bar = test')
503
+ range = node.child_node_range(:message)
504
+ expect(range.to_range).to eq(4...9)
505
+
424
506
  node = parse('foobar(test)')
425
507
  range = node.child_node_range(:message)
426
508
  expect(range.to_range).to eq(0...6)
@@ -440,24 +522,6 @@ describe Parser::AST::Node do
440
522
  expect(range).to be_nil
441
523
  end
442
524
  end
443
-
444
- context 'class node' do
445
- it 'checks name' do
446
- node = parse('class Post < ActiveRecord::Base; end')
447
- range = node.child_node_range(:name)
448
- expect(range.to_range).to eq(6...10)
449
- end
450
-
451
- it 'checks parent_class' do
452
- node = parse('class Post < ActiveRecord::Base; end')
453
- range = node.child_node_range(:parent_class)
454
- expect(range.to_range).to eq(13...31)
455
-
456
- node = parse('class Post; end')
457
- range = node.child_node_range(:parent_class)
458
- expect(range).to be_nil
459
- end
460
- end
461
525
  end
462
526
 
463
527
  describe '#rewritten_source' do
@@ -6,22 +6,22 @@ module Synvert::Core
6
6
  describe Rewriter::ReplaceAction do
7
7
  context 'replace with single line' do
8
8
  subject {
9
- source = "'slug from title'.gsub(' ', '_')"
9
+ source = "FactoryBot.create(:user)"
10
10
  node = Parser::CurrentRuby.parse(source)
11
11
  instance = double(current_node: node)
12
- Rewriter::ReplaceAction.new(instance, :message, with: 'tr')
12
+ Rewriter::ReplaceAction.new(instance, :receiver, :dot, :message, with: 'create')
13
13
  }
14
14
 
15
15
  it 'gets begin_pos' do
16
- expect(subject.begin_pos).to eq "'slug from title'.".length
16
+ expect(subject.begin_pos).to eq 0
17
17
  end
18
18
 
19
19
  it 'gets end_pos' do
20
- expect(subject.end_pos).to eq "'slug from title'.gsub".length
20
+ expect(subject.end_pos).to eq "FactoryBot.create".length
21
21
  end
22
22
 
23
23
  it 'gets rewritten_code' do
24
- expect(subject.rewritten_code).to eq 'tr'
24
+ expect(subject.rewritten_code).to eq 'create'
25
25
  end
26
26
  end
27
27
  end
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.27.1
4
+ version: 0.28.1
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-03-31 00:00:00.000000000 Z
11
+ date: 2021-04-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport