rubocop 0.75.0 → 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 (102) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -1
  3. data/config/default.yml +53 -54
  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/correctors/percent_literal_corrector.rb +1 -1
  19. data/lib/rubocop/cop/generator/configuration_injector.rb +1 -1
  20. data/lib/rubocop/cop/layout/align_hash.rb +6 -2
  21. data/lib/rubocop/cop/layout/comment_indentation.rb +10 -13
  22. data/lib/rubocop/cop/layout/empty_comment.rb +7 -16
  23. data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +22 -7
  24. data/lib/rubocop/cop/layout/empty_line_after_magic_comment.rb +2 -2
  25. data/lib/rubocop/cop/layout/empty_lines_around_class_body.rb +2 -2
  26. data/lib/rubocop/cop/layout/end_of_line.rb +8 -3
  27. data/lib/rubocop/cop/layout/indent_assignment.rb +2 -1
  28. data/lib/rubocop/cop/layout/indent_first_argument.rb +9 -7
  29. data/lib/rubocop/cop/layout/indent_first_hash_element.rb +1 -1
  30. data/lib/rubocop/cop/layout/multiline_assignment_layout.rb +1 -1
  31. data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +2 -0
  32. data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +9 -7
  33. data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +7 -4
  34. data/lib/rubocop/cop/layout/space_inside_parens.rb +6 -6
  35. data/lib/rubocop/cop/layout/trailing_whitespace.rb +18 -2
  36. data/lib/rubocop/cop/lint/erb_new_arguments.rb +9 -8
  37. data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +2 -2
  38. data/lib/rubocop/cop/lint/{unneeded_cop_disable_directive.rb → redundant_cop_disable_directive.rb} +23 -23
  39. data/lib/rubocop/cop/lint/{unneeded_cop_enable_directive.rb → redundant_cop_enable_directive.rb} +6 -8
  40. data/lib/rubocop/cop/lint/{unneeded_require_statement.rb → redundant_require_statement.rb} +1 -1
  41. data/lib/rubocop/cop/lint/{unneeded_splat_expansion.rb → redundant_splat_expansion.rb} +5 -5
  42. data/lib/rubocop/cop/lint/safe_navigation_chain.rb +5 -6
  43. data/lib/rubocop/cop/lint/unused_block_argument.rb +22 -6
  44. data/lib/rubocop/cop/lint/unused_method_argument.rb +23 -5
  45. data/lib/rubocop/cop/lint/void.rb +7 -26
  46. data/lib/rubocop/cop/metrics/abc_size.rb +1 -1
  47. data/lib/rubocop/cop/metrics/line_length.rb +1 -4
  48. data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +23 -6
  49. data/lib/rubocop/cop/mixin/method_complexity.rb +2 -1
  50. data/lib/rubocop/cop/mixin/statement_modifier.rb +5 -2
  51. data/lib/rubocop/cop/mixin/trailing_comma.rb +8 -6
  52. data/lib/rubocop/cop/naming/file_name.rb +12 -5
  53. data/lib/rubocop/cop/registry.rb +1 -1
  54. data/lib/rubocop/cop/style/attr.rb +2 -2
  55. data/lib/rubocop/cop/style/braces_around_hash_parameters.rb +6 -6
  56. data/lib/rubocop/cop/style/comment_annotation.rb +5 -5
  57. data/lib/rubocop/cop/style/copyright.rb +11 -7
  58. data/lib/rubocop/cop/style/documentation_method.rb +44 -0
  59. data/lib/rubocop/cop/style/double_cop_disable_directive.rb +2 -2
  60. data/lib/rubocop/cop/style/empty_case_condition.rb +2 -2
  61. data/lib/rubocop/cop/style/empty_literal.rb +2 -2
  62. data/lib/rubocop/cop/style/empty_method.rb +5 -5
  63. data/lib/rubocop/cop/style/expand_path_arguments.rb +1 -1
  64. data/lib/rubocop/cop/style/format_string.rb +10 -7
  65. data/lib/rubocop/cop/style/format_string_token.rb +15 -34
  66. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +10 -0
  67. data/lib/rubocop/cop/style/hash_syntax.rb +2 -2
  68. data/lib/rubocop/cop/style/if_unless_modifier.rb +9 -2
  69. data/lib/rubocop/cop/style/infinite_loop.rb +4 -3
  70. data/lib/rubocop/cop/style/inverse_methods.rb +19 -13
  71. data/lib/rubocop/cop/style/line_end_concatenation.rb +14 -10
  72. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +20 -20
  73. data/lib/rubocop/cop/style/method_def_parentheses.rb +17 -9
  74. data/lib/rubocop/cop/style/multiline_when_then.rb +1 -1
  75. data/lib/rubocop/cop/style/nested_modifier.rb +4 -2
  76. data/lib/rubocop/cop/style/non_nil_check.rb +21 -9
  77. data/lib/rubocop/cop/style/{unneeded_capital_w.rb → redundant_capital_w.rb} +1 -1
  78. data/lib/rubocop/cop/style/{unneeded_condition.rb → redundant_condition.rb} +3 -3
  79. data/lib/rubocop/cop/style/{unneeded_interpolation.rb → redundant_interpolation.rb} +1 -1
  80. data/lib/rubocop/cop/style/{unneeded_percent_q.rb → redundant_percent_q.rb} +1 -1
  81. data/lib/rubocop/cop/style/redundant_return.rb +37 -21
  82. data/lib/rubocop/cop/style/{unneeded_sort.rb → redundant_sort.rb} +4 -4
  83. data/lib/rubocop/cop/style/safe_navigation.rb +19 -8
  84. data/lib/rubocop/cop/style/semicolon.rb +13 -2
  85. data/lib/rubocop/cop/style/special_global_vars.rb +5 -7
  86. data/lib/rubocop/cop/util.rb +1 -1
  87. data/lib/rubocop/cop/utils/format_string.rb +10 -18
  88. data/lib/rubocop/cop/variable_force.rb +7 -5
  89. data/lib/rubocop/formatter/clang_style_formatter.rb +8 -3
  90. data/lib/rubocop/formatter/emacs_style_formatter.rb +22 -12
  91. data/lib/rubocop/formatter/file_list_formatter.rb +1 -1
  92. data/lib/rubocop/formatter/formatter_set.rb +16 -16
  93. data/lib/rubocop/formatter/pacman_formatter.rb +3 -3
  94. data/lib/rubocop/formatter/simple_text_formatter.rb +7 -3
  95. data/lib/rubocop/formatter/tap_formatter.rb +8 -3
  96. data/lib/rubocop/node_pattern.rb +3 -1
  97. data/lib/rubocop/options.rb +16 -22
  98. data/lib/rubocop/result_cache.rb +1 -1
  99. data/lib/rubocop/runner.rb +32 -27
  100. data/lib/rubocop/target_finder.rb +12 -6
  101. data/lib/rubocop/version.rb +1 -1
  102. 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
