
Add transactional semantics to `rustfix` ### What does this PR try to resolve? This PR adds transactional semantics to `rustfix::Data`, enabling `rustfix::CodeFix` to apply `Suggestion`s as atomic units and rollback partially-applied changes when they conflict with existing ones. The basic approach and goals are discussed [in a comment on issue 14699](https://github.com/rust-lang/cargo/issues/14699#issuecomment-2427501232). In that comment, I proposed a solution which extended the existing `State` enumeration, but described an alternative that simplifies the overall tracking of incoming changes; this PR implements the latter. ### How should we test and review this PR? I've added an additional test and updated the existing ones. The tests in `parse_and_replace` already cover this case, particularly thanks to https://github.com/rust-lang/cargo/pull/14765 added by `@weihanglo.` It's still a good idea to experiment with `cargo clippy --fix` on repos that match the cases described in these open issues. ### Additional information Fixes #14699 Fixes rust-lang/rust-clippy/issues/13549
rustfix
Rustfix is a library defining useful structures that represent fix suggestions from rustc.
This is a low-level library. You pass it the JSON output from rustc
, and you can then use it to apply suggestions to in-memory strings. This library doesn't execute commands, or read or write from the filesystem.
If you are looking for the cargo fix
implementation, the core of it is located in cargo::ops::fix
.
This crate is maintained by the Cargo team, primarily for use by Cargo and Rust compiler test suite and not intended for external use (except as a transitive dependency). This crate may make major changes to its APIs or be deprecated without warning.
License
Licensed under either of
- Apache License, Version 2.0, (LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0)
- MIT license (LICENSE-MIT or http://opensource.org/licenses/MIT)
at your option.
Contribution
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.