synvert-core 0.28.0 → 0.32.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 +4 -4
- data/CHANGELOG.md +18 -0
- data/lib/synvert/core/node_ext.rb +84 -40
- data/lib/synvert/core/rewriter.rb +2 -0
- data/lib/synvert/core/rewriter/any_value.rb +6 -0
- data/lib/synvert/core/rewriter/instance.rb +8 -3
- data/lib/synvert/core/rewriter/scope/goto_scope.rb +7 -4
- data/lib/synvert/core/version.rb +1 -1
- data/spec/synvert/core/node_ext_spec.rb +34 -4
- data/spec/synvert/core/rewriter/action/delete_action_spec.rb +3 -3
- data/spec/synvert/core/rewriter/action/replace_action_spec.rb +2 -2
- data/spec/synvert/core/rewriter/instance_spec.rb +2 -2
- data/spec/synvert/core/rewriter/scope/goto_scope_spec.rb +7 -8
- data/synvert-core.gemspec +1 -1
- metadata +8 -7
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: eb6c6b0b57d35fa8d3f850685ccda616f56f19fe55fee0b766302574b2cc577e
|
|
4
|
+
data.tar.gz: fac77a466b7691c8b74c5a3bb4f2b00ef31be69dfdb0db93fb07593e8553702e
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 6ce9c70f4892ed3e65cb4669e0e623b745d8edce13e06fbc758c33adce27870934b6e5ea78dcf0eca480c421b96b9afa6de666599094819fd6e5cb6f4ba3b056
|
|
7
|
+
data.tar.gz: '0800aedc7b404a04f4605e2586f123faed17152f7ebe81bd430f48834f760c8189efe7fb348f41d15f2285370bdd2d08c31badb6e99df064c5b50dd98801ea88'
|
data/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,23 @@
|
|
|
1
1
|
# CHANGELOG
|
|
2
2
|
|
|
3
|
+
## 0.32.0 (2021-05-07)
|
|
4
|
+
|
|
5
|
+
* Remove `ArgumentsNode`
|
|
6
|
+
|
|
7
|
+
## 0.31.0 (2021-04-27)
|
|
8
|
+
|
|
9
|
+
* Add `in` and `not_in` rules
|
|
10
|
+
|
|
11
|
+
## 0.30.0 (2021-04-26)
|
|
12
|
+
|
|
13
|
+
* `goto_node` accepts multiple child node names
|
|
14
|
+
* Match any_value
|
|
15
|
+
|
|
16
|
+
## 0.29.0 (2021-04-25)
|
|
17
|
+
|
|
18
|
+
* Make `child_name_range` support [:block, :pipe]
|
|
19
|
+
* Get key value for hash node
|
|
20
|
+
|
|
3
21
|
## 0.28.0 (2021-04-07)
|
|
4
22
|
|
|
5
23
|
* Make `child_name_range` support all dsl nodes
|
|
@@ -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?
|
|
@@ -203,7 +180,7 @@ module Parser::AST
|
|
|
203
180
|
def hash_value(key)
|
|
204
181
|
if :hash == type
|
|
205
182
|
value_node = children.find { |pair_node| pair_node.key.to_value == key }
|
|
206
|
-
value_node
|
|
183
|
+
value_node&.value
|
|
207
184
|
else
|
|
208
185
|
raise Synvert::Core::MethodNotSupported, "hash_value is not handled for #{debug_info}"
|
|
209
186
|
end
|
|
@@ -280,6 +257,35 @@ module Parser::AST
|
|
|
280
257
|
end
|
|
281
258
|
end
|
|
282
259
|
|
|
260
|
+
# Respond key value for hash node, e.g.
|
|
261
|
+
#
|
|
262
|
+
# Current node is s(:hash, s(:pair, s(:sym, :number), s(:int, 10)))
|
|
263
|
+
# node.number_value is 10
|
|
264
|
+
def method_missing(method_name, *args, &block)
|
|
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')
|
|
268
|
+
key = method_name.to_s.sub('_value', '')
|
|
269
|
+
return hash_value(key.to_sym)&.to_value if key?(key.to_sym)
|
|
270
|
+
return hash_value(key.to_s)&.to_value if key?(key.to_s)
|
|
271
|
+
|
|
272
|
+
return nil
|
|
273
|
+
end
|
|
274
|
+
|
|
275
|
+
super
|
|
276
|
+
end
|
|
277
|
+
|
|
278
|
+
def respond_to_missing?(method_name, *args)
|
|
279
|
+
if :args == type && children.respond_to?(method_name)
|
|
280
|
+
return true
|
|
281
|
+
elsif :hash == type && method_name.to_s.include?('_value')
|
|
282
|
+
key = method_name.to_s.sub('_value', '')
|
|
283
|
+
return true if key?(key.to_sym) || key?(key.to_s)
|
|
284
|
+
end
|
|
285
|
+
|
|
286
|
+
super
|
|
287
|
+
end
|
|
288
|
+
|
|
283
289
|
def to_s
|
|
284
290
|
if :mlhs == type
|
|
285
291
|
"(#{children.map(&:name).join(', ')})"
|
|
@@ -323,33 +329,57 @@ module Parser::AST
|
|
|
323
329
|
# @return [Parser::Source::Range] source range of child node.
|
|
324
330
|
def child_node_range(child_name)
|
|
325
331
|
case [type, child_name]
|
|
326
|
-
when [
|
|
332
|
+
when %i[block pipe]
|
|
333
|
+
Parser::Source::Range.new('(string)', arguments.loc.expression.begin_pos, arguments.loc.expression.end_pos)
|
|
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]
|
|
327
337
|
loc.name
|
|
328
|
-
when [
|
|
338
|
+
when %i[def name]
|
|
329
339
|
loc.name
|
|
330
|
-
when [
|
|
340
|
+
when %i[defs name]
|
|
331
341
|
loc.name
|
|
332
|
-
when [
|
|
342
|
+
when %i[defs dot]
|
|
333
343
|
loc.operator
|
|
334
|
-
when [
|
|
344
|
+
when %i[defs self]
|
|
335
345
|
Parser::Source::Range.new('(string)', loc.operator.begin_pos - 4, loc.operator.begin_pos)
|
|
336
|
-
when [
|
|
346
|
+
when %i[send dot]
|
|
337
347
|
loc.dot
|
|
338
|
-
when [
|
|
339
|
-
|
|
348
|
+
when %i[send message]
|
|
349
|
+
if loc.operator
|
|
350
|
+
Parser::Source::Range.new('(string)', loc.selector.begin_pos, loc.operator.end_pos)
|
|
351
|
+
else
|
|
352
|
+
loc.selector
|
|
353
|
+
end
|
|
340
354
|
else
|
|
341
355
|
if respond_to?(child_name)
|
|
342
356
|
child_node = send(child_name)
|
|
343
357
|
return nil if child_node.nil?
|
|
358
|
+
|
|
344
359
|
if child_node.is_a?(Parser::AST::Node)
|
|
345
|
-
return
|
|
360
|
+
return(
|
|
361
|
+
Parser::Source::Range.new(
|
|
362
|
+
'(string)',
|
|
363
|
+
child_node.loc.expression.begin_pos,
|
|
364
|
+
child_node.loc.expression.end_pos
|
|
365
|
+
)
|
|
366
|
+
)
|
|
346
367
|
end
|
|
368
|
+
|
|
347
369
|
# arguments
|
|
348
370
|
return nil if child_node.empty?
|
|
349
|
-
|
|
371
|
+
|
|
372
|
+
return(
|
|
373
|
+
Parser::Source::Range.new(
|
|
374
|
+
'(string)',
|
|
375
|
+
child_node.first.loc.expression.begin_pos,
|
|
376
|
+
child_node.last.loc.expression.end_pos
|
|
377
|
+
)
|
|
378
|
+
)
|
|
350
379
|
end
|
|
351
380
|
|
|
352
|
-
raise Synvert::Core::MethodNotSupported,
|
|
381
|
+
raise Synvert::Core::MethodNotSupported,
|
|
382
|
+
"child_node_range is not handled for #{evaluated.inspect}, child_name: #{child_name}"
|
|
353
383
|
end
|
|
354
384
|
end
|
|
355
385
|
|
|
@@ -381,6 +411,14 @@ module Parser::AST
|
|
|
381
411
|
actual = actual_value(self, multi_keys[0...-1])
|
|
382
412
|
expected = expected_value(rules, multi_keys)
|
|
383
413
|
!match_value?(actual, expected)
|
|
414
|
+
when :in
|
|
415
|
+
actual = actual_value(self, multi_keys[0...-1])
|
|
416
|
+
expected_values = expected_value(rules, multi_keys)
|
|
417
|
+
expected_values.any? { |expected| match_value?(actual, expected) }
|
|
418
|
+
when :not_in
|
|
419
|
+
actual = actual_value(self, multi_keys[0...-1])
|
|
420
|
+
expected_values = expected_value(rules, multi_keys)
|
|
421
|
+
expected_values.all? { |expected| !match_value?(actual, expected) }
|
|
384
422
|
else
|
|
385
423
|
actual = actual_value(self, multi_keys)
|
|
386
424
|
expected = expected_value(rules, multi_keys)
|
|
@@ -403,8 +441,12 @@ module Parser::AST
|
|
|
403
441
|
evaluated = instance_eval old_code
|
|
404
442
|
case evaluated
|
|
405
443
|
when Parser::AST::Node
|
|
406
|
-
evaluated.
|
|
407
|
-
|
|
444
|
+
if evaluated.type == :args
|
|
445
|
+
evaluated.loc.expression.source[1...-1]
|
|
446
|
+
else
|
|
447
|
+
evaluated.loc.expression.source
|
|
448
|
+
end
|
|
449
|
+
when Array
|
|
408
450
|
if evaluated.size > 0
|
|
409
451
|
file_source = evaluated.first.loc.expression.source_buffer.source
|
|
410
452
|
source = file_source[evaluated.first.loc.expression.begin_pos...evaluated.last.loc.expression.end_pos]
|
|
@@ -420,7 +462,7 @@ module Parser::AST
|
|
|
420
462
|
source
|
|
421
463
|
end
|
|
422
464
|
end
|
|
423
|
-
when String, Symbol
|
|
465
|
+
when String, Symbol, Integer, Float
|
|
424
466
|
evaluated
|
|
425
467
|
when NilClass
|
|
426
468
|
'nil'
|
|
@@ -480,6 +522,8 @@ module Parser::AST
|
|
|
480
522
|
:false == actual.type
|
|
481
523
|
when Parser::AST::Node
|
|
482
524
|
actual == expected
|
|
525
|
+
when Synvert::Core::Rewriter::AnyValue
|
|
526
|
+
!actual.nil?
|
|
483
527
|
else
|
|
484
528
|
raise Synvert::Core::MethodNotSupported, "#{expected.class} is not handled for match_value?"
|
|
485
529
|
end
|
|
@@ -44,6 +44,8 @@ module Synvert::Core
|
|
|
44
44
|
autoload :RubyVersion, 'synvert/core/rewriter/ruby_version'
|
|
45
45
|
autoload :GemSpec, 'synvert/core/rewriter/gem_spec'
|
|
46
46
|
|
|
47
|
+
autoload :AnyValue, 'synvert/core/rewriter/any_value'
|
|
48
|
+
|
|
47
49
|
class << self
|
|
48
50
|
# Execute the temporary rewriter without group and name.
|
|
49
51
|
#
|
|
@@ -181,10 +181,10 @@ module Synvert::Core
|
|
|
181
181
|
# Parse goto_node dsl, it creates a [Synvert::Core::Rewriter::GotoScope] to go to a child node,
|
|
182
182
|
# then continue operating on the child node.
|
|
183
183
|
#
|
|
184
|
-
# @param
|
|
184
|
+
# @param *child_node_names [Array] the name of the child nodes.
|
|
185
185
|
# @param block [Block] block code to continue operating on the matching nodes.
|
|
186
|
-
def goto_node(
|
|
187
|
-
Rewriter::GotoScope.new(self,
|
|
186
|
+
def goto_node(*child_node_names, &block)
|
|
187
|
+
Rewriter::GotoScope.new(self, *child_node_names, &block).process
|
|
188
188
|
end
|
|
189
189
|
|
|
190
190
|
# Parse if_exist_node dsl, it creates a [Synvert::Core::Rewriter::IfExistCondition] to check
|
|
@@ -285,6 +285,11 @@ module Synvert::Core
|
|
|
285
285
|
@rewriter.add_warning Rewriter::Warning.new(self, message)
|
|
286
286
|
end
|
|
287
287
|
|
|
288
|
+
# Any value but nil.
|
|
289
|
+
def any_value
|
|
290
|
+
Rewriter::AnyValue.new
|
|
291
|
+
end
|
|
292
|
+
|
|
288
293
|
private
|
|
289
294
|
|
|
290
295
|
# It changes source code from bottom to top, and it can change source code twice at the same time,
|
|
@@ -6,11 +6,11 @@ module Synvert::Core
|
|
|
6
6
|
# Initialize a scope
|
|
7
7
|
#
|
|
8
8
|
# @param instance [Synvert::Core::Rewriter::Instance]
|
|
9
|
-
# @param
|
|
9
|
+
# @param *child_node_names [Array]
|
|
10
10
|
# @param block [Block]
|
|
11
|
-
def initialize(instance,
|
|
11
|
+
def initialize(instance, *child_node_names, &block)
|
|
12
12
|
@instance = instance
|
|
13
|
-
@
|
|
13
|
+
@child_node_names = child_node_names
|
|
14
14
|
@block = block
|
|
15
15
|
end
|
|
16
16
|
|
|
@@ -19,7 +19,10 @@ module Synvert::Core
|
|
|
19
19
|
current_node = @instance.current_node
|
|
20
20
|
return unless current_node
|
|
21
21
|
|
|
22
|
-
child_node =
|
|
22
|
+
child_node = current_node
|
|
23
|
+
@child_node_names.each do |child_node_name|
|
|
24
|
+
child_node = child_node_name.is_a?(Parser::AST::Node) ? child_node_name : child_node.send(child_node_name)
|
|
25
|
+
end
|
|
23
26
|
@instance.process_with_other_node child_node do
|
|
24
27
|
@instance.instance_eval(&@block)
|
|
25
28
|
end
|
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
|
|
@@ -333,6 +333,18 @@ describe Parser::AST::Node do
|
|
|
333
333
|
end
|
|
334
334
|
end
|
|
335
335
|
|
|
336
|
+
describe 'key value by method_missing' do
|
|
337
|
+
it 'gets for key value' do
|
|
338
|
+
node = parse('{:foo => :bar}')
|
|
339
|
+
expect(node.foo_value).to eq :bar
|
|
340
|
+
|
|
341
|
+
node = parse("{'foo' => 'bar'}")
|
|
342
|
+
expect(node.foo_value).to eq 'bar'
|
|
343
|
+
|
|
344
|
+
expect(node.bar_value).to be_nil
|
|
345
|
+
end
|
|
346
|
+
end
|
|
347
|
+
|
|
336
348
|
describe '#recursive_children' do
|
|
337
349
|
it 'iterates all children recursively' do
|
|
338
350
|
node = parse('class Synvert; def current_node; @node; end; end')
|
|
@@ -392,6 +404,18 @@ describe Parser::AST::Node do
|
|
|
392
404
|
node = parse(source)
|
|
393
405
|
expect(node).not_to be_match(type: 'class', name: { not: 'Synvert' })
|
|
394
406
|
end
|
|
407
|
+
|
|
408
|
+
it 'matches in' do
|
|
409
|
+
source = 'FactoryBot.create(:user)'
|
|
410
|
+
node = parse(source)
|
|
411
|
+
expect(node).to be_match(type: 'send', message: { in: %i[create build] })
|
|
412
|
+
end
|
|
413
|
+
|
|
414
|
+
it 'matches not_in' do
|
|
415
|
+
source = 'FactoryBot.create(:user)'
|
|
416
|
+
node = parse(source)
|
|
417
|
+
expect(node).not_to be_match(type: 'send', message: { not_in: %i[create build] })
|
|
418
|
+
end
|
|
395
419
|
end
|
|
396
420
|
|
|
397
421
|
describe '#child_node_range' do
|
|
@@ -407,6 +431,12 @@ describe Parser::AST::Node do
|
|
|
407
431
|
range = node.child_node_range(:arguments)
|
|
408
432
|
expect(range.to_range).to eq(25...29)
|
|
409
433
|
end
|
|
434
|
+
|
|
435
|
+
it 'checks pipe' do
|
|
436
|
+
node = parse('Factory.define :user do |user|; end')
|
|
437
|
+
range = node.child_node_range(:pipe)
|
|
438
|
+
expect(range.to_range).to eq(24...30)
|
|
439
|
+
end
|
|
410
440
|
end
|
|
411
441
|
|
|
412
442
|
context 'class node' do
|
|
@@ -536,7 +566,7 @@ describe Parser::AST::Node do
|
|
|
536
566
|
expect(node.rewritten_source('{{name}}')).to eq 'Synvert'
|
|
537
567
|
end
|
|
538
568
|
|
|
539
|
-
it 'rewrites for
|
|
569
|
+
it 'rewrites for arguments' do
|
|
540
570
|
source = 'test { |a, b| }'
|
|
541
571
|
node = parse(source)
|
|
542
572
|
expect(node.rewritten_source('{{arguments}}')).to eq 'a, b'
|
|
@@ -5,18 +5,18 @@ require 'spec_helper'
|
|
|
5
5
|
module Synvert::Core
|
|
6
6
|
describe Rewriter::DeleteAction do
|
|
7
7
|
subject {
|
|
8
|
-
source =
|
|
8
|
+
source = 'arr.map {}.flatten'
|
|
9
9
|
node = Parser::CurrentRuby.parse(source)
|
|
10
10
|
instance = double(current_node: node)
|
|
11
11
|
Rewriter::DeleteAction.new(instance, :dot, :message)
|
|
12
12
|
}
|
|
13
13
|
|
|
14
14
|
it 'gets begin_pos' do
|
|
15
|
-
expect(subject.begin_pos).to eq
|
|
15
|
+
expect(subject.begin_pos).to eq 'arr.map {}'.length
|
|
16
16
|
end
|
|
17
17
|
|
|
18
18
|
it 'gets end_pos' do
|
|
19
|
-
expect(subject.end_pos).to eq
|
|
19
|
+
expect(subject.end_pos).to eq 'arr.map {}.flatten'.length
|
|
20
20
|
end
|
|
21
21
|
|
|
22
22
|
it 'gets rewritten_code' do
|
|
@@ -6,7 +6,7 @@ module Synvert::Core
|
|
|
6
6
|
describe Rewriter::ReplaceAction do
|
|
7
7
|
context 'replace with single line' do
|
|
8
8
|
subject {
|
|
9
|
-
source =
|
|
9
|
+
source = 'FactoryBot.create(:user)'
|
|
10
10
|
node = Parser::CurrentRuby.parse(source)
|
|
11
11
|
instance = double(current_node: node)
|
|
12
12
|
Rewriter::ReplaceAction.new(instance, :receiver, :dot, :message, with: 'create')
|
|
@@ -17,7 +17,7 @@ module Synvert::Core
|
|
|
17
17
|
end
|
|
18
18
|
|
|
19
19
|
it 'gets end_pos' do
|
|
20
|
-
expect(subject.end_pos).to eq
|
|
20
|
+
expect(subject.end_pos).to eq 'FactoryBot.create'.length
|
|
21
21
|
end
|
|
22
22
|
|
|
23
23
|
it 'gets rewritten_code' do
|
|
@@ -54,9 +54,9 @@ module Synvert::Core
|
|
|
54
54
|
it 'parses goto_node' do
|
|
55
55
|
scope = double
|
|
56
56
|
block = proc {}
|
|
57
|
-
expect(Rewriter::GotoScope).to receive(:new).with(instance, :caller, &block).and_return(scope)
|
|
57
|
+
expect(Rewriter::GotoScope).to receive(:new).with(instance, :caller, :receiver, &block).and_return(scope)
|
|
58
58
|
expect(scope).to receive(:process)
|
|
59
|
-
instance.goto_node(:caller, &block)
|
|
59
|
+
instance.goto_node(:caller, :receiver, &block)
|
|
60
60
|
end
|
|
61
61
|
|
|
62
62
|
it 'parses if_exist_node' do
|
|
@@ -8,12 +8,11 @@ module Synvert::Core
|
|
|
8
8
|
rewriter = Rewriter.new('foo', 'bar')
|
|
9
9
|
Rewriter::Instance.new(rewriter, 'file pattern')
|
|
10
10
|
}
|
|
11
|
-
let(:source) {
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
}
|
|
11
|
+
let(:source) { <<~EOS }
|
|
12
|
+
Factory.define :user do |user|
|
|
13
|
+
end
|
|
14
|
+
EOS
|
|
15
|
+
|
|
17
16
|
let(:node) { Parser::CurrentRuby.parse(source) }
|
|
18
17
|
before do
|
|
19
18
|
Rewriter::Instance.reset
|
|
@@ -25,13 +24,13 @@ end
|
|
|
25
24
|
run = false
|
|
26
25
|
type_in_scope = nil
|
|
27
26
|
scope =
|
|
28
|
-
Rewriter::GotoScope.new instance, :caller do
|
|
27
|
+
Rewriter::GotoScope.new instance, :caller, :receiver do
|
|
29
28
|
run = true
|
|
30
29
|
type_in_scope = node.type
|
|
31
30
|
end
|
|
32
31
|
scope.process
|
|
33
32
|
expect(run).to be_truthy
|
|
34
|
-
expect(type_in_scope).to eq :
|
|
33
|
+
expect(type_in_scope).to eq :const
|
|
35
34
|
expect(instance.current_node.type).to eq :block
|
|
36
35
|
end
|
|
37
36
|
end
|
data/synvert-core.gemspec
CHANGED
|
@@ -21,7 +21,7 @@ Gem::Specification.new do |spec|
|
|
|
21
21
|
|
|
22
22
|
spec.add_runtime_dependency "activesupport"
|
|
23
23
|
spec.add_runtime_dependency "erubis"
|
|
24
|
-
spec.add_runtime_dependency "parser"
|
|
24
|
+
spec.add_runtime_dependency "parser"
|
|
25
25
|
|
|
26
26
|
spec.add_development_dependency "bundler"
|
|
27
27
|
spec.add_development_dependency "guard"
|
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.32.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-07 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: activesupport
|
|
@@ -42,16 +42,16 @@ dependencies:
|
|
|
42
42
|
name: parser
|
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
|
44
44
|
requirements:
|
|
45
|
-
- - "
|
|
45
|
+
- - ">="
|
|
46
46
|
- !ruby/object:Gem::Version
|
|
47
|
-
version:
|
|
47
|
+
version: '0'
|
|
48
48
|
type: :runtime
|
|
49
49
|
prerelease: false
|
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
|
51
51
|
requirements:
|
|
52
|
-
- - "
|
|
52
|
+
- - ">="
|
|
53
53
|
- !ruby/object:Gem::Version
|
|
54
|
-
version:
|
|
54
|
+
version: '0'
|
|
55
55
|
- !ruby/object:Gem::Dependency
|
|
56
56
|
name: bundler
|
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -154,6 +154,7 @@ files:
|
|
|
154
154
|
- lib/synvert/core/rewriter/action/replace_action.rb
|
|
155
155
|
- lib/synvert/core/rewriter/action/replace_erb_stmt_with_expr_action.rb
|
|
156
156
|
- lib/synvert/core/rewriter/action/replace_with_action.rb
|
|
157
|
+
- lib/synvert/core/rewriter/any_value.rb
|
|
157
158
|
- lib/synvert/core/rewriter/condition.rb
|
|
158
159
|
- lib/synvert/core/rewriter/condition/if_exist_condition.rb
|
|
159
160
|
- lib/synvert/core/rewriter/condition/if_only_exist_condition.rb
|
|
@@ -213,7 +214,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
213
214
|
- !ruby/object:Gem::Version
|
|
214
215
|
version: '0'
|
|
215
216
|
requirements: []
|
|
216
|
-
rubygems_version: 3.1.
|
|
217
|
+
rubygems_version: 3.1.6
|
|
217
218
|
signing_key:
|
|
218
219
|
specification_version: 4
|
|
219
220
|
summary: convert ruby code to better syntax.
|