rubocop 0.75.1 → 0.76.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 (85) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -1
  3. data/config/default.yml +52 -53
  4. data/lib/rubocop.rb +10 -9
  5. data/lib/rubocop/ast/builder.rb +1 -0
  6. data/lib/rubocop/ast/node.rb +4 -0
  7. data/lib/rubocop/ast/node/return_node.rb +24 -0
  8. data/lib/rubocop/cli.rb +7 -4
  9. data/lib/rubocop/comment_config.rb +2 -2
  10. data/lib/rubocop/config.rb +7 -0
  11. data/lib/rubocop/config_loader.rb +1 -1
  12. data/lib/rubocop/config_loader_resolver.rb +2 -1
  13. data/lib/rubocop/config_obsoletion.rb +9 -0
  14. data/lib/rubocop/config_validator.rb +24 -15
  15. data/lib/rubocop/cop/commissioner.rb +15 -7
  16. data/lib/rubocop/cop/cop.rb +10 -6
  17. data/lib/rubocop/cop/corrector.rb +8 -7
  18. data/lib/rubocop/cop/generator/configuration_injector.rb +1 -1
  19. data/lib/rubocop/cop/layout/align_hash.rb +6 -2
  20. data/lib/rubocop/cop/layout/comment_indentation.rb +10 -13
  21. data/lib/rubocop/cop/layout/empty_comment.rb +7 -16
  22. data/lib/rubocop/cop/layout/end_of_line.rb +8 -3
  23. data/lib/rubocop/cop/layout/indent_first_argument.rb +9 -7
  24. data/lib/rubocop/cop/layout/indent_first_hash_element.rb +1 -1
  25. data/lib/rubocop/cop/layout/multiline_assignment_layout.rb +1 -1
  26. data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +2 -0
  27. data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +9 -7
  28. data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +7 -4
  29. data/lib/rubocop/cop/layout/space_inside_parens.rb +6 -6
  30. data/lib/rubocop/cop/layout/trailing_whitespace.rb +18 -2
  31. data/lib/rubocop/cop/lint/erb_new_arguments.rb +9 -8
  32. data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +2 -2
  33. data/lib/rubocop/cop/lint/{unneeded_cop_disable_directive.rb → redundant_cop_disable_directive.rb} +23 -23
  34. data/lib/rubocop/cop/lint/{unneeded_cop_enable_directive.rb → redundant_cop_enable_directive.rb} +6 -8
  35. data/lib/rubocop/cop/lint/{unneeded_require_statement.rb → redundant_require_statement.rb} +1 -1
  36. data/lib/rubocop/cop/lint/{unneeded_splat_expansion.rb → redundant_splat_expansion.rb} +5 -5
  37. data/lib/rubocop/cop/lint/safe_navigation_chain.rb +5 -6
  38. data/lib/rubocop/cop/lint/void.rb +4 -4
  39. data/lib/rubocop/cop/metrics/abc_size.rb +1 -1
  40. data/lib/rubocop/cop/metrics/line_length.rb +1 -4
  41. data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +23 -6
  42. data/lib/rubocop/cop/mixin/method_complexity.rb +2 -1
  43. data/lib/rubocop/cop/mixin/statement_modifier.rb +5 -2
  44. data/lib/rubocop/cop/mixin/trailing_comma.rb +8 -6
  45. data/lib/rubocop/cop/naming/file_name.rb +12 -5
  46. data/lib/rubocop/cop/registry.rb +1 -1
  47. data/lib/rubocop/cop/style/attr.rb +2 -2
  48. data/lib/rubocop/cop/style/braces_around_hash_parameters.rb +6 -6
  49. data/lib/rubocop/cop/style/comment_annotation.rb +5 -5
  50. data/lib/rubocop/cop/style/copyright.rb +11 -7
  51. data/lib/rubocop/cop/style/double_cop_disable_directive.rb +2 -2
  52. data/lib/rubocop/cop/style/empty_case_condition.rb +2 -2
  53. data/lib/rubocop/cop/style/empty_literal.rb +2 -2
  54. data/lib/rubocop/cop/style/empty_method.rb +5 -5
  55. data/lib/rubocop/cop/style/format_string.rb +10 -7
  56. data/lib/rubocop/cop/style/format_string_token.rb +2 -0
  57. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +10 -0
  58. data/lib/rubocop/cop/style/hash_syntax.rb +2 -2
  59. data/lib/rubocop/cop/style/if_unless_modifier.rb +9 -2
  60. data/lib/rubocop/cop/style/infinite_loop.rb +4 -3
  61. data/lib/rubocop/cop/style/inverse_methods.rb +19 -13
  62. data/lib/rubocop/cop/style/line_end_concatenation.rb +14 -10
  63. data/lib/rubocop/cop/style/method_def_parentheses.rb +17 -9
  64. data/lib/rubocop/cop/style/multiline_when_then.rb +1 -1
  65. data/lib/rubocop/cop/style/nested_modifier.rb +4 -2
  66. data/lib/rubocop/cop/style/non_nil_check.rb +21 -9
  67. data/lib/rubocop/cop/style/{unneeded_capital_w.rb → redundant_capital_w.rb} +1 -1
  68. data/lib/rubocop/cop/style/{unneeded_condition.rb → redundant_condition.rb} +3 -3
  69. data/lib/rubocop/cop/style/{unneeded_interpolation.rb → redundant_interpolation.rb} +1 -1
  70. data/lib/rubocop/cop/style/{unneeded_percent_q.rb → redundant_percent_q.rb} +1 -1
  71. data/lib/rubocop/cop/style/redundant_return.rb +25 -21
  72. data/lib/rubocop/cop/style/{unneeded_sort.rb → redundant_sort.rb} +4 -4
  73. data/lib/rubocop/cop/style/safe_navigation.rb +13 -10
  74. data/lib/rubocop/cop/style/semicolon.rb +2 -2
  75. data/lib/rubocop/cop/style/special_global_vars.rb +5 -7
  76. data/lib/rubocop/cop/util.rb +1 -1
  77. data/lib/rubocop/cop/utils/format_string.rb +10 -18
  78. data/lib/rubocop/cop/variable_force.rb +7 -5
  79. data/lib/rubocop/node_pattern.rb +3 -1
  80. data/lib/rubocop/options.rb +12 -6
  81. data/lib/rubocop/result_cache.rb +1 -1
  82. data/lib/rubocop/runner.rb +32 -27
  83. data/lib/rubocop/target_finder.rb +12 -6
  84. data/lib/rubocop/version.rb +1 -1
  85. metadata +12 -11
