Skip to content

Commit f0cd503

Browse files
committed
fix: default to all targets when using --edition flags in cargo fix
Signed-off-by: Rustin170506 <[email protected]>
1 parent 94b1f0f commit f0cd503

File tree

2 files changed

+102
-25
lines changed

2 files changed

+102
-25
lines changed

src/bin/cargo/commands/fix.rs

+5-2
Original file line numberDiff line numberDiff line change
@@ -81,8 +81,11 @@ pub fn exec(gctx: &mut GlobalContext, args: &ArgMatches) -> CliResult {
8181

8282
let mut opts = args.compile_options(gctx, mode, Some(&ws), ProfileChecking::LegacyTestOnly)?;
8383

84-
if !opts.filter.is_specific() {
85-
// cargo fix with no target selection implies `--all-targets`.
84+
let edition = args.flag("edition") || args.flag("edition-idioms");
85+
if !opts.filter.is_specific() && edition {
86+
// When `cargo fix` is run without specifying targets but with `--edition` or `--edition-idioms`,
87+
// it should default to fixing all targets.
88+
// See: https://github.com/rust-lang/cargo/issues/13527
8689
opts.filter = ops::CompileFilter::new_all_targets();
8790
}
8891

tests/testsuite/fix.rs

+97-23
Original file line numberDiff line numberDiff line change
@@ -198,7 +198,7 @@ fn prepare_for_2018() {
198198
}
199199

200200
#[cargo_test]
201-
fn fix_tests() {
201+
fn do_not_fix_tests() {
202202
let p = project()
203203
.file(
204204
"src/lib.rs",
@@ -220,21 +220,108 @@ fn fix_tests() {
220220
p.cargo("fix --allow-no-vcs")
221221
.with_stderr_data(str![[r#"
222222
[CHECKING] foo v0.0.1 ([ROOT]/foo)
223+
[FINISHED] `dev` profile [unoptimized + debuginfo] target(s) in [ELAPSED]s
224+
225+
"#]])
226+
.with_stdout_data("")
227+
.run();
228+
}
229+
230+
#[cargo_test]
231+
fn fix_tests_with_edition() {
232+
let p = project()
233+
.file(
234+
"Cargo.toml",
235+
r#"
236+
[package]
237+
name = "foo"
238+
version = "0.1.0"
239+
edition = "2018"
240+
"#,
241+
)
242+
.file(
243+
"src/lib.rs",
244+
r#"
245+
#![allow(ellipsis_inclusive_range_patterns)]
246+
pub fn foo() {}
247+
248+
#[cfg(test)]
249+
mod tests {
250+
#[test]
251+
fn it_works() {
252+
f();
253+
}
254+
fn f() -> bool {
255+
let x = 123;
256+
match x {
257+
0...100 => true,
258+
_ => false,
259+
}
260+
}
261+
}
262+
"#,
263+
)
264+
.build();
265+
266+
p.cargo("fix --edition --allow-no-vcs")
267+
.with_stderr_data(str![[r#"
268+
[MIGRATING] Cargo.toml from 2018 edition to 2021
269+
[CHECKING] foo v0.1.0 ([ROOT]/foo)
270+
[MIGRATING] src/lib.rs from 2018 edition to 2021
223271
[FIXED] src/lib.rs (1 fix)
224-
[WARNING] path statement with no effect
225-
--> src/lib.rs:9:25
226-
|
227-
9 | x;
228-
| ^^
229-
|
230-
= [NOTE] `#[warn(path_statements)]` on by default
272+
[FINISHED] `dev` profile [unoptimized + debuginfo] target(s) in [ELAPSED]s
273+
274+
"#]])
275+
.with_stdout_data("")
276+
.run();
277+
// Check that the test is fixed.
278+
assert!(p.read_file("src/lib.rs").contains(r#"0..=100 => true,"#));
279+
}
280+
281+
#[cargo_test]
282+
fn fix_tests_with_edition_idioms() {
283+
let p = project()
284+
.file(
285+
"Cargo.toml",
286+
r#"
287+
[package]
288+
name = 'foo'
289+
version = '0.1.0'
290+
edition = '2018'
291+
"#,
292+
)
293+
.file(
294+
"src/lib.rs",
295+
r#"
296+
pub fn foo() {}
297+
298+
#[cfg(test)]
299+
mod tests {
300+
#[test]
301+
fn it_works() {
302+
f();
303+
}
304+
305+
use std::any::Any;
306+
pub fn f() {
307+
let _x: Box<Any> = Box::new(3);
308+
}
309+
}
310+
"#,
311+
)
312+
.build();
231313

232-
[WARNING] `foo` (lib test) generated 1 warning
314+
p.cargo("fix --edition-idioms --allow-no-vcs")
315+
.with_stderr_data(str![[r#"
316+
[CHECKING] foo v0.1.0 ([ROOT]/foo)
317+
[FIXED] src/lib.rs (1 fix)
233318
[FINISHED] `dev` profile [unoptimized + debuginfo] target(s) in [ELAPSED]s
234319
235320
"#]])
236321
.with_stdout_data("")
237322
.run();
323+
// Check that the test is fixed.
324+
assert!(p.read_file("src/lib.rs").contains("Box<dyn Any>"));
238325
}
239326

240327
#[cargo_test]
@@ -747,19 +834,6 @@ fn does_not_warn_about_dirty_ignored_files() {
747834
p.cargo("fix").run();
748835
}
749836

750-
#[cargo_test]
751-
fn fix_all_targets_by_default() {
752-
let p = project()
753-
.file("src/lib.rs", "pub fn foo() { let mut x = 3; let _ = x; }")
754-
.file("tests/foo.rs", "pub fn foo() { let mut x = 3; let _ = x; }")
755-
.build();
756-
p.cargo("fix --allow-no-vcs")
757-
.env("__CARGO_FIX_YOLO", "1")
758-
.run();
759-
assert!(!p.read_file("src/lib.rs").contains("let mut x"));
760-
assert!(!p.read_file("tests/foo.rs").contains("let mut x"));
761-
}
762-
763837
#[cargo_test]
764838
fn prepare_for_unstable() {
765839
// During the period where a new edition is coming up, but not yet stable,
@@ -1370,7 +1444,7 @@ fn fix_to_broken_code() {
13701444
p.cargo("fix --allow-no-vcs --broken-code")
13711445
.cwd("bar")
13721446
.env("RUSTC", p.root().join("foo/target/debug/foo"))
1373-
.with_status(101)
1447+
.with_status(0)
13741448
.with_stderr_data(str![[r#"
13751449
...
13761450
[WARNING] failed to automatically apply fixes suggested by rustc to crate `bar`

0 commit comments

Comments
 (0)