synvert-core 0.27.4 → 0.28.0

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: a239badccf8d5b2774e75423755123fe55393f951cb3064030800ce351e014bf
4
- data.tar.gz: df9c575e61f833873bafaa672b95977390ce5eef62ace7898f209f684fef595d
3
+ metadata.gz: f8c211d681b7aa05969c2a167eff0f78c27803f354eff7550571b0a5b6ed735a
4
+ data.tar.gz: e66a98377c36ec9931a5e6afb7eb27adb9c52b97e877d442a807c24629729f8f
5
5
  SHA512:
6
- metadata.gz: fc153d13c26d917155db767031b5371df250014e1c86cfbf58e89693775e5488a02276e272a62e6c41489a744056846ff2237f74433c283dbfc5b9664c989372
7
- data.tar.gz: 4c6e8df70fc14379a871b1b187ef9ce4b3b32ec964aedf096d6db1f69ae911e005933576b1adbc01478a61b1c694a1d7002bd1d4f0647f1e421bcbe894f191f5
6
+ metadata.gz: a4d24957bb9719dc7ad41ff7a194c199d96a43ffcb539d86000fdcab36754f83ad5da47ecd54d76cbb6e3755c3816c0b59a2b3debcb87896fdb10079535782d1
7
+ data.tar.gz: f489d2cfbaea89bed0349283ced59fd69b9f993336069ec8a711b43fb7c3f82ae4c698c5e9e15eed473dfd0dd3fa34c433ee5af2e9719e5b17a09d84ef808838
data/CHANGELOG.md CHANGED
@@ -1,20 +1,9 @@
1
1
  # CHANGELOG
2
2
 
3
- ## 0.27.4 (2021-04-01)
4
-
5
- * Support `:block` in `child_node_range`
6
-
7
- ## 0.27.3 (2021-03-31)
8
-
9
- * Support `:def` in `child_node_range`
10
- * Support `:defs` in `child_node_range`
11
-
12
- ## 0.27.2 (2021-03-31)
13
-
14
- * Fix selector with operator in `child_node_range`
15
-
16
- ## 0.27.1 (2021-03-31)
3
+ ## 0.28.0 (2021-04-07)
17
4
 
5
+ * Make `child_name_range` support all dsl nodes
6
+ * Make `replace` action support multi child names
18
7
  * Fix `delete` action arguments
19
8
 
20
9
  ## 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,51 +322,33 @@ 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 :block
327
- case child_name
328
- when :caller
329
- caller&.loc&.expression
330
- when :arguments
331
- arguments&.loc&.expression
332
- end
333
- when :class
334
- case child_name
335
- when :name
336
- loc.name
337
- when :parent_class
338
- parent_class&.loc&.expression
339
- end
340
- when :def
341
- case child_name
342
- when :name
343
- loc.name
344
- when :arguments
345
- Parser::Source::Range.new('(string)', arguments.first.loc.expression.begin_pos, arguments.last.loc.expression.end_pos) unless arguments.empty?
346
- end
347
- when :defs
348
- case child_name
349
- when :dot
350
- loc.operator
351
- when :self
352
- Parser::Source::Range.new('(string)', loc.operator.begin_pos - 4, loc.operator.begin_pos)
353
- when :name
354
- loc.name
355
- when :arguments
356
- Parser::Source::Range.new('(string)', arguments.first.loc.expression.begin_pos, arguments.last.loc.expression.end_pos) unless arguments.empty?
357
- end
358
- when :send
359
- case child_name
360
- when :receiver
361
- receiver&.loc&.expression
362
- when :dot
363
- loc.dot
364
- when :message
365
- loc.operator ? Parser::Source::Range.new('(string)', loc.selector.begin_pos, loc.operator.end_pos) : loc.selector
366
- when :arguments
367
- Parser::Source::Range.new('(string)', arguments.first.loc.expression.begin_pos, arguments.last.loc.expression.end_pos) unless arguments.empty?
368
- end
325
+ case [type, child_name]
326
+ when [:class, :name]
327
+ loc.name
328
+ when [:def, :name]
329
+ loc.name
330
+ when [:defs, :name]
331
+ loc.name
332
+ when [:defs, :dot]
333
+ loc.operator
334
+ when [:defs, :self]
335
+ Parser::Source::Range.new('(string)', loc.operator.begin_pos - 4, loc.operator.begin_pos)
336
+ when [:send, :dot]
337
+ loc.dot
338
+ when [:send, :message]
339
+ loc.operator ? Parser::Source::Range.new('(string)', loc.selector.begin_pos, loc.operator.end_pos) : loc.selector
369
340
  else
341
+ if respond_to?(child_name)
342
+ child_node = send(child_name)
343
+ return nil if child_node.nil?
344
+ if child_node.is_a?(Parser::AST::Node)
345
+ return Parser::Source::Range.new('(string)', child_node.loc.expression.begin_pos, child_node.loc.expression.end_pos)
346
+ end
347
+ # arguments
348
+ return nil if child_node.empty?
349
+ return Parser::Source::Range.new('(string)', child_node.first.loc.expression.begin_pos, child_node.last.loc.expression.end_pos)
350
+ end
351
+
370
352
  raise Synvert::Core::MethodNotSupported, "child_node_range is not handled for #{evaluated.inspect}, child_name: #{child_name}"
371
353
  end
372
354
  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.4'
5
+ VERSION = '0.28.0'
6
6
  end
7
7
  end
@@ -405,7 +405,7 @@ describe Parser::AST::Node do
405
405
  it 'checks arguments' do
406
406
  node = parse('Factory.define :user do |user|; end')
407
407
  range = node.child_node_range(:arguments)
408
- expect(range.to_range).to eq(24...30)
408
+ expect(range.to_range).to eq(25...29)
409
409
  end
410
410
  end
411
411
 
@@ -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.4
4
+ version: 0.28.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-01 00:00:00.000000000 Z
11
+ date: 2021-04-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport