rubocop 0.75.1 → 0.76.0

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