synvert-core 0.27.4 → 0.28.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: 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