synvert-core 0.15.1 → 0.18.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.
Files changed (58) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +12 -2
  3. data/Gemfile +2 -0
  4. data/Guardfile +2 -0
  5. data/Rakefile +2 -0
  6. data/lib/synvert/core.rb +2 -3
  7. data/lib/synvert/core/configuration.rb +2 -1
  8. data/lib/synvert/core/engine.rb +1 -1
  9. data/lib/synvert/core/engine/erb.rb +31 -23
  10. data/lib/synvert/core/exceptions.rb +5 -3
  11. data/lib/synvert/core/node_ext.rb +107 -101
  12. data/lib/synvert/core/rewriter.rb +20 -14
  13. data/lib/synvert/core/rewriter/action.rb +5 -7
  14. data/lib/synvert/core/rewriter/action/append_action.rb +8 -6
  15. data/lib/synvert/core/rewriter/action/insert_action.rb +18 -19
  16. data/lib/synvert/core/rewriter/action/insert_after_action.rb +2 -2
  17. data/lib/synvert/core/rewriter/action/remove_action.rb +2 -2
  18. data/lib/synvert/core/rewriter/action/replace_erb_stmt_with_expr_action.rb +5 -4
  19. data/lib/synvert/core/rewriter/action/replace_with_action.rb +7 -5
  20. data/lib/synvert/core/rewriter/condition.rb +1 -1
  21. data/lib/synvert/core/rewriter/condition/if_exist_condition.rb +2 -2
  22. data/lib/synvert/core/rewriter/condition/if_only_exist_condition.rb +2 -3
  23. data/lib/synvert/core/rewriter/condition/unless_exist_condition.rb +2 -2
  24. data/lib/synvert/core/rewriter/gem_spec.rb +10 -10
  25. data/lib/synvert/core/rewriter/helper.rb +4 -6
  26. data/lib/synvert/core/rewriter/instance.rb +36 -22
  27. data/lib/synvert/core/rewriter/ruby_version.rb +1 -1
  28. data/lib/synvert/core/rewriter/scope.rb +1 -1
  29. data/lib/synvert/core/rewriter/scope/goto_scope.rb +2 -1
  30. data/lib/synvert/core/rewriter/scope/within_scope.rb +23 -7
  31. data/lib/synvert/core/rewriter/warning.rb +1 -1
  32. data/lib/synvert/core/version.rb +2 -2
  33. data/spec/spec_helper.rb +3 -1
  34. data/spec/support/parser_helper.rb +2 -0
  35. data/spec/synvert/core/configuration_spec.rb +3 -1
  36. data/spec/synvert/core/engine/erb_spec.rb +32 -30
  37. data/spec/synvert/core/node_ext_spec.rb +57 -54
  38. data/spec/synvert/core/rewriter/action/append_action_spec.rb +2 -0
  39. data/spec/synvert/core/rewriter/action/insert_action_spec.rb +10 -8
  40. data/spec/synvert/core/rewriter/action/insert_after_action_spec.rb +5 -3
  41. data/spec/synvert/core/rewriter/action/remove_action_spec.rb +3 -1
  42. data/spec/synvert/core/rewriter/action/replace_erb_stmt_with_expr_action_spec.rb +2 -0
  43. data/spec/synvert/core/rewriter/action/replace_with_action_spec.rb +17 -11
  44. data/spec/synvert/core/rewriter/action_spec.rb +2 -0
  45. data/spec/synvert/core/rewriter/condition/if_exist_condition_spec.rb +19 -9
  46. data/spec/synvert/core/rewriter/condition/if_only_exist_condition_spec.rb +23 -12
  47. data/spec/synvert/core/rewriter/condition/unless_exist_condition_spec.rb +19 -9
  48. data/spec/synvert/core/rewriter/condition_spec.rb +2 -0
  49. data/spec/synvert/core/rewriter/gem_spec_spec.rb +13 -10
  50. data/spec/synvert/core/rewriter/helper_spec.rb +36 -31
  51. data/spec/synvert/core/rewriter/instance_spec.rb +118 -66
  52. data/spec/synvert/core/rewriter/scope/goto_scope_spec.rb +10 -6
  53. data/spec/synvert/core/rewriter/scope/within_scope.rb +18 -9
  54. data/spec/synvert/core/rewriter/scope_spec.rb +2 -0
  55. data/spec/synvert/core/rewriter/warning_spec.rb +2 -0
  56. data/spec/synvert/core/rewriter_spec.rb +106 -73
  57. data/synvert-core.gemspec +2 -2
  58. metadata +12 -12
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 991ca9778419ac8a11db3c9828322a98538168b99ef4771a92db7ac97b472f8d
4
- data.tar.gz: 863462dccb67e99f09663630450004468dbb2278831cb21e6a1c9f4231498885
3
+ metadata.gz: a30d3e6c2241ca3fb2d35ead568fb24dc04db2d38a8faebb99eda33b0da7a354
4
+ data.tar.gz: f5d6ecdbcecbceabdf95ee474253b6e4ed0fc5cc5c52d25a7408d53ab54ccff0
5
5
  SHA512:
