Skip to content

Commit f33da7f

Browse files
committed
fix: Prefer exact prefix/suffix matches when trimming replacements
1 parent 4d72a3e commit f33da7f

File tree

2 files changed

+20
-14
lines changed

2 files changed

+20
-14
lines changed

src/renderer/source_map.rs

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -779,18 +779,24 @@ pub(crate) fn as_substr<'a>(
779779
original: &'a str,
780780
suggestion: &'a str,
781781
) -> Option<(usize, &'a str, usize)> {
782-
let common_prefix = original
783-
.chars()
784-
.zip(suggestion.chars())
785-
.take_while(|(c1, c2)| c1 == c2)
786-
.map(|(c, _)| c.len_utf8())
787-
.sum();
788-
let original = &original[common_prefix..];
789-
let suggestion = &suggestion[common_prefix..];
790-
if let Some(stripped) = suggestion.strip_suffix(original) {
791-
let common_suffix = original.len();
792-
Some((common_prefix, stripped, common_suffix))
782+
if let Some(stripped) = suggestion.strip_prefix(original) {
783+
Some((original.len(), stripped, 0))
784+
} else if let Some(stripped) = suggestion.strip_suffix(original) {
785+
Some((0, stripped, original.len()))
793786
} else {
794-
None
787+
let common_prefix = original
788+
.chars()
789+
.zip(suggestion.chars())
790+
.take_while(|(c1, c2)| c1 == c2)
791+
.map(|(c, _)| c.len_utf8())
792+
.sum();
793+
let original = &original[common_prefix..];
794+
let suggestion = &suggestion[common_prefix..];
795+
if let Some(stripped) = suggestion.strip_suffix(original) {
796+
let common_suffix = original.len();
797+
Some((common_prefix, stripped, common_suffix))
798+
} else {
799+
None
800+
}
795801
}
796802
}

tests/formatter.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5045,7 +5045,7 @@ fn original_matches_replacement_suffix() {
50455045
help: consider importing this module instead
50465046
|
50475047
1 | use std::sync;
5048-
| +++++
5048+
| +++++
50495049
"#]];
50505050
let renderer = Renderer::plain();
50515051
assert_data_eq!(renderer.render(input), expected_ascii);
@@ -5059,7 +5059,7 @@ help: consider importing this module instead
50595059
help: consider importing this module instead
50605060
╭╴
50615061
1 │ use std::sync;
5062-
╰╴ +++++
5062+
╰╴ +++++
50635063
"#]];
50645064
let renderer = renderer.decor_style(DecorStyle::Unicode);
50655065
assert_data_eq!(renderer.render(input), expected_unicode);

0 commit comments

Comments
 (0)