@@ -64,17 +64,25 @@ module RuboCop
64
64
  end
65
65
 
66
66
  def remove_irrelevant_cops(filename)
67
- @cops.reject! { |cop| cop.excluded_file?(filename) }
68
67
  @cops.reject! do |cop|
69
- cop.class.respond_to?(:support_target_ruby_version?) &&
70
- !cop.class.support_target_ruby_version?(cop.target_ruby_version)
71
- end
72
- @cops.reject! do |cop|
73
- cop.class.respond_to?(:support_target_rails_version?) &&
74
- !cop.class.support_target_rails_version?(cop.target_rails_version)
68
+ cop.excluded_file?(filename) ||
69
+ !support_target_ruby_version?(cop) ||
70
+ !support_target_rails_version?(cop)
75
71
  end
76
72
  end
77
73
 
74
+ def support_target_ruby_version?(cop)
75
+ return true unless cop.class.respond_to?(:support_target_ruby_version?)
76
+
77
+ cop.class.support_target_ruby_version?(cop.target_ruby_version)
78
+ end
79
+
80
+ def support_target_rails_version?(cop)
81
+ return true unless cop.class.respond_to?(:support_target_rails_version?)
82
+
83
+ cop.class.support_target_rails_version?(cop.target_rails_version)
84
+ end
85
+
78
86
  def reset_callbacks
79
87
  @callbacks.clear
80
88
  end
@@ -123,23 +123,19 @@ module RuboCop
123
123
  self.class::MSG
124
124
  end
125
125
 
126
- # rubocop:disable Metrics/CyclomaticComplexity
127
126
  def add_offense(node, location: :expression, message: nil, severity: nil)
128
127
  loc = find_location(node, location)
129
128
 
130
129
  return if duplicate_location?(loc)
131
130
 