6
- metadata.gz: c452bfc0e989411e73ddaeeadf99d2929d9218ab7ff19ea2e54acbcc700b3a453fee082b3b0098b600860d1c398a2125c5edfffe8c4238f7d30df0f16324786e
7
- data.tar.gz: 31c1e7290e440e4dca4b6e16af84bc4c61f41203e256d4fff10c4543cb82ab4cb6e15a251e7747bde41a2b9823945bf98aa77d00f5df6abc66ff84aacb05f3cd
6
+ metadata.gz: b7a9a026022ba96e5140d3aa6976bdbc8448dffdc8539b946df41016daf5847bf2c75a1458c2b8184d73e2a50a40741be67e8c382b49b1c1df5adf9e7c2e29dd
7
+ data.tar.gz: 42d7d7249ba0047709013c61a14c3428728967ff701b738eaa261683dfdf44ea899a3235cf1a2adb034034bb0bd006d7ec6ce59c415abfaef263647d15cbeb21
data/CHANGELOG.md CHANGED
@@ -1,8 +1,18 @@
1
1
  # CHANGELOG
2
2
 
3
- ## 0.15.1 (2019-10-11)
3
+ ## 0.18.0 (2021-02-07)
4
4
 
5
- * Use parser 2.6.5.0
5
+ * Add `Rewriter.execute`
6
+
7
+ ## 0.17.0 (2021-01-29)
8
+
9
+ * Ignore `gem_spec` check if `Gemfile.lock` does not eixst
10
+
11
+ ## 0.16.0 (2021-01-17)
12
+
13
+ * Use parser 3.0.0
14
+ * Fix magic number
15
+ * Add `within_direct_node` scope
6
16
 
7
17
  ## 0.15.0 (2018-05-23)
8
18
 
data/Gemfile CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  source 'https://rubygems.org'
2
4
 
3
5
  # Specify your gem's dependencies in synvert.gemspec
data/Guardfile CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  guard :rspec, cmd: 'bundle exec rspec' do
2
4
  watch(%r{^spec/.+_spec\.rb$})
