Skip to content

Commit 1956c8b

Browse files
committed
fix(remove): Carry comments across removes
1 parent 059b5b6 commit 1956c8b

File tree

2 files changed

+46
-3
lines changed
  • src/cargo/util/toml_mut
  • tests/testsuite/cargo_remove/optional_dep_feature_formatting/out

2 files changed

+46
-3
lines changed

src/cargo/util/toml_mut/manifest.rs

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -540,5 +540,42 @@ fn non_existent_dependency_err(
540540
}
541541

542542
fn remove_array_index(array: &mut toml_edit::Array, index: usize) {
543-
array.remove(index);
543+
let value = array.remove(index);
544+
545+
// Captures all lines before leading whitespace
546+
let prefix_lines = value
547+
.decor()
548+
.prefix()
549+
.and_then(|p| p.as_str().expect("spans removed").rsplit_once('\n'))
550+
.map(|(lines, _current)| lines);
551+
// Captures all lines after trailing whitespace, before the next comma
552+
let suffix_lines = value
553+
.decor()
554+
.suffix()
555+
.and_then(|p| p.as_str().expect("spans removed").split_once('\n'))
556+
.map(|(_current, lines)| lines);
557+
let mut merged_lines = String::new();
558+
if let Some(prefix_lines) = prefix_lines {
559+
merged_lines.push_str(prefix_lines);
560+
merged_lines.push('\n');
561+
}
562+
if let Some(suffix_lines) = suffix_lines {
563+
merged_lines.push_str(suffix_lines);
564+
merged_lines.push('\n');
565+
}
566+
567+
let next_index = index; // Since `index` was removed, that effectively auto-advances us
568+
if let Some(next) = array.get_mut(next_index) {
569+
let next_decor = next.decor_mut();
570+
let next_prefix = next_decor
571+
.prefix()
572+
.map(|s| s.as_str().expect("spans removed"))
573+
.unwrap_or_default();
574+
merged_lines.push_str(next_prefix);
575+
next_decor.set_prefix(merged_lines);
576+
} else {
577+
let trailing = array.trailing().as_str().expect("spans removed");
578+
merged_lines.push_str(trailing);
579+
array.set_trailing(merged_lines);
580+
}
544581
}

tests/testsuite/cargo_remove/optional_dep_feature_formatting/out/Cargo.toml

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,10 @@ serde = "1.0.90"
2121
[features]
2222
std = [
2323
# Leading clippy
24-
"dep:clippy", # trailing docopt
24+
"dep:clippy", # trailing clippy
25+
26+
# Leading docopt
27+
# trailing docopt
2528

2629
# Leading rustc-serialize
2730
"dep:rustc-serialize", # trailing rustc-serialize
@@ -30,5 +33,8 @@ std = [
3033
"serde/std", # trailing serde/std
3134

3235
# Leading semver/std
33-
"semver/std", # trailing toml
36+
"semver/std", # trailing semver/std
37+
38+
# Leading toml
39+
# trailing toml
3440
]

0 commit comments

Comments
 (0)