Skip to content

Commit 52dc738

Browse files
committed
Visualize trailing whitespace
1 parent 3e41f95 commit 52dc738

File tree

3 files changed

+35
-12
lines changed

3 files changed

+35
-12
lines changed

lib/rubocop_interactive/actions.rb

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -129,8 +129,10 @@ def disable_line(offense)
129129
{ status: :disabled }
130130
elsif current_line.include?('rubocop:disable')
131131
# Already has a disable directive - append this cop to it
132+
# Match existing "# rubocop:disable ..." comment and append cop name
133+
disable_pattern = /(# rubocop:disable [^\n]+)/
132134
lines[line_index] = current_line.sub(
133-
/(# rubocop:disable [^\n]+)/,
135+
disable_pattern,
134136
"\\1, #{offense.cop_name}"
135137
)
136138
File.write(offense.file_path, lines.join)

lib/rubocop_interactive/patch_generator.rb

Lines changed: 31 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -177,14 +177,14 @@ def extract_window(original_lines, corrected_lines, target_line)
177177
(start_idx..end_idx).each do |i|
178178
change = diffs[i]
179179
if change.unchanged?
180-
result << " #{change.old_element}"
180+
result << visualize_trailing_whitespace(" #{change.old_element}")
181181
elsif change.changed?
182-
result << "-#{change.old_element}"
183-
result << "+#{change.new_element}"
182+
result << visualize_trailing_whitespace("-#{change.old_element}")
183+
result << visualize_trailing_whitespace("+#{change.new_element}")
184184
elsif change.deleting?
185-
result << "-#{change.old_element}"
185+
result << visualize_trailing_whitespace("-#{change.old_element}")
186186
elsif change.adding?
187-
result << "+#{change.new_element}"
187+
result << visualize_trailing_whitespace("+#{change.new_element}")
188188
end
189189
end
190190

@@ -233,18 +233,39 @@ def generate_diff(original_lines, corrected_lines)
233233
result = []
234234
diffs.each do |change|
235235
if change.unchanged?
236-
result << " #{change.old_element}"
236+
result << visualize_trailing_whitespace(" #{change.old_element}")
237237
elsif change.changed?
238-
result << "-#{change.old_element}"
239-
result << "+#{change.new_element}"
238+
result << visualize_trailing_whitespace("-#{change.old_element}")
239+
result << visualize_trailing_whitespace("+#{change.new_element}")
240240
elsif change.deleting?
241-
result << "-#{change.old_element}"
241+
result << visualize_trailing_whitespace("-#{change.old_element}")
242242
elsif change.adding?
243-
result << "+#{change.new_element}"
243+
result << visualize_trailing_whitespace("+#{change.new_element}")
244244
end
245245
end
246246

247247
result
248248
end
249+
250+
def visualize_trailing_whitespace(line)
251+
# Check if line (without newline) has trailing whitespace
252+
# Match: <diff prefix><content><trailing whitespace>
253+
pattern = /
254+
^([-+\ ]) # Diff prefix: -, +, or space
255+
(.*?) # Content (non-greedy)
256+
([ \t]+) # Trailing whitespace (spaces or tabs)
257+
$ # End of line
258+
/x
259+
260+
if line.chomp =~ pattern
261+
prefix = $1
262+
content = $2
263+
trailing = $3
264+
markers = trailing.gsub(' ', '·').gsub("\t", '→')
265+
"#{prefix}#{content}#{markers}\n"
266+
else
267+
line
268+
end
269+
end
249270
end
250271
end

test/patch_generator_cops_test.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -205,7 +205,7 @@ def test_layout_trailing_whitespace
205205
result = RubocopInteractive::PatchGenerator.generate(offense)
206206

207207
assert result, "Should generate patch for Layout/TrailingWhitespace"
208-
assert_match(/-def example\s+\n/, result[:lines], "Should show line with trailing spaces")
208+
assert_match(/-def example···\n/, result[:lines], "Should show line with trailing space markers")
209209
assert_match(/\+def example\n/, result[:lines], "Should show line without trailing spaces")
210210
end
211211
end

0 commit comments

Comments
 (0)