132
- severity = custom_severity || severity || default_severity
133
-
134
- message ||= message(node)
135
- message = annotate(message)
131
+ severity = find_severity(node, severity)
132
+ message = find_message(node, message)
136
133
 
137
134
  status = enabled_line?(loc.line) ? correct(node) : :disabled
138
135
 
139
136
  @offenses << Offense.new(severity, loc, message, name, status)
140
137
  yield if block_given? && status != :disabled
141
138
  end
142
- # rubocop:enable Metrics/CyclomaticComplexity
143
139
 
144
140
  def find_location(node, loc)
145
141
  # Location can be provided as a symbol, e.g.: `:keyword`
@@ -223,6 +219,10 @@ module RuboCop
223
219
 
224
220
  private
225
221
 
222
+ def find_message(node, message)
223
+ annotate(message || message(node))
224
+ end
225
+
226
226
  def annotate(message)
227
227
  RuboCop::Cop::MessageAnnotator.new(
228
228
  config, cop_name, cop_config, @options
@@ -250,6 +250,10 @@ module RuboCop
250
250
  @processed_source.comment_config.cop_enabled_at_line?(self, line_number)
251
251
  end
252
252
 
253
+ def find_severity(_node, severity)
254
+ custom_severity || severity || default_severity
255
+ end
256
+
253
257
  def default_severity
254
258
  self.class.lint? ? :warning : :convention
255
259
  end
@@ -154,16 +154,17 @@ module RuboCop
154
154
 
155
155
  # :nodoc:
156
156
  def validate_range(range)
157
- return if range.source_buffer == @source_buffer
157
+ buffer = range.source_buffer
158
+ return if buffer == @source_buffer
158
159
 
159
- unless range.source_buffer.is_a?(Parser::Source::Buffer)
160
+ unless buffer.is_a?(Parser::Source::Buffer)
160
161
  # actually this should be enforced by parser gem
161
- raise 'Corrector expected range source buffer to be a '\
162
- "Parser::Source::Buffer, but got #{range.source_buffer.class}"
162
+ raise 'Corrector expected range source buffer to be a ' \
163
+ "Parser::Source::Buffer, but got #{buffer.class}"
163
164
  end
164
- raise "Correction target buffer #{range.source_buffer.object_id} "\
165
- "name:#{range.source_buffer.name.inspect}"\
166
- " is not current #{@source_buffer.object_id} "\
165
+ raise "Correction target buffer #{buffer.object_id} " \
166
+ "name:#{buffer.name.inspect}" \
167
+ " is not current #{@source_buffer.object_id} " \
167
168
  "name:#{@source_buffer.name.inspect} under investigation"
168
169
  end
169
170
  end
@@ -24,7 +24,7 @@ module RuboCop
24
24
  def inject
25
25
  target_line = find_target_line
26
26
  if target_line
27
- configuration_entries.insert(find_target_line,
27
+ configuration_entries.insert(target_line,
28
28
  new_configuration_entry + "\n")
29
29
  else
30
30
  configuration_entries.push("\n" + new_configuration_entry)
@@ -220,14 +220,18 @@ module RuboCop
220
220
 
221
221
  private
222
222
 
223
+ def reset!
224
+ self.offences_by = {}
225
+ self.column_deltas = Hash.new { |hash, key| hash[key] = {} }
226
+ end
227
+
223
228
  def double_splat?(node)
224
229
  node.children.last.is_a?(Symbol)
225
230
  end
226
231
 
227
232
  def check_pairs(node)
228
233
  first_pair = node.pairs.first
229
- self.offences_by = {}
230
- self.column_deltas = Hash.new { |hash, key| hash[key] = {} }
234
+ reset!
231
235
 
232
236
  alignment_for(first_pair).each do |alignment|
233
237
  delta = alignment.deltas_for_first_pair(first_pair, node)
@@ -55,23 +55,20 @@ module RuboCop
55
55
  # of correcting, saving the file, parsing and inspecting again, and
56
56
  # then correcting one more line, and so on.
57
57
  def autocorrect_preceding_comments(comment)
58
- corrections = []
59
- line_no = comment.loc.line
60
- column = comment.loc.column
61
58
  comments = processed_source.comments
62
- (comments.index(comment) - 1).downto(0) do |ix|
63
- previous_comment = comments[ix]
64
- break unless should_correct?(previous_comment, column, line_no - 1)
59
+ index = comments.index(comment)
65
60
 
66
- corrections << autocorrect_one(previous_comment)
67
- line_no -= 1
68
- end
69
- corrections
61
+ comments[0..index]
62
+ .reverse_each
63
+ .each_cons(2)
64
+ .take_while { |below, above| should_correct?(above, below) }
65
+ .map { |_, above| autocorrect_one(above) }
70
66
  end
71
67
 
72
- def should_correct?(comment, column, line_no)
73
- loc = comment.loc
74
- loc.line == line_no && loc.column == column
68
+ def should_correct?(preceding_comment, reference_comment)
69
+ loc = preceding_comment.loc
70
+ ref_loc = reference_comment.loc
71
+ loc.line == ref_loc.line - 1 && loc.column == ref_loc.column
75
72
  end
76
73
 
77
74
  def autocorrect_one(comment)
@@ -103,19 +103,12 @@ module RuboCop
103
103
  private
104
104
 
105
105
  def concat_consecutive_comments(comments)
106
- prev_line = nil
106
+ consecutive_comments =
107
+ comments.chunk_while { |i, j| i.loc.line.succ == j.loc.line }
107
108
 
108
- comments.each_with_object([]) do |comment, concatenated_comments|
109
- if prev_line && comment.loc.line == prev_line.next
110
- last_concatenated_comment = concatenated_comments.last
111
-
112
- last_concatenated_comment[0] << comment_text(comment)
113
- last_concatenated_comment[1] << comment
114
- else
115
- concatenated_comments << [comment_text(comment).dup, [comment]]
116
- end
117
-
118
- prev_line = comment.loc.line
109
+ consecutive_comments.map do |chunk|
110
+ joined_text = chunk.map { |c| comment_text(c) }.join
111
+ [joined_text, chunk]
119
112
  end
120
113
  end
121
114
 
@@ -141,11 +134,9 @@ module RuboCop
141
134
  cop_config['AllowMarginComment']
142
135
  end
143
136
 
144
- def current_token(node)
137
+ def current_token(comment)
145
138
  processed_source.find_token do |token|
146
- token.pos.column == node.loc.column &&
147
- token.pos.last_column == node.loc.last_column &&
148
- token.line == node.loc.line
139
+ token.pos == comment.loc.expression
149
140
  end
150
141
  end
151
142
 
@@ -45,9 +45,7 @@ module RuboCop
45
45
  MSG_MISSING = 'Carriage return character missing.'
46
46
 
47
47
  def investigate(processed_source)
48
- last_token = processed_source.tokens.last
49
- last_line =
50
- last_token ? last_token.line : processed_source.lines.length
48
+ last_line = last_line(processed_source)
51
49
 
52
50
  processed_source.raw_source.each_line.with_index do |line, index|
53
51
  break if index >= last_line
@@ -81,6 +79,13 @@ module RuboCop
81
79
  else MSG_MISSING if line !~ /\r$/
82
80
  end
83
81
  end
82
+
83
+ private
84
+
85
+ def last_line(processed_source)
86
+ last_token = processed_source.tokens.last
87
+ last_token ? last_token.line : processed_source.lines.length
88
+ end
84
89
  end
85
90
  end
86
91
  end
@@ -228,19 +228,21 @@ module RuboCop
228
228
  # containing the previous line that's not a comment line or a blank
229
229
  # line.
230
230
  def previous_code_line(line_number)
231
- @comment_lines ||=
232
- processed_source
233
- .comments
234
- .select { |c| begins_its_line?(c.loc.expression) }
235
- .map { |c| c.loc.line }
236
-
237
231
  line = ''
238
- while line.blank? || @comment_lines.include?(line_number)
232
+ while line.blank? || comment_lines.include?(line_number)
239
233
  line_number -= 1
240
234
  line = processed_source.lines[line_number - 1]
241
235
  end
242
236
  line
243
237
  end
238
+
239
+ def comment_lines
240
+ @comment_lines ||=
241
+ processed_source
242
+ .comments
243
+ .select { |c| begins_its_line?(c.loc.expression) }
244
+ .map { |c| c.loc.line }
245
+ end
244
246
  end
245
247
  end
246
248
  end
@@ -113,7 +113,7 @@ module RuboCop
113
113
  first_pair = hash_node.pairs.first
114
114
 
115
115
  if first_pair
116
- return if first_pair.source_range.line == left_brace.line
116
+ return if first_pair.first_line == left_brace.line
117
117
 
118
118
  if separator_style?(first_pair)
119
119
  check_based_on_longest_key(hash_node, left_brace,
@@ -43,7 +43,7 @@ module RuboCop
43
43
  'on the same line as the assignment operator `=`.'
44
44
 
45
45
  def check_assignment(node, rhs)
46
- return if node.send_type?
46
+ return if node.send_type? && node.loc.operator&.source != '='
47
47
  return unless rhs
48
48
  return unless supported_types.include?(rhs.type)
49
49
  return if rhs.first_line == rhs.last_line
@@ -96,6 +96,7 @@ module RuboCop
96
96
  )
97
97
  end
98
98
 
99
+ # rubocop:disable Metrics/AbcSize
99
100
  def alignment_source(node, starting_loc)
100
101
  ending_loc =
101
102
  case node.type
@@ -114,6 +115,7 @@ module RuboCop
114
115
 
115
116
  range_between(starting_loc.begin_pos, ending_loc.end_pos).source
116
117
  end
118
+ # rubocop:enable Metrics/AbcSize
117
119
 
118
120
  # We will use ancestor or wrapper with access modifier.
119
121
 
@@ -48,9 +48,7 @@ module RuboCop
48
48
  if style == :require_space
49
49
  corrector.insert_before(children[1].source_range, ' ')
50
50
  else
51
- space_range = range_between(children[0].source_range.end_pos,
52
- children[1].source_range.begin_pos)
53
- corrector.remove(space_range)
51
+ corrector.remove(space_after_arrow(lambda_node))
54
52
  end
55
53
  end
56
54
  end
@@ -62,10 +60,14 @@ module RuboCop
62
60
  end
63
61
 
64
62
  def space_after_arrow?(lambda_node)
65
- arrow = lambda_node.parent.children[0]
66
- parentheses = lambda_node.parent.children[1]
67
- (parentheses.source_range.begin_pos - arrow.source_range.end_pos)
68
- .positive?
63
+ !space_after_arrow(lambda_node).empty?
64
+ end
65
+
66
+ def space_after_arrow(lambda_node)
67
+ arrow = lambda_node.parent.children[0].source_range
68
+ parentheses = lambda_node.parent.children[1].source_range
69
+
70
+ arrow.end.join(parentheses.begin)
69
71
  end
70
72
 
71
73
  def range_of_offense(node)
@@ -210,18 +210,21 @@ module RuboCop
210
210
 
211
211
  def compact_corrections(corrector, node, left, right)
212
212
  if qualifies_for_compact?(node, left, side: :left)
213
- range = side_space_range(range: left.pos, side: :right)
214
- corrector.remove(range)
213
+ compact(corrector, left, :right)
215
214
  elsif !left.space_after?
216
215
  corrector.insert_after(left.pos, ' ')
217
216
  end
218
217
  if qualifies_for_compact?(node, right)
219
- range = side_space_range(range: right.pos, side: :left)
220
- corrector.remove(range)
218
+ compact(corrector, right, :left)
221
219
  elsif !right.space_before?
222
220
  corrector.insert_before(right.pos, ' ')
223
221
  end
224
222
  end
223
+
224
+ def compact(corrector, bracket, side)
225
+ range = side_space_range(range: bracket.pos, side: side)
226
+ corrector.remove(range)
227
+ end
225
228
  end
226
229
  end
227
230
  end
@@ -72,7 +72,7 @@ module RuboCop
72
72
  # If the second token is a comment, that means that a line break
73
73
  # follows, and that the rules for space inside don't apply.
74
74
  next if token2.comment?
75
- next unless token2.line == token1.line && token1.space_after?
75
+ next unless same_line?(token1, token2) && token1.space_after?
76
76
 
77
77
  yield range_between(token1.end_pos, token2.begin_pos)
78
78
  end
@@ -82,17 +82,18 @@ module RuboCop
82
82
  tokens.each_cons(2) do |token1, token2|
83
83
  next if can_be_ignored?(token1, token2)
84
84
 
85
- next unless token2.line == token1.line && !token1.space_after?
86
-
87
85
  if token1.left_parens?
88
86
  yield range_between(token2.begin_pos, token2.begin_pos + 1)
89
-
90
87
  elsif token2.right_parens?
91
88
  yield range_between(token2.begin_pos, token2.end_pos)
92
89
  end
93
90
  end
94
91
  end
95
92
 
93
+ def same_line?(token1, token2)
94
+ token1.line == token2.line
95
+ end
96
+
96
97
  def parens?(token1, token2)
97
98
  token1.left_parens? || token2.right_parens?
98
99
  end
@@ -104,8 +105,7 @@ module RuboCop
104
105
  # follows, and that the rules for space inside don't apply.
105
106
  return true if token2.comment?
106
107
 
107
- # Ignore empty parens. # TODO: Could be configurable.
108
- return true if token1.left_parens? && token2.right_parens?
108
+ return true unless same_line?(token1, token2) && !token1.space_after?
109
109
  end
110
110
  end
111
111
  end
@@ -14,6 +14,20 @@ module RuboCop
14
14
  # # good
15
15
  # x = 0
16
16
  #
17
+ # @example AllowInHeredoc: false (default)
18
+ # # The line in this example contains spaces after the 0.
19
+ # # bad
20
+ # code = <<~RUBY
21
+ # x = 0
22
+ # RUBY
23
+ #
24
+ # @example AllowInHeredoc: true
25
+ # # The line in this example contains spaces after the 0.
26
+ # # good
27
+ # code = <<~RUBY
28
+ # x = 0
29
+ # RUBY
30
+ #
17
31
  class TrailingWhitespace < Cop
18
32
  include RangeHelp
19
33
 
@@ -22,11 +36,13 @@ module RuboCop
22
36
  def investigate(processed_source)
23
37
  heredoc_ranges = extract_heredoc_ranges(processed_source.ast)
24
38
  processed_source.lines.each_with_index do |line, index|
39
+ lineno = index + 1
40
+
25
41
  next unless line.end_with?(' ', "\t")
26
- next if skip_heredoc? && inside_heredoc?(heredoc_ranges, index + 1)
42
+ next if skip_heredoc? && inside_heredoc?(heredoc_ranges, lineno)
27
43
 
28
44
  range = source_range(processed_source.buffer,
29
- index + 1,
45
+ lineno,
30
46
  (line.rstrip.length)...(line.length))
31
47
 
32
48
  add_offense(range, location: range)
@@ -86,13 +86,13 @@ module RuboCop
86
86
  erb_new_with_non_keyword_arguments(node) do |arguments|
87
87
  return if correct_arguments?(arguments)
88
88
 
89
- 1.upto(3) do |i|
90
- next if !arguments[i] || arguments[i].hash_type?
89
+ arguments[1..3].each_with_index do |argument, i|
90
+ next if !argument || argument.hash_type?
91
91
 
92
- message = format(MESSAGES[i - 1], arg_value: arguments[i].source)
92
+ message = format(MESSAGES[i], arg_value: argument.source)
93
93
 
94
94
  add_offense(
95
- node, location: arguments[i].source_range, message: message
95
+ node, location: argument.source_range, message: message
96
96
  )
97
97
  end
98
98
  end
@@ -138,14 +138,15 @@ module RuboCop
138
138
  end
139
139
 
140
140
  def override_by_legacy_args(kwargs, node)
141
+ arguments = node.arguments
141
142
  overridden_kwargs = kwargs.dup
142
143
 
143
- if node.arguments[2]
144
- overridden_kwargs[0] = "trim_mode: #{node.arguments[2].source}"
144
+ if arguments[2]
145
+ overridden_kwargs[0] = "trim_mode: #{arguments[2].source}"
145
146
  end
146
147
 
147
- if node.arguments[3] && !node.arguments[3].hash_type?
148
- overridden_kwargs[1] = "eoutvar: #{node.arguments[3].source}"
148
+ if arguments[3] && !arguments[3].hash_type?
149
+ overridden_kwargs[1] = "eoutvar: #{arguments[3].source}"
149
150
  end
150
151
 
151
152
  overridden_kwargs