# Module fix

Source
Expand description

High-level overview of how `fix` works:

The main goal is to run `cargo check` to get rustc to emit JSON diagnostics with suggested fixes that can be applied to the files on the filesystem, and validate that those changes didn’t break anything.

Cargo begins by launching a `LockServer` thread in the background to listen for network connections to coordinate locking when multiple targets are built simultaneously. It ensures each package has only one fix running at once.

The `RustfixDiagnosticServer` is launched in a background thread (in `JobQueue`) to listen for network connections to coordinate displaying messages to the user on the console (so that multiple processes don’t try to print at the same time).

Cargo begins a normal `cargo check` operation with itself set as a proxy for rustc by setting `BuildConfig::primary_unit_rustc` in the build config. When cargo launches rustc to check a crate, it is actually launching itself. The `FIX_ENV_INTERNAL` environment variable is set to the value of the `LockServer`’s address so that cargo knows it is in fix-proxy-mode.

Each proxied cargo-as-rustc detects it is in fix-proxy-mode (via `FIX_ENV_INTERNAL` environment variable in `main`) and does the following:

- Acquire a lock from the `LockServer` from the master cargo process.
- Launches the real rustc (`rustfix_and_fix`), looking at the JSON output for suggested fixes.
- Uses the `rustfix` crate to apply the suggestions to the files on the file system.
- If rustfix fails to apply any suggestions (for example, they are overlapping), but at least some suggestions succeeded, it will try the previous two steps up to 4 times as long as some suggestions succeed.
- Assuming there’s at least one suggestion applied, and the suggestions applied cleanly, rustc is run again to verify the suggestions didn’t break anything. The change will be backed out if it fails (unless `--broken-code` is used).

## Re-exports§

`pub use self::fix_edition::fix_edition;`

## Modules§

fix_edition 🔒
  Support for the permanently unstable `-Zfix-edition` flag.

## Structs§

FixArgs 🔒
  Various command-line options and settings used when `cargo` is running as a proxy for `rustc` during the fix operation.
FixOptions
FixedCrate 🔒
FixedFile 🔒

## Enums§

EditionFixMode
  The behavior of `--edition` migration.

## Constants§

BROKEN_CODE_ENV_INTERNAL 🔒
  Internal only. For passing `FixOptions::broken_code` through to cargo running in proxy mode.
EDITION_ENV_INTERNAL 🔒
  Internal only. For passing `FixOptions::edition` through to cargo running in proxy mode.
FIX_ENV_INTERNAL 🔒
  Internal only. Indicates Cargo is in fix-proxy-mode if presents. The value of it is the socket address of the `LockServer` being used. See the module-level documentation for more.
IDIOMS_ENV_INTERNAL 🔒
  Internal only. For passing `FixOptions::idioms` through to cargo running in proxy mode.
SYSROOT_INTERNAL 🔒
  Internal only. The sysroot path.

## Functions§

check_resolver_change 🔒
check_version_control 🔒
emit_output 🔒
exit_with 🔒
fix
fix_exec_rustc
  Entry point for `cargo` running as a proxy for `rustc`.
fix_get_proxy_lock_addr
  Provide the lock address when running in proxy mode
log_failed_fix 🔒
migrate_manifests 🔒
remove_ignored_default_features_2024 🔒
rename_array_of_target_fields_2024 🔒
rename_dep_fields_2024 🔒
rename_table 🔒
rename_target_fields_2024 🔒
report_maybe_diesel 🔒
rustfix_and_fix 🔒
  Executes `rustc` to apply one round of suggestions to the crate in question.
rustfix_crate 🔒
  Attempts to apply fixes to a single crate.