@@ -98,7 +98,7 @@ module RuboCop
98
98
  end
99
99
 
100
100
  def fix_escaped_content(word_node, escape, delimiters)
101
- content = word_node.children.first.to_s
101
+ content = +word_node.children.first.to_s
102
102
  content = escape_string(content) if escape
103
103
  substitute_escaped_delimiters(content, delimiters)
104
104
  content
@@ -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,7 +45,7 @@ module RuboCop
45
45
  return if correct_style?(node)
46
46
 
47
47
  if node.modifier_form? && last_argument_is_heredoc?(node)
48
- heredoc_node = last_argument(node)
48
+ heredoc_node = last_heredoc_argument(node)
49
49
 
50
50
  return if next_line_empty?(heredoc_line(node, heredoc_node))
51
51
 
@@ -109,16 +109,27 @@ module RuboCop
109
109
 
110
110
  def last_argument_is_heredoc?(node)
111
111
  last_children = node.if_branch
112
-
113
112
  return false unless last_children&.send_type?
114
113
 
115
- last_argument = last_argument(node)
116
-
117
- last_argument.respond_to?(:heredoc?) && last_argument.heredoc?
114
+ heredoc?(last_heredoc_argument(node))
118
115
  end
119
116
 
120
- def last_argument(node)
121
- node.if_branch.children.last
117
+ def last_heredoc_argument(node)
118
+ n = if node.respond_to?(:if_branch)
119
+ node.if_branch.children.last
120
+ else
121
+ node
122
+ end
123
+
124
+ return n if heredoc?(n)
125
+ return unless n.respond_to?(:arguments)
126
+
127
+ n.arguments.each do |argument|
128
+ node = last_heredoc_argument(argument)
129
+ return node if node
130
+ end
131
+
132
+ return last_heredoc_argument(n.receiver) if n.respond_to?(:receiver)
122
133
  end
123
134
 
124
135
  def heredoc_line(node, heredoc_node)
@@ -129,6 +140,10 @@ module RuboCop
129
140
  node.last_line + num_of_heredoc_lines + END_OF_HEREDOC_LINE
130
141
  end
131
142
 
143
+ def heredoc?(node)
144
+ node.respond_to?(:heredoc?) && node.heredoc?
145
+ end
146
+
132
147
  def offense_location(node)
133
148
  if node.loc.respond_to?(:end) && node.loc.end
134
149
  :end
@@ -55,8 +55,8 @@ module RuboCop
55
55
  source
56
56
  .comments
57
57
  .take_while { |comment| comment.loc.line < source.ast.loc.line }
58
- .select { |comment| MagicComment.parse(comment.text).any? }
59
- .last
58
+ .reverse
59
+ .find { |comment| MagicComment.parse(comment.text).any? }
60
60
  end
61
61
  end
62
62
  end
@@ -36,7 +36,7 @@ module RuboCop
36
36
  #
37
37
  # end
38
38
  #
39
- # @example Enforcedstyle: beginning_only
39
+ # @example EnforcedStyle: beginning_only
40
40
  # # good
41
41
  #
42
42
  # class Foo
@@ -46,7 +46,7 @@ module RuboCop
46
46
  # end
47
47
  # end
48
48
  #
49
- # @example Enforcedstyle: ending_only
49
+ # @example EnforcedStyle: ending_only
50
50
  # # good
51
51
  #
52
52
  # class Foo
@@ -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
@@ -42,7 +42,8 @@ module RuboCop
42
42
  end
43
43
 
44
44
  def leftmost_multiple_assignment(node)
45
- return node unless node.parent&.assignment?
45
+ return node unless same_line?(node, node.parent) &&
46
+ node.parent.assignment?
46
47
 
47
48
  leftmost_multiple_assignment(node.parent)
48
49
 
@@ -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