From 818792a8181e4b7862c257fdbcf7eb839dbe7238 Mon Sep 17 00:00:00 2001 From: Pyrode Date: Sun, 29 Jun 2025 21:12:19 +0530 Subject: [PATCH 1/4] test: Added tests to check order of build units --- tests/testsuite/fixit.rs | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/tests/testsuite/fixit.rs b/tests/testsuite/fixit.rs index 2cc8d06..e51ab16 100644 --- a/tests/testsuite/fixit.rs +++ b/tests/testsuite/fixit.rs @@ -143,3 +143,23 @@ fn dependency_order() { "#]]) .run(); } + +#[cargo_test] +fn build_unit_order() { + let p = project() + .file("Cargo.toml", &basic_manifest("foo", "0.1.0")) + .file("build.rs", "fn main(){ let mut a = 1; let _ = a; }") + .file("src/lib.rs", "fn _a(){ let mut a = 1; let _ = a; }") + .file("src/main.rs", "fn main(){ let mut a = 1; let _ = a; }") + .build(); + + p.cargo_("fixit --allow-no-vcs") + .with_status(0) + .with_stderr_data(str![[r#" +[FIXED] build.rs (1 fix) +[FIXED] src/lib.rs (1 fix) +[FIXED] src/main.rs (1 fix) + +"#]]) + .run(); +} From cf540129af74f33a2facc1bdf4a520334adcd95d Mon Sep 17 00:00:00 2001 From: Pyrode Date: Mon, 30 Jun 2025 16:17:23 +0530 Subject: [PATCH 2/4] refactor: Renamed `src/check.rs` to `src/flags.rs` --- src/{check.rs => flags.rs} | 0 src/lib.rs | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) rename src/{check.rs => flags.rs} (100%) diff --git a/src/check.rs b/src/flags.rs similarity index 100% rename from src/check.rs rename to src/flags.rs diff --git a/src/lib.rs b/src/lib.rs index 244b29c..0b10975 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,6 +1,6 @@ -mod check; mod errors; +mod flags; pub mod shell; -pub use check::CheckFlags; pub use errors::*; +pub use flags::CheckFlags; From f862905a9a7d2cde1ce0cb7624e61f977b0ebccf Mon Sep 17 00:00:00 2001 From: Pyrode Date: Mon, 30 Jun 2025 16:29:18 +0530 Subject: [PATCH 3/4] refactor: Moved `CheckMessage` to `src/check.rs` --- src/bin/cargo-fixit/fixit.rs | 11 ++--------- src/check.rs | 8 ++++++++ src/lib.rs | 2 ++ 3 files changed, 12 insertions(+), 9 deletions(-) create mode 100644 src/check.rs diff --git a/src/bin/cargo-fixit/fixit.rs b/src/bin/cargo-fixit/fixit.rs index e178fa1..0bd2eb4 100644 --- a/src/bin/cargo-fixit/fixit.rs +++ b/src/bin/cargo-fixit/fixit.rs @@ -6,12 +6,11 @@ use std::{ process::Stdio, }; -use cargo_fixit::{shell, CargoResult, CheckFlags}; +use cargo_fixit::{shell, CargoResult, CheckFlags, CheckMessage}; use cargo_util::paths; use clap::Parser; use indexmap::{IndexMap, IndexSet}; -use rustfix::{collect_suggestions, diagnostics::Diagnostic, CodeFix}; -use serde::Deserialize; +use rustfix::{collect_suggestions, CodeFix}; use tracing::{trace, warn}; #[derive(Debug, Parser)] @@ -34,12 +33,6 @@ impl FixitArgs { } } -#[derive(Deserialize)] -struct CheckMessage { - message: Diagnostic, - package_id: String, -} - #[derive(Debug, Default)] struct File { fixes: u32, diff --git a/src/check.rs b/src/check.rs new file mode 100644 index 0000000..43592bc --- /dev/null +++ b/src/check.rs @@ -0,0 +1,8 @@ +use rustfix::diagnostics::Diagnostic; +use serde::Deserialize; + +#[derive(Deserialize)] +pub struct CheckMessage { + pub message: Diagnostic, + pub package_id: String, +} diff --git a/src/lib.rs b/src/lib.rs index 0b10975..e55bd86 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,6 +1,8 @@ +mod check; mod errors; mod flags; pub mod shell; +pub use check::*; pub use errors::*; pub use flags::CheckFlags; From ce9ce7709ccd51178f57ca47f47e59fa07fbc949 Mon Sep 17 00:00:00 2001 From: Pyrode Date: Fri, 27 Jun 2025 23:07:22 +0530 Subject: [PATCH 4/4] feat: Fixing build units --- src/bin/cargo-fixit/fixit.rs | 24 ++++++++++--------- src/check.rs | 45 ++++++++++++++++++++++++++++++++++++ 2 files changed, 58 insertions(+), 11 deletions(-) diff --git a/src/bin/cargo-fixit/fixit.rs b/src/bin/cargo-fixit/fixit.rs index 0bd2eb4..17ae5eb 100644 --- a/src/bin/cargo-fixit/fixit.rs +++ b/src/bin/cargo-fixit/fixit.rs @@ -6,7 +6,7 @@ use std::{ process::Stdio, }; -use cargo_fixit::{shell, CargoResult, CheckFlags, CheckMessage}; +use cargo_fixit::{shell, CargoResult, CheckFlags, CheckMessage, Target}; use cargo_util::paths; use clap::Parser; use indexmap::{IndexMap, IndexSet}; @@ -52,20 +52,19 @@ fn exec(args: FixitArgs) -> CargoResult<()> { let mut last_errors; - let mut current_package_id = None; + let mut current_target = None; let mut seen = HashSet::new(); loop { - let (errors, made_changes) = - run_rustfix(&args, &mut files, &mut current_package_id, &seen)?; + let (errors, made_changes) = run_rustfix(&args, &mut files, &mut current_target, &seen)?; last_errors = errors; iteration += 1; if !made_changes || iteration >= max_iterations { - if let Some(pkg) = current_package_id { + if let Some(pkg) = current_target { seen.insert(pkg); - current_package_id = None; + current_target = None; iteration = 0; } else { break; @@ -86,8 +85,8 @@ fn exec(args: FixitArgs) -> CargoResult<()> { fn run_rustfix( args: &FixitArgs, files: &mut IndexMap, - current_package_id: &mut Option, - seen: &HashSet, + current_target: &mut Option<(Target, String)>, + seen: &HashSet<(Target, String)>, ) -> CargoResult<(IndexSet, bool)> { let only = HashSet::new(); let mut file_map = IndexMap::new(); @@ -106,6 +105,7 @@ fn run_rustfix( for line in buf.lines() { let Ok(CheckMessage { + target, message: diagnostic, package_id, }) = serde_json::from_str(&line?) @@ -158,7 +158,9 @@ fn run_rustfix( } } - if seen.contains(&package_id) { + let target = (target.clone(), package_id.clone()); + + if seen.contains(&target) { trace!( "rejecting package id `{}` already seen: {:?}", package_id, @@ -170,9 +172,9 @@ fn run_rustfix( continue; } - let current_package_id = current_package_id.get_or_insert(package_id.clone()); + let current_target = current_target.get_or_insert(target.clone()); - if current_package_id == &package_id { + if current_target == &target { file_map .entry(file_name) .or_insert_with(IndexSet::new) diff --git a/src/check.rs b/src/check.rs index 43592bc..70c02db 100644 --- a/src/check.rs +++ b/src/check.rs @@ -3,6 +3,51 @@ use serde::Deserialize; #[derive(Deserialize)] pub struct CheckMessage { + pub target: Target, pub message: Diagnostic, pub package_id: String, } + +#[derive(Deserialize, Hash, PartialEq, Clone, Eq)] +pub struct Target { + kind: Vec, + crate_types: Vec, + name: String, + src_path: String, + edition: String, + doc: bool, + doctest: bool, + test: bool, +} + +#[derive(Deserialize, Hash, PartialEq, Clone, Eq)] +#[serde(rename_all(deserialize = "kebab-case"))] +pub enum Kind { + Bin, + Example, + Test, + Bench, + CustomBuild, + Lib, + Rlib, + Dylib, + Cdylib, + Staticlib, + ProcMacro, + #[serde(untagged)] + Other(String), +} + +#[derive(Deserialize, Hash, PartialEq, Clone, Eq)] +#[serde(rename_all(deserialize = "kebab-case"))] +pub enum CrateType { + Bin, + Lib, + Rlib, + Dylib, + Cdylib, + Staticlib, + ProcMacro, + #[serde(untagged)] + Other(String), +}