Skip to content

Commit 99361c4

Browse files
committed
Auto merge of #14092 - Alexendoo:rustfix-separate-suggestions, r=weihanglo
Add `CodeFix::apply_solution` and impl `Clone` ### What does this PR try to resolve? In Clippy we have a good few lints that produce mutually exclusive suggestions e.g. ``` error: octal-looking escape in a literal --> tests/ui/octal_escapes.rs:6:19 | LL | let _bad2 = b"\033[0m"; | ^^^^ | help: if an octal escape is intended, use a hex escape instead | LL | let _bad2 = b"\x1b[0m"; | ~~~~ help: if a null escape is intended, disambiguate using | LL | let _bad2 = b"\x0033[0m"; | ~~~~~~ ``` For these we have to disable rustfix tests since the suggestions are overlapping, this PR adds a method to `rustfix` that `ui_test` could use in order to produce multiple `.fixed` files, one for each alternative suggestion ### Additional information It does not work for for multiple suggestions coming from a single subdiagnostic ([`Diag::span_suggestions`](https://doc.rust-lang.org/nightly/nightly-rustc/rustc_errors/diagnostic/struct.Diag.html#method.span_suggestions)) e.g. ``` help: consider importing one of these items | 1 + use std::collections::HashMap; | 1 + use ahash::HashMap; ``` Solving this would be blocked on rust-lang/rust#53934, on the Clippy side we only have one use of `span_suggestions` however so it's still very useful without this The test cases use Clippy lints that I generated by setting the `parse_and_replace` test to use `clippy-driver` because of familiarity, if there's a rustc case that does multiple suggestions it would be good to go with that
2 parents 6e23650 + 5a15397 commit 99361c4

File tree

3 files changed

+15
-8
lines changed

3 files changed

+15
-8
lines changed

Cargo.lock

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

crates/rustfix/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "rustfix"
3-
version = "0.8.4"
3+
version = "0.8.5"
44
authors = [
55
"Pascal Hertleif <[email protected]>",
66
"Oliver Schneider <[email protected]>",

crates/rustfix/src/lib.rs

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,7 @@ pub fn collect_suggestions<S: ::std::hash::BuildHasher>(
213213
/// 1. Feeds the source of a file to [`CodeFix::new`].
214214
/// 2. Calls [`CodeFix::apply`] to apply suggestions to the source code.
215215
/// 3. Calls [`CodeFix::finish`] to get the "fixed" code.
216+
#[derive(Clone)]
216217
pub struct CodeFix {
217218
data: replace::Data,
218219
/// Whether or not the data has been modified.
@@ -230,12 +231,18 @@ impl CodeFix {
230231

231232
/// Applies a suggestion to the code.
232233
pub fn apply(&mut self, suggestion: &Suggestion) -> Result<(), Error> {
233-
for sol in &suggestion.solutions {
234-
for r in &sol.replacements {
235-
self.data
236-
.replace_range(r.snippet.range.clone(), r.replacement.as_bytes())?;
237-
self.modified = true;
238-
}
234+
for solution in &suggestion.solutions {
235+
self.apply_solution(solution)?;
236+
}
237+
Ok(())
238+
}
239+
240+
/// Applies an individual solution from a [`Suggestion`].
241+
pub fn apply_solution(&mut self, solution: &Solution) -> Result<(), Error> {
242+
for r in &solution.replacements {
243+
self.data
244+
.replace_range(r.snippet.range.clone(), r.replacement.as_bytes())?;
245+
self.modified = true;
239246
}
240247
Ok(())
241248
}

0 commit comments

Comments
 (0)