synvert-core 0.15.1 → 0.18.0

Sign up to get free protection for your applications and to get access to all the features.
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