3
5
  watch(%r{^lib/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
data/Rakefile CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "bundler/gem_tasks"
2
4
  require 'rspec/core/rake_task'
3
5
 
data/lib/synvert/core.rb CHANGED
@@ -1,7 +1,6 @@
1
- require "synvert/core/version"
1
+ # frozen_string_literal: true
2
2
 
3
- # coding: utf-8
4
- require "synvert/core/version"
3
+ require 'synvert/core/version'
5
4
  require 'bundler'
6
5
  require 'parser'
7
6
  require 'parser/current'
@@ -1,4 +1,5 @@
1
- # encoding: utf-8
1
+ # frozen_string_literal: true
2
+
2
3
  require 'singleton'
3
4
 
4
5
  module Synvert::Core
@@ -1,4 +1,4 @@
1
- # encoding: utf-8
1
+ # frozen_string_literal: true
2
2
 
3
3
  module Synvert::Core
4
4
  # Engine defines how to encode / decode other files (like erb).
@@ -1,19 +1,20 @@
1
- # encoding: utf-8
1
+ # frozen_string_literal: true
2
+
2
3
  require 'erubis'
3
4
 
4
5
  module Synvert::Core
5
6
  module Engine
6
- ERUBY_EXPR_SPLITTER = "; ;"
7
- ERUBY_STMT_SPLITTER = "; ;"
7
+ ERUBY_EXPR_SPLITTER = '; ;'
8
+ ERUBY_STMT_SPLITTER = '; ;'
8
9
 
9
10
  class ERB
10
- class <<self
11
+ class << self
11
12
  # convert erb to ruby code.
12
13
  #
13
14
  # @param source [String] erb source code.
14
15
  # @return [String] ruby source code.
15
16
  def encode(source)
16
- Erubis.new(source.gsub("-%>", "%>"), :escape => false, :trim => false).src
17
+ Erubis.new(source.gsub('-%>', '%>'), escape: false, trim: false).src
17
18
  end
18
19
 
19
20
  # convert ruby code to erb.
@@ -27,25 +28,30 @@ module Synvert::Core
27
28
  source = remove_erubis_buf(source)
28
29
  end
29
30
 
30
- private
31
+ private
31
32
 
32
33
  def decode_ruby_stmt(source)
33
34
  source.gsub(/#{ERUBY_STMT_SPLITTER}(.+?)#{ERUBY_STMT_SPLITTER}/m) { "<%#{$1}%>" }
34
35
  end
35
36
 
36
37
  def decode_ruby_output(source)
37
- source.gsub(/@output_buffer.append=\((.+?)\);#{ERUBY_EXPR_SPLITTER}/m) { "<%=#{$1}%>" }
38
- .gsub(/@output_buffer.append= (.+?)\s+(do|\{)(\s*\|[^|]*\|)?\s*#{ERUBY_EXPR_SPLITTER}/m) { |m| "<%=#{m.sub("@output_buffer.append= ", "").sub(ERUBY_EXPR_SPLITTER, "")}%>" }
38
+ source.gsub(/@output_buffer.append=\((.+?)\);#{ERUBY_EXPR_SPLITTER}/m) { "<%=#{$1}%>" }.gsub(
39
+ /@output_buffer.append= (.+?)\s+(do|\{)(\s*\|[^|]*\|)?\s*#{ERUBY_EXPR_SPLITTER}/m
40
+ ) { |m| "<%=#{m.sub('@output_buffer.append= ', '').sub(ERUBY_EXPR_SPLITTER, '')}%>" }
39
41
  end
40
42
 
41
43
  def decode_html_output(source)
42
- source.gsub(/@output_buffer.safe_append='(.+?)'.freeze;/m) { reverse_escape_text($1) }
43
- .gsub(/@output_buffer.safe_append=\((.+?)\);#{ERUBY_EXPR_SPLITTER}/m) { reverse_escape_text($1) }
44
- .gsub(/@output_buffer.safe_append=(.+?)\s+(do|\{)(\s*\|[^|]*\|)?\s*#{ERUBY_EXPR_SPLITTER}/m) { reverse_escape_text($1) }
44
+ source.gsub(/@output_buffer.safe_append='(.+?)'.freeze;/m) { reverse_escape_text($1) }.gsub(
45
+ /@output_buffer.safe_append=\((.+?)\);#{ERUBY_EXPR_SPLITTER}/m
46
+ ) { reverse_escape_text($1) }.gsub(
47
+ /@output_buffer.safe_append=(.+?)\s+(do|\{)(\s*\|[^|]*\|)?\s*#{ERUBY_EXPR_SPLITTER}/m
48
+ ) { reverse_escape_text($1) }
45
49
  end
46
50
 
47
51
  def remove_erubis_buf(source)
48
- source.sub("@output_buffer = output_buffer || ActionView::OutputBuffer.new;", "").sub("@output_buffer.to_s", "")
52
+ source
53
+ .sub('@output_buffer = output_buffer || ActionView::OutputBuffer.new;', '')
54
+ .sub('@output_buffer.to_s', '')
49
55
  end
50
56
 
51
57
  def reverse_escape_text(source)
@@ -58,7 +64,7 @@ module Synvert::Core
58
64
  class Erubis < ::Erubis::Eruby
59
65
  def add_preamble(src)
60
66
  @newline_pending = 0
61
- src << "@output_buffer = output_buffer || ActionView::OutputBuffer.new;"
67
+ src << '@output_buffer = output_buffer || ActionView::OutputBuffer.new;'
62
68
  end
63
69
 
64
70
  def add_text(src, text)
@@ -101,22 +107,24 @@ module Synvert::Core
101
107
  def add_expr_escaped(src, code)
102
108
  flush_newline_if_pending(src)
103
109
  if code =~ BLOCK_EXPR
104
- src << "@output_buffer.safe_append= " << code << ERUBY_EXPR_SPLITTER
110
+ src << '@output_buffer.safe_append= ' << code << ERUBY_EXPR_SPLITTER
105
111
  else
106
- src << "@output_buffer.safe_append=(" << code << ");" << ERUBY_EXPR_SPLITTER
112
+ src << '@output_buffer.safe_append=(' << code << ');' << ERUBY_EXPR_SPLITTER
107
113
  end
108
114
  end
109
115
 
110
116
  def add_stmt(src, code)
111
117
  flush_newline_if_pending(src)
112
- if code != "\n" && code != ""
113
- index = if code =~ /\A(\s*)\r?\n/
114
- $1.length
115
- elsif code =~ /\A(\s+)/
116
- $1.end_with?(' ') ? $1.length - 1 : $1.length
117
- else
118
- 0
119
- end
118
+ if code != "\n" && code != ''
119
+ index =
120
+ case code
121
+ when /\A(\s*)\r?\n/
122
+ $1.length
123
+ when /\A(\s+)/
124
+ $1.end_with?(' ') ? $1.length - 1 : $1.length
125
+ else
126
+ 0
127
+ end
120
128
  code.insert(index, ERUBY_STMT_SPLITTER)
121
129
  code.insert(-1, ERUBY_STMT_SPLITTER[0...-1])
122
130
  end
@@ -1,13 +1,15 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Synvert::Core
2
4
  # Rewriter not found exception.
3
- class RewriterNotFound < Exception
5
+ class RewriterNotFound < RuntimeError
4
6
  end
5
7
 
6
8
  # Gemfile.lock not found exception.
7
- class GemfileLockNotFound < Exception
9
+ class GemfileLockNotFound < RuntimeError
8
10
  end
9
11
 
10
12
  # Method not supported exception.
11
- class MethodNotSupported < Exception
13
+ class MethodNotSupported < RuntimeError
12
14
  end
13
15
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Parser::AST
2
4
  # ArgumentsNode allows to handle all args as one node or handle all args as an array.
3
5
  class ArgumentsNode
@@ -29,15 +31,15 @@ module Parser::AST
29
31
  # @return [Parser::AST::Node] name node.
30
32
  # @raise [Synvert::Core::MethodNotSupported] if calls on other node.
31
33
  def name
32
- case self.type
34
+ case type
33
35
  when :class, :module, :def, :arg, :blockarg, :restarg
34
- self.children[0]
36
+ children[0]
35
37
  when :defs, :const
36
- self.children[1]
38
+ children[1]
37
39
  when :mlhs
38
40
  self
39
41
  else
40
- raise Synvert::Core::MethodNotSupported.new "name is not handled for #{self.debug_info}"
42
+ raise Synvert::Core::MethodNotSupported, "name is not handled for #{debug_info}"
41
43
  end
42
44
  end
43
45
 
@@ -46,10 +48,10 @@ module Parser::AST
46
48
  # @return [Parser::AST::Node] parent_class node.
47
49
  # @raise [Synvert::Core::MethodNotSupported] if calls on other node.
48
50
  def parent_class
49
- if :class == self.type
50
- self.children[1]
51
+ if :class == type
52
+ children[1]
51
53
  else
52
- raise Synvert::Core::MethodNotSupported.new "parent_class is not handled for #{self.debug_info}"
54
+ raise Synvert::Core::MethodNotSupported, "parent_class is not handled for #{debug_info}"
53
55
  end
54
56
  end
55
57
 
@@ -58,10 +60,10 @@ module Parser::AST
58
60
  # @return [Parser::AST::Node] parent const node.
59
61
  # @raise [Synvert::Core::MethodNotSupported] if calls on other node.
60
62
  def parent_const
61
- if :const == self.type
62
- self.children[0]
63
+ if :const == type
64
+ children[0]
63
65
  else
64
- raise Synvert::Core::MethodNotSupported.new "parent_const is not handled for #{self.debug_info}"
66
+ raise Synvert::Core::MethodNotSupported, "parent_const is not handled for #{debug_info}"
65
67
  end
66
68
  end
67
69
 
@@ -70,10 +72,10 @@ module Parser::AST
70
72
  # @return [Parser::AST::Node] receiver node.
71
73
  # @raise [Synvert::Core::MethodNotSupported] if calls on other node.
72
74
  def receiver
73
- if :send == self.type
74
- self.children[0]
75
+ if :send == type
76
+ children[0]
75
77
  else
76
- raise Synvert::Core::MethodNotSupported.new "receiver is not handled for #{self.debug_info}"
78
+ raise Synvert::Core::MethodNotSupported, "receiver is not handled for #{debug_info}"
77
79
  end
78
80
  end
79
81
 
@@ -82,13 +84,13 @@ module Parser::AST
82
84
  # @return [Parser::AST::Node] mesage node.
83
85
  # @raise [Synvert::Core::MethodNotSupported] if calls on other node.
84
86
  def message
85
- case self.type
87
+ case type
86
88
  when :super, :zsuper
87
89
  :super
88
90
  when :send
89
- self.children[1]
91
+ children[1]
90
92
  else
91
- raise Synvert::Core::MethodNotSupported.new "message is not handled for #{self.debug_info}"
93
+ raise Synvert::Core::MethodNotSupported, "message is not handled for #{debug_info}"
92
94
  end
93
95
  end
94
96
 
@@ -97,17 +99,17 @@ module Parser::AST
97
99
  # @return [Array<Parser::AST::Node>] arguments node.
98
100
  # @raise [Synvert::Core::MethodNotSupported] if calls on other node.
99
101
  def arguments
100
- case self.type
102
+ case type
101
103
  when :def, :block
102
- ArgumentsNode.new self.children[1]
104
+ ArgumentsNode.new children[1]
103
105
  when :defs
104
- ArgumentsNode.new self.children[2]
106
+ ArgumentsNode.new children[2]
105
107
  when :send
106
- self.children[2..-1]
108
+ children[2..-1]
107
109
  when :defined?
108
- self.children
110
+ children
109
111
  else
110
- raise Synvert::Core::MethodNotSupported.new "arguments is not handled for #{self.debug_info}"
112
+ raise Synvert::Core::MethodNotSupported, "arguments is not handled for #{debug_info}"
111
113
  end
112
114
  end
113
115
 
@@ -116,10 +118,10 @@ module Parser::AST
116
118
  # @return [Parser::AST::Node] caller node.
117
119
  # @raise [Synvert::Core::MethodNotSupported] if calls on other node.
118
120
  def caller
119
- if :block == self.type
120
- self.children[0]
121
+ if :block == type
122
+ children[0]
121
123
  else
122
- raise Synvert::Core::MethodNotSupported.new "caller is not handled for #{self.debug_info}"
124
+ raise Synvert::Core::MethodNotSupported, "caller is not handled for #{debug_info}"
123
125
  end
124
126
  end
125
127
 
@@ -128,17 +130,19 @@ module Parser::AST
128
130
  # @return [Array<Parser::AST::Node>] body node.
129
131
  # @raise [Synvert::Core::MethodNotSupported] if calls on other node.
130
132
  def body
131
- case self.type
133
+ case type
132
134
  when :begin
133
- self.children
135
+ children
134
136
  when :def, :block
135
- return [] if self.children[2].nil?
136
- :begin == self.children[2].type ? self.children[2].body : self.children[2..-1]
137
+ return [] if children[2].nil?
138
+
139
+ :begin == children[2].type ? children[2].body : children[2..-1]
137
140
  when :defs
138
- return [] if self.children[3].nil?
139
- :begin == self.children[3].type ? self.children[3].body : self.children[3..-1]
141
+ return [] if children[3].nil?
142
+
143
+ :begin == children[3].type ? children[3].body : children[3..-1]
140
144
  else
141
- raise Synvert::Core::MethodNotSupported.new "body is not handled for #{self.debug_info}"
145
+ raise Synvert::Core::MethodNotSupported, "body is not handled for #{debug_info}"
142
146
  end
143
147
  end
144
148
 
@@ -147,10 +151,10 @@ module Parser::AST
147
151
  # @return [Parser::AST::Node] condition node.
148
152
  # @raise [Synvert::Core::MethodNotSupported] if calls on other node.
149
153
  def condition
150
- if :if == self.type
151
- self.children[0]
154
+ if :if == type
155
+ children[0]
152
156
  else
153
- raise Synvert::Core::MethodNotSupported.new "condition is not handled for #{self.debug_info}"
157
+ raise Synvert::Core::MethodNotSupported, "condition is not handled for #{debug_info}"
154
158
  end
155
159
  end
156
160
 
@@ -159,10 +163,10 @@ module Parser::AST
159
163
  # @return [Array<Parser::AST::Node>] keys node.
160
164
  # @raise [Synvert::Core::MethodNotSupported] if calls on other node.
161
165
  def keys
162
- if :hash == self.type
163
- self.children.map { |child| child.children[0] }
166
+ if :hash == type
167
+ children.map { |child| child.children[0] }
164
168
  else
165
- raise Synvert::Core::MethodNotSupported.new "keys is not handled for #{self.debug_info}"
169
+ raise Synvert::Core::MethodNotSupported, "keys is not handled for #{debug_info}"
166
170
  end
167
171
  end
168
172
 
@@ -171,10 +175,10 @@ module Parser::AST
171
175
  # @return [Array<Parser::AST::Node>] values node.
172
176
  # @raise [Synvert::Core::MethodNotSupported] if calls on other node.
173
177
  def values
174
- if :hash == self.type
175
- self.children.map { |child| child.children[1] }
178
+ if :hash == type
179
+ children.map { |child| child.children[1] }
176
180
  else
177
- raise Synvert::Core::MethodNotSupported.new "keys is not handled for #{self.debug_info}"
181
+ raise Synvert::Core::MethodNotSupported, "keys is not handled for #{debug_info}"
178
182
  end
179
183
  end
180
184
 
@@ -184,10 +188,10 @@ module Parser::AST
184
188
  # @return [Boolean] true if specified key exists.
185
189
  # @raise [Synvert::Core::MethodNotSupported] if calls on other node.
186
190
  def has_key?(key)
187
- if :hash == self.type
188
- self.children.any? { |pair_node| pair_node.key.to_value == key }
191
+ if :hash == type
192
+ children.any? { |pair_node| pair_node.key.to_value == key }
189
193
  else
190
- raise Synvert::Core::MethodNotSupported.new "has_key? is not handled for #{self.debug_info}"
194
+ raise Synvert::Core::MethodNotSupported, "has_key? is not handled for #{debug_info}"
191
195
  end
192
196
  end
193
197
 
@@ -197,11 +201,11 @@ module Parser::AST
197
201
  # @return [Parser::AST::Node] value node.
198
202
  # @raise [Synvert::Core::MethodNotSupported] if calls on other node.
199
203
  def hash_value(key)
200
- if :hash == self.type
201
- value_node = self.children.find { |pair_node| pair_node.key.to_value == key }
204
+ if :hash == type
205
+ value_node = children.find { |pair_node| pair_node.key.to_value == key }
202
206
  value_node ? value_node.value : nil
203
207
  else
204
- raise Synvert::Core::MethodNotSupported.new "has_key? is not handled for #{self.debug_info}"
208
+ raise Synvert::Core::MethodNotSupported, "has_key? is not handled for #{debug_info}"
205
209
  end
206
210
  end
207
211
 
@@ -210,10 +214,10 @@ module Parser::AST
210
214
  # @return [Parser::AST::Node] key node.
211
215
  # @raise [Synvert::Core::MethodNotSupported] if calls on other node.
212
216
  def key
213
- if :pair == self.type
214
- self.children.first
217
+ if :pair == type
218
+ children.first
215
219
  else
216
- raise Synvert::Core::MethodNotSupported.new "key is not handled for #{self.debug_info}"
220
+ raise Synvert::Core::MethodNotSupported, "key is not handled for #{debug_info}"
217
221
  end
218
222
  end
219
223
 
@@ -222,10 +226,10 @@ module Parser::AST
222
226
  # @return [Parser::AST::Node] value node.
223
227
  # @raise [Synvert::Core::MethodNotSupported] if calls on other node.
224
228
  def value
225
- if :pair == self.type
226
- self.children.last
229
+ if :pair == type
230
+ children.last
227
231
  else
228
- raise Synvert::Core::MethodNotSupported.new "value is not handled for #{self.debug_info}"
232
+ raise Synvert::Core::MethodNotSupported, "value is not handled for #{debug_info}"
229
233
  end
230
234
  end
231
235
 
@@ -234,10 +238,10 @@ module Parser::AST
234
238
  # @return [Parser::AST::Node] variable nodes.
235
239
  # @raise [Synvert::Core::MethodNotSupported] if calls on other node.
236
240
  def left_value
237
- if [:masgn, :lvasgn, :ivasgn].include? self.type
238
- self.children[0]
241
+ if %i[masgn lvasgn ivasgn].include? type
242
+ children[0]
239
243
  else
240
- raise Synvert::Core::MethodNotSupported.new "left_value is not handled for #{self.debug_info}"
244
+ raise Synvert::Core::MethodNotSupported, "left_value is not handled for #{debug_info}"
241
245
  end
242
246
  end
243
247
 
@@ -246,10 +250,10 @@ module Parser::AST
246
250
  # @return [Array<Parser::AST::Node>] variable nodes.
247
251
  # @raise [Synvert::Core::MethodNotSupported] if calls on other node.
248
252
  def right_value
249
- if [:masgn, :lvasgn, :ivasgn].include? self.type
250
- self.children[1]
253
+ if %i[masgn lvasgn ivasgn].include? type
254
+ children[1]
251
255
  else
252
- raise Synvert::Core::MethodNotSupported.new "right_value is not handled for #{self.debug_info}"
256
+ raise Synvert::Core::MethodNotSupported, "right_value is not handled for #{debug_info}"
253
257
  end
254
258
  end
255
259
 
@@ -258,60 +262,59 @@ module Parser::AST
258
262
  # @return [Object] exact value.
259
263
  # @raise [Synvert::Core::MethodNotSupported] if calls on other node.
260
264
  def to_value
261
- case self.type
265
+ case type
262
266
  when :int, :str, :sym
263
- self.children.last
267
+ children.last
264
268
  when :true
265
269
  true
266
270
  when :false
267
271
  false
268
272
  when :array
269
- self.children.map(&:to_value)
273
+ children.map(&:to_value)
270
274
  when :irange
271
- (self.children.first.to_value..self.children.last.to_value)
275
+ (children.first.to_value..children.last.to_value)
272
276
  when :begin
273
- self.children.first.to_value
277
+ children.first.to_value
274
278
  else
275
- raise Synvert::Core::MethodNotSupported.new "to_value is not handled for #{self.debug_info}"
279
+ raise Synvert::Core::MethodNotSupported, "to_value is not handled for #{debug_info}"
276
280
  end
277
281
  end
278
282
 
279
283
  def to_s
280
- if :mlhs == self.type
281
- "(#{self.children.map(&:name).join(', ')})"
284
+ if :mlhs == type
285
+ "(#{children.map(&:name).join(', ')})"
282
286
  end
283
287
  end
284
288
 
285
289
  def debug_info
286
- "\n" + [
287
- "file: #{self.loc.expression.source_buffer.name}",
288
- "line: #{self.loc.expression.line}",
289
- "source: #{self.to_source}",
290
- "node: #{self.inspect}"
291
- ].join("\n")
290
+ "\n" +
291
+ [
292
+ "file: #{loc.expression.source_buffer.name}",
293
+ "line: #{loc.expression.line}",
294
+ "source: #{to_source}",
295
+ "node: #{inspect}"
296
+ ].join("\n")
292
297
  end
293
298
 
294
299
  # Get the source code of current node.
295
300
  #
296
301
  # @return [String] source code.
297
302
  def to_source
298
- if self.loc.expression
299
- self.loc.expression.source
300
- end
303
+ loc.expression&.source
301
304
  end
302
305
 
303
306
  # Get the indent of current node.
304
307
  #
305
308
  # @return [Integer] indent.
306
309
  def indent
307
- self.loc.expression.column
310
+ loc.expression.column
308
311
  end
309
312
 
310
313
  # Get the line of current node.
311
314
  #
312
315
  # @return [Integer] line.
313
316
  def line
314
- self.loc.expression.line
317
+ loc.expression.line
315
318
  end
316
319
 
317
320
  # Recursively iterate all child nodes of current node.
@@ -319,7 +322,7 @@ module Parser::AST
319
322
  # @yield [child] Gives a child node.
320
323
  # @yieldparam child [Parser::AST::Node] child node
321
324
  def recursive_children
322
- self.children.each do |child|
325
+ children.each do |child|
323
326
  if Parser::AST::Node === child
324
327
  yield child
325
328
  child.recursive_children { |c| yield c }
@@ -332,21 +335,24 @@ module Parser::AST
332
335
  # @param rules [Hash] rules to match.
333
336
  # @return true if matches.
334
337
  def match?(rules)
335
- flat_hash(rules).keys.all? do |multi_keys|
336
- if multi_keys.last == :any
337
- actual_values = actual_value(self, multi_keys[0...-1])
338
- expected = expected_value(rules, multi_keys)
339
- actual_values.any? { |actual| match_value?(actual, expected) }
340
- elsif multi_keys.last == :not
341
- actual = actual_value(self, multi_keys[0...-1])
342
- expected = expected_value(rules, multi_keys)
343
- !match_value?(actual, expected)
344
- else
345
- actual = actual_value(self, multi_keys)
346
- expected = expected_value(rules, multi_keys)
347
- match_value?(actual, expected)
338
+ flat_hash(rules)
339
+ .keys
340
+ .all? do |multi_keys|
341
+ case multi_keys.last
342
+ when :any
343
+ actual_values = actual_value(self, multi_keys[0...-1])
344
+ expected = expected_value(rules, multi_keys)
345
+ actual_values.any? { |actual| match_value?(actual, expected) }
346
+ when :not
347
+ actual = actual_value(self, multi_keys[0...-1])
348
+ expected = expected_value(rules, multi_keys)
349
+ !match_value?(actual, expected)
350
+ else
351
+ actual = actual_value(self, multi_keys)
352
+ expected = expected_value(rules, multi_keys)
353
+ match_value?(actual, expected)
354
+ end
348
355
  end
349
- end
350
356
  end
351
357
 
352
358
  # Get rewritten source code.
@@ -359,8 +365,8 @@ module Parser::AST
359
365
  def rewritten_source(code)
360
366
  code.gsub(/{{(.*?)}}/m) do
361
367
  old_code = $1
362
- if self.respond_to? old_code.split(/\.|\[/).first
363
- evaluated = self.instance_eval old_code
368
+ if respond_to? old_code.split(/\.|\[/).first
369
+ evaluated = instance_eval old_code
364
370
  case evaluated
365
371
  when Parser::AST::Node
366
372
  evaluated.loc.expression.source
@@ -373,7 +379,7 @@ module Parser::AST
373
379
  if lines_count > 1 && lines_count == evaluated.size
374
380
  new_code = []
375
381
  lines.each_with_index { |line, index|
376
- new_code << (index == 0 ? line : line[evaluated.first.indent-2..-1])
382
+ new_code << (index == 0 ? line : line[evaluated.first.indent - 2..-1])
377
383
  }
378
384
  new_code.join("\n")
379
385
  else
@@ -385,7 +391,7 @@ module Parser::AST
385
391
  when NilClass
386
392
  'nil'
387
393
  else
388
- raise Synvert::Core::MethodNotSupported.new "rewritten_source is not handled for #{evaluated.inspect}"
394
+ raise Synvert::Core::MethodNotSupported, "rewritten_source is not handled for #{evaluated.inspect}"
389
395
  end
390
396
  else
391
397
  "{{#{old_code}}}"
@@ -393,7 +399,7 @@ module Parser::AST
393
399
  end
394
400
  end
395
401
 
396
- private
402
+ private
397
403
 
398
404
  # Compare actual value with expected value.
399
405
  #
@@ -411,8 +417,7 @@ module Parser::AST
411
417
  end
412
418
  when String
413
419
  if Parser::AST::Node === actual
414
- actual.to_source == expected ||
415
- (actual.to_source[0] == ':' && actual.to_source[1..-1] == expected) ||
420
+ actual.to_source == expected || (actual.to_source[0] == ':' && actual.to_source[1..-1] == expected) ||
416
421
  actual.to_source[1...-1] == expected
417
422
  else
418
423
  actual.to_s == expected
@@ -425,6 +430,7 @@ module Parser::AST
425
430
  end
426
431
  when Array
427
432
  return false unless expected.length == actual.length
433
+
428
434
  actual.zip(expected).all? { |a, e| match_value?(a, e) }
429
435
  when NilClass
430
436
  actual.nil?
@@ -441,7 +447,7 @@ module Parser::AST
441
447
  when Parser::AST::Node
442
448
  actual == expected
443
449
  else
444
- raise Synvert::Core::MethodNotSupported.new "#{expected.class} is not handled for match_value?"
450
+ raise Synvert::Core::MethodNotSupported, "#{expected.class} is not handled for match_value?"
445
451
  end
446
452
  end
447
453