From b64f403dc23ca49477ee28bb64721ddeb912ec79 Mon Sep 17 00:00:00 2001 From: Zanie Blue Date: Thu, 5 Oct 2023 13:43:46 -0500 Subject: [PATCH] Rename applicability levels to always, sometimes, and never (#7821) Following much discussion for #4181 at https://github.com/astral-sh/ruff/pull/5119, https://github.com/astral-sh/ruff/discussions/5476, #7769, https://github.com/astral-sh/ruff/pull/7819, and in [Discord](https://discord.com/channels/1039017663004942429/1082324250112823306/1159144114231709746), this pull request changes `Applicability` from using `Automatic`, `Suggested`, and `Manual` to `Always`, `Sometimes`, and `Never`. Also removes `Applicability::Unspecified` (replacing #7792). --- crates/ruff_cli/tests/format.rs | 2 +- .../integration_test__stdin_json.snap | 2 +- crates/ruff_diagnostics/src/fix.rs | 89 +++++++------------ .../src/checkers/ast/analyze/bindings.rs | 2 +- crates/ruff_linter/src/checkers/noqa.rs | 18 ++-- crates/ruff_linter/src/fix/mod.rs | 2 +- crates/ruff_linter/src/message/diff.rs | 8 +- crates/ruff_linter/src/message/mod.rs | 9 +- ..._linter__message__json__tests__output.snap | 4 +- ...r__message__json_lines__tests__output.snap | 4 +- .../eradicate/rules/commented_out_code.rs | 2 +- .../flake8_annotations/rules/definition.rs | 4 +- .../flake8_bugbear/rules/assert_false.rs | 2 +- .../rules/duplicate_exceptions.rs | 2 +- .../rules/getattr_with_constant.rs | 2 +- .../rules/mutable_argument_default.rs | 5 +- .../redundant_tuple_in_exception_handler.rs | 2 +- .../rules/setattr_with_constant.rs | 2 +- .../rules/unreliable_callable_check.rs | 2 +- .../rules/unused_loop_control_variable.rs | 2 +- .../flake8_commas/rules/trailing_commas.rs | 6 +- .../src/rules/flake8_comprehensions/fixes.rs | 2 +- .../rules/unnecessary_call_around_sorted.rs | 4 +- .../rules/unnecessary_collection_call.rs | 2 +- .../rules/unnecessary_comprehension.rs | 2 +- .../unnecessary_double_cast_or_process.rs | 2 +- .../rules/unnecessary_generator_dict.rs | 2 +- .../rules/unnecessary_generator_list.rs | 2 +- .../rules/unnecessary_generator_set.rs | 2 +- .../rules/unnecessary_list_call.rs | 2 +- .../unnecessary_list_comprehension_dict.rs | 3 +- .../unnecessary_list_comprehension_set.rs | 3 +- .../rules/unnecessary_literal_dict.rs | 5 +- .../rules/unnecessary_literal_set.rs | 5 +- .../unnecessary_literal_within_dict_call.rs | 2 +- .../unnecessary_literal_within_list_call.rs | 2 +- .../unnecessary_literal_within_tuple_call.rs | 2 +- .../rules/unnecessary_map.rs | 2 +- .../rules/string_in_exception.rs | 2 +- .../rules/shebang_leading_whitespace.rs | 2 +- .../rules/implicit.rs | 2 +- .../rules/unconventional_import_alias.rs | 2 +- .../rules/direct_logger_instantiation.rs | 2 +- .../rules/invalid_get_logger_argument.rs | 2 +- .../flake8_logging/rules/undocumented_warn.rs | 2 +- .../rules/logging_call.rs | 2 +- .../rules/duplicate_class_field_definition.rs | 2 +- .../rules/multiple_starts_ends_with.rs | 2 +- .../rules/reimplemented_list_builtin.rs | 2 +- .../flake8_pie/rules/unnecessary_pass.rs | 2 +- .../rules/unnecessary_range_start.rs | 2 +- .../flake8_pyi/rules/any_eq_ne_annotation.rs | 2 +- .../rules/duplicate_union_member.rs | 2 +- .../rules/ellipsis_in_non_empty_class_body.rs | 2 +- .../flake8_pyi/rules/exit_annotations.rs | 2 +- .../flake8_pyi/rules/non_empty_stub_body.rs | 2 +- .../rules/numeric_literal_too_long.rs | 2 +- .../flake8_pyi/rules/pass_in_class_body.rs | 2 +- .../rules/pass_statement_stub_body.rs | 2 +- .../rules/quoted_annotation_in_stub.rs | 2 +- .../rules/flake8_pyi/rules/simple_defaults.rs | 10 +-- .../rules/str_or_repr_defined_in_stub.rs | 2 +- .../rules/string_or_bytes_too_long.rs | 2 +- .../unaliased_collections_abc_set_import.rs | 2 +- .../flake8_pytest_style/rules/assertion.rs | 6 +- .../flake8_pytest_style/rules/fixture.rs | 14 +-- .../rules/flake8_pytest_style/rules/marks.rs | 8 +- .../flake8_pytest_style/rules/parametrize.rs | 29 +++--- .../rules/avoidable_escaped_quote.rs | 4 +- .../rules/check_string_quotes.rs | 6 +- .../unnecessary_paren_on_raise_exception.rs | 4 +- .../src/rules/flake8_return/rules/function.rs | 15 ++-- .../flake8_simplify/rules/ast_bool_op.rs | 12 +-- .../rules/flake8_simplify/rules/ast_expr.rs | 4 +- .../rules/flake8_simplify/rules/ast_ifexp.rs | 8 +- .../flake8_simplify/rules/ast_unary_op.rs | 8 +- .../rules/flake8_simplify/rules/ast_with.rs | 2 +- .../flake8_simplify/rules/collapsible_if.rs | 2 +- .../if_else_block_instead_of_dict_get.rs | 2 +- .../rules/if_else_block_instead_of_if_exp.rs | 2 +- .../flake8_simplify/rules/key_in_dict.rs | 4 +- .../flake8_simplify/rules/needless_bool.rs | 4 +- .../rules/reimplemented_builtin.rs | 4 +- .../rules/suppressible_exception.rs | 2 +- .../flake8_simplify/rules/yoda_conditions.rs | 2 +- .../rules/relative_imports.rs | 2 +- .../src/rules/flake8_todos/rules/todos.rs | 2 +- .../rules/empty_type_checking_block.rs | 2 +- .../runtime_import_in_type_checking_block.rs | 2 +- .../rules/typing_only_runtime_import.rs | 2 +- .../path_constructor_current_directory.rs | 2 +- .../flynt/rules/static_join_to_fstring.rs | 2 +- .../rules/isort/rules/add_required_imports.rs | 2 +- .../src/rules/isort/rules/organize_imports.rs | 2 +- .../rules/numpy/rules/deprecated_function.rs | 5 +- .../numpy/rules/deprecated_type_alias.rs | 2 +- .../pandas_vet/rules/inplace_argument.rs | 5 +- .../perflint/rules/incorrect_dict_iterator.rs | 10 ++- .../perflint/rules/unnecessary_list_cast.rs | 2 +- .../pycodestyle/rules/compound_statements.rs | 2 +- .../rules/invalid_escape_sequence.rs | 4 +- .../pycodestyle/rules/lambda_assignment.rs | 7 +- .../pycodestyle/rules/literal_comparisons.rs | 2 +- .../logical_lines/extraneous_whitespace.rs | 9 +- .../rules/logical_lines/missing_whitespace.rs | 2 +- .../whitespace_before_parameters.rs | 2 +- .../rules/missing_newline_at_end_of_file.rs | 2 +- .../src/rules/pycodestyle/rules/not_tests.rs | 4 +- .../pycodestyle/rules/trailing_whitespace.rs | 4 +- .../pydocstyle/rules/blank_after_summary.rs | 2 +- .../rules/blank_before_after_class.rs | 8 +- .../rules/blank_before_after_function.rs | 4 +- .../src/rules/pydocstyle/rules/capitalized.rs | 2 +- .../pydocstyle/rules/ends_with_period.rs | 2 +- .../pydocstyle/rules/ends_with_punctuation.rs | 2 +- .../src/rules/pydocstyle/rules/indent.rs | 6 +- .../rules/multi_line_summary_start.rs | 4 +- .../rules/newline_after_last_paragraph.rs | 2 +- .../rules/no_surrounding_whitespace.rs | 2 +- .../src/rules/pydocstyle/rules/one_liner.rs | 2 +- .../src/rules/pydocstyle/rules/sections.rs | 30 +++---- .../rules/f_string_missing_placeholders.rs | 2 +- .../rules/invalid_literal_comparisons.rs | 2 +- .../pyflakes/rules/raise_not_implemented.rs | 2 +- .../src/rules/pyflakes/rules/repeated_keys.rs | 4 +- .../src/rules/pyflakes/rules/strings.rs | 6 +- .../src/rules/pyflakes/rules/unused_import.rs | 2 +- .../rules/pyflakes/rules/unused_variable.rs | 10 +-- .../pylint/rules/invalid_string_characters.rs | 2 +- .../rules/pylint/rules/manual_import_from.rs | 2 +- .../src/rules/pylint/rules/nested_min_max.rs | 2 +- .../pylint/rules/repeated_isinstance_calls.rs | 2 +- .../src/rules/pylint/rules/sys_exit_alias.rs | 2 +- .../pylint/rules/useless_import_alias.rs | 2 +- .../src/rules/pylint/rules/useless_return.rs | 2 +- ...convert_named_tuple_functional_to_class.rs | 2 +- .../convert_typed_dict_functional_to_class.rs | 2 +- .../pyupgrade/rules/datetime_utc_alias.rs | 2 +- .../rules/deprecated_c_element_tree.rs | 2 +- .../pyupgrade/rules/deprecated_import.rs | 2 +- .../pyupgrade/rules/deprecated_mock_import.rs | 6 +- .../rules/deprecated_unittest_alias.rs | 2 +- .../pyupgrade/rules/extraneous_parentheses.rs | 2 +- .../src/rules/pyupgrade/rules/f_strings.rs | 2 +- .../rules/pyupgrade/rules/format_literals.rs | 5 +- .../rules/lru_cache_with_maxsize_none.rs | 2 +- .../rules/lru_cache_without_parameters.rs | 2 +- .../rules/pyupgrade/rules/native_literals.rs | 4 +- .../src/rules/pyupgrade/rules/open_alias.rs | 2 +- .../rules/pyupgrade/rules/os_error_alias.rs | 4 +- .../pyupgrade/rules/outdated_version_block.rs | 16 ++-- .../rules/printf_string_formatting.rs | 2 +- .../pyupgrade/rules/quoted_annotation.rs | 2 +- .../pyupgrade/rules/redundant_open_modes.rs | 5 +- .../pyupgrade/rules/replace_stdout_stderr.rs | 2 +- .../rules/replace_universal_newlines.rs | 4 +- .../rules/super_call_with_parameters.rs | 2 +- .../pyupgrade/rules/type_of_primitive.rs | 2 +- .../pyupgrade/rules/typing_text_str_alias.rs | 2 +- .../pyupgrade/rules/unicode_kind_prefix.rs | 2 +- .../rules/unnecessary_builtin_import.rs | 2 +- .../rules/unnecessary_class_parentheses.rs | 2 +- .../rules/unnecessary_coding_comment.rs | 2 +- .../rules/unnecessary_encode_utf8.rs | 10 +-- .../rules/unnecessary_future_import.rs | 2 +- .../rules/unpacked_list_comprehension.rs | 2 +- .../pyupgrade/rules/use_pep585_annotation.rs | 4 +- .../pyupgrade/rules/use_pep604_annotation.rs | 6 +- .../pyupgrade/rules/use_pep604_isinstance.rs | 2 +- .../pyupgrade/rules/use_pep695_type_alias.rs | 2 +- .../pyupgrade/rules/useless_metaclass_type.rs | 2 +- .../rules/useless_object_inheritance.rs | 2 +- .../pyupgrade/rules/yield_in_for_loop.rs | 2 +- .../refurb/rules/check_and_remove_from_set.rs | 2 +- .../rules/refurb/rules/delete_full_slice.rs | 2 +- .../src/rules/refurb/rules/implicit_cwd.rs | 2 +- .../rules/refurb/rules/print_empty_string.rs | 6 +- .../refurb/rules/reimplemented_starmap.rs | 2 +- .../src/rules/refurb/rules/repeated_append.rs | 2 +- .../src/rules/refurb/rules/slice_copy.rs | 2 +- .../refurb/rules/unnecessary_enumerate.rs | 5 +- .../rules/collection_literal_concatenation.rs | 2 +- .../explicit_f_string_type_conversion.rs | 2 +- .../src/rules/ruff/rules/implicit_optional.rs | 4 +- .../ruff/rules/quadratic_list_summation.rs | 2 +- ...y_iterable_allocation_for_first_element.rs | 2 +- .../rules/tryceratops/rules/verbose_raise.rs | 7 +- 187 files changed, 386 insertions(+), 381 deletions(-) diff --git a/crates/ruff_cli/tests/format.rs b/crates/ruff_cli/tests/format.rs index c51a521816..df992ea17f 100644 --- a/crates/ruff_cli/tests/format.rs +++ b/crates/ruff_cli/tests/format.rs @@ -175,7 +175,7 @@ import os }, "filename": "-", "fix": { - "applicability": "Automatic", + "applicability": "always", "edits": [ { "content": "", diff --git a/crates/ruff_cli/tests/snapshots/integration_test__stdin_json.snap b/crates/ruff_cli/tests/snapshots/integration_test__stdin_json.snap index c722ec3d69..7086c05203 100644 --- a/crates/ruff_cli/tests/snapshots/integration_test__stdin_json.snap +++ b/crates/ruff_cli/tests/snapshots/integration_test__stdin_json.snap @@ -24,7 +24,7 @@ exit_code: 1 }, "filename": "/path/to/F401.py", "fix": { - "applicability": "Automatic", + "applicability": "always", "edits": [ { "content": "", diff --git a/crates/ruff_diagnostics/src/fix.rs b/crates/ruff_diagnostics/src/fix.rs index 7456e82b7e..5979286256 100644 --- a/crates/ruff_diagnostics/src/fix.rs +++ b/crates/ruff_diagnostics/src/fix.rs @@ -5,27 +5,22 @@ use ruff_text_size::{Ranged, TextSize}; use crate::edit::Edit; -/// Indicates confidence in the correctness of a suggested fix. -#[derive(Default, Copy, Clone, Debug, Hash, PartialEq, Eq, PartialOrd, Ord)] +/// Indicates if a fix can be applied. +#[derive(Copy, Clone, Debug, Hash, PartialEq, Eq)] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] +#[cfg_attr(feature = "serde", serde(rename_all = "lowercase"))] pub enum Applicability { - /// The fix is definitely what the user intended, or maintains the exact meaning of the code. - /// This fix should be automatically applied. - Automatic, + /// The fix is safe and can always be applied. + /// The fix is definitely what the user intended, or it maintains the exact meaning of the code. + Always, - /// The fix may be what the user intended, but it is uncertain. - /// The fix should result in valid code if it is applied. - /// The fix can be applied with user opt-in. - Suggested, + /// The fix is unsafe and should only be applied with user opt-in. + /// The fix may be what the user intended, but it is uncertain; the resulting code will have valid syntax. + Sometimes, - /// The fix has a good chance of being incorrect or the code be incomplete. - /// The fix may result in invalid code if it is applied. - /// The fix should only be manually applied by the user. - Manual, - - /// The applicability of the fix is unknown. - #[default] - Unspecified, + /// The fix is unsafe and should only be manually applied by the user. + /// The fix is likely to be incorrect or the resulting code may have invalid syntax. + Never, } /// Indicates the level of isolation required to apply a fix. @@ -52,86 +47,62 @@ pub struct Fix { } impl Fix { - /// Create a new [`Fix`] with an unspecified applicability from an [`Edit`] element. - #[deprecated( - note = "Use `Fix::automatic`, `Fix::suggested`, or `Fix::manual` instead to specify an applicability." - )] - pub fn unspecified(edit: Edit) -> Self { + /// Create a new [`Fix`] that can [always](Applicability::Always) be applied from an [`Edit`] element. + pub fn always_applies(edit: Edit) -> Self { Self { edits: vec![edit], - applicability: Applicability::Unspecified, + applicability: Applicability::Always, isolation_level: IsolationLevel::default(), } } - /// Create a new [`Fix`] with an unspecified applicability from multiple [`Edit`] elements. - #[deprecated( - note = "Use `Fix::automatic_edits`, `Fix::suggested_edits`, or `Fix::manual_edits` instead to specify an applicability." - )] - pub fn unspecified_edits(edit: Edit, rest: impl IntoIterator) -> Self { - Self { - edits: std::iter::once(edit).chain(rest).collect(), - applicability: Applicability::Unspecified, - isolation_level: IsolationLevel::default(), - } - } - - /// Create a new [`Fix`] with [automatic applicability](Applicability::Automatic) from an [`Edit`] element. - pub fn automatic(edit: Edit) -> Self { - Self { - edits: vec![edit], - applicability: Applicability::Automatic, - isolation_level: IsolationLevel::default(), - } - } - - /// Create a new [`Fix`] with [automatic applicability](Applicability::Automatic) from multiple [`Edit`] elements. - pub fn automatic_edits(edit: Edit, rest: impl IntoIterator) -> Self { + /// Create a new [`Fix`] that can [always](Applicability::Always) be applied from multiple [`Edit`] elements. + pub fn always_applies_edits(edit: Edit, rest: impl IntoIterator) -> Self { let mut edits: Vec = std::iter::once(edit).chain(rest).collect(); edits.sort_by_key(|edit| (edit.start(), edit.end())); Self { edits, - applicability: Applicability::Automatic, + applicability: Applicability::Always, isolation_level: IsolationLevel::default(), } } - /// Create a new [`Fix`] with [suggested applicability](Applicability::Suggested) from an [`Edit`] element. - pub fn suggested(edit: Edit) -> Self { + /// Create a new [`Fix`] that can [sometimes](Applicability::Sometimes) be applied from an [`Edit`] element. + pub fn sometimes_applies(edit: Edit) -> Self { Self { edits: vec![edit], - applicability: Applicability::Suggested, + applicability: Applicability::Sometimes, isolation_level: IsolationLevel::default(), } } - /// Create a new [`Fix`] with [suggested applicability](Applicability::Suggested) from multiple [`Edit`] elements. - pub fn suggested_edits(edit: Edit, rest: impl IntoIterator) -> Self { + /// Create a new [`Fix`] that can [sometimes](Applicability::Sometimes) be applied from multiple [`Edit`] elements. + pub fn sometimes_applies_edits(edit: Edit, rest: impl IntoIterator) -> Self { let mut edits: Vec = std::iter::once(edit).chain(rest).collect(); edits.sort_by_key(|edit| (edit.start(), edit.end())); Self { edits, - applicability: Applicability::Suggested, + applicability: Applicability::Sometimes, isolation_level: IsolationLevel::default(), } } - /// Create a new [`Fix`] with [manual applicability](Applicability::Manual) from an [`Edit`] element. - pub fn manual(edit: Edit) -> Self { + /// Create a new [`Fix`] that should [never](Applicability::Never) be applied from an [`Edit`] element . + pub fn never_applies(edit: Edit) -> Self { Self { edits: vec![edit], - applicability: Applicability::Manual, + applicability: Applicability::Never, isolation_level: IsolationLevel::default(), } } - /// Create a new [`Fix`] with [manual applicability](Applicability::Manual) from multiple [`Edit`] elements. - pub fn manual_edits(edit: Edit, rest: impl IntoIterator) -> Self { + /// Create a new [`Fix`] that should [never](Applicability::Never) be applied from multiple [`Edit`] elements. + pub fn never_applies_edits(edit: Edit, rest: impl IntoIterator) -> Self { let mut edits: Vec = std::iter::once(edit).chain(rest).collect(); edits.sort_by_key(|edit| (edit.start(), edit.end())); Self { edits, - applicability: Applicability::Manual, + applicability: Applicability::Never, isolation_level: IsolationLevel::default(), } } diff --git a/crates/ruff_linter/src/checkers/ast/analyze/bindings.rs b/crates/ruff_linter/src/checkers/ast/analyze/bindings.rs index fca537a63c..1fe3f0cf9f 100644 --- a/crates/ruff_linter/src/checkers/ast/analyze/bindings.rs +++ b/crates/ruff_linter/src/checkers/ast/analyze/bindings.rs @@ -38,7 +38,7 @@ pub(crate) fn bindings(checker: &mut Checker) { binding, checker.locator, ) - .map(Fix::automatic) + .map(Fix::always_applies) }); } checker.diagnostics.push(diagnostic); diff --git a/crates/ruff_linter/src/checkers/noqa.rs b/crates/ruff_linter/src/checkers/noqa.rs index 1c73b257ee..623476f8d6 100644 --- a/crates/ruff_linter/src/checkers/noqa.rs +++ b/crates/ruff_linter/src/checkers/noqa.rs @@ -110,8 +110,10 @@ pub(crate) fn check_noqa( let mut diagnostic = Diagnostic::new(UnusedNOQA { codes: None }, directive.range()); if settings.rules.should_fix(diagnostic.kind.rule()) { - diagnostic - .set_fix(Fix::suggested(delete_noqa(directive.range(), locator))); + diagnostic.set_fix(Fix::sometimes_applies(delete_noqa( + directive.range(), + locator, + ))); } diagnostics.push(diagnostic); } @@ -175,15 +177,17 @@ pub(crate) fn check_noqa( ); if settings.rules.should_fix(diagnostic.kind.rule()) { if valid_codes.is_empty() { - diagnostic.set_fix(Fix::suggested(delete_noqa( + diagnostic.set_fix(Fix::sometimes_applies(delete_noqa( directive.range(), locator, ))); } else { - diagnostic.set_fix(Fix::suggested(Edit::range_replacement( - format!("# noqa: {}", valid_codes.join(", ")), - directive.range(), - ))); + diagnostic.set_fix(Fix::sometimes_applies( + Edit::range_replacement( + format!("# noqa: {}", valid_codes.join(", ")), + directive.range(), + ), + )); } } diagnostics.push(diagnostic); diff --git a/crates/ruff_linter/src/fix/mod.rs b/crates/ruff_linter/src/fix/mod.rs index 563fac9e83..770631e9f7 100644 --- a/crates/ruff_linter/src/fix/mod.rs +++ b/crates/ruff_linter/src/fix/mod.rs @@ -151,7 +151,7 @@ mod tests { // The choice of rule here is arbitrary. kind: MissingNewlineAtEndOfFile.into(), range: edit.range(), - fix: Some(Fix::unspecified(edit)), + fix: Some(Fix::always_applies(edit)), parent: None, }) .collect() diff --git a/crates/ruff_linter/src/message/diff.rs b/crates/ruff_linter/src/message/diff.rs index 645d0797f5..ae165cece0 100644 --- a/crates/ruff_linter/src/message/diff.rs +++ b/crates/ruff_linter/src/message/diff.rs @@ -52,10 +52,10 @@ impl Display for Diff<'_> { let diff = TextDiff::from_lines(self.source_code.source_text(), &output); let message = match self.fix.applicability() { - Applicability::Automatic => "Fix", - Applicability::Suggested => "Suggested fix", - Applicability::Manual => "Possible fix", - Applicability::Unspecified => "Suggested fix", /* For backwards compatibility, unspecified fixes are 'suggested' */ + // TODO(zanieb): Adjust this messaging once it's user-facing + Applicability::Always => "Fix", + Applicability::Sometimes => "Suggested fix", + Applicability::Never => "Possible fix", }; writeln!(f, "ℹ {}", message.blue())?; diff --git a/crates/ruff_linter/src/message/mod.rs b/crates/ruff_linter/src/message/mod.rs index 67ba50df4e..a54dacd9ef 100644 --- a/crates/ruff_linter/src/message/mod.rs +++ b/crates/ruff_linter/src/message/mod.rs @@ -178,10 +178,9 @@ def fibonacci(n): }, TextRange::new(TextSize::from(7), TextSize::from(9)), ) - .with_fix(Fix::suggested(Edit::range_deletion(TextRange::new( - TextSize::from(0), - TextSize::from(10), - )))); + .with_fix(Fix::sometimes_applies(Edit::range_deletion( + TextRange::new(TextSize::from(0), TextSize::from(10)), + ))); let fib_source = SourceFileBuilder::new("fib.py", fib).finish(); @@ -193,7 +192,7 @@ def fibonacci(n): }, TextRange::new(TextSize::from(94), TextSize::from(95)), ) - .with_fix(Fix::suggested(Edit::deletion( + .with_fix(Fix::sometimes_applies(Edit::deletion( TextSize::from(94), TextSize::from(99), ))); diff --git a/crates/ruff_linter/src/message/snapshots/ruff_linter__message__json__tests__output.snap b/crates/ruff_linter/src/message/snapshots/ruff_linter__message__json__tests__output.snap index d149e4ec54..26dca5f8c0 100644 --- a/crates/ruff_linter/src/message/snapshots/ruff_linter__message__json__tests__output.snap +++ b/crates/ruff_linter/src/message/snapshots/ruff_linter__message__json__tests__output.snap @@ -11,7 +11,7 @@ expression: content }, "filename": "fib.py", "fix": { - "applicability": "Suggested", + "applicability": "sometimes", "edits": [ { "content": "", @@ -43,7 +43,7 @@ expression: content }, "filename": "fib.py", "fix": { - "applicability": "Suggested", + "applicability": "sometimes", "edits": [ { "content": "", diff --git a/crates/ruff_linter/src/message/snapshots/ruff_linter__message__json_lines__tests__output.snap b/crates/ruff_linter/src/message/snapshots/ruff_linter__message__json_lines__tests__output.snap index 4a4c04222d..e68e02a616 100644 --- a/crates/ruff_linter/src/message/snapshots/ruff_linter__message__json_lines__tests__output.snap +++ b/crates/ruff_linter/src/message/snapshots/ruff_linter__message__json_lines__tests__output.snap @@ -2,7 +2,7 @@ source: crates/ruff_linter/src/message/json_lines.rs expression: content --- -{"code":"F401","end_location":{"column":10,"row":1},"filename":"fib.py","fix":{"applicability":"Suggested","edits":[{"content":"","end_location":{"column":1,"row":2},"location":{"column":1,"row":1}}],"message":"Remove unused import: `os`"},"location":{"column":8,"row":1},"message":"`os` imported but unused","noqa_row":1,"url":"https://docs.astral.sh/ruff/rules/unused-import"} -{"code":"F841","end_location":{"column":6,"row":6},"filename":"fib.py","fix":{"applicability":"Suggested","edits":[{"content":"","end_location":{"column":10,"row":6},"location":{"column":5,"row":6}}],"message":"Remove assignment to unused variable `x`"},"location":{"column":5,"row":6},"message":"Local variable `x` is assigned to but never used","noqa_row":6,"url":"https://docs.astral.sh/ruff/rules/unused-variable"} +{"code":"F401","end_location":{"column":10,"row":1},"filename":"fib.py","fix":{"applicability":"sometimes","edits":[{"content":"","end_location":{"column":1,"row":2},"location":{"column":1,"row":1}}],"message":"Remove unused import: `os`"},"location":{"column":8,"row":1},"message":"`os` imported but unused","noqa_row":1,"url":"https://docs.astral.sh/ruff/rules/unused-import"} +{"code":"F841","end_location":{"column":6,"row":6},"filename":"fib.py","fix":{"applicability":"sometimes","edits":[{"content":"","end_location":{"column":10,"row":6},"location":{"column":5,"row":6}}],"message":"Remove assignment to unused variable `x`"},"location":{"column":5,"row":6},"message":"Local variable `x` is assigned to but never used","noqa_row":6,"url":"https://docs.astral.sh/ruff/rules/unused-variable"} {"code":"F821","end_location":{"column":5,"row":1},"filename":"undef.py","fix":null,"location":{"column":4,"row":1},"message":"Undefined name `a`","noqa_row":1,"url":"https://docs.astral.sh/ruff/rules/undefined-name"} diff --git a/crates/ruff_linter/src/rules/eradicate/rules/commented_out_code.rs b/crates/ruff_linter/src/rules/eradicate/rules/commented_out_code.rs index 4bb0612001..4a78d2ad02 100644 --- a/crates/ruff_linter/src/rules/eradicate/rules/commented_out_code.rs +++ b/crates/ruff_linter/src/rules/eradicate/rules/commented_out_code.rs @@ -68,7 +68,7 @@ pub(crate) fn commented_out_code( let mut diagnostic = Diagnostic::new(CommentedOutCode, *range); if settings.rules.should_fix(Rule::CommentedOutCode) { - diagnostic.set_fix(Fix::manual(Edit::range_deletion( + diagnostic.set_fix(Fix::never_applies(Edit::range_deletion( locator.full_lines_range(*range), ))); } diff --git a/crates/ruff_linter/src/rules/flake8_annotations/rules/definition.rs b/crates/ruff_linter/src/rules/flake8_annotations/rules/definition.rs index faabd02a3b..91e763e9a2 100644 --- a/crates/ruff_linter/src/rules/flake8_annotations/rules/definition.rs +++ b/crates/ruff_linter/src/rules/flake8_annotations/rules/definition.rs @@ -703,7 +703,7 @@ pub(crate) fn definition( function.identifier(), ); if checker.patch(diagnostic.kind.rule()) { - diagnostic.set_fix(Fix::suggested(Edit::insertion( + diagnostic.set_fix(Fix::sometimes_applies(Edit::insertion( " -> None".to_string(), function.parameters.range().end(), ))); @@ -721,7 +721,7 @@ pub(crate) fn definition( ); if checker.patch(diagnostic.kind.rule()) { if let Some(return_type) = simple_magic_return_type(name) { - diagnostic.set_fix(Fix::suggested(Edit::insertion( + diagnostic.set_fix(Fix::sometimes_applies(Edit::insertion( format!(" -> {return_type}"), function.parameters.range().end(), ))); diff --git a/crates/ruff_linter/src/rules/flake8_bugbear/rules/assert_false.rs b/crates/ruff_linter/src/rules/flake8_bugbear/rules/assert_false.rs index 3e2076a7fa..dcbdb8beda 100644 --- a/crates/ruff_linter/src/rules/flake8_bugbear/rules/assert_false.rs +++ b/crates/ruff_linter/src/rules/flake8_bugbear/rules/assert_false.rs @@ -76,7 +76,7 @@ pub(crate) fn assert_false(checker: &mut Checker, stmt: &Stmt, test: &Expr, msg: let mut diagnostic = Diagnostic::new(AssertFalse, test.range()); if checker.patch(diagnostic.kind.rule()) { - diagnostic.set_fix(Fix::suggested(Edit::range_replacement( + diagnostic.set_fix(Fix::sometimes_applies(Edit::range_replacement( checker.generator().stmt(&assertion_error(msg)), stmt.range(), ))); diff --git a/crates/ruff_linter/src/rules/flake8_bugbear/rules/duplicate_exceptions.rs b/crates/ruff_linter/src/rules/flake8_bugbear/rules/duplicate_exceptions.rs index 362b2c57f5..2cf49212b6 100644 --- a/crates/ruff_linter/src/rules/flake8_bugbear/rules/duplicate_exceptions.rs +++ b/crates/ruff_linter/src/rules/flake8_bugbear/rules/duplicate_exceptions.rs @@ -147,7 +147,7 @@ fn duplicate_handler_exceptions<'a>( expr.range(), ); if checker.patch(diagnostic.kind.rule()) { - diagnostic.set_fix(Fix::automatic(Edit::range_replacement( + diagnostic.set_fix(Fix::always_applies(Edit::range_replacement( // Single exceptions don't require parentheses, but since we're _removing_ // parentheses, insert whitespace as needed. if let [elt] = unique_elts.as_slice() { diff --git a/crates/ruff_linter/src/rules/flake8_bugbear/rules/getattr_with_constant.rs b/crates/ruff_linter/src/rules/flake8_bugbear/rules/getattr_with_constant.rs index 8e0bbdf992..0f77c82f96 100644 --- a/crates/ruff_linter/src/rules/flake8_bugbear/rules/getattr_with_constant.rs +++ b/crates/ruff_linter/src/rules/flake8_bugbear/rules/getattr_with_constant.rs @@ -86,7 +86,7 @@ pub(crate) fn getattr_with_constant( let mut diagnostic = Diagnostic::new(GetAttrWithConstant, expr.range()); if checker.patch(diagnostic.kind.rule()) { - diagnostic.set_fix(Fix::suggested(Edit::range_replacement( + diagnostic.set_fix(Fix::sometimes_applies(Edit::range_replacement( pad( if matches!( obj, diff --git a/crates/ruff_linter/src/rules/flake8_bugbear/rules/mutable_argument_default.rs b/crates/ruff_linter/src/rules/flake8_bugbear/rules/mutable_argument_default.rs index a680ad5d9a..802a2580be 100644 --- a/crates/ruff_linter/src/rules/flake8_bugbear/rules/mutable_argument_default.rs +++ b/crates/ruff_linter/src/rules/flake8_bugbear/rules/mutable_argument_default.rs @@ -200,5 +200,8 @@ fn move_initialization( } let initialization_edit = Edit::insertion(content, pos); - Some(Fix::manual_edits(default_edit, [initialization_edit])) + Some(Fix::never_applies_edits( + default_edit, + [initialization_edit], + )) } diff --git a/crates/ruff_linter/src/rules/flake8_bugbear/rules/redundant_tuple_in_exception_handler.rs b/crates/ruff_linter/src/rules/flake8_bugbear/rules/redundant_tuple_in_exception_handler.rs index afe698dca9..548c6f13e4 100644 --- a/crates/ruff_linter/src/rules/flake8_bugbear/rules/redundant_tuple_in_exception_handler.rs +++ b/crates/ruff_linter/src/rules/flake8_bugbear/rules/redundant_tuple_in_exception_handler.rs @@ -85,7 +85,7 @@ pub(crate) fn redundant_tuple_in_exception_handler( // ``` // Otherwise, the output will be invalid syntax, since we're removing a set of // parentheses. - diagnostic.set_fix(Fix::automatic(Edit::range_replacement( + diagnostic.set_fix(Fix::always_applies(Edit::range_replacement( pad( checker.generator().expr(elt), type_.range(), diff --git a/crates/ruff_linter/src/rules/flake8_bugbear/rules/setattr_with_constant.rs b/crates/ruff_linter/src/rules/flake8_bugbear/rules/setattr_with_constant.rs index 5f70ada572..9fccd53144 100644 --- a/crates/ruff_linter/src/rules/flake8_bugbear/rules/setattr_with_constant.rs +++ b/crates/ruff_linter/src/rules/flake8_bugbear/rules/setattr_with_constant.rs @@ -109,7 +109,7 @@ pub(crate) fn setattr_with_constant( if expr == child.as_ref() { let mut diagnostic = Diagnostic::new(SetAttrWithConstant, expr.range()); if checker.patch(diagnostic.kind.rule()) { - diagnostic.set_fix(Fix::suggested(Edit::range_replacement( + diagnostic.set_fix(Fix::sometimes_applies(Edit::range_replacement( assignment(obj, name, value, checker.generator()), expr.range(), ))); diff --git a/crates/ruff_linter/src/rules/flake8_bugbear/rules/unreliable_callable_check.rs b/crates/ruff_linter/src/rules/flake8_bugbear/rules/unreliable_callable_check.rs index ea47a921e1..c8a7fa7863 100644 --- a/crates/ruff_linter/src/rules/flake8_bugbear/rules/unreliable_callable_check.rs +++ b/crates/ruff_linter/src/rules/flake8_bugbear/rules/unreliable_callable_check.rs @@ -83,7 +83,7 @@ pub(crate) fn unreliable_callable_check( if checker.patch(diagnostic.kind.rule()) { if id == "hasattr" { if checker.semantic().is_builtin("callable") { - diagnostic.set_fix(Fix::automatic(Edit::range_replacement( + diagnostic.set_fix(Fix::always_applies(Edit::range_replacement( format!("callable({})", checker.locator().slice(obj)), expr.range(), ))); diff --git a/crates/ruff_linter/src/rules/flake8_bugbear/rules/unused_loop_control_variable.rs b/crates/ruff_linter/src/rules/flake8_bugbear/rules/unused_loop_control_variable.rs index aee8537a6a..3cada03b90 100644 --- a/crates/ruff_linter/src/rules/flake8_bugbear/rules/unused_loop_control_variable.rs +++ b/crates/ruff_linter/src/rules/flake8_bugbear/rules/unused_loop_control_variable.rs @@ -168,7 +168,7 @@ pub(crate) fn unused_loop_control_variable(checker: &mut Checker, stmt_for: &ast .filter(|binding| binding.start() >= expr.start()) .all(|binding| !binding.is_used()) { - diagnostic.set_fix(Fix::suggested(Edit::range_replacement( + diagnostic.set_fix(Fix::sometimes_applies(Edit::range_replacement( rename, expr.range(), ))); diff --git a/crates/ruff_linter/src/rules/flake8_commas/rules/trailing_commas.rs b/crates/ruff_linter/src/rules/flake8_commas/rules/trailing_commas.rs index eb9f1ec40e..0c1aa266e4 100644 --- a/crates/ruff_linter/src/rules/flake8_commas/rules/trailing_commas.rs +++ b/crates/ruff_linter/src/rules/flake8_commas/rules/trailing_commas.rs @@ -325,7 +325,9 @@ pub(crate) fn trailing_commas( let comma = prev.spanned.unwrap(); let mut diagnostic = Diagnostic::new(ProhibitedTrailingComma, comma.1); if settings.rules.should_fix(Rule::ProhibitedTrailingComma) { - diagnostic.set_fix(Fix::automatic(Edit::range_deletion(diagnostic.range()))); + diagnostic.set_fix(Fix::always_applies(Edit::range_deletion( + diagnostic.range(), + ))); } diagnostics.push(diagnostic); } @@ -365,7 +367,7 @@ pub(crate) fn trailing_commas( // removing any brackets in the same linter pass - doing both at the same time could // lead to a syntax error. let contents = locator.slice(missing_comma.1); - diagnostic.set_fix(Fix::automatic(Edit::range_replacement( + diagnostic.set_fix(Fix::always_applies(Edit::range_replacement( format!("{contents},"), missing_comma.1, ))); diff --git a/crates/ruff_linter/src/rules/flake8_comprehensions/fixes.rs b/crates/ruff_linter/src/rules/flake8_comprehensions/fixes.rs index b16a1371d6..fdfd7045c5 100644 --- a/crates/ruff_linter/src/rules/flake8_comprehensions/fixes.rs +++ b/crates/ruff_linter/src/rules/flake8_comprehensions/fixes.rs @@ -1293,7 +1293,7 @@ pub(crate) fn fix_unnecessary_comprehension_any_all( _ => whitespace_after_arg, }; - Ok(Fix::suggested(Edit::range_replacement( + Ok(Fix::sometimes_applies(Edit::range_replacement( tree.codegen_stylist(stylist), expr.range(), ))) diff --git a/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_call_around_sorted.rs b/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_call_around_sorted.rs index 5738ef49b8..c9ea1b8e0d 100644 --- a/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_call_around_sorted.rs +++ b/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_call_around_sorted.rs @@ -90,9 +90,9 @@ pub(crate) fn unnecessary_call_around_sorted( checker.stylist(), )?; if outer.id == "reversed" { - Ok(Fix::suggested(edit)) + Ok(Fix::sometimes_applies(edit)) } else { - Ok(Fix::automatic(edit)) + Ok(Fix::always_applies(edit)) } }); } diff --git a/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_collection_call.rs b/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_collection_call.rs index 7848fedb12..50ecb575f1 100644 --- a/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_collection_call.rs +++ b/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_collection_call.rs @@ -88,7 +88,7 @@ pub(crate) fn unnecessary_collection_call( ); if checker.patch(diagnostic.kind.rule()) { diagnostic.try_set_fix(|| { - fixes::fix_unnecessary_collection_call(expr, checker).map(Fix::suggested) + fixes::fix_unnecessary_collection_call(expr, checker).map(Fix::sometimes_applies) }); } checker.diagnostics.push(diagnostic); diff --git a/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_comprehension.rs b/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_comprehension.rs index 18a52b10ce..9aee77f929 100644 --- a/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_comprehension.rs +++ b/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_comprehension.rs @@ -67,7 +67,7 @@ fn add_diagnostic(checker: &mut Checker, expr: &Expr) { if checker.patch(diagnostic.kind.rule()) { diagnostic.try_set_fix(|| { fixes::fix_unnecessary_comprehension(expr, checker.locator(), checker.stylist()) - .map(Fix::suggested) + .map(Fix::sometimes_applies) }); } checker.diagnostics.push(diagnostic); diff --git a/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_double_cast_or_process.rs b/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_double_cast_or_process.rs index 94ddb88611..3a1dc89b68 100644 --- a/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_double_cast_or_process.rs +++ b/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_double_cast_or_process.rs @@ -137,7 +137,7 @@ pub(crate) fn unnecessary_double_cast_or_process( checker.locator(), checker.stylist(), ) - .map(Fix::suggested) + .map(Fix::sometimes_applies) }); } checker.diagnostics.push(diagnostic); diff --git a/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_generator_dict.rs b/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_generator_dict.rs index 820444f737..360d098dfc 100644 --- a/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_generator_dict.rs +++ b/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_generator_dict.rs @@ -69,7 +69,7 @@ pub(crate) fn unnecessary_generator_dict( let mut diagnostic = Diagnostic::new(UnnecessaryGeneratorDict, expr.range()); if checker.patch(diagnostic.kind.rule()) { diagnostic.try_set_fix(|| { - fixes::fix_unnecessary_generator_dict(expr, checker).map(Fix::suggested) + fixes::fix_unnecessary_generator_dict(expr, checker).map(Fix::sometimes_applies) }); } checker.diagnostics.push(diagnostic); diff --git a/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_generator_list.rs b/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_generator_list.rs index a15912dfe2..17d43ac937 100644 --- a/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_generator_list.rs +++ b/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_generator_list.rs @@ -63,7 +63,7 @@ pub(crate) fn unnecessary_generator_list( if checker.patch(diagnostic.kind.rule()) { diagnostic.try_set_fix(|| { fixes::fix_unnecessary_generator_list(expr, checker.locator(), checker.stylist()) - .map(Fix::suggested) + .map(Fix::sometimes_applies) }); } checker.diagnostics.push(diagnostic); diff --git a/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_generator_set.rs b/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_generator_set.rs index 7a76389c22..23fd0a695b 100644 --- a/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_generator_set.rs +++ b/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_generator_set.rs @@ -62,7 +62,7 @@ pub(crate) fn unnecessary_generator_set( let mut diagnostic = Diagnostic::new(UnnecessaryGeneratorSet, expr.range()); if checker.patch(diagnostic.kind.rule()) { diagnostic.try_set_fix(|| { - fixes::fix_unnecessary_generator_set(expr, checker).map(Fix::suggested) + fixes::fix_unnecessary_generator_set(expr, checker).map(Fix::sometimes_applies) }); } checker.diagnostics.push(diagnostic); diff --git a/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_list_call.rs b/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_list_call.rs index 0e75994756..68190738e8 100644 --- a/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_list_call.rs +++ b/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_list_call.rs @@ -59,7 +59,7 @@ pub(crate) fn unnecessary_list_call( if checker.patch(diagnostic.kind.rule()) { diagnostic.try_set_fix(|| { fixes::fix_unnecessary_list_call(expr, checker.locator(), checker.stylist()) - .map(Fix::suggested) + .map(Fix::sometimes_applies) }); } checker.diagnostics.push(diagnostic); diff --git a/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_list_comprehension_dict.rs b/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_list_comprehension_dict.rs index ce308b1f8a..c144f589bf 100644 --- a/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_list_comprehension_dict.rs +++ b/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_list_comprehension_dict.rs @@ -67,7 +67,8 @@ pub(crate) fn unnecessary_list_comprehension_dict( let mut diagnostic = Diagnostic::new(UnnecessaryListComprehensionDict, expr.range()); if checker.patch(diagnostic.kind.rule()) { diagnostic.try_set_fix(|| { - fixes::fix_unnecessary_list_comprehension_dict(expr, checker).map(Fix::suggested) + fixes::fix_unnecessary_list_comprehension_dict(expr, checker) + .map(Fix::sometimes_applies) }); } checker.diagnostics.push(diagnostic); diff --git a/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_list_comprehension_set.rs b/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_list_comprehension_set.rs index 796319293d..159e3c99a1 100644 --- a/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_list_comprehension_set.rs +++ b/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_list_comprehension_set.rs @@ -60,7 +60,8 @@ pub(crate) fn unnecessary_list_comprehension_set( let mut diagnostic = Diagnostic::new(UnnecessaryListComprehensionSet, expr.range()); if checker.patch(diagnostic.kind.rule()) { diagnostic.try_set_fix(|| { - fixes::fix_unnecessary_list_comprehension_set(expr, checker).map(Fix::suggested) + fixes::fix_unnecessary_list_comprehension_set(expr, checker) + .map(Fix::sometimes_applies) }); } checker.diagnostics.push(diagnostic); diff --git a/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_literal_dict.rs b/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_literal_dict.rs index 80d7d48ef5..17b9c001b3 100644 --- a/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_literal_dict.rs +++ b/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_literal_dict.rs @@ -81,8 +81,9 @@ pub(crate) fn unnecessary_literal_dict( expr.range(), ); if checker.patch(diagnostic.kind.rule()) { - diagnostic - .try_set_fix(|| fixes::fix_unnecessary_literal_dict(expr, checker).map(Fix::suggested)); + diagnostic.try_set_fix(|| { + fixes::fix_unnecessary_literal_dict(expr, checker).map(Fix::sometimes_applies) + }); } checker.diagnostics.push(diagnostic); } diff --git a/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_literal_set.rs b/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_literal_set.rs index facf6a9de5..b87d81aab5 100644 --- a/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_literal_set.rs +++ b/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_literal_set.rs @@ -76,8 +76,9 @@ pub(crate) fn unnecessary_literal_set( expr.range(), ); if checker.patch(diagnostic.kind.rule()) { - diagnostic - .try_set_fix(|| fixes::fix_unnecessary_literal_set(expr, checker).map(Fix::suggested)); + diagnostic.try_set_fix(|| { + fixes::fix_unnecessary_literal_set(expr, checker).map(Fix::sometimes_applies) + }); } checker.diagnostics.push(diagnostic); } diff --git a/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_literal_within_dict_call.rs b/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_literal_within_dict_call.rs index 7e01ea03c1..7d42f46436 100644 --- a/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_literal_within_dict_call.rs +++ b/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_literal_within_dict_call.rs @@ -98,7 +98,7 @@ pub(crate) fn unnecessary_literal_within_dict_call( checker.locator(), checker.stylist(), ) - .map(Fix::suggested) + .map(Fix::sometimes_applies) }); } checker.diagnostics.push(diagnostic); diff --git a/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_literal_within_list_call.rs b/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_literal_within_list_call.rs index 8d90154080..95dff2223d 100644 --- a/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_literal_within_list_call.rs +++ b/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_literal_within_list_call.rs @@ -100,7 +100,7 @@ pub(crate) fn unnecessary_literal_within_list_call( checker.locator(), checker.stylist(), ) - .map(Fix::suggested) + .map(Fix::sometimes_applies) }); } checker.diagnostics.push(diagnostic); diff --git a/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_literal_within_tuple_call.rs b/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_literal_within_tuple_call.rs index 6bc002ca17..b20f32a896 100644 --- a/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_literal_within_tuple_call.rs +++ b/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_literal_within_tuple_call.rs @@ -102,7 +102,7 @@ pub(crate) fn unnecessary_literal_within_tuple_call( checker.locator(), checker.stylist(), ) - .map(Fix::suggested) + .map(Fix::sometimes_applies) }); } checker.diagnostics.push(diagnostic); diff --git a/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_map.rs b/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_map.rs index cb2be309bb..0f9311f71f 100644 --- a/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_map.rs +++ b/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_map.rs @@ -230,7 +230,7 @@ pub(crate) fn unnecessary_map( checker.locator(), checker.stylist(), ) - .map(Fix::suggested) + .map(Fix::sometimes_applies) }); } checker.diagnostics.push(diagnostic); diff --git a/crates/ruff_linter/src/rules/flake8_errmsg/rules/string_in_exception.rs b/crates/ruff_linter/src/rules/flake8_errmsg/rules/string_in_exception.rs index ea73c92752..14a5077d41 100644 --- a/crates/ruff_linter/src/rules/flake8_errmsg/rules/string_in_exception.rs +++ b/crates/ruff_linter/src/rules/flake8_errmsg/rules/string_in_exception.rs @@ -293,7 +293,7 @@ fn generate_fix( range: TextRange::default(), }); - Fix::suggested_edits( + Fix::sometimes_applies_edits( Edit::insertion( format!( "{}{}{}", diff --git a/crates/ruff_linter/src/rules/flake8_executable/rules/shebang_leading_whitespace.rs b/crates/ruff_linter/src/rules/flake8_executable/rules/shebang_leading_whitespace.rs index bd6dcac142..c03b5b2a0c 100644 --- a/crates/ruff_linter/src/rules/flake8_executable/rules/shebang_leading_whitespace.rs +++ b/crates/ruff_linter/src/rules/flake8_executable/rules/shebang_leading_whitespace.rs @@ -69,7 +69,7 @@ pub(crate) fn shebang_leading_whitespace( let prefix = TextRange::up_to(range.start()); let mut diagnostic = Diagnostic::new(ShebangLeadingWhitespace, prefix); if settings.rules.should_fix(diagnostic.kind.rule()) { - diagnostic.set_fix(Fix::automatic(Edit::range_deletion(prefix))); + diagnostic.set_fix(Fix::always_applies(Edit::range_deletion(prefix))); } Some(diagnostic) } diff --git a/crates/ruff_linter/src/rules/flake8_implicit_str_concat/rules/implicit.rs b/crates/ruff_linter/src/rules/flake8_implicit_str_concat/rules/implicit.rs index b0a06b9ad9..24d680a9a7 100644 --- a/crates/ruff_linter/src/rules/flake8_implicit_str_concat/rules/implicit.rs +++ b/crates/ruff_linter/src/rules/flake8_implicit_str_concat/rules/implicit.rs @@ -169,7 +169,7 @@ fn concatenate_strings(a_range: TextRange, b_range: TextRange, locator: &Locator let concatenation = format!("{a_leading_quote}{a_body}{b_body}{a_trailing_quote}"); let range = TextRange::new(a_range.start(), b_range.end()); - Some(Fix::automatic(Edit::range_replacement( + Some(Fix::always_applies(Edit::range_replacement( concatenation, range, ))) diff --git a/crates/ruff_linter/src/rules/flake8_import_conventions/rules/unconventional_import_alias.rs b/crates/ruff_linter/src/rules/flake8_import_conventions/rules/unconventional_import_alias.rs index 3fd576876c..f8c3b162a6 100644 --- a/crates/ruff_linter/src/rules/flake8_import_conventions/rules/unconventional_import_alias.rs +++ b/crates/ruff_linter/src/rules/flake8_import_conventions/rules/unconventional_import_alias.rs @@ -86,7 +86,7 @@ pub(crate) fn unconventional_import_alias( let scope = &checker.semantic().scopes[binding.scope]; let (edit, rest) = Renamer::rename(name, expected_alias, scope, checker.semantic())?; - Ok(Fix::suggested_edits(edit, rest)) + Ok(Fix::sometimes_applies_edits(edit, rest)) }); } } diff --git a/crates/ruff_linter/src/rules/flake8_logging/rules/direct_logger_instantiation.rs b/crates/ruff_linter/src/rules/flake8_logging/rules/direct_logger_instantiation.rs index 7d8d9af04b..6b2c829527 100644 --- a/crates/ruff_linter/src/rules/flake8_logging/rules/direct_logger_instantiation.rs +++ b/crates/ruff_linter/src/rules/flake8_logging/rules/direct_logger_instantiation.rs @@ -69,7 +69,7 @@ pub(crate) fn direct_logger_instantiation(checker: &mut Checker, call: &ast::Exp checker.semantic(), )?; let reference_edit = Edit::range_replacement(binding, call.func.range()); - Ok(Fix::suggested_edits(import_edit, [reference_edit])) + Ok(Fix::sometimes_applies_edits(import_edit, [reference_edit])) }); } checker.diagnostics.push(diagnostic); diff --git a/crates/ruff_linter/src/rules/flake8_logging/rules/invalid_get_logger_argument.rs b/crates/ruff_linter/src/rules/flake8_logging/rules/invalid_get_logger_argument.rs index 956f23b3ae..c37255377a 100644 --- a/crates/ruff_linter/src/rules/flake8_logging/rules/invalid_get_logger_argument.rs +++ b/crates/ruff_linter/src/rules/flake8_logging/rules/invalid_get_logger_argument.rs @@ -82,7 +82,7 @@ pub(crate) fn invalid_get_logger_argument(checker: &mut Checker, call: &ast::Exp let mut diagnostic = Diagnostic::new(InvalidGetLoggerArgument, expr.range()); if checker.patch(diagnostic.kind.rule()) { if checker.semantic().is_builtin("__name__") { - diagnostic.set_fix(Fix::suggested(Edit::range_replacement( + diagnostic.set_fix(Fix::sometimes_applies(Edit::range_replacement( "__name__".to_string(), expr.range(), ))); diff --git a/crates/ruff_linter/src/rules/flake8_logging/rules/undocumented_warn.rs b/crates/ruff_linter/src/rules/flake8_logging/rules/undocumented_warn.rs index 6e64dab7fe..3b71ee693a 100644 --- a/crates/ruff_linter/src/rules/flake8_logging/rules/undocumented_warn.rs +++ b/crates/ruff_linter/src/rules/flake8_logging/rules/undocumented_warn.rs @@ -63,7 +63,7 @@ pub(crate) fn undocumented_warn(checker: &mut Checker, expr: &Expr) { checker.semantic(), )?; let reference_edit = Edit::range_replacement(binding, expr.range()); - Ok(Fix::suggested_edits(import_edit, [reference_edit])) + Ok(Fix::sometimes_applies_edits(import_edit, [reference_edit])) }); } checker.diagnostics.push(diagnostic); diff --git a/crates/ruff_linter/src/rules/flake8_logging_format/rules/logging_call.rs b/crates/ruff_linter/src/rules/flake8_logging_format/rules/logging_call.rs index a526981a46..80d6325348 100644 --- a/crates/ruff_linter/src/rules/flake8_logging_format/rules/logging_call.rs +++ b/crates/ruff_linter/src/rules/flake8_logging_format/rules/logging_call.rs @@ -197,7 +197,7 @@ pub(crate) fn logging_call(checker: &mut Checker, call: &ast::ExprCall) { ) { let mut diagnostic = Diagnostic::new(LoggingWarn, range); if checker.patch(diagnostic.kind.rule()) { - diagnostic.set_fix(Fix::automatic(Edit::range_replacement( + diagnostic.set_fix(Fix::always_applies(Edit::range_replacement( "warning".to_string(), range, ))); diff --git a/crates/ruff_linter/src/rules/flake8_pie/rules/duplicate_class_field_definition.rs b/crates/ruff_linter/src/rules/flake8_pie/rules/duplicate_class_field_definition.rs index d724e6baf6..0ce64881e6 100644 --- a/crates/ruff_linter/src/rules/flake8_pie/rules/duplicate_class_field_definition.rs +++ b/crates/ruff_linter/src/rules/flake8_pie/rules/duplicate_class_field_definition.rs @@ -82,7 +82,7 @@ pub(crate) fn duplicate_class_field_definition(checker: &mut Checker, body: &[St if checker.patch(diagnostic.kind.rule()) { let edit = fix::edits::delete_stmt(stmt, Some(stmt), checker.locator(), checker.indexer()); - diagnostic.set_fix(Fix::suggested(edit).isolate(Checker::isolation( + diagnostic.set_fix(Fix::sometimes_applies(edit).isolate(Checker::isolation( checker.semantic().current_statement_id(), ))); } diff --git a/crates/ruff_linter/src/rules/flake8_pie/rules/multiple_starts_ends_with.rs b/crates/ruff_linter/src/rules/flake8_pie/rules/multiple_starts_ends_with.rs index 4ab05a1e70..99996cdb98 100644 --- a/crates/ruff_linter/src/rules/flake8_pie/rules/multiple_starts_ends_with.rs +++ b/crates/ruff_linter/src/rules/flake8_pie/rules/multiple_starts_ends_with.rs @@ -196,7 +196,7 @@ pub(crate) fn multiple_starts_ends_with(checker: &mut Checker, expr: &Expr) { range: TextRange::default(), }); let bool_op = node; - diagnostic.set_fix(Fix::suggested(Edit::range_replacement( + diagnostic.set_fix(Fix::sometimes_applies(Edit::range_replacement( checker.generator().expr(&bool_op), expr.range(), ))); diff --git a/crates/ruff_linter/src/rules/flake8_pie/rules/reimplemented_list_builtin.rs b/crates/ruff_linter/src/rules/flake8_pie/rules/reimplemented_list_builtin.rs index 05492d9bab..e19c924cd3 100644 --- a/crates/ruff_linter/src/rules/flake8_pie/rules/reimplemented_list_builtin.rs +++ b/crates/ruff_linter/src/rules/flake8_pie/rules/reimplemented_list_builtin.rs @@ -66,7 +66,7 @@ pub(crate) fn reimplemented_list_builtin(checker: &mut Checker, expr: &ExprLambd let mut diagnostic = Diagnostic::new(ReimplementedListBuiltin, expr.range()); if checker.patch(diagnostic.kind.rule()) { if checker.semantic().is_builtin("list") { - diagnostic.set_fix(Fix::automatic(Edit::range_replacement( + diagnostic.set_fix(Fix::always_applies(Edit::range_replacement( "list".to_string(), expr.range(), ))); diff --git a/crates/ruff_linter/src/rules/flake8_pie/rules/unnecessary_pass.rs b/crates/ruff_linter/src/rules/flake8_pie/rules/unnecessary_pass.rs index eaea78bd5c..c14fb56a5c 100644 --- a/crates/ruff_linter/src/rules/flake8_pie/rules/unnecessary_pass.rs +++ b/crates/ruff_linter/src/rules/flake8_pie/rules/unnecessary_pass.rs @@ -70,7 +70,7 @@ pub(crate) fn no_unnecessary_pass(checker: &mut Checker, body: &[Stmt]) { } else { fix::edits::delete_stmt(stmt, None, checker.locator(), checker.indexer()) }; - diagnostic.set_fix(Fix::automatic(edit).isolate(Checker::isolation( + diagnostic.set_fix(Fix::always_applies(edit).isolate(Checker::isolation( checker.semantic().current_statement_id(), ))); } diff --git a/crates/ruff_linter/src/rules/flake8_pie/rules/unnecessary_range_start.rs b/crates/ruff_linter/src/rules/flake8_pie/rules/unnecessary_range_start.rs index 9bedfb27b1..ead7bd7377 100644 --- a/crates/ruff_linter/src/rules/flake8_pie/rules/unnecessary_range_start.rs +++ b/crates/ruff_linter/src/rules/flake8_pie/rules/unnecessary_range_start.rs @@ -86,7 +86,7 @@ pub(crate) fn unnecessary_range_start(checker: &mut Checker, call: &ast::ExprCal Parentheses::Preserve, checker.locator().contents(), ) - .map(Fix::automatic) + .map(Fix::always_applies) }); } checker.diagnostics.push(diagnostic); diff --git a/crates/ruff_linter/src/rules/flake8_pyi/rules/any_eq_ne_annotation.rs b/crates/ruff_linter/src/rules/flake8_pyi/rules/any_eq_ne_annotation.rs index 108a190755..94867958ce 100644 --- a/crates/ruff_linter/src/rules/flake8_pyi/rules/any_eq_ne_annotation.rs +++ b/crates/ruff_linter/src/rules/flake8_pyi/rules/any_eq_ne_annotation.rs @@ -81,7 +81,7 @@ pub(crate) fn any_eq_ne_annotation(checker: &mut Checker, name: &str, parameters if checker.patch(diagnostic.kind.rule()) { // Ex) `def __eq__(self, obj: Any): ...` if checker.semantic().is_builtin("object") { - diagnostic.set_fix(Fix::automatic(Edit::range_replacement( + diagnostic.set_fix(Fix::always_applies(Edit::range_replacement( "object".to_string(), annotation.range(), ))); diff --git a/crates/ruff_linter/src/rules/flake8_pyi/rules/duplicate_union_member.rs b/crates/ruff_linter/src/rules/flake8_pyi/rules/duplicate_union_member.rs index fea8b83aeb..c0240556b7 100644 --- a/crates/ruff_linter/src/rules/flake8_pyi/rules/duplicate_union_member.rs +++ b/crates/ruff_linter/src/rules/flake8_pyi/rules/duplicate_union_member.rs @@ -72,7 +72,7 @@ pub(crate) fn duplicate_union_member<'a>(checker: &mut Checker, expr: &'a Expr) if let Some(parent @ Expr::BinOp(ast::ExprBinOp { left, right, .. })) = parent { // Replace the parent with its non-duplicate child. let child = if expr == left.as_ref() { right } else { left }; - diagnostic.set_fix(Fix::automatic(Edit::range_replacement( + diagnostic.set_fix(Fix::always_applies(Edit::range_replacement( checker.locator().slice(child.as_ref()).to_string(), parent.range(), ))); diff --git a/crates/ruff_linter/src/rules/flake8_pyi/rules/ellipsis_in_non_empty_class_body.rs b/crates/ruff_linter/src/rules/flake8_pyi/rules/ellipsis_in_non_empty_class_body.rs index db80761f03..3419752d9c 100644 --- a/crates/ruff_linter/src/rules/flake8_pyi/rules/ellipsis_in_non_empty_class_body.rs +++ b/crates/ruff_linter/src/rules/flake8_pyi/rules/ellipsis_in_non_empty_class_body.rs @@ -66,7 +66,7 @@ pub(crate) fn ellipsis_in_non_empty_class_body(checker: &mut Checker, body: &[St if checker.patch(diagnostic.kind.rule()) { let edit = fix::edits::delete_stmt(stmt, Some(stmt), checker.locator(), checker.indexer()); - diagnostic.set_fix(Fix::automatic(edit).isolate(Checker::isolation( + diagnostic.set_fix(Fix::always_applies(edit).isolate(Checker::isolation( checker.semantic().current_statement_id(), ))); } diff --git a/crates/ruff_linter/src/rules/flake8_pyi/rules/exit_annotations.rs b/crates/ruff_linter/src/rules/flake8_pyi/rules/exit_annotations.rs index 24321f62ee..2a1247942a 100644 --- a/crates/ruff_linter/src/rules/flake8_pyi/rules/exit_annotations.rs +++ b/crates/ruff_linter/src/rules/flake8_pyi/rules/exit_annotations.rs @@ -177,7 +177,7 @@ fn check_short_args_list(checker: &mut Checker, parameters: &Parameters, func_ki if checker.patch(diagnostic.kind.rule()) { if checker.semantic().is_builtin("object") { - diagnostic.set_fix(Fix::automatic(Edit::range_replacement( + diagnostic.set_fix(Fix::always_applies(Edit::range_replacement( "object".to_string(), annotation.range(), ))); diff --git a/crates/ruff_linter/src/rules/flake8_pyi/rules/non_empty_stub_body.rs b/crates/ruff_linter/src/rules/flake8_pyi/rules/non_empty_stub_body.rs index ac9f1de1e6..8979146421 100644 --- a/crates/ruff_linter/src/rules/flake8_pyi/rules/non_empty_stub_body.rs +++ b/crates/ruff_linter/src/rules/flake8_pyi/rules/non_empty_stub_body.rs @@ -70,7 +70,7 @@ pub(crate) fn non_empty_stub_body(checker: &mut Checker, body: &[Stmt]) { let mut diagnostic = Diagnostic::new(NonEmptyStubBody, stmt.range()); if checker.patch(Rule::NonEmptyStubBody) { - diagnostic.set_fix(Fix::suggested(Edit::range_replacement( + diagnostic.set_fix(Fix::sometimes_applies(Edit::range_replacement( format!("..."), stmt.range(), ))); diff --git a/crates/ruff_linter/src/rules/flake8_pyi/rules/numeric_literal_too_long.rs b/crates/ruff_linter/src/rules/flake8_pyi/rules/numeric_literal_too_long.rs index f2211d5c1d..4b432ed09a 100644 --- a/crates/ruff_linter/src/rules/flake8_pyi/rules/numeric_literal_too_long.rs +++ b/crates/ruff_linter/src/rules/flake8_pyi/rules/numeric_literal_too_long.rs @@ -51,7 +51,7 @@ pub(crate) fn numeric_literal_too_long(checker: &mut Checker, expr: &Expr) { let mut diagnostic = Diagnostic::new(NumericLiteralTooLong, expr.range()); if checker.patch(diagnostic.kind.rule()) { - diagnostic.set_fix(Fix::suggested(Edit::range_replacement( + diagnostic.set_fix(Fix::sometimes_applies(Edit::range_replacement( "...".to_string(), expr.range(), ))); diff --git a/crates/ruff_linter/src/rules/flake8_pyi/rules/pass_in_class_body.rs b/crates/ruff_linter/src/rules/flake8_pyi/rules/pass_in_class_body.rs index 2adc7bbfca..b4c580a486 100644 --- a/crates/ruff_linter/src/rules/flake8_pyi/rules/pass_in_class_body.rs +++ b/crates/ruff_linter/src/rules/flake8_pyi/rules/pass_in_class_body.rs @@ -63,7 +63,7 @@ pub(crate) fn pass_in_class_body(checker: &mut Checker, class_def: &ast::StmtCla if checker.patch(diagnostic.kind.rule()) { let edit = fix::edits::delete_stmt(stmt, Some(stmt), checker.locator(), checker.indexer()); - diagnostic.set_fix(Fix::automatic(edit).isolate(Checker::isolation( + diagnostic.set_fix(Fix::always_applies(edit).isolate(Checker::isolation( checker.semantic().current_statement_id(), ))); } diff --git a/crates/ruff_linter/src/rules/flake8_pyi/rules/pass_statement_stub_body.rs b/crates/ruff_linter/src/rules/flake8_pyi/rules/pass_statement_stub_body.rs index 71cce841b6..672ea85a6f 100644 --- a/crates/ruff_linter/src/rules/flake8_pyi/rules/pass_statement_stub_body.rs +++ b/crates/ruff_linter/src/rules/flake8_pyi/rules/pass_statement_stub_body.rs @@ -48,7 +48,7 @@ pub(crate) fn pass_statement_stub_body(checker: &mut Checker, body: &[Stmt]) { let mut diagnostic = Diagnostic::new(PassStatementStubBody, pass.range()); if checker.patch(Rule::PassStatementStubBody) { - diagnostic.set_fix(Fix::automatic(Edit::range_replacement( + diagnostic.set_fix(Fix::always_applies(Edit::range_replacement( format!("..."), pass.range(), ))); diff --git a/crates/ruff_linter/src/rules/flake8_pyi/rules/quoted_annotation_in_stub.rs b/crates/ruff_linter/src/rules/flake8_pyi/rules/quoted_annotation_in_stub.rs index f1d7e7f9cf..f193e253cb 100644 --- a/crates/ruff_linter/src/rules/flake8_pyi/rules/quoted_annotation_in_stub.rs +++ b/crates/ruff_linter/src/rules/flake8_pyi/rules/quoted_annotation_in_stub.rs @@ -44,7 +44,7 @@ impl AlwaysFixableViolation for QuotedAnnotationInStub { pub(crate) fn quoted_annotation_in_stub(checker: &mut Checker, annotation: &str, range: TextRange) { let mut diagnostic = Diagnostic::new(QuotedAnnotationInStub, range); if checker.patch(Rule::QuotedAnnotationInStub) { - diagnostic.set_fix(Fix::automatic(Edit::range_replacement( + diagnostic.set_fix(Fix::always_applies(Edit::range_replacement( annotation.to_string(), range, ))); diff --git a/crates/ruff_linter/src/rules/flake8_pyi/rules/simple_defaults.rs b/crates/ruff_linter/src/rules/flake8_pyi/rules/simple_defaults.rs index daf82807c0..e2093e6b9b 100644 --- a/crates/ruff_linter/src/rules/flake8_pyi/rules/simple_defaults.rs +++ b/crates/ruff_linter/src/rules/flake8_pyi/rules/simple_defaults.rs @@ -535,7 +535,7 @@ pub(crate) fn typed_argument_simple_defaults(checker: &mut Checker, parameters: let mut diagnostic = Diagnostic::new(TypedArgumentDefaultInStub, default.range()); if checker.patch(diagnostic.kind.rule()) { - diagnostic.set_fix(Fix::suggested(Edit::range_replacement( + diagnostic.set_fix(Fix::sometimes_applies(Edit::range_replacement( "...".to_string(), default.range(), ))); @@ -572,7 +572,7 @@ pub(crate) fn argument_simple_defaults(checker: &mut Checker, parameters: &Param let mut diagnostic = Diagnostic::new(ArgumentDefaultInStub, default.range()); if checker.patch(diagnostic.kind.rule()) { - diagnostic.set_fix(Fix::suggested(Edit::range_replacement( + diagnostic.set_fix(Fix::sometimes_applies(Edit::range_replacement( "...".to_string(), default.range(), ))); @@ -607,7 +607,7 @@ pub(crate) fn assignment_default_in_stub(checker: &mut Checker, targets: &[Expr] let mut diagnostic = Diagnostic::new(AssignmentDefaultInStub, value.range()); if checker.patch(diagnostic.kind.rule()) { - diagnostic.set_fix(Fix::suggested(Edit::range_replacement( + diagnostic.set_fix(Fix::sometimes_applies(Edit::range_replacement( "...".to_string(), value.range(), ))); @@ -643,7 +643,7 @@ pub(crate) fn annotated_assignment_default_in_stub( let mut diagnostic = Diagnostic::new(AssignmentDefaultInStub, value.range()); if checker.patch(diagnostic.kind.rule()) { - diagnostic.set_fix(Fix::suggested(Edit::range_replacement( + diagnostic.set_fix(Fix::sometimes_applies(Edit::range_replacement( "...".to_string(), value.range(), ))); @@ -748,7 +748,7 @@ pub(crate) fn type_alias_without_annotation(checker: &mut Checker, value: &Expr, target.start(), checker.semantic(), )?; - Ok(Fix::suggested_edits( + Ok(Fix::sometimes_applies_edits( Edit::range_replacement(format!("{id}: {binding}"), target.range()), [import_edit], )) diff --git a/crates/ruff_linter/src/rules/flake8_pyi/rules/str_or_repr_defined_in_stub.rs b/crates/ruff_linter/src/rules/flake8_pyi/rules/str_or_repr_defined_in_stub.rs index d4f98db0f7..acbe23b07a 100644 --- a/crates/ruff_linter/src/rules/flake8_pyi/rules/str_or_repr_defined_in_stub.rs +++ b/crates/ruff_linter/src/rules/flake8_pyi/rules/str_or_repr_defined_in_stub.rs @@ -99,7 +99,7 @@ pub(crate) fn str_or_repr_defined_in_stub(checker: &mut Checker, stmt: &Stmt) { let stmt = checker.semantic().current_statement(); let parent = checker.semantic().current_statement_parent(); let edit = delete_stmt(stmt, parent, checker.locator(), checker.indexer()); - diagnostic.set_fix(Fix::automatic(edit).isolate(Checker::isolation( + diagnostic.set_fix(Fix::always_applies(edit).isolate(Checker::isolation( checker.semantic().current_statement_parent_id(), ))); } diff --git a/crates/ruff_linter/src/rules/flake8_pyi/rules/string_or_bytes_too_long.rs b/crates/ruff_linter/src/rules/flake8_pyi/rules/string_or_bytes_too_long.rs index 14af90cdb4..81c2361b1f 100644 --- a/crates/ruff_linter/src/rules/flake8_pyi/rules/string_or_bytes_too_long.rs +++ b/crates/ruff_linter/src/rules/flake8_pyi/rules/string_or_bytes_too_long.rs @@ -68,7 +68,7 @@ pub(crate) fn string_or_bytes_too_long(checker: &mut Checker, expr: &Expr) { let mut diagnostic = Diagnostic::new(StringOrBytesTooLong, expr.range()); if checker.patch(diagnostic.kind.rule()) { - diagnostic.set_fix(Fix::suggested(Edit::range_replacement( + diagnostic.set_fix(Fix::sometimes_applies(Edit::range_replacement( "...".to_string(), expr.range(), ))); diff --git a/crates/ruff_linter/src/rules/flake8_pyi/rules/unaliased_collections_abc_set_import.rs b/crates/ruff_linter/src/rules/flake8_pyi/rules/unaliased_collections_abc_set_import.rs index 29794d5f71..e50cfa03de 100644 --- a/crates/ruff_linter/src/rules/flake8_pyi/rules/unaliased_collections_abc_set_import.rs +++ b/crates/ruff_linter/src/rules/flake8_pyi/rules/unaliased_collections_abc_set_import.rs @@ -70,7 +70,7 @@ pub(crate) fn unaliased_collections_abc_set_import( diagnostic.try_set_fix(|| { let scope = &checker.semantic().scopes[binding.scope]; let (edit, rest) = Renamer::rename(name, "AbstractSet", scope, checker.semantic())?; - Ok(Fix::suggested_edits(edit, rest)) + Ok(Fix::sometimes_applies_edits(edit, rest)) }); } } diff --git a/crates/ruff_linter/src/rules/flake8_pytest_style/rules/assertion.rs b/crates/ruff_linter/src/rules/flake8_pytest_style/rules/assertion.rs index d0286bb55f..f81b6d050b 100644 --- a/crates/ruff_linter/src/rules/flake8_pytest_style/rules/assertion.rs +++ b/crates/ruff_linter/src/rules/flake8_pytest_style/rules/assertion.rs @@ -292,7 +292,7 @@ pub(crate) fn unittest_assertion( && !checker.indexer().comment_ranges().intersects(expr.range()) { if let Ok(stmt) = unittest_assert.generate_assert(args, keywords) { - diagnostic.set_fix(Fix::suggested(Edit::range_replacement( + diagnostic.set_fix(Fix::sometimes_applies(Edit::range_replacement( checker.generator().stmt(&stmt), parenthesized_range( expr.into(), @@ -401,7 +401,7 @@ pub(crate) fn unittest_raises_assertion( checker.semantic(), )?; let edit = Edit::range_replacement(format!("{binding}({args})"), call.range()); - Ok(Fix::suggested_edits(import_edit, [edit])) + Ok(Fix::sometimes_applies_edits(import_edit, [edit])) }); } } @@ -756,7 +756,7 @@ pub(crate) fn composite_condition( { diagnostic.try_set_fix(|| { fix_composite_condition(stmt, checker.locator(), checker.stylist()) - .map(Fix::suggested) + .map(Fix::sometimes_applies) }); } } diff --git a/crates/ruff_linter/src/rules/flake8_pytest_style/rules/fixture.rs b/crates/ruff_linter/src/rules/flake8_pytest_style/rules/fixture.rs index c877e4f7ba..c96e783e2d 100644 --- a/crates/ruff_linter/src/rules/flake8_pytest_style/rules/fixture.rs +++ b/crates/ruff_linter/src/rules/flake8_pytest_style/rules/fixture.rs @@ -700,7 +700,7 @@ fn check_fixture_decorator(checker: &mut Checker, func_name: &str, decorator: &D && arguments.args.is_empty() && arguments.keywords.is_empty() { - let fix = Fix::automatic(Edit::deletion(func.end(), decorator.end())); + let fix = Fix::always_applies(Edit::deletion(func.end(), decorator.end())); pytest_fixture_parentheses( checker, decorator, @@ -735,7 +735,7 @@ fn check_fixture_decorator(checker: &mut Checker, func_name: &str, decorator: &D edits::Parentheses::Preserve, checker.locator().contents(), ) - .map(Fix::suggested) + .map(Fix::sometimes_applies) }); } checker.diagnostics.push(diagnostic); @@ -746,7 +746,7 @@ fn check_fixture_decorator(checker: &mut Checker, func_name: &str, decorator: &D _ => { if checker.enabled(Rule::PytestFixtureIncorrectParenthesesStyle) { if checker.settings.flake8_pytest_style.fixture_parentheses { - let fix = Fix::automatic(Edit::insertion( + let fix = Fix::always_applies(Edit::insertion( Parentheses::Empty.to_string(), decorator.end(), )); @@ -839,9 +839,9 @@ fn check_fixture_returns( )) }); if let Some(return_type_edit) = return_type_edit { - diagnostic.set_fix(Fix::automatic_edits(yield_edit, [return_type_edit])); + diagnostic.set_fix(Fix::always_applies_edits(yield_edit, [return_type_edit])); } else { - diagnostic.set_fix(Fix::automatic(yield_edit)); + diagnostic.set_fix(Fix::always_applies(yield_edit)); } } checker.diagnostics.push(diagnostic); @@ -914,7 +914,7 @@ fn check_fixture_marks(checker: &mut Checker, decorators: &[Decorator]) { Diagnostic::new(PytestUnnecessaryAsyncioMarkOnFixture, expr.range()); if checker.patch(diagnostic.kind.rule()) { let range = checker.locator().full_lines_range(expr.range()); - diagnostic.set_fix(Fix::automatic(Edit::range_deletion(range))); + diagnostic.set_fix(Fix::always_applies(Edit::range_deletion(range))); } checker.diagnostics.push(diagnostic); } @@ -926,7 +926,7 @@ fn check_fixture_marks(checker: &mut Checker, decorators: &[Decorator]) { Diagnostic::new(PytestErroneousUseFixturesOnFixture, expr.range()); if checker.patch(diagnostic.kind.rule()) { let line_range = checker.locator().full_lines_range(expr.range()); - diagnostic.set_fix(Fix::automatic(Edit::range_deletion(line_range))); + diagnostic.set_fix(Fix::always_applies(Edit::range_deletion(line_range))); } checker.diagnostics.push(diagnostic); } diff --git a/crates/ruff_linter/src/rules/flake8_pytest_style/rules/marks.rs b/crates/ruff_linter/src/rules/flake8_pytest_style/rules/marks.rs index f3aaef2843..8214ea52e2 100644 --- a/crates/ruff_linter/src/rules/flake8_pytest_style/rules/marks.rs +++ b/crates/ruff_linter/src/rules/flake8_pytest_style/rules/marks.rs @@ -152,13 +152,13 @@ fn check_mark_parentheses(checker: &mut Checker, decorator: &Decorator, call_pat && args.is_empty() && keywords.is_empty() { - let fix = Fix::automatic(Edit::deletion(func.end(), decorator.end())); + let fix = Fix::always_applies(Edit::deletion(func.end(), decorator.end())); pytest_mark_parentheses(checker, decorator, call_path, fix, "", "()"); } } _ => { if checker.settings.flake8_pytest_style.mark_parentheses { - let fix = Fix::automatic(Edit::insertion("()".to_string(), decorator.end())); + let fix = Fix::always_applies(Edit::insertion("()".to_string(), decorator.end())); pytest_mark_parentheses(checker, decorator, call_path, fix, "()", ""); } } @@ -185,7 +185,9 @@ fn check_useless_usefixtures(checker: &mut Checker, decorator: &Decorator, call_ if !has_parameters { let mut diagnostic = Diagnostic::new(PytestUseFixturesWithoutParameters, decorator.range()); if checker.patch(diagnostic.kind.rule()) { - diagnostic.set_fix(Fix::suggested(Edit::range_deletion(decorator.range()))); + diagnostic.set_fix(Fix::sometimes_applies(Edit::range_deletion( + decorator.range(), + ))); } checker.diagnostics.push(diagnostic); } diff --git a/crates/ruff_linter/src/rules/flake8_pytest_style/rules/parametrize.rs b/crates/ruff_linter/src/rules/flake8_pytest_style/rules/parametrize.rs index 1df32c72fb..cc201ded57 100644 --- a/crates/ruff_linter/src/rules/flake8_pytest_style/rules/parametrize.rs +++ b/crates/ruff_linter/src/rules/flake8_pytest_style/rules/parametrize.rs @@ -352,7 +352,7 @@ fn check_names(checker: &mut Checker, decorator: &Decorator, expr: &Expr) { ctx: ExprContext::Load, range: TextRange::default(), }); - diagnostic.set_fix(Fix::suggested(Edit::range_replacement( + diagnostic.set_fix(Fix::sometimes_applies(Edit::range_replacement( format!("({})", checker.generator().expr(&node)), name_range, ))); @@ -387,7 +387,7 @@ fn check_names(checker: &mut Checker, decorator: &Decorator, expr: &Expr) { ctx: ExprContext::Load, range: TextRange::default(), }); - diagnostic.set_fix(Fix::suggested(Edit::range_replacement( + diagnostic.set_fix(Fix::sometimes_applies(Edit::range_replacement( checker.generator().expr(&node), name_range, ))); @@ -419,7 +419,7 @@ fn check_names(checker: &mut Checker, decorator: &Decorator, expr: &Expr) { ctx: ExprContext::Load, range: TextRange::default(), }); - diagnostic.set_fix(Fix::suggested(Edit::range_replacement( + diagnostic.set_fix(Fix::sometimes_applies(Edit::range_replacement( checker.generator().expr(&node), expr.range(), ))); @@ -435,10 +435,9 @@ fn check_names(checker: &mut Checker, decorator: &Decorator, expr: &Expr) { ); if checker.patch(diagnostic.kind.rule()) { if let Some(content) = elts_to_csv(elts, checker.generator()) { - diagnostic.set_fix(Fix::suggested(Edit::range_replacement( - content, - expr.range(), - ))); + diagnostic.set_fix(Fix::sometimes_applies( + Edit::range_replacement(content, expr.range()), + )); } } checker.diagnostics.push(diagnostic); @@ -467,7 +466,7 @@ fn check_names(checker: &mut Checker, decorator: &Decorator, expr: &Expr) { ctx: ExprContext::Load, range: TextRange::default(), }); - diagnostic.set_fix(Fix::suggested(Edit::range_replacement( + diagnostic.set_fix(Fix::sometimes_applies(Edit::range_replacement( format!("({})", checker.generator().expr(&node)), expr.range(), ))); @@ -483,10 +482,9 @@ fn check_names(checker: &mut Checker, decorator: &Decorator, expr: &Expr) { ); if checker.patch(diagnostic.kind.rule()) { if let Some(content) = elts_to_csv(elts, checker.generator()) { - diagnostic.set_fix(Fix::suggested(Edit::range_replacement( - content, - expr.range(), - ))); + diagnostic.set_fix(Fix::sometimes_applies( + Edit::range_replacement(content, expr.range()), + )); } } checker.diagnostics.push(diagnostic); @@ -598,8 +596,9 @@ fn check_duplicates(checker: &mut Checker, values: &Expr) { .comment_ranges() .intersects(deletion_range) { - diagnostic - .set_fix(Fix::suggested(Edit::range_deletion(deletion_range))); + diagnostic.set_fix(Fix::sometimes_applies(Edit::range_deletion( + deletion_range, + ))); } } } @@ -620,7 +619,7 @@ fn handle_single_name(checker: &mut Checker, expr: &Expr, value: &Expr) { if checker.patch(diagnostic.kind.rule()) { let node = value.clone(); - diagnostic.set_fix(Fix::automatic(Edit::range_replacement( + diagnostic.set_fix(Fix::always_applies(Edit::range_replacement( checker.generator().expr(&node), expr.range(), ))); diff --git a/crates/ruff_linter/src/rules/flake8_quotes/rules/avoidable_escaped_quote.rs b/crates/ruff_linter/src/rules/flake8_quotes/rules/avoidable_escaped_quote.rs index b0ea0636b4..5f73e34bb5 100644 --- a/crates/ruff_linter/src/rules/flake8_quotes/rules/avoidable_escaped_quote.rs +++ b/crates/ruff_linter/src/rules/flake8_quotes/rules/avoidable_escaped_quote.rs @@ -142,7 +142,7 @@ pub(crate) fn avoidable_escaped_quote( quote = quotes_settings.inline_quotes.opposite().as_char(), value = unescape_string(string_contents) ); - diagnostic.set_fix(Fix::automatic(Edit::range_replacement( + diagnostic.set_fix(Fix::always_applies(Edit::range_replacement( fixed_contents, tok_range, ))); @@ -216,7 +216,7 @@ pub(crate) fn avoidable_escaped_quote( tok_range, ), )); - diagnostic.set_fix(Fix::automatic_edits( + diagnostic.set_fix(Fix::always_applies_edits( fstring_start_edit, fstring_middle_and_end_edits, )); diff --git a/crates/ruff_linter/src/rules/flake8_quotes/rules/check_string_quotes.rs b/crates/ruff_linter/src/rules/flake8_quotes/rules/check_string_quotes.rs index 1d32095509..2fb2e89df4 100644 --- a/crates/ruff_linter/src/rules/flake8_quotes/rules/check_string_quotes.rs +++ b/crates/ruff_linter/src/rules/flake8_quotes/rules/check_string_quotes.rs @@ -240,7 +240,7 @@ fn docstring(locator: &Locator, range: TextRange, settings: &LinterSettings) -> fixed_contents.push_str("e); fixed_contents.push_str(string_contents); fixed_contents.push_str("e); - diagnostic.set_fix(Fix::automatic(Edit::range_replacement( + diagnostic.set_fix(Fix::always_applies(Edit::range_replacement( fixed_contents, range, ))); @@ -317,7 +317,7 @@ fn strings( fixed_contents.push_str(quote); fixed_contents.push_str(string_contents); fixed_contents.push_str(quote); - diagnostic.set_fix(Fix::automatic(Edit::range_replacement( + diagnostic.set_fix(Fix::always_applies(Edit::range_replacement( fixed_contents, *range, ))); @@ -342,7 +342,7 @@ fn strings( fixed_contents.push(quote); fixed_contents.push_str(string_contents); fixed_contents.push(quote); - diagnostic.set_fix(Fix::automatic(Edit::range_replacement( + diagnostic.set_fix(Fix::always_applies(Edit::range_replacement( fixed_contents, *range, ))); diff --git a/crates/ruff_linter/src/rules/flake8_raise/rules/unnecessary_paren_on_raise_exception.rs b/crates/ruff_linter/src/rules/flake8_raise/rules/unnecessary_paren_on_raise_exception.rs index 53febbdc01..f8a3f27903 100644 --- a/crates/ruff_linter/src/rules/flake8_raise/rules/unnecessary_paren_on_raise_exception.rs +++ b/crates/ruff_linter/src/rules/flake8_raise/rules/unnecessary_paren_on_raise_exception.rs @@ -87,12 +87,12 @@ pub(crate) fn unnecessary_paren_on_raise_exception(checker: &mut Checker, expr: .next() .is_some_and(char::is_alphanumeric) { - diagnostic.set_fix(Fix::automatic(Edit::range_replacement( + diagnostic.set_fix(Fix::always_applies(Edit::range_replacement( " ".to_string(), arguments.range(), ))); } else { - diagnostic.set_fix(Fix::automatic(Edit::range_deletion(arguments.range()))); + diagnostic.set_fix(Fix::always_applies(Edit::range_deletion(arguments.range()))); } } checker.diagnostics.push(diagnostic); diff --git a/crates/ruff_linter/src/rules/flake8_return/rules/function.rs b/crates/ruff_linter/src/rules/flake8_return/rules/function.rs index 6ec87d50df..148191a447 100644 --- a/crates/ruff_linter/src/rules/flake8_return/rules/function.rs +++ b/crates/ruff_linter/src/rules/flake8_return/rules/function.rs @@ -346,7 +346,7 @@ fn unnecessary_return_none(checker: &mut Checker, stack: &Stack) { } let mut diagnostic = Diagnostic::new(UnnecessaryReturnNone, stmt.range); if checker.patch(diagnostic.kind.rule()) { - diagnostic.set_fix(Fix::automatic(Edit::range_replacement( + diagnostic.set_fix(Fix::always_applies(Edit::range_replacement( "return".to_string(), stmt.range(), ))); @@ -363,7 +363,7 @@ fn implicit_return_value(checker: &mut Checker, stack: &Stack) { } let mut diagnostic = Diagnostic::new(ImplicitReturnValue, stmt.range); if checker.patch(diagnostic.kind.rule()) { - diagnostic.set_fix(Fix::automatic(Edit::range_replacement( + diagnostic.set_fix(Fix::always_applies(Edit::range_replacement( "return None".to_string(), stmt.range, ))); @@ -415,7 +415,7 @@ fn implicit_return(checker: &mut Checker, stmt: &Stmt) { content.push_str(checker.stylist().line_ending().as_str()); content.push_str(indent); content.push_str("return None"); - diagnostic.set_fix(Fix::suggested(Edit::insertion( + diagnostic.set_fix(Fix::sometimes_applies(Edit::insertion( content, end_of_last_statement(stmt, checker.locator()), ))); @@ -437,7 +437,7 @@ fn implicit_return(checker: &mut Checker, stmt: &Stmt) { content.push_str(checker.stylist().line_ending().as_str()); content.push_str(indent); content.push_str("return None"); - diagnostic.set_fix(Fix::suggested(Edit::insertion( + diagnostic.set_fix(Fix::sometimes_applies(Edit::insertion( content, end_of_last_statement(stmt, checker.locator()), ))); @@ -473,7 +473,7 @@ fn implicit_return(checker: &mut Checker, stmt: &Stmt) { content.push_str(checker.stylist().line_ending().as_str()); content.push_str(indent); content.push_str("return None"); - diagnostic.set_fix(Fix::suggested(Edit::insertion( + diagnostic.set_fix(Fix::sometimes_applies(Edit::insertion( content, end_of_last_statement(stmt, checker.locator()), ))); @@ -567,7 +567,10 @@ fn unnecessary_assign(checker: &mut Checker, stack: &Stack) { ), ); - Ok(Fix::suggested_edits(replace_assign, [delete_return])) + Ok(Fix::sometimes_applies_edits( + replace_assign, + [delete_return], + )) }); } checker.diagnostics.push(diagnostic); diff --git a/crates/ruff_linter/src/rules/flake8_simplify/rules/ast_bool_op.rs b/crates/ruff_linter/src/rules/flake8_simplify/rules/ast_bool_op.rs index 9a798ca1ab..36c01ddfec 100644 --- a/crates/ruff_linter/src/rules/flake8_simplify/rules/ast_bool_op.rs +++ b/crates/ruff_linter/src/rules/flake8_simplify/rules/ast_bool_op.rs @@ -461,7 +461,7 @@ pub(crate) fn duplicate_isinstance_call(checker: &mut Checker, expr: &Expr) { // Populate the `Fix`. Replace the _entire_ `BoolOp`. Note that if we have // multiple duplicates, the fixes will conflict. - diagnostic.set_fix(Fix::suggested(Edit::range_replacement( + diagnostic.set_fix(Fix::sometimes_applies(Edit::range_replacement( checker.generator().expr(&bool_op), expr.range(), ))); @@ -582,7 +582,7 @@ pub(crate) fn compare_with_tuple(checker: &mut Checker, expr: &Expr) { }; node.into() }; - diagnostic.set_fix(Fix::suggested(Edit::range_replacement( + diagnostic.set_fix(Fix::sometimes_applies(Edit::range_replacement( checker.generator().expr(&in_expr), expr.range(), ))); @@ -639,7 +639,7 @@ pub(crate) fn expr_and_not_expr(checker: &mut Checker, expr: &Expr) { expr.range(), ); if checker.patch(diagnostic.kind.rule()) { - diagnostic.set_fix(Fix::suggested(Edit::range_replacement( + diagnostic.set_fix(Fix::sometimes_applies(Edit::range_replacement( "False".to_string(), expr.range(), ))); @@ -698,7 +698,7 @@ pub(crate) fn expr_or_not_expr(checker: &mut Checker, expr: &Expr) { expr.range(), ); if checker.patch(diagnostic.kind.rule()) { - diagnostic.set_fix(Fix::suggested(Edit::range_replacement( + diagnostic.set_fix(Fix::sometimes_applies(Edit::range_replacement( "True".to_string(), expr.range(), ))); @@ -851,7 +851,7 @@ pub(crate) fn expr_or_true(checker: &mut Checker, expr: &Expr) { edit.range(), ); if checker.patch(diagnostic.kind.rule()) { - diagnostic.set_fix(Fix::suggested(edit)); + diagnostic.set_fix(Fix::sometimes_applies(edit)); } checker.diagnostics.push(diagnostic); } @@ -868,7 +868,7 @@ pub(crate) fn expr_and_false(checker: &mut Checker, expr: &Expr) { edit.range(), ); if checker.patch(diagnostic.kind.rule()) { - diagnostic.set_fix(Fix::suggested(edit)); + diagnostic.set_fix(Fix::sometimes_applies(edit)); } checker.diagnostics.push(diagnostic); } diff --git a/crates/ruff_linter/src/rules/flake8_simplify/rules/ast_expr.rs b/crates/ruff_linter/src/rules/flake8_simplify/rules/ast_expr.rs index e6feaa6b27..e29aa643cb 100644 --- a/crates/ruff_linter/src/rules/flake8_simplify/rules/ast_expr.rs +++ b/crates/ruff_linter/src/rules/flake8_simplify/rules/ast_expr.rs @@ -217,7 +217,7 @@ fn check_os_environ_subscript(checker: &mut Checker, expr: &Expr) { range: TextRange::default(), }; let new_env_var = node.into(); - diagnostic.set_fix(Fix::suggested(Edit::range_replacement( + diagnostic.set_fix(Fix::sometimes_applies(Edit::range_replacement( checker.generator().expr(&new_env_var), slice.range(), ))); @@ -276,7 +276,7 @@ pub(crate) fn dict_get_with_none_default(checker: &mut Checker, expr: &Expr) { ); if checker.patch(diagnostic.kind.rule()) { - diagnostic.set_fix(Fix::automatic(Edit::range_replacement( + diagnostic.set_fix(Fix::always_applies(Edit::range_replacement( expected, expr.range(), ))); diff --git a/crates/ruff_linter/src/rules/flake8_simplify/rules/ast_ifexp.rs b/crates/ruff_linter/src/rules/flake8_simplify/rules/ast_ifexp.rs index a989660b2c..971a4b2afc 100644 --- a/crates/ruff_linter/src/rules/flake8_simplify/rules/ast_ifexp.rs +++ b/crates/ruff_linter/src/rules/flake8_simplify/rules/ast_ifexp.rs @@ -159,7 +159,7 @@ pub(crate) fn if_expr_with_true_false( ); if checker.patch(diagnostic.kind.rule()) { if test.is_compare_expr() { - diagnostic.set_fix(Fix::suggested(Edit::range_replacement( + diagnostic.set_fix(Fix::sometimes_applies(Edit::range_replacement( checker .locator() .slice( @@ -175,7 +175,7 @@ pub(crate) fn if_expr_with_true_false( expr.range(), ))); } else if checker.semantic().is_builtin("bool") { - diagnostic.set_fix(Fix::suggested(Edit::range_replacement( + diagnostic.set_fix(Fix::sometimes_applies(Edit::range_replacement( checker.generator().expr( &ast::ExprCall { func: Box::new( @@ -216,7 +216,7 @@ pub(crate) fn if_expr_with_false_true( let mut diagnostic = Diagnostic::new(IfExprWithFalseTrue, expr.range()); if checker.patch(diagnostic.kind.rule()) { - diagnostic.set_fix(Fix::suggested(Edit::range_replacement( + diagnostic.set_fix(Fix::sometimes_applies(Edit::range_replacement( checker.generator().expr( &ast::ExprUnaryOp { op: UnaryOp::Not, @@ -279,7 +279,7 @@ pub(crate) fn twisted_arms_in_ifexpr( orelse: Box::new(node), range: TextRange::default(), }; - diagnostic.set_fix(Fix::suggested(Edit::range_replacement( + diagnostic.set_fix(Fix::sometimes_applies(Edit::range_replacement( checker.generator().expr(&node3.into()), expr.range(), ))); diff --git a/crates/ruff_linter/src/rules/flake8_simplify/rules/ast_unary_op.rs b/crates/ruff_linter/src/rules/flake8_simplify/rules/ast_unary_op.rs index c7210c1d87..b017053f87 100644 --- a/crates/ruff_linter/src/rules/flake8_simplify/rules/ast_unary_op.rs +++ b/crates/ruff_linter/src/rules/flake8_simplify/rules/ast_unary_op.rs @@ -182,7 +182,7 @@ pub(crate) fn negation_with_equal_op( comparators: comparators.clone(), range: TextRange::default(), }; - diagnostic.set_fix(Fix::automatic(Edit::range_replacement( + diagnostic.set_fix(Fix::always_applies(Edit::range_replacement( checker.generator().expr(&node.into()), expr.range(), ))); @@ -239,7 +239,7 @@ pub(crate) fn negation_with_not_equal_op( comparators: comparators.clone(), range: TextRange::default(), }; - diagnostic.set_fix(Fix::suggested(Edit::range_replacement( + diagnostic.set_fix(Fix::sometimes_applies(Edit::range_replacement( checker.generator().expr(&node.into()), expr.range(), ))); @@ -272,7 +272,7 @@ pub(crate) fn double_negation(checker: &mut Checker, expr: &Expr, op: UnaryOp, o ); if checker.patch(diagnostic.kind.rule()) { if checker.semantic().in_boolean_test() { - diagnostic.set_fix(Fix::suggested(Edit::range_replacement( + diagnostic.set_fix(Fix::sometimes_applies(Edit::range_replacement( checker.locator().slice(operand.as_ref()).to_string(), expr.range(), ))); @@ -291,7 +291,7 @@ pub(crate) fn double_negation(checker: &mut Checker, expr: &Expr, op: UnaryOp, o }, range: TextRange::default(), }; - diagnostic.set_fix(Fix::suggested(Edit::range_replacement( + diagnostic.set_fix(Fix::sometimes_applies(Edit::range_replacement( checker.generator().expr(&node1.into()), expr.range(), ))); diff --git a/crates/ruff_linter/src/rules/flake8_simplify/rules/ast_with.rs b/crates/ruff_linter/src/rules/flake8_simplify/rules/ast_with.rs index d1689f71dd..5dcfecf813 100644 --- a/crates/ruff_linter/src/rules/flake8_simplify/rules/ast_with.rs +++ b/crates/ruff_linter/src/rules/flake8_simplify/rules/ast_with.rs @@ -145,7 +145,7 @@ pub(crate) fn multiple_with_statements( checker.settings.tab_size, ) }) { - diagnostic.set_fix(Fix::suggested(edit)); + diagnostic.set_fix(Fix::sometimes_applies(edit)); } } Err(err) => error!("Failed to fix nested with: {err}"), diff --git a/crates/ruff_linter/src/rules/flake8_simplify/rules/collapsible_if.rs b/crates/ruff_linter/src/rules/flake8_simplify/rules/collapsible_if.rs index e8601624d0..8a75bf85f9 100644 --- a/crates/ruff_linter/src/rules/flake8_simplify/rules/collapsible_if.rs +++ b/crates/ruff_linter/src/rules/flake8_simplify/rules/collapsible_if.rs @@ -123,7 +123,7 @@ pub(crate) fn nested_if_statements( checker.settings.tab_size, ) }) { - diagnostic.set_fix(Fix::suggested(edit)); + diagnostic.set_fix(Fix::sometimes_applies(edit)); } } Err(err) => error!("Failed to fix nested if: {err}"), diff --git a/crates/ruff_linter/src/rules/flake8_simplify/rules/if_else_block_instead_of_dict_get.rs b/crates/ruff_linter/src/rules/flake8_simplify/rules/if_else_block_instead_of_dict_get.rs index d703488016..336ce13fdd 100644 --- a/crates/ruff_linter/src/rules/flake8_simplify/rules/if_else_block_instead_of_dict_get.rs +++ b/crates/ruff_linter/src/rules/flake8_simplify/rules/if_else_block_instead_of_dict_get.rs @@ -186,7 +186,7 @@ pub(crate) fn use_dict_get_with_default(checker: &mut Checker, stmt_if: &ast::St ); if checker.patch(diagnostic.kind.rule()) { if !checker.indexer().has_comments(stmt_if, checker.locator()) { - diagnostic.set_fix(Fix::suggested(Edit::range_replacement( + diagnostic.set_fix(Fix::sometimes_applies(Edit::range_replacement( contents, stmt_if.range(), ))); diff --git a/crates/ruff_linter/src/rules/flake8_simplify/rules/if_else_block_instead_of_if_exp.rs b/crates/ruff_linter/src/rules/flake8_simplify/rules/if_else_block_instead_of_if_exp.rs index fce5712152..1f97f58874 100644 --- a/crates/ruff_linter/src/rules/flake8_simplify/rules/if_else_block_instead_of_if_exp.rs +++ b/crates/ruff_linter/src/rules/flake8_simplify/rules/if_else_block_instead_of_if_exp.rs @@ -145,7 +145,7 @@ pub(crate) fn use_ternary_operator(checker: &mut Checker, stmt: &Stmt) { ); if checker.patch(diagnostic.kind.rule()) { if !checker.indexer().has_comments(stmt, checker.locator()) { - diagnostic.set_fix(Fix::suggested(Edit::range_replacement( + diagnostic.set_fix(Fix::sometimes_applies(Edit::range_replacement( contents, stmt.range(), ))); diff --git a/crates/ruff_linter/src/rules/flake8_simplify/rules/key_in_dict.rs b/crates/ruff_linter/src/rules/flake8_simplify/rules/key_in_dict.rs index c7d37748ef..82fe703bfa 100644 --- a/crates/ruff_linter/src/rules/flake8_simplify/rules/key_in_dict.rs +++ b/crates/ruff_linter/src/rules/flake8_simplify/rules/key_in_dict.rs @@ -128,12 +128,12 @@ fn key_in_dict( .next() .is_some_and(|char| char.is_ascii_alphabetic()) { - diagnostic.set_fix(Fix::suggested(Edit::range_replacement( + diagnostic.set_fix(Fix::sometimes_applies(Edit::range_replacement( " ".to_string(), range, ))); } else { - diagnostic.set_fix(Fix::suggested(Edit::range_deletion(range))); + diagnostic.set_fix(Fix::sometimes_applies(Edit::range_deletion(range))); } } } diff --git a/crates/ruff_linter/src/rules/flake8_simplify/rules/needless_bool.rs b/crates/ruff_linter/src/rules/flake8_simplify/rules/needless_bool.rs index 26011958a9..24954fdbbc 100644 --- a/crates/ruff_linter/src/rules/flake8_simplify/rules/needless_bool.rs +++ b/crates/ruff_linter/src/rules/flake8_simplify/rules/needless_bool.rs @@ -112,7 +112,7 @@ pub(crate) fn needless_bool(checker: &mut Checker, stmt: &Stmt) { value: Some(Box::new(if_test.clone())), range: TextRange::default(), }; - diagnostic.set_fix(Fix::suggested(Edit::range_replacement( + diagnostic.set_fix(Fix::sometimes_applies(Edit::range_replacement( checker.generator().stmt(&node.into()), range, ))); @@ -137,7 +137,7 @@ pub(crate) fn needless_bool(checker: &mut Checker, stmt: &Stmt) { value: Some(Box::new(node1.into())), range: TextRange::default(), }; - diagnostic.set_fix(Fix::suggested(Edit::range_replacement( + diagnostic.set_fix(Fix::sometimes_applies(Edit::range_replacement( checker.generator().stmt(&node2.into()), range, ))); diff --git a/crates/ruff_linter/src/rules/flake8_simplify/rules/reimplemented_builtin.rs b/crates/ruff_linter/src/rules/flake8_simplify/rules/reimplemented_builtin.rs index 23591c6bd7..51833ef03e 100644 --- a/crates/ruff_linter/src/rules/flake8_simplify/rules/reimplemented_builtin.rs +++ b/crates/ruff_linter/src/rules/flake8_simplify/rules/reimplemented_builtin.rs @@ -115,7 +115,7 @@ pub(crate) fn convert_for_loop_to_any_all(checker: &mut Checker, stmt: &Stmt) { TextRange::new(stmt.start(), terminal.stmt.end()), ); if checker.patch(diagnostic.kind.rule()) && checker.semantic().is_builtin("any") { - diagnostic.set_fix(Fix::suggested(Edit::replacement( + diagnostic.set_fix(Fix::sometimes_applies(Edit::replacement( contents, stmt.start(), terminal.stmt.end(), @@ -201,7 +201,7 @@ pub(crate) fn convert_for_loop_to_any_all(checker: &mut Checker, stmt: &Stmt) { TextRange::new(stmt.start(), terminal.stmt.end()), ); if checker.patch(diagnostic.kind.rule()) && checker.semantic().is_builtin("all") { - diagnostic.set_fix(Fix::suggested(Edit::replacement( + diagnostic.set_fix(Fix::sometimes_applies(Edit::replacement( contents, stmt.start(), terminal.stmt.end(), diff --git a/crates/ruff_linter/src/rules/flake8_simplify/rules/suppressible_exception.rs b/crates/ruff_linter/src/rules/flake8_simplify/rules/suppressible_exception.rs index 91f8928cff..1c51f9e247 100644 --- a/crates/ruff_linter/src/rules/flake8_simplify/rules/suppressible_exception.rs +++ b/crates/ruff_linter/src/rules/flake8_simplify/rules/suppressible_exception.rs @@ -148,7 +148,7 @@ pub(crate) fn suppressible_exception( ); let remove_handler = Edit::range_deletion(checker.locator().full_lines_range(*range)); - Ok(Fix::suggested_edits( + Ok(Fix::sometimes_applies_edits( import_edit, [replace_try, remove_handler], )) diff --git a/crates/ruff_linter/src/rules/flake8_simplify/rules/yoda_conditions.rs b/crates/ruff_linter/src/rules/flake8_simplify/rules/yoda_conditions.rs index 65feceb3b7..7363f46a7b 100644 --- a/crates/ruff_linter/src/rules/flake8_simplify/rules/yoda_conditions.rs +++ b/crates/ruff_linter/src/rules/flake8_simplify/rules/yoda_conditions.rs @@ -194,7 +194,7 @@ pub(crate) fn yoda_conditions( expr.range(), ); if checker.patch(diagnostic.kind.rule()) { - diagnostic.set_fix(Fix::automatic(Edit::range_replacement( + diagnostic.set_fix(Fix::always_applies(Edit::range_replacement( pad(suggestion, expr.range(), checker.locator()), expr.range(), ))); diff --git a/crates/ruff_linter/src/rules/flake8_tidy_imports/rules/relative_imports.rs b/crates/ruff_linter/src/rules/flake8_tidy_imports/rules/relative_imports.rs index be176a9b6d..fa0313a8a8 100644 --- a/crates/ruff_linter/src/rules/flake8_tidy_imports/rules/relative_imports.rs +++ b/crates/ruff_linter/src/rules/flake8_tidy_imports/rules/relative_imports.rs @@ -103,7 +103,7 @@ fn fix_banned_relative_import( range: TextRange::default(), }; let content = generator.stmt(&node.into()); - Some(Fix::suggested(Edit::range_replacement( + Some(Fix::sometimes_applies(Edit::range_replacement( content, stmt.range(), ))) diff --git a/crates/ruff_linter/src/rules/flake8_todos/rules/todos.rs b/crates/ruff_linter/src/rules/flake8_todos/rules/todos.rs index 6f932fe344..4b6f8084c5 100644 --- a/crates/ruff_linter/src/rules/flake8_todos/rules/todos.rs +++ b/crates/ruff_linter/src/rules/flake8_todos/rules/todos.rs @@ -319,7 +319,7 @@ fn directive_errors( ); if settings.rules.should_fix(Rule::InvalidTodoCapitalization) { - diagnostic.set_fix(Fix::automatic(Edit::range_replacement( + diagnostic.set_fix(Fix::always_applies(Edit::range_replacement( "TODO".to_string(), directive.range, ))); diff --git a/crates/ruff_linter/src/rules/flake8_type_checking/rules/empty_type_checking_block.rs b/crates/ruff_linter/src/rules/flake8_type_checking/rules/empty_type_checking_block.rs index c7181e01e0..2a63cefdab 100644 --- a/crates/ruff_linter/src/rules/flake8_type_checking/rules/empty_type_checking_block.rs +++ b/crates/ruff_linter/src/rules/flake8_type_checking/rules/empty_type_checking_block.rs @@ -61,7 +61,7 @@ pub(crate) fn empty_type_checking_block(checker: &mut Checker, stmt: &ast::StmtI let stmt = checker.semantic().current_statement(); let parent = checker.semantic().current_statement_parent(); let edit = fix::edits::delete_stmt(stmt, parent, checker.locator(), checker.indexer()); - diagnostic.set_fix(Fix::automatic(edit).isolate(Checker::isolation( + diagnostic.set_fix(Fix::always_applies(edit).isolate(Checker::isolation( checker.semantic().current_statement_parent_id(), ))); } diff --git a/crates/ruff_linter/src/rules/flake8_type_checking/rules/runtime_import_in_type_checking_block.rs b/crates/ruff_linter/src/rules/flake8_type_checking/rules/runtime_import_in_type_checking_block.rs index eb0e29c1b2..f69d26e9cb 100644 --- a/crates/ruff_linter/src/rules/flake8_type_checking/rules/runtime_import_in_type_checking_block.rs +++ b/crates/ruff_linter/src/rules/flake8_type_checking/rules/runtime_import_in_type_checking_block.rs @@ -235,7 +235,7 @@ fn fix_imports(checker: &Checker, node_id: NodeId, imports: &[ImportBinding]) -> )?; Ok( - Fix::suggested_edits(remove_import_edit, add_import_edit.into_edits()).isolate( + Fix::sometimes_applies_edits(remove_import_edit, add_import_edit.into_edits()).isolate( Checker::isolation(checker.semantic().parent_statement_id(node_id)), ), ) diff --git a/crates/ruff_linter/src/rules/flake8_type_checking/rules/typing_only_runtime_import.rs b/crates/ruff_linter/src/rules/flake8_type_checking/rules/typing_only_runtime_import.rs index c041565428..89e4413f42 100644 --- a/crates/ruff_linter/src/rules/flake8_type_checking/rules/typing_only_runtime_import.rs +++ b/crates/ruff_linter/src/rules/flake8_type_checking/rules/typing_only_runtime_import.rs @@ -486,7 +486,7 @@ fn fix_imports(checker: &Checker, node_id: NodeId, imports: &[ImportBinding]) -> )?; Ok( - Fix::suggested_edits(remove_import_edit, add_import_edit.into_edits()).isolate( + Fix::sometimes_applies_edits(remove_import_edit, add_import_edit.into_edits()).isolate( Checker::isolation(checker.semantic().parent_statement_id(node_id)), ), ) diff --git a/crates/ruff_linter/src/rules/flake8_use_pathlib/rules/path_constructor_current_directory.rs b/crates/ruff_linter/src/rules/flake8_use_pathlib/rules/path_constructor_current_directory.rs index 4f74c49024..edda6fadf3 100644 --- a/crates/ruff_linter/src/rules/flake8_use_pathlib/rules/path_constructor_current_directory.rs +++ b/crates/ruff_linter/src/rules/flake8_use_pathlib/rules/path_constructor_current_directory.rs @@ -77,7 +77,7 @@ pub(crate) fn path_constructor_current_directory(checker: &mut Checker, expr: &E if matches!(value.as_str(), "" | ".") { let mut diagnostic = Diagnostic::new(PathConstructorCurrentDirectory, *range); if checker.patch(diagnostic.kind.rule()) { - diagnostic.set_fix(Fix::automatic(Edit::range_deletion(*range))); + diagnostic.set_fix(Fix::always_applies(Edit::range_deletion(*range))); } checker.diagnostics.push(diagnostic); } diff --git a/crates/ruff_linter/src/rules/flynt/rules/static_join_to_fstring.rs b/crates/ruff_linter/src/rules/flynt/rules/static_join_to_fstring.rs index 003d5cad2d..a481b5c4d2 100644 --- a/crates/ruff_linter/src/rules/flynt/rules/static_join_to_fstring.rs +++ b/crates/ruff_linter/src/rules/flynt/rules/static_join_to_fstring.rs @@ -155,7 +155,7 @@ pub(crate) fn static_join_to_fstring(checker: &mut Checker, expr: &Expr, joiner: expr.range(), ); if checker.patch(diagnostic.kind.rule()) { - diagnostic.set_fix(Fix::suggested(Edit::range_replacement( + diagnostic.set_fix(Fix::sometimes_applies(Edit::range_replacement( pad(contents, expr.range(), checker.locator()), expr.range(), ))); diff --git a/crates/ruff_linter/src/rules/isort/rules/add_required_imports.rs b/crates/ruff_linter/src/rules/isort/rules/add_required_imports.rs index edda5aaf4c..7c72620409 100644 --- a/crates/ruff_linter/src/rules/isort/rules/add_required_imports.rs +++ b/crates/ruff_linter/src/rules/isort/rules/add_required_imports.rs @@ -117,7 +117,7 @@ fn add_required_import( TextRange::default(), ); if settings.rules.should_fix(Rule::MissingRequiredImport) { - diagnostic.set_fix(Fix::automatic( + diagnostic.set_fix(Fix::always_applies( Importer::new(python_ast, locator, stylist) .add_import(required_import, TextSize::default()), )); diff --git a/crates/ruff_linter/src/rules/isort/rules/organize_imports.rs b/crates/ruff_linter/src/rules/isort/rules/organize_imports.rs index cdbd9e493c..07451f7a45 100644 --- a/crates/ruff_linter/src/rules/isort/rules/organize_imports.rs +++ b/crates/ruff_linter/src/rules/isort/rules/organize_imports.rs @@ -139,7 +139,7 @@ pub(crate) fn organize_imports( let mut diagnostic = Diagnostic::new(UnsortedImports, range); if settings.rules.should_fix(diagnostic.kind.rule()) { - diagnostic.set_fix(Fix::automatic(Edit::range_replacement( + diagnostic.set_fix(Fix::always_applies(Edit::range_replacement( indent(&expected, indentation).to_string(), range, ))); diff --git a/crates/ruff_linter/src/rules/numpy/rules/deprecated_function.rs b/crates/ruff_linter/src/rules/numpy/rules/deprecated_function.rs index 5edf807b39..108934723f 100644 --- a/crates/ruff_linter/src/rules/numpy/rules/deprecated_function.rs +++ b/crates/ruff_linter/src/rules/numpy/rules/deprecated_function.rs @@ -84,7 +84,10 @@ pub(crate) fn deprecated_function(checker: &mut Checker, expr: &Expr) { checker.semantic(), )?; let replacement_edit = Edit::range_replacement(binding, expr.range()); - Ok(Fix::suggested_edits(import_edit, [replacement_edit])) + Ok(Fix::sometimes_applies_edits( + import_edit, + [replacement_edit], + )) }); } checker.diagnostics.push(diagnostic); diff --git a/crates/ruff_linter/src/rules/numpy/rules/deprecated_type_alias.rs b/crates/ruff_linter/src/rules/numpy/rules/deprecated_type_alias.rs index aef527328e..b812d70877 100644 --- a/crates/ruff_linter/src/rules/numpy/rules/deprecated_type_alias.rs +++ b/crates/ruff_linter/src/rules/numpy/rules/deprecated_type_alias.rs @@ -80,7 +80,7 @@ pub(crate) fn deprecated_type_alias(checker: &mut Checker, expr: &Expr) { _ => type_name, }; if checker.semantic().is_builtin(type_name) { - diagnostic.set_fix(Fix::suggested(Edit::range_replacement( + diagnostic.set_fix(Fix::sometimes_applies(Edit::range_replacement( type_name.to_string(), expr.range(), ))); diff --git a/crates/ruff_linter/src/rules/pandas_vet/rules/inplace_argument.rs b/crates/ruff_linter/src/rules/pandas_vet/rules/inplace_argument.rs index 528421a8f4..85f34f731e 100644 --- a/crates/ruff_linter/src/rules/pandas_vet/rules/inplace_argument.rs +++ b/crates/ruff_linter/src/rules/pandas_vet/rules/inplace_argument.rs @@ -135,5 +135,8 @@ fn convert_inplace_argument_to_assignment( ) .ok()?; - Some(Fix::suggested_edits(insert_assignment, [remove_argument])) + Some(Fix::sometimes_applies_edits( + insert_assignment, + [remove_argument], + )) } diff --git a/crates/ruff_linter/src/rules/perflint/rules/incorrect_dict_iterator.rs b/crates/ruff_linter/src/rules/perflint/rules/incorrect_dict_iterator.rs index 4534b0e570..d48cf10082 100644 --- a/crates/ruff_linter/src/rules/perflint/rules/incorrect_dict_iterator.rs +++ b/crates/ruff_linter/src/rules/perflint/rules/incorrect_dict_iterator.rs @@ -110,7 +110,10 @@ pub(crate) fn incorrect_dict_iterator(checker: &mut Checker, stmt_for: &ast::Stm ), stmt_for.target.range(), ); - diagnostic.set_fix(Fix::suggested_edits(replace_attribute, [replace_target])); + diagnostic.set_fix(Fix::sometimes_applies_edits( + replace_attribute, + [replace_target], + )); } checker.diagnostics.push(diagnostic); } @@ -132,7 +135,10 @@ pub(crate) fn incorrect_dict_iterator(checker: &mut Checker, stmt_for: &ast::Stm ), stmt_for.target.range(), ); - diagnostic.set_fix(Fix::suggested_edits(replace_attribute, [replace_target])); + diagnostic.set_fix(Fix::sometimes_applies_edits( + replace_attribute, + [replace_target], + )); } checker.diagnostics.push(diagnostic); } diff --git a/crates/ruff_linter/src/rules/perflint/rules/unnecessary_list_cast.rs b/crates/ruff_linter/src/rules/perflint/rules/unnecessary_list_cast.rs index 74853d5127..f2488442f7 100644 --- a/crates/ruff_linter/src/rules/perflint/rules/unnecessary_list_cast.rs +++ b/crates/ruff_linter/src/rules/perflint/rules/unnecessary_list_cast.rs @@ -135,7 +135,7 @@ pub(crate) fn unnecessary_list_cast(checker: &mut Checker, iter: &Expr) { /// Generate a [`Fix`] to remove a `list` cast from an expression. fn remove_cast(list_range: TextRange, iterable_range: TextRange) -> Fix { - Fix::automatic_edits( + Fix::always_applies_edits( Edit::deletion(list_range.start(), iterable_range.start()), [Edit::deletion(iterable_range.end(), list_range.end())], ) diff --git a/crates/ruff_linter/src/rules/pycodestyle/rules/compound_statements.rs b/crates/ruff_linter/src/rules/pycodestyle/rules/compound_statements.rs index 8480a78a4c..78a84c3f7a 100644 --- a/crates/ruff_linter/src/rules/pycodestyle/rules/compound_statements.rs +++ b/crates/ruff_linter/src/rules/pycodestyle/rules/compound_statements.rs @@ -170,7 +170,7 @@ pub(crate) fn compound_statements( let mut diagnostic = Diagnostic::new(UselessSemicolon, TextRange::new(start, end)); if settings.rules.should_fix(Rule::UselessSemicolon) { - diagnostic.set_fix(Fix::automatic(Edit::deletion( + diagnostic.set_fix(Fix::always_applies(Edit::deletion( indexer .preceded_by_continuations(start, locator) .unwrap_or(start), diff --git a/crates/ruff_linter/src/rules/pycodestyle/rules/invalid_escape_sequence.rs b/crates/ruff_linter/src/rules/pycodestyle/rules/invalid_escape_sequence.rs index 64042fd021..27e321c55a 100644 --- a/crates/ruff_linter/src/rules/pycodestyle/rules/invalid_escape_sequence.rs +++ b/crates/ruff_linter/src/rules/pycodestyle/rules/invalid_escape_sequence.rs @@ -162,7 +162,7 @@ pub(crate) fn invalid_escape_sequence( if contains_valid_escape_sequence { // Escape with backslash. for diagnostic in &mut invalid_escape_sequence { - diagnostic.set_fix(Fix::automatic(Edit::insertion( + diagnostic.set_fix(Fix::always_applies(Edit::insertion( r"\".to_string(), diagnostic.start() + TextSize::from(1), ))); @@ -184,7 +184,7 @@ pub(crate) fn invalid_escape_sequence( // If necessary, add a space between any leading keyword (`return`, `yield`, // `assert`, etc.) and the string. For example, `return"foo"` is valid, but // `returnr"foo"` is not. - diagnostic.set_fix(Fix::automatic(Edit::insertion( + diagnostic.set_fix(Fix::always_applies(Edit::insertion( pad_start("r".to_string(), tok_start, locator), tok_start, ))); diff --git a/crates/ruff_linter/src/rules/pycodestyle/rules/lambda_assignment.rs b/crates/ruff_linter/src/rules/pycodestyle/rules/lambda_assignment.rs index fa98ca61b4..8613e0b42a 100644 --- a/crates/ruff_linter/src/rules/pycodestyle/rules/lambda_assignment.rs +++ b/crates/ruff_linter/src/rules/pycodestyle/rules/lambda_assignment.rs @@ -125,9 +125,12 @@ pub(crate) fn lambda_assignment( .get_all(id) .any(|binding_id| checker.semantic().binding(binding_id).kind.is_annotation()) { - diagnostic.set_fix(Fix::manual(Edit::range_replacement(indented, stmt.range()))); + diagnostic.set_fix(Fix::never_applies(Edit::range_replacement( + indented, + stmt.range(), + ))); } else { - diagnostic.set_fix(Fix::suggested(Edit::range_replacement( + diagnostic.set_fix(Fix::sometimes_applies(Edit::range_replacement( indented, stmt.range(), ))); diff --git a/crates/ruff_linter/src/rules/pycodestyle/rules/literal_comparisons.rs b/crates/ruff_linter/src/rules/pycodestyle/rules/literal_comparisons.rs index 4a580c67b0..63f977a980 100644 --- a/crates/ruff_linter/src/rules/pycodestyle/rules/literal_comparisons.rs +++ b/crates/ruff_linter/src/rules/pycodestyle/rules/literal_comparisons.rs @@ -287,7 +287,7 @@ pub(crate) fn literal_comparisons(checker: &mut Checker, compare: &ast::ExprComp checker.locator(), ); for diagnostic in &mut diagnostics { - diagnostic.set_fix(Fix::suggested(Edit::range_replacement( + diagnostic.set_fix(Fix::sometimes_applies(Edit::range_replacement( content.to_string(), compare.range(), ))); diff --git a/crates/ruff_linter/src/rules/pycodestyle/rules/logical_lines/extraneous_whitespace.rs b/crates/ruff_linter/src/rules/pycodestyle/rules/logical_lines/extraneous_whitespace.rs index 305a1dcb59..df39129fd3 100644 --- a/crates/ruff_linter/src/rules/pycodestyle/rules/logical_lines/extraneous_whitespace.rs +++ b/crates/ruff_linter/src/rules/pycodestyle/rules/logical_lines/extraneous_whitespace.rs @@ -162,8 +162,9 @@ pub(crate) fn extraneous_whitespace( TextRange::at(token.end(), trailing_len), ); if fix_after_open_bracket { - diagnostic - .set_fix(Fix::automatic(Edit::range_deletion(diagnostic.range()))); + diagnostic.set_fix(Fix::always_applies(Edit::range_deletion( + diagnostic.range(), + ))); } context.push_diagnostic(diagnostic); } @@ -178,7 +179,7 @@ pub(crate) fn extraneous_whitespace( TextRange::at(token.start() - offset, offset), ); if fix_before_close_bracket { - diagnostic.set_fix(Fix::automatic(Edit::range_deletion( + diagnostic.set_fix(Fix::always_applies(Edit::range_deletion( diagnostic.range(), ))); } @@ -196,7 +197,7 @@ pub(crate) fn extraneous_whitespace( TextRange::at(token.start() - offset, offset), ); if fix_before_punctuation { - diagnostic.set_fix(Fix::automatic(Edit::range_deletion( + diagnostic.set_fix(Fix::always_applies(Edit::range_deletion( diagnostic.range(), ))); } diff --git a/crates/ruff_linter/src/rules/pycodestyle/rules/logical_lines/missing_whitespace.rs b/crates/ruff_linter/src/rules/pycodestyle/rules/logical_lines/missing_whitespace.rs index 638755ee6c..0db41e9904 100644 --- a/crates/ruff_linter/src/rules/pycodestyle/rules/logical_lines/missing_whitespace.rs +++ b/crates/ruff_linter/src/rules/pycodestyle/rules/logical_lines/missing_whitespace.rs @@ -116,7 +116,7 @@ pub(crate) fn missing_whitespace(line: &LogicalLine, fix: bool, context: &mut Lo let mut diagnostic = Diagnostic::new(kind, token.range()); if fix { - diagnostic.set_fix(Fix::automatic(Edit::insertion( + diagnostic.set_fix(Fix::always_applies(Edit::insertion( " ".to_string(), token.end(), ))); diff --git a/crates/ruff_linter/src/rules/pycodestyle/rules/logical_lines/whitespace_before_parameters.rs b/crates/ruff_linter/src/rules/pycodestyle/rules/logical_lines/whitespace_before_parameters.rs index 84f07c5a18..9d571db968 100644 --- a/crates/ruff_linter/src/rules/pycodestyle/rules/logical_lines/whitespace_before_parameters.rs +++ b/crates/ruff_linter/src/rules/pycodestyle/rules/logical_lines/whitespace_before_parameters.rs @@ -83,7 +83,7 @@ pub(crate) fn whitespace_before_parameters( let mut diagnostic = Diagnostic::new(kind, TextRange::new(start, end)); if fix { - diagnostic.set_fix(Fix::automatic(Edit::deletion(start, end))); + diagnostic.set_fix(Fix::always_applies(Edit::deletion(start, end))); } context.push_diagnostic(diagnostic); } diff --git a/crates/ruff_linter/src/rules/pycodestyle/rules/missing_newline_at_end_of_file.rs b/crates/ruff_linter/src/rules/pycodestyle/rules/missing_newline_at_end_of_file.rs index a59576fb6b..8c1367bcb5 100644 --- a/crates/ruff_linter/src/rules/pycodestyle/rules/missing_newline_at_end_of_file.rs +++ b/crates/ruff_linter/src/rules/pycodestyle/rules/missing_newline_at_end_of_file.rs @@ -56,7 +56,7 @@ pub(crate) fn no_newline_at_end_of_file( let mut diagnostic = Diagnostic::new(MissingNewlineAtEndOfFile, range); if fix { - diagnostic.set_fix(Fix::automatic(Edit::insertion( + diagnostic.set_fix(Fix::always_applies(Edit::insertion( stylist.line_ending().to_string(), range.start(), ))); diff --git a/crates/ruff_linter/src/rules/pycodestyle/rules/not_tests.rs b/crates/ruff_linter/src/rules/pycodestyle/rules/not_tests.rs index 61328cff39..a13b077873 100644 --- a/crates/ruff_linter/src/rules/pycodestyle/rules/not_tests.rs +++ b/crates/ruff_linter/src/rules/pycodestyle/rules/not_tests.rs @@ -95,7 +95,7 @@ pub(crate) fn not_tests(checker: &mut Checker, unary_op: &ast::ExprUnaryOp) { if checker.enabled(Rule::NotInTest) { let mut diagnostic = Diagnostic::new(NotInTest, unary_op.operand.range()); if checker.patch(diagnostic.kind.rule()) { - diagnostic.set_fix(Fix::automatic(Edit::range_replacement( + diagnostic.set_fix(Fix::always_applies(Edit::range_replacement( pad( generate_comparison( left, @@ -118,7 +118,7 @@ pub(crate) fn not_tests(checker: &mut Checker, unary_op: &ast::ExprUnaryOp) { if checker.enabled(Rule::NotIsTest) { let mut diagnostic = Diagnostic::new(NotIsTest, unary_op.operand.range()); if checker.patch(diagnostic.kind.rule()) { - diagnostic.set_fix(Fix::automatic(Edit::range_replacement( + diagnostic.set_fix(Fix::always_applies(Edit::range_replacement( pad( generate_comparison( left, diff --git a/crates/ruff_linter/src/rules/pycodestyle/rules/trailing_whitespace.rs b/crates/ruff_linter/src/rules/pycodestyle/rules/trailing_whitespace.rs index 27cac8082f..9b82bb0d29 100644 --- a/crates/ruff_linter/src/rules/pycodestyle/rules/trailing_whitespace.rs +++ b/crates/ruff_linter/src/rules/pycodestyle/rules/trailing_whitespace.rs @@ -93,7 +93,7 @@ pub(crate) fn trailing_whitespace( if settings.rules.should_fix(Rule::BlankLineWithWhitespace) { // Remove any preceding continuations, to avoid introducing a potential // syntax error. - diagnostic.set_fix(Fix::automatic(Edit::range_deletion(TextRange::new( + diagnostic.set_fix(Fix::always_applies(Edit::range_deletion(TextRange::new( indexer .preceded_by_continuations(line.start(), locator) .unwrap_or(range.start()), @@ -105,7 +105,7 @@ pub(crate) fn trailing_whitespace( } else if settings.rules.enabled(Rule::TrailingWhitespace) { let mut diagnostic = Diagnostic::new(TrailingWhitespace, range); if settings.rules.should_fix(Rule::TrailingWhitespace) { - diagnostic.set_fix(Fix::automatic(Edit::range_deletion(range))); + diagnostic.set_fix(Fix::always_applies(Edit::range_deletion(range))); } return Some(diagnostic); } diff --git a/crates/ruff_linter/src/rules/pydocstyle/rules/blank_after_summary.rs b/crates/ruff_linter/src/rules/pydocstyle/rules/blank_after_summary.rs index 40a340b8d8..45182250cc 100644 --- a/crates/ruff_linter/src/rules/pydocstyle/rules/blank_after_summary.rs +++ b/crates/ruff_linter/src/rules/pydocstyle/rules/blank_after_summary.rs @@ -114,7 +114,7 @@ pub(crate) fn blank_after_summary(checker: &mut Checker, docstring: &Docstring) } // Insert one blank line after the summary (replacing any existing lines). - diagnostic.set_fix(Fix::automatic(Edit::replacement( + diagnostic.set_fix(Fix::always_applies(Edit::replacement( checker.stylist().line_ending().to_string(), summary_end, blank_end, diff --git a/crates/ruff_linter/src/rules/pydocstyle/rules/blank_before_after_class.rs b/crates/ruff_linter/src/rules/pydocstyle/rules/blank_before_after_class.rs index 8e0dde539c..5bb1ac8012 100644 --- a/crates/ruff_linter/src/rules/pydocstyle/rules/blank_before_after_class.rs +++ b/crates/ruff_linter/src/rules/pydocstyle/rules/blank_before_after_class.rs @@ -191,7 +191,7 @@ pub(crate) fn blank_before_after_class(checker: &mut Checker, docstring: &Docstr let mut diagnostic = Diagnostic::new(BlankLineBeforeClass, docstring.range()); if checker.patch(diagnostic.kind.rule()) { // Delete the blank line before the class. - diagnostic.set_fix(Fix::automatic(Edit::deletion( + diagnostic.set_fix(Fix::always_applies(Edit::deletion( blank_lines_start, docstring.start() - docstring.indentation.text_len(), ))); @@ -204,7 +204,7 @@ pub(crate) fn blank_before_after_class(checker: &mut Checker, docstring: &Docstr let mut diagnostic = Diagnostic::new(OneBlankLineBeforeClass, docstring.range()); if checker.patch(diagnostic.kind.rule()) { // Insert one blank line before the class. - diagnostic.set_fix(Fix::automatic(Edit::replacement( + diagnostic.set_fix(Fix::always_applies(Edit::replacement( checker.stylist().line_ending().to_string(), blank_lines_start, docstring.start() - docstring.indentation.text_len(), @@ -252,7 +252,7 @@ pub(crate) fn blank_before_after_class(checker: &mut Checker, docstring: &Docstr // """Has priorities""" ; priorities=1 // ``` let next_statement = next_statement.trim_whitespace_start(); - diagnostic.set_fix(Fix::automatic(Edit::replacement( + diagnostic.set_fix(Fix::always_applies(Edit::replacement( line_ending.to_string() + line_ending + indentation + next_statement, replacement_start, first_line.end(), @@ -282,7 +282,7 @@ pub(crate) fn blank_before_after_class(checker: &mut Checker, docstring: &Docstr let mut diagnostic = Diagnostic::new(OneBlankLineAfterClass, docstring.range()); if checker.patch(diagnostic.kind.rule()) { // Insert a blank line before the class (replacing any existing lines). - diagnostic.set_fix(Fix::automatic(Edit::replacement( + diagnostic.set_fix(Fix::always_applies(Edit::replacement( checker.stylist().line_ending().to_string(), replacement_start, blank_lines_end, diff --git a/crates/ruff_linter/src/rules/pydocstyle/rules/blank_before_after_function.rs b/crates/ruff_linter/src/rules/pydocstyle/rules/blank_before_after_function.rs index d010bc64a1..ecd161a86a 100644 --- a/crates/ruff_linter/src/rules/pydocstyle/rules/blank_before_after_function.rs +++ b/crates/ruff_linter/src/rules/pydocstyle/rules/blank_before_after_function.rs @@ -134,7 +134,7 @@ pub(crate) fn blank_before_after_function(checker: &mut Checker, docstring: &Doc ); if checker.patch(diagnostic.kind.rule()) { // Delete the blank line before the docstring. - diagnostic.set_fix(Fix::automatic(Edit::deletion( + diagnostic.set_fix(Fix::always_applies(Edit::deletion( blank_lines_start, docstring.start() - docstring.indentation.text_len(), ))); @@ -190,7 +190,7 @@ pub(crate) fn blank_before_after_function(checker: &mut Checker, docstring: &Doc ); if checker.patch(diagnostic.kind.rule()) { // Delete the blank line after the docstring. - diagnostic.set_fix(Fix::automatic(Edit::deletion( + diagnostic.set_fix(Fix::always_applies(Edit::deletion( first_line_end, blank_lines_end, ))); diff --git a/crates/ruff_linter/src/rules/pydocstyle/rules/capitalized.rs b/crates/ruff_linter/src/rules/pydocstyle/rules/capitalized.rs index 209fae42f5..013a3f69cd 100644 --- a/crates/ruff_linter/src/rules/pydocstyle/rules/capitalized.rs +++ b/crates/ruff_linter/src/rules/pydocstyle/rules/capitalized.rs @@ -91,7 +91,7 @@ pub(crate) fn capitalized(checker: &mut Checker, docstring: &Docstring) { ); if checker.patch(diagnostic.kind.rule()) { - diagnostic.set_fix(Fix::automatic(Edit::range_replacement( + diagnostic.set_fix(Fix::always_applies(Edit::range_replacement( capitalized_word, TextRange::at(body.start(), first_word.text_len()), ))); diff --git a/crates/ruff_linter/src/rules/pydocstyle/rules/ends_with_period.rs b/crates/ruff_linter/src/rules/pydocstyle/rules/ends_with_period.rs index 01830140e5..40598e02e0 100644 --- a/crates/ruff_linter/src/rules/pydocstyle/rules/ends_with_period.rs +++ b/crates/ruff_linter/src/rules/pydocstyle/rules/ends_with_period.rs @@ -105,7 +105,7 @@ pub(crate) fn ends_with_period(checker: &mut Checker, docstring: &Docstring) { let mut diagnostic = Diagnostic::new(EndsInPeriod, docstring.range()); // Best-effort fix: avoid adding a period after other punctuation marks. if checker.patch(diagnostic.kind.rule()) && !trimmed.ends_with([':', ';']) { - diagnostic.set_fix(Fix::suggested(Edit::insertion( + diagnostic.set_fix(Fix::sometimes_applies(Edit::insertion( ".".to_string(), line.start() + trimmed.text_len(), ))); diff --git a/crates/ruff_linter/src/rules/pydocstyle/rules/ends_with_punctuation.rs b/crates/ruff_linter/src/rules/pydocstyle/rules/ends_with_punctuation.rs index 8abc42f855..0057ce34ac 100644 --- a/crates/ruff_linter/src/rules/pydocstyle/rules/ends_with_punctuation.rs +++ b/crates/ruff_linter/src/rules/pydocstyle/rules/ends_with_punctuation.rs @@ -104,7 +104,7 @@ pub(crate) fn ends_with_punctuation(checker: &mut Checker, docstring: &Docstring let mut diagnostic = Diagnostic::new(EndsInPunctuation, docstring.range()); // Best-effort fix: avoid adding a period after other punctuation marks. if checker.patch(diagnostic.kind.rule()) && !trimmed.ends_with([':', ';']) { - diagnostic.set_fix(Fix::suggested(Edit::insertion( + diagnostic.set_fix(Fix::sometimes_applies(Edit::insertion( ".".to_string(), line.start() + trimmed.text_len(), ))); diff --git a/crates/ruff_linter/src/rules/pydocstyle/rules/indent.rs b/crates/ruff_linter/src/rules/pydocstyle/rules/indent.rs index 702227dc92..d8a220a9cb 100644 --- a/crates/ruff_linter/src/rules/pydocstyle/rules/indent.rs +++ b/crates/ruff_linter/src/rules/pydocstyle/rules/indent.rs @@ -189,7 +189,7 @@ pub(crate) fn indent(checker: &mut Checker, docstring: &Docstring) { let mut diagnostic = Diagnostic::new(UnderIndentation, TextRange::empty(line.start())); if checker.patch(diagnostic.kind.rule()) { - diagnostic.set_fix(Fix::automatic(Edit::range_replacement( + diagnostic.set_fix(Fix::always_applies(Edit::range_replacement( clean_space(docstring.indentation), TextRange::at(line.start(), line_indent.text_len()), ))); @@ -236,7 +236,7 @@ pub(crate) fn indent(checker: &mut Checker, docstring: &Docstring) { } else { Edit::range_replacement(indent, over_indented) }; - diagnostic.set_fix(Fix::automatic(edit)); + diagnostic.set_fix(Fix::always_applies(edit)); } checker.diagnostics.push(diagnostic); } @@ -256,7 +256,7 @@ pub(crate) fn indent(checker: &mut Checker, docstring: &Docstring) { } else { Edit::range_replacement(indent, range) }; - diagnostic.set_fix(Fix::automatic(edit)); + diagnostic.set_fix(Fix::always_applies(edit)); } checker.diagnostics.push(diagnostic); } diff --git a/crates/ruff_linter/src/rules/pydocstyle/rules/multi_line_summary_start.rs b/crates/ruff_linter/src/rules/pydocstyle/rules/multi_line_summary_start.rs index cd0a0cde9f..a44a6243f6 100644 --- a/crates/ruff_linter/src/rules/pydocstyle/rules/multi_line_summary_start.rs +++ b/crates/ruff_linter/src/rules/pydocstyle/rules/multi_line_summary_start.rs @@ -141,7 +141,7 @@ pub(crate) fn multi_line_summary_start(checker: &mut Checker, docstring: &Docstr // Delete until first non-whitespace char. for line in content_lines { if let Some(end_column) = line.find(|c: char| !c.is_whitespace()) { - diagnostic.set_fix(Fix::automatic(Edit::deletion( + diagnostic.set_fix(Fix::always_applies(Edit::deletion( first_line.end(), line.start() + TextSize::try_from(end_column).unwrap(), ))); @@ -197,7 +197,7 @@ pub(crate) fn multi_line_summary_start(checker: &mut Checker, docstring: &Docstr first_line.strip_prefix(prefix).unwrap().trim_start() ); - diagnostic.set_fix(Fix::automatic(Edit::replacement( + diagnostic.set_fix(Fix::always_applies(Edit::replacement( repl, body.start(), first_line.end(), diff --git a/crates/ruff_linter/src/rules/pydocstyle/rules/newline_after_last_paragraph.rs b/crates/ruff_linter/src/rules/pydocstyle/rules/newline_after_last_paragraph.rs index 0e0be209a3..c89a822372 100644 --- a/crates/ruff_linter/src/rules/pydocstyle/rules/newline_after_last_paragraph.rs +++ b/crates/ruff_linter/src/rules/pydocstyle/rules/newline_after_last_paragraph.rs @@ -96,7 +96,7 @@ pub(crate) fn newline_after_last_paragraph(checker: &mut Checker, docstring: &Do checker.stylist().line_ending().as_str(), clean_space(docstring.indentation) ); - diagnostic.set_fix(Fix::automatic(Edit::replacement( + diagnostic.set_fix(Fix::always_applies(Edit::replacement( content, docstring.expr.end() - num_trailing_quotes - num_trailing_spaces, docstring.expr.end() - num_trailing_quotes, diff --git a/crates/ruff_linter/src/rules/pydocstyle/rules/no_surrounding_whitespace.rs b/crates/ruff_linter/src/rules/pydocstyle/rules/no_surrounding_whitespace.rs index f5122fac05..51bee9b9b3 100644 --- a/crates/ruff_linter/src/rules/pydocstyle/rules/no_surrounding_whitespace.rs +++ b/crates/ruff_linter/src/rules/pydocstyle/rules/no_surrounding_whitespace.rs @@ -69,7 +69,7 @@ pub(crate) fn no_surrounding_whitespace(checker: &mut Checker, docstring: &Docst // characters, avoid applying the fix. if !trimmed.ends_with(quote) && !trimmed.starts_with(quote) && !ends_with_backslash(trimmed) { - diagnostic.set_fix(Fix::automatic(Edit::range_replacement( + diagnostic.set_fix(Fix::always_applies(Edit::range_replacement( trimmed.to_string(), TextRange::at(body.start(), line.text_len()), ))); diff --git a/crates/ruff_linter/src/rules/pydocstyle/rules/one_liner.rs b/crates/ruff_linter/src/rules/pydocstyle/rules/one_liner.rs index 76f139cbc4..a656a58ca1 100644 --- a/crates/ruff_linter/src/rules/pydocstyle/rules/one_liner.rs +++ b/crates/ruff_linter/src/rules/pydocstyle/rules/one_liner.rs @@ -78,7 +78,7 @@ pub(crate) fn one_liner(checker: &mut Checker, docstring: &Docstring) { && !trimmed.ends_with(trailing.chars().last().unwrap()) && !trimmed.starts_with(leading.chars().last().unwrap()) { - diagnostic.set_fix(Fix::suggested(Edit::range_replacement( + diagnostic.set_fix(Fix::sometimes_applies(Edit::range_replacement( format!("{leading}{trimmed}{trailing}"), docstring.range(), ))); diff --git a/crates/ruff_linter/src/rules/pydocstyle/rules/sections.rs b/crates/ruff_linter/src/rules/pydocstyle/rules/sections.rs index 66a0b8ad71..7f198e1d87 100644 --- a/crates/ruff_linter/src/rules/pydocstyle/rules/sections.rs +++ b/crates/ruff_linter/src/rules/pydocstyle/rules/sections.rs @@ -1392,7 +1392,7 @@ fn blanks_and_section_underline( let range = TextRange::new(context.following_range().start(), blank_lines_end); // Delete any blank lines between the header and the underline. - diagnostic.set_fix(Fix::automatic(Edit::range_deletion(range))); + diagnostic.set_fix(Fix::always_applies(Edit::range_deletion(range))); } checker.diagnostics.push(diagnostic); } @@ -1420,7 +1420,7 @@ fn blanks_and_section_underline( "-".repeat(context.section_name().len()), checker.stylist().line_ending().as_str() ); - diagnostic.set_fix(Fix::automatic(Edit::replacement( + diagnostic.set_fix(Fix::always_applies(Edit::replacement( content, blank_lines_end, non_blank_line.full_end(), @@ -1446,7 +1446,7 @@ fn blanks_and_section_underline( leading_space.text_len() + TextSize::from(1), ); let contents = clean_space(docstring.indentation); - diagnostic.set_fix(Fix::automatic(if contents.is_empty() { + diagnostic.set_fix(Fix::always_applies(if contents.is_empty() { Edit::range_deletion(range) } else { Edit::range_replacement(contents, range) @@ -1486,7 +1486,7 @@ fn blanks_and_section_underline( ); if checker.patch(diagnostic.kind.rule()) { // Delete any blank lines between the header and content. - diagnostic.set_fix(Fix::automatic(Edit::deletion( + diagnostic.set_fix(Fix::always_applies(Edit::deletion( line_after_dashes.start(), blank_lines_after_dashes_end, ))); @@ -1529,14 +1529,14 @@ fn blanks_and_section_underline( { // If an existing underline is an equal sign line of the appropriate length, // replace it with a dashed line. - diagnostic.set_fix(Fix::automatic(Edit::replacement( + diagnostic.set_fix(Fix::always_applies(Edit::replacement( content, context.summary_range().end(), non_blank_line.end(), ))); } else { // Otherwise, insert a dashed line after the section header. - diagnostic.set_fix(Fix::automatic(Edit::insertion( + diagnostic.set_fix(Fix::always_applies(Edit::insertion( content, context.summary_range().end(), ))); @@ -1556,7 +1556,7 @@ fn blanks_and_section_underline( let range = TextRange::new(context.following_range().start(), blank_lines_end); // Delete any blank lines between the header and content. - diagnostic.set_fix(Fix::automatic(Edit::range_deletion(range))); + diagnostic.set_fix(Fix::always_applies(Edit::range_deletion(range))); } checker.diagnostics.push(diagnostic); } @@ -1581,7 +1581,7 @@ fn blanks_and_section_underline( "-".repeat(context.section_name().len()), ); - diagnostic.set_fix(Fix::automatic(Edit::insertion( + diagnostic.set_fix(Fix::always_applies(Edit::insertion( content, context.summary_range().end(), ))); @@ -1618,7 +1618,7 @@ fn common_section( // Replace the section title with the capitalized variant. This requires // locating the start and end of the section name. let section_range = context.section_name_range(); - diagnostic.set_fix(Fix::automatic(Edit::range_replacement( + diagnostic.set_fix(Fix::always_applies(Edit::range_replacement( capitalized_section_name.to_string(), section_range, ))); @@ -1641,7 +1641,7 @@ fn common_section( let content = clean_space(docstring.indentation); let fix_range = TextRange::at(context.start(), leading_space.text_len()); - diagnostic.set_fix(Fix::automatic(if content.is_empty() { + diagnostic.set_fix(Fix::always_applies(if content.is_empty() { Edit::range_deletion(fix_range) } else { Edit::range_replacement(content, fix_range) @@ -1664,7 +1664,7 @@ fn common_section( ); if checker.patch(diagnostic.kind.rule()) { // Add a newline at the beginning of the next section. - diagnostic.set_fix(Fix::automatic(Edit::insertion( + diagnostic.set_fix(Fix::always_applies(Edit::insertion( line_end.to_string(), next.start(), ))); @@ -1681,7 +1681,7 @@ fn common_section( ); if checker.patch(diagnostic.kind.rule()) { // Add a newline after the section. - diagnostic.set_fix(Fix::automatic(Edit::insertion( + diagnostic.set_fix(Fix::always_applies(Edit::insertion( format!("{}{}", line_end, docstring.indentation), context.end(), ))); @@ -1704,7 +1704,7 @@ fn common_section( ); if checker.patch(diagnostic.kind.rule()) { // Add a blank line before the section. - diagnostic.set_fix(Fix::automatic(Edit::insertion( + diagnostic.set_fix(Fix::always_applies(Edit::insertion( line_end.to_string(), context.start(), ))); @@ -1900,7 +1900,7 @@ fn numpy_section( ); if checker.patch(diagnostic.kind.rule()) { let section_range = context.section_name_range(); - diagnostic.set_fix(Fix::automatic(Edit::range_deletion(TextRange::at( + diagnostic.set_fix(Fix::always_applies(Edit::range_deletion(TextRange::at( section_range.end(), suffix.text_len(), )))); @@ -1937,7 +1937,7 @@ fn google_section( if checker.patch(diagnostic.kind.rule()) { // Replace the suffix. let section_name_range = context.section_name_range(); - diagnostic.set_fix(Fix::automatic(Edit::range_replacement( + diagnostic.set_fix(Fix::always_applies(Edit::range_replacement( ":".to_string(), TextRange::at(section_name_range.end(), suffix.text_len()), ))); diff --git a/crates/ruff_linter/src/rules/pyflakes/rules/f_string_missing_placeholders.rs b/crates/ruff_linter/src/rules/pyflakes/rules/f_string_missing_placeholders.rs index 4614cbe4f9..072ab8171a 100644 --- a/crates/ruff_linter/src/rules/pyflakes/rules/f_string_missing_placeholders.rs +++ b/crates/ruff_linter/src/rules/pyflakes/rules/f_string_missing_placeholders.rs @@ -151,7 +151,7 @@ fn convert_f_string_to_regular_string( content.insert(0, ' '); } - Fix::automatic(Edit::replacement( + Fix::always_applies(Edit::replacement( content, prefix_range.start(), tok_range.end(), diff --git a/crates/ruff_linter/src/rules/pyflakes/rules/invalid_literal_comparisons.rs b/crates/ruff_linter/src/rules/pyflakes/rules/invalid_literal_comparisons.rs index 8beed9661a..b49a7e32a1 100644 --- a/crates/ruff_linter/src/rules/pyflakes/rules/invalid_literal_comparisons.rs +++ b/crates/ruff_linter/src/rules/pyflakes/rules/invalid_literal_comparisons.rs @@ -101,7 +101,7 @@ pub(crate) fn invalid_literal_comparison( None } } { - diagnostic.set_fix(Fix::automatic(Edit::range_replacement( + diagnostic.set_fix(Fix::always_applies(Edit::range_replacement( content, located_op.range + expr.start(), ))); diff --git a/crates/ruff_linter/src/rules/pyflakes/rules/raise_not_implemented.rs b/crates/ruff_linter/src/rules/pyflakes/rules/raise_not_implemented.rs index e21e33ed5c..b325499721 100644 --- a/crates/ruff_linter/src/rules/pyflakes/rules/raise_not_implemented.rs +++ b/crates/ruff_linter/src/rules/pyflakes/rules/raise_not_implemented.rs @@ -78,7 +78,7 @@ pub(crate) fn raise_not_implemented(checker: &mut Checker, expr: &Expr) { let mut diagnostic = Diagnostic::new(RaiseNotImplemented, expr.range()); if checker.patch(diagnostic.kind.rule()) { if checker.semantic().is_builtin("NotImplementedError") { - diagnostic.set_fix(Fix::automatic(Edit::range_replacement( + diagnostic.set_fix(Fix::always_applies(Edit::range_replacement( "NotImplementedError".to_string(), expr.range(), ))); diff --git a/crates/ruff_linter/src/rules/pyflakes/rules/repeated_keys.rs b/crates/ruff_linter/src/rules/pyflakes/rules/repeated_keys.rs index 0aebe6ac38..d11dbfc592 100644 --- a/crates/ruff_linter/src/rules/pyflakes/rules/repeated_keys.rs +++ b/crates/ruff_linter/src/rules/pyflakes/rules/repeated_keys.rs @@ -159,7 +159,7 @@ pub(crate) fn repeated_keys(checker: &mut Checker, dict: &ast::ExprDict) { ); if checker.patch(diagnostic.kind.rule()) { if !seen_values.insert(comparable_value) { - diagnostic.set_fix(Fix::suggested(Edit::deletion( + diagnostic.set_fix(Fix::sometimes_applies(Edit::deletion( parenthesized_range( (&dict.values[i - 1]).into(), dict.into(), @@ -193,7 +193,7 @@ pub(crate) fn repeated_keys(checker: &mut Checker, dict: &ast::ExprDict) { if checker.patch(diagnostic.kind.rule()) { let comparable_value: ComparableExpr = (&dict.values[i]).into(); if !seen_values.insert(comparable_value) { - diagnostic.set_fix(Fix::suggested(Edit::deletion( + diagnostic.set_fix(Fix::sometimes_applies(Edit::deletion( parenthesized_range( (&dict.values[i - 1]).into(), dict.into(), diff --git a/crates/ruff_linter/src/rules/pyflakes/rules/strings.rs b/crates/ruff_linter/src/rules/pyflakes/rules/strings.rs index 237a6a7442..9fac75977a 100644 --- a/crates/ruff_linter/src/rules/pyflakes/rules/strings.rs +++ b/crates/ruff_linter/src/rules/pyflakes/rules/strings.rs @@ -618,7 +618,7 @@ pub(crate) fn percent_format_extra_named_arguments( checker.locator(), checker.stylist(), )?; - Ok(Fix::automatic(edit)) + Ok(Fix::always_applies(edit)) }); } checker.diagnostics.push(diagnostic); @@ -785,7 +785,7 @@ pub(crate) fn string_dot_format_extra_named_arguments( checker.locator(), checker.stylist(), )?; - Ok(Fix::automatic(edit)) + Ok(Fix::always_applies(edit)) }); } checker.diagnostics.push(diagnostic); @@ -854,7 +854,7 @@ pub(crate) fn string_dot_format_extra_positional_arguments( checker.locator(), checker.stylist(), )?; - Ok(Fix::automatic(edit)) + Ok(Fix::always_applies(edit)) }); } } diff --git a/crates/ruff_linter/src/rules/pyflakes/rules/unused_import.rs b/crates/ruff_linter/src/rules/pyflakes/rules/unused_import.rs index 3595dfeba4..0736546df0 100644 --- a/crates/ruff_linter/src/rules/pyflakes/rules/unused_import.rs +++ b/crates/ruff_linter/src/rules/pyflakes/rules/unused_import.rs @@ -251,7 +251,7 @@ fn fix_imports(checker: &Checker, node_id: NodeId, imports: &[ImportBinding]) -> checker.stylist(), checker.indexer(), )?; - Ok(Fix::automatic(edit).isolate(Checker::isolation( + Ok(Fix::always_applies(edit).isolate(Checker::isolation( checker.semantic().parent_statement_id(node_id), ))) } diff --git a/crates/ruff_linter/src/rules/pyflakes/rules/unused_variable.rs b/crates/ruff_linter/src/rules/pyflakes/rules/unused_variable.rs index f7ae6524f1..6ad6ab6f67 100644 --- a/crates/ruff_linter/src/rules/pyflakes/rules/unused_variable.rs +++ b/crates/ruff_linter/src/rules/pyflakes/rules/unused_variable.rs @@ -237,11 +237,11 @@ fn remove_unused_variable(binding: &Binding, checker: &Checker) -> Option { )? .start(); let edit = Edit::deletion(start, end); - Some(Fix::suggested(edit)) + Some(Fix::sometimes_applies(edit)) } else { // If (e.g.) assigning to a constant (`x = 1`), delete the entire statement. let edit = delete_stmt(statement, parent, checker.locator(), checker.indexer()); - Some(Fix::suggested(edit).isolate(isolation)) + Some(Fix::sometimes_applies(edit).isolate(isolation)) }; } } @@ -265,11 +265,11 @@ fn remove_unused_variable(binding: &Binding, checker: &Checker) -> Option { })? .start(); let edit = Edit::deletion(start, end); - Some(Fix::suggested(edit)) + Some(Fix::sometimes_applies(edit)) } else { // If (e.g.) assigning to a constant (`x = 1`), delete the entire statement. let edit = delete_stmt(statement, parent, checker.locator(), checker.indexer()); - Some(Fix::suggested(edit).isolate(isolation)) + Some(Fix::sometimes_applies(edit).isolate(isolation)) }; } } @@ -300,7 +300,7 @@ fn remove_unused_variable(binding: &Binding, checker: &Checker) -> Option { .start(); let edit = Edit::deletion(start, end); - return Some(Fix::suggested(edit)); + return Some(Fix::sometimes_applies(edit)); } } } diff --git a/crates/ruff_linter/src/rules/pylint/rules/invalid_string_characters.rs b/crates/ruff_linter/src/rules/pylint/rules/invalid_string_characters.rs index aa5c1954e8..3c39c689c6 100644 --- a/crates/ruff_linter/src/rules/pylint/rules/invalid_string_characters.rs +++ b/crates/ruff_linter/src/rules/pylint/rules/invalid_string_characters.rs @@ -201,7 +201,7 @@ pub(crate) fn invalid_string_characters( let location = range.start() + TextSize::try_from(column).unwrap(); let range = TextRange::at(location, c.text_len()); - diagnostics.push(Diagnostic::new(rule, range).with_fix(Fix::automatic( + diagnostics.push(Diagnostic::new(rule, range).with_fix(Fix::always_applies( Edit::range_replacement(replacement.to_string(), range), ))); } diff --git a/crates/ruff_linter/src/rules/pylint/rules/manual_import_from.rs b/crates/ruff_linter/src/rules/pylint/rules/manual_import_from.rs index 0761359f94..e475b5b144 100644 --- a/crates/ruff_linter/src/rules/pylint/rules/manual_import_from.rs +++ b/crates/ruff_linter/src/rules/pylint/rules/manual_import_from.rs @@ -83,7 +83,7 @@ pub(crate) fn manual_from_import( level: Some(0), range: TextRange::default(), }; - diagnostic.set_fix(Fix::automatic(Edit::range_replacement( + diagnostic.set_fix(Fix::always_applies(Edit::range_replacement( checker.generator().stmt(&node.into()), stmt.range(), ))); diff --git a/crates/ruff_linter/src/rules/pylint/rules/nested_min_max.rs b/crates/ruff_linter/src/rules/pylint/rules/nested_min_max.rs index 0d0608b3a7..42a7cd83f1 100644 --- a/crates/ruff_linter/src/rules/pylint/rules/nested_min_max.rs +++ b/crates/ruff_linter/src/rules/pylint/rules/nested_min_max.rs @@ -171,7 +171,7 @@ pub(crate) fn nested_min_max( }, range: TextRange::default(), }); - diagnostic.set_fix(Fix::suggested(Edit::range_replacement( + diagnostic.set_fix(Fix::sometimes_applies(Edit::range_replacement( checker.generator().expr(&flattened_expr), expr.range(), ))); diff --git a/crates/ruff_linter/src/rules/pylint/rules/repeated_isinstance_calls.rs b/crates/ruff_linter/src/rules/pylint/rules/repeated_isinstance_calls.rs index b038d8f15e..3e7be37b3e 100644 --- a/crates/ruff_linter/src/rules/pylint/rules/repeated_isinstance_calls.rs +++ b/crates/ruff_linter/src/rules/pylint/rules/repeated_isinstance_calls.rs @@ -134,7 +134,7 @@ pub(crate) fn repeated_isinstance_calls( expr.range(), ); if checker.patch(diagnostic.kind.rule()) { - diagnostic.set_fix(Fix::automatic(Edit::range_replacement( + diagnostic.set_fix(Fix::always_applies(Edit::range_replacement( pad(call, expr.range(), checker.locator()), expr.range(), ))); diff --git a/crates/ruff_linter/src/rules/pylint/rules/sys_exit_alias.rs b/crates/ruff_linter/src/rules/pylint/rules/sys_exit_alias.rs index 9c311d04d5..31705fa5e0 100644 --- a/crates/ruff_linter/src/rules/pylint/rules/sys_exit_alias.rs +++ b/crates/ruff_linter/src/rules/pylint/rules/sys_exit_alias.rs @@ -85,7 +85,7 @@ pub(crate) fn sys_exit_alias(checker: &mut Checker, func: &Expr) { checker.semantic(), )?; let reference_edit = Edit::range_replacement(binding, func.range()); - Ok(Fix::suggested_edits(import_edit, [reference_edit])) + Ok(Fix::sometimes_applies_edits(import_edit, [reference_edit])) }); } checker.diagnostics.push(diagnostic); diff --git a/crates/ruff_linter/src/rules/pylint/rules/useless_import_alias.rs b/crates/ruff_linter/src/rules/pylint/rules/useless_import_alias.rs index ce6ac9ad0c..a2cd99e1ca 100644 --- a/crates/ruff_linter/src/rules/pylint/rules/useless_import_alias.rs +++ b/crates/ruff_linter/src/rules/pylint/rules/useless_import_alias.rs @@ -50,7 +50,7 @@ pub(crate) fn useless_import_alias(checker: &mut Checker, alias: &Alias) { let mut diagnostic = Diagnostic::new(UselessImportAlias, alias.range()); if checker.patch(diagnostic.kind.rule()) { - diagnostic.set_fix(Fix::suggested(Edit::range_replacement( + diagnostic.set_fix(Fix::sometimes_applies(Edit::range_replacement( asname.to_string(), alias.range(), ))); diff --git a/crates/ruff_linter/src/rules/pylint/rules/useless_return.rs b/crates/ruff_linter/src/rules/pylint/rules/useless_return.rs index 104ca92bc9..8e6d1d630a 100644 --- a/crates/ruff_linter/src/rules/pylint/rules/useless_return.rs +++ b/crates/ruff_linter/src/rules/pylint/rules/useless_return.rs @@ -106,7 +106,7 @@ pub(crate) fn useless_return( if checker.patch(diagnostic.kind.rule()) { let edit = fix::edits::delete_stmt(last_stmt, Some(stmt), checker.locator(), checker.indexer()); - diagnostic.set_fix(Fix::automatic(edit).isolate(Checker::isolation( + diagnostic.set_fix(Fix::always_applies(edit).isolate(Checker::isolation( checker.semantic().current_statement_id(), ))); } diff --git a/crates/ruff_linter/src/rules/pyupgrade/rules/convert_named_tuple_functional_to_class.rs b/crates/ruff_linter/src/rules/pyupgrade/rules/convert_named_tuple_functional_to_class.rs index 4fd5e665cd..69234c90d9 100644 --- a/crates/ruff_linter/src/rules/pyupgrade/rules/convert_named_tuple_functional_to_class.rs +++ b/crates/ruff_linter/src/rules/pyupgrade/rules/convert_named_tuple_functional_to_class.rs @@ -241,7 +241,7 @@ fn convert_to_class( base_class: &Expr, generator: Generator, ) -> Fix { - Fix::suggested(Edit::range_replacement( + Fix::sometimes_applies(Edit::range_replacement( generator.stmt(&create_class_def_stmt(typename, body, base_class)), stmt.range(), )) diff --git a/crates/ruff_linter/src/rules/pyupgrade/rules/convert_typed_dict_functional_to_class.rs b/crates/ruff_linter/src/rules/pyupgrade/rules/convert_typed_dict_functional_to_class.rs index 9b028ae389..667149bd88 100644 --- a/crates/ruff_linter/src/rules/pyupgrade/rules/convert_typed_dict_functional_to_class.rs +++ b/crates/ruff_linter/src/rules/pyupgrade/rules/convert_typed_dict_functional_to_class.rs @@ -275,7 +275,7 @@ fn convert_to_class( base_class: &Expr, generator: Generator, ) -> Fix { - Fix::suggested(Edit::range_replacement( + Fix::sometimes_applies(Edit::range_replacement( generator.stmt(&create_class_def_stmt( class_name, body, diff --git a/crates/ruff_linter/src/rules/pyupgrade/rules/datetime_utc_alias.rs b/crates/ruff_linter/src/rules/pyupgrade/rules/datetime_utc_alias.rs index ee37a7e1c7..809ee308f3 100644 --- a/crates/ruff_linter/src/rules/pyupgrade/rules/datetime_utc_alias.rs +++ b/crates/ruff_linter/src/rules/pyupgrade/rules/datetime_utc_alias.rs @@ -66,7 +66,7 @@ pub(crate) fn datetime_utc_alias(checker: &mut Checker, expr: &Expr) { checker.semantic(), )?; let reference_edit = Edit::range_replacement(binding, expr.range()); - Ok(Fix::suggested_edits(import_edit, [reference_edit])) + Ok(Fix::sometimes_applies_edits(import_edit, [reference_edit])) }); } checker.diagnostics.push(diagnostic); diff --git a/crates/ruff_linter/src/rules/pyupgrade/rules/deprecated_c_element_tree.rs b/crates/ruff_linter/src/rules/pyupgrade/rules/deprecated_c_element_tree.rs index 4e663531c4..2118aa8918 100644 --- a/crates/ruff_linter/src/rules/pyupgrade/rules/deprecated_c_element_tree.rs +++ b/crates/ruff_linter/src/rules/pyupgrade/rules/deprecated_c_element_tree.rs @@ -46,7 +46,7 @@ where let mut diagnostic = Diagnostic::new(DeprecatedCElementTree, node.range()); if checker.patch(diagnostic.kind.rule()) { let contents = checker.locator().slice(node); - diagnostic.set_fix(Fix::suggested(Edit::range_replacement( + diagnostic.set_fix(Fix::sometimes_applies(Edit::range_replacement( contents.replacen("cElementTree", "ElementTree", 1), node.range(), ))); diff --git a/crates/ruff_linter/src/rules/pyupgrade/rules/deprecated_import.rs b/crates/ruff_linter/src/rules/pyupgrade/rules/deprecated_import.rs index 113e3ba5db..45c5564fe0 100644 --- a/crates/ruff_linter/src/rules/pyupgrade/rules/deprecated_import.rs +++ b/crates/ruff_linter/src/rules/pyupgrade/rules/deprecated_import.rs @@ -632,7 +632,7 @@ pub(crate) fn deprecated_import( ); if checker.patch(Rule::DeprecatedImport) { if let Some(content) = fix { - diagnostic.set_fix(Fix::suggested(Edit::range_replacement( + diagnostic.set_fix(Fix::sometimes_applies(Edit::range_replacement( content, stmt.range(), ))); diff --git a/crates/ruff_linter/src/rules/pyupgrade/rules/deprecated_mock_import.rs b/crates/ruff_linter/src/rules/pyupgrade/rules/deprecated_mock_import.rs index 6a0b1016eb..350cde8074 100644 --- a/crates/ruff_linter/src/rules/pyupgrade/rules/deprecated_mock_import.rs +++ b/crates/ruff_linter/src/rules/pyupgrade/rules/deprecated_mock_import.rs @@ -262,7 +262,7 @@ pub(crate) fn deprecated_mock_attribute(checker: &mut Checker, expr: &Expr) { value.range(), ); if checker.patch(diagnostic.kind.rule()) { - diagnostic.set_fix(Fix::suggested(Edit::range_replacement( + diagnostic.set_fix(Fix::sometimes_applies(Edit::range_replacement( "mock".to_string(), value.range(), ))); @@ -308,7 +308,7 @@ pub(crate) fn deprecated_mock_import(checker: &mut Checker, stmt: &Stmt) { name.range(), ); if let Some(content) = content.as_ref() { - diagnostic.set_fix(Fix::suggested(Edit::range_replacement( + diagnostic.set_fix(Fix::sometimes_applies(Edit::range_replacement( content.clone(), stmt.range(), ))); @@ -339,7 +339,7 @@ pub(crate) fn deprecated_mock_import(checker: &mut Checker, stmt: &Stmt) { diagnostic.try_set_fix(|| { format_import_from(stmt, indent, checker.locator(), checker.stylist()) .map(|content| Edit::range_replacement(content, stmt.range())) - .map(Fix::suggested) + .map(Fix::sometimes_applies) }); } } diff --git a/crates/ruff_linter/src/rules/pyupgrade/rules/deprecated_unittest_alias.rs b/crates/ruff_linter/src/rules/pyupgrade/rules/deprecated_unittest_alias.rs index aa32e5b2da..49c79e13cb 100644 --- a/crates/ruff_linter/src/rules/pyupgrade/rules/deprecated_unittest_alias.rs +++ b/crates/ruff_linter/src/rules/pyupgrade/rules/deprecated_unittest_alias.rs @@ -100,7 +100,7 @@ pub(crate) fn deprecated_unittest_alias(checker: &mut Checker, expr: &Expr) { expr.range(), ); if checker.patch(diagnostic.kind.rule()) { - diagnostic.set_fix(Fix::suggested(Edit::range_replacement( + diagnostic.set_fix(Fix::sometimes_applies(Edit::range_replacement( format!("self.{target}"), expr.range(), ))); diff --git a/crates/ruff_linter/src/rules/pyupgrade/rules/extraneous_parentheses.rs b/crates/ruff_linter/src/rules/pyupgrade/rules/extraneous_parentheses.rs index 8bf7b35f80..965bc24e95 100644 --- a/crates/ruff_linter/src/rules/pyupgrade/rules/extraneous_parentheses.rs +++ b/crates/ruff_linter/src/rules/pyupgrade/rules/extraneous_parentheses.rs @@ -157,7 +157,7 @@ pub(crate) fn extraneous_parentheses( if settings.rules.should_fix(Rule::ExtraneousParentheses) { let contents = locator.slice(TextRange::new(start_range.start(), end_range.end())); - diagnostic.set_fix(Fix::automatic(Edit::replacement( + diagnostic.set_fix(Fix::always_applies(Edit::replacement( contents[1..contents.len() - 1].to_string(), start_range.start(), end_range.end(), diff --git a/crates/ruff_linter/src/rules/pyupgrade/rules/f_strings.rs b/crates/ruff_linter/src/rules/pyupgrade/rules/f_strings.rs index 92655d504f..32712a539c 100644 --- a/crates/ruff_linter/src/rules/pyupgrade/rules/f_strings.rs +++ b/crates/ruff_linter/src/rules/pyupgrade/rules/f_strings.rs @@ -419,7 +419,7 @@ pub(crate) fn f_strings( .comment_ranges() .intersects(call.arguments.range()) { - diagnostic.set_fix(Fix::suggested(Edit::range_replacement( + diagnostic.set_fix(Fix::sometimes_applies(Edit::range_replacement( contents, call.range(), ))); diff --git a/crates/ruff_linter/src/rules/pyupgrade/rules/format_literals.rs b/crates/ruff_linter/src/rules/pyupgrade/rules/format_literals.rs index 44fed73107..5901686c96 100644 --- a/crates/ruff_linter/src/rules/pyupgrade/rules/format_literals.rs +++ b/crates/ruff_linter/src/rules/pyupgrade/rules/format_literals.rs @@ -115,8 +115,9 @@ pub(crate) fn format_literals( let mut diagnostic = Diagnostic::new(FormatLiterals, call.range()); if checker.patch(diagnostic.kind.rule()) { diagnostic.try_set_fix(|| { - generate_call(call, arguments, checker.locator(), checker.stylist()) - .map(|suggestion| Fix::suggested(Edit::range_replacement(suggestion, call.range()))) + generate_call(call, arguments, checker.locator(), checker.stylist()).map(|suggestion| { + Fix::sometimes_applies(Edit::range_replacement(suggestion, call.range())) + }) }); } checker.diagnostics.push(diagnostic); diff --git a/crates/ruff_linter/src/rules/pyupgrade/rules/lru_cache_with_maxsize_none.rs b/crates/ruff_linter/src/rules/pyupgrade/rules/lru_cache_with_maxsize_none.rs index e45108505a..453d66dffe 100644 --- a/crates/ruff_linter/src/rules/pyupgrade/rules/lru_cache_with_maxsize_none.rs +++ b/crates/ruff_linter/src/rules/pyupgrade/rules/lru_cache_with_maxsize_none.rs @@ -100,7 +100,7 @@ pub(crate) fn lru_cache_with_maxsize_none(checker: &mut Checker, decorator_list: )?; let reference_edit = Edit::range_replacement(binding, decorator.expression.range()); - Ok(Fix::automatic_edits(import_edit, [reference_edit])) + Ok(Fix::always_applies_edits(import_edit, [reference_edit])) }); } checker.diagnostics.push(diagnostic); diff --git a/crates/ruff_linter/src/rules/pyupgrade/rules/lru_cache_without_parameters.rs b/crates/ruff_linter/src/rules/pyupgrade/rules/lru_cache_without_parameters.rs index 7c7d539915..a75b1e57b5 100644 --- a/crates/ruff_linter/src/rules/pyupgrade/rules/lru_cache_without_parameters.rs +++ b/crates/ruff_linter/src/rules/pyupgrade/rules/lru_cache_without_parameters.rs @@ -78,7 +78,7 @@ pub(crate) fn lru_cache_without_parameters(checker: &mut Checker, decorator_list TextRange::new(func.end(), decorator.end()), ); if checker.patch(diagnostic.kind.rule()) { - diagnostic.set_fix(Fix::automatic(Edit::range_deletion(arguments.range()))); + diagnostic.set_fix(Fix::always_applies(Edit::range_deletion(arguments.range()))); } checker.diagnostics.push(diagnostic); } diff --git a/crates/ruff_linter/src/rules/pyupgrade/rules/native_literals.rs b/crates/ruff_linter/src/rules/pyupgrade/rules/native_literals.rs index f79d401994..14627811a1 100644 --- a/crates/ruff_linter/src/rules/pyupgrade/rules/native_literals.rs +++ b/crates/ruff_linter/src/rules/pyupgrade/rules/native_literals.rs @@ -185,7 +185,7 @@ pub(crate) fn native_literals( if checker.patch(diagnostic.kind.rule()) { let constant = Constant::from(literal_type); let content = checker.generator().constant(&constant); - diagnostic.set_fix(Fix::automatic(Edit::range_replacement( + diagnostic.set_fix(Fix::always_applies(Edit::range_replacement( content, call.range(), ))); @@ -223,7 +223,7 @@ pub(crate) fn native_literals( let mut diagnostic = Diagnostic::new(NativeLiterals { literal_type }, call.range()); if checker.patch(diagnostic.kind.rule()) { - diagnostic.set_fix(Fix::automatic(Edit::range_replacement( + diagnostic.set_fix(Fix::always_applies(Edit::range_replacement( content, call.range(), ))); diff --git a/crates/ruff_linter/src/rules/pyupgrade/rules/open_alias.rs b/crates/ruff_linter/src/rules/pyupgrade/rules/open_alias.rs index 35ea30241a..c44414c3a6 100644 --- a/crates/ruff_linter/src/rules/pyupgrade/rules/open_alias.rs +++ b/crates/ruff_linter/src/rules/pyupgrade/rules/open_alias.rs @@ -56,7 +56,7 @@ pub(crate) fn open_alias(checker: &mut Checker, expr: &Expr, func: &Expr) { let mut diagnostic = Diagnostic::new(OpenAlias, expr.range()); if checker.patch(diagnostic.kind.rule()) { if checker.semantic().is_builtin("open") { - diagnostic.set_fix(Fix::suggested(Edit::range_replacement( + diagnostic.set_fix(Fix::sometimes_applies(Edit::range_replacement( "open".to_string(), func.range(), ))); diff --git a/crates/ruff_linter/src/rules/pyupgrade/rules/os_error_alias.rs b/crates/ruff_linter/src/rules/pyupgrade/rules/os_error_alias.rs index 6cdb8bfff0..ac5b2c5d32 100644 --- a/crates/ruff_linter/src/rules/pyupgrade/rules/os_error_alias.rs +++ b/crates/ruff_linter/src/rules/pyupgrade/rules/os_error_alias.rs @@ -83,7 +83,7 @@ fn atom_diagnostic(checker: &mut Checker, target: &Expr) { ); if checker.patch(diagnostic.kind.rule()) { if checker.semantic().is_builtin("OSError") { - diagnostic.set_fix(Fix::automatic(Edit::range_replacement( + diagnostic.set_fix(Fix::always_applies(Edit::range_replacement( "OSError".to_string(), target.range(), ))); @@ -135,7 +135,7 @@ fn tuple_diagnostic(checker: &mut Checker, tuple: &ast::ExprTuple, aliases: &[&E format!("({})", checker.generator().expr(&node.into())) }; - diagnostic.set_fix(Fix::automatic(Edit::range_replacement( + diagnostic.set_fix(Fix::always_applies(Edit::range_replacement( pad(content, tuple.range(), checker.locator()), tuple.range(), ))); diff --git a/crates/ruff_linter/src/rules/pyupgrade/rules/outdated_version_block.rs b/crates/ruff_linter/src/rules/pyupgrade/rules/outdated_version_block.rs index 6cd829b3b7..ffeb97f56a 100644 --- a/crates/ruff_linter/src/rules/pyupgrade/rules/outdated_version_block.rs +++ b/crates/ruff_linter/src/rules/pyupgrade/rules/outdated_version_block.rs @@ -289,7 +289,7 @@ fn fix_always_false_branch( let stmt = checker.semantic().current_statement(); let parent = checker.semantic().current_statement_parent(); let edit = delete_stmt(stmt, parent, checker.locator(), checker.indexer()); - Some(Fix::suggested(edit)) + Some(Fix::sometimes_applies(edit)) } // If we have an `if` and an `elif`, turn the `elif` into an `if` Some(ElifElseClause { @@ -304,7 +304,7 @@ fn fix_always_false_branch( == "elif" ); let end_location = range.start() + ("elif".text_len() - "if".text_len()); - Some(Fix::suggested(Edit::deletion( + Some(Fix::sometimes_applies(Edit::deletion( stmt_if.start(), end_location, ))) @@ -317,7 +317,7 @@ fn fix_always_false_branch( let end = body.last()?; if indentation(checker.locator(), start).is_none() { // Inline `else` block (e.g., `else: x = 1`). - Some(Fix::suggested(Edit::range_replacement( + Some(Fix::sometimes_applies(Edit::range_replacement( checker .locator() .slice(TextRange::new(start.start(), end.end())) @@ -339,7 +339,7 @@ fn fix_always_false_branch( .ok() }) .map(|contents| { - Fix::suggested(Edit::replacement( + Fix::sometimes_applies(Edit::replacement( contents, checker.locator().line_start(stmt_if.start()), stmt_if.end(), @@ -366,7 +366,7 @@ fn fix_always_false_branch( .iter() .map(Ranged::start) .find(|start| *start > branch.start()); - Some(Fix::suggested(Edit::deletion( + Some(Fix::sometimes_applies(Edit::deletion( branch.start(), next_start.unwrap_or(branch.end()), ))) @@ -394,7 +394,7 @@ fn fix_always_true_branch( let end = branch.body.last()?; if indentation(checker.locator(), start).is_none() { // Inline `if` block (e.g., `if ...: x = 1`). - Some(Fix::suggested(Edit::range_replacement( + Some(Fix::sometimes_applies(Edit::range_replacement( checker .locator() .slice(TextRange::new(start.start(), end.end())) @@ -413,7 +413,7 @@ fn fix_always_true_branch( .ok() }) .map(|contents| { - Fix::suggested(Edit::replacement( + Fix::sometimes_applies(Edit::replacement( contents, checker.locator().line_start(stmt_if.start()), stmt_if.end(), @@ -428,7 +428,7 @@ fn fix_always_true_branch( let text = checker .locator() .slice(TextRange::new(branch.test.end(), end.end())); - Some(Fix::suggested(Edit::range_replacement( + Some(Fix::sometimes_applies(Edit::range_replacement( format!("else{text}"), TextRange::new(branch.start(), stmt_if.end()), ))) diff --git a/crates/ruff_linter/src/rules/pyupgrade/rules/printf_string_formatting.rs b/crates/ruff_linter/src/rules/pyupgrade/rules/printf_string_formatting.rs index 76d2d108ff..4b92ed1d59 100644 --- a/crates/ruff_linter/src/rules/pyupgrade/rules/printf_string_formatting.rs +++ b/crates/ruff_linter/src/rules/pyupgrade/rules/printf_string_formatting.rs @@ -498,7 +498,7 @@ pub(crate) fn printf_string_formatting(checker: &mut Checker, expr: &Expr, right if checker.patch(diagnostic.kind.rule()) && !checker.indexer().comment_ranges().intersects(right.range()) { - diagnostic.set_fix(Fix::suggested(Edit::range_replacement( + diagnostic.set_fix(Fix::sometimes_applies(Edit::range_replacement( contents, expr.range(), ))); diff --git a/crates/ruff_linter/src/rules/pyupgrade/rules/quoted_annotation.rs b/crates/ruff_linter/src/rules/pyupgrade/rules/quoted_annotation.rs index 047d6366a9..46bd877169 100644 --- a/crates/ruff_linter/src/rules/pyupgrade/rules/quoted_annotation.rs +++ b/crates/ruff_linter/src/rules/pyupgrade/rules/quoted_annotation.rs @@ -54,7 +54,7 @@ impl AlwaysFixableViolation for QuotedAnnotation { pub(crate) fn quoted_annotation(checker: &mut Checker, annotation: &str, range: TextRange) { let mut diagnostic = Diagnostic::new(QuotedAnnotation, range); if checker.patch(Rule::QuotedAnnotation) { - diagnostic.set_fix(Fix::automatic(Edit::range_replacement( + diagnostic.set_fix(Fix::always_applies(Edit::range_replacement( annotation.to_string(), range, ))); diff --git a/crates/ruff_linter/src/rules/pyupgrade/rules/redundant_open_modes.rs b/crates/ruff_linter/src/rules/pyupgrade/rules/redundant_open_modes.rs index 6ae4acddc1..539ec4f0ca 100644 --- a/crates/ruff_linter/src/rules/pyupgrade/rules/redundant_open_modes.rs +++ b/crates/ruff_linter/src/rules/pyupgrade/rules/redundant_open_modes.rs @@ -185,13 +185,14 @@ fn create_check( ); if patch { if let Some(content) = replacement_value { - diagnostic.set_fix(Fix::automatic(Edit::range_replacement( + diagnostic.set_fix(Fix::always_applies(Edit::range_replacement( content.to_string(), mode_param.range(), ))); } else { diagnostic.try_set_fix(|| { - create_remove_param_fix(locator, expr, mode_param, source_type).map(Fix::automatic) + create_remove_param_fix(locator, expr, mode_param, source_type) + .map(Fix::always_applies) }); } } diff --git a/crates/ruff_linter/src/rules/pyupgrade/rules/replace_stdout_stderr.rs b/crates/ruff_linter/src/rules/pyupgrade/rules/replace_stdout_stderr.rs index 481afd4c4b..053642534a 100644 --- a/crates/ruff_linter/src/rules/pyupgrade/rules/replace_stdout_stderr.rs +++ b/crates/ruff_linter/src/rules/pyupgrade/rules/replace_stdout_stderr.rs @@ -105,7 +105,7 @@ fn generate_fix( (stderr, stdout) }; // Replace one argument with `capture_output=True`, and remove the other. - Ok(Fix::suggested_edits( + Ok(Fix::sometimes_applies_edits( Edit::range_replacement("capture_output=True".to_string(), first.range()), [remove_argument( second, diff --git a/crates/ruff_linter/src/rules/pyupgrade/rules/replace_universal_newlines.rs b/crates/ruff_linter/src/rules/pyupgrade/rules/replace_universal_newlines.rs index b7a61047ac..7828036fbb 100644 --- a/crates/ruff_linter/src/rules/pyupgrade/rules/replace_universal_newlines.rs +++ b/crates/ruff_linter/src/rules/pyupgrade/rules/replace_universal_newlines.rs @@ -74,10 +74,10 @@ pub(crate) fn replace_universal_newlines(checker: &mut Checker, call: &ast::Expr Parentheses::Preserve, checker.locator().contents(), ) - .map(Fix::suggested) + .map(Fix::sometimes_applies) }); } else { - diagnostic.set_fix(Fix::suggested(Edit::range_replacement( + diagnostic.set_fix(Fix::sometimes_applies(Edit::range_replacement( "text".to_string(), arg.range(), ))); diff --git a/crates/ruff_linter/src/rules/pyupgrade/rules/super_call_with_parameters.rs b/crates/ruff_linter/src/rules/pyupgrade/rules/super_call_with_parameters.rs index 4f00a905c8..1c45d01204 100644 --- a/crates/ruff_linter/src/rules/pyupgrade/rules/super_call_with_parameters.rs +++ b/crates/ruff_linter/src/rules/pyupgrade/rules/super_call_with_parameters.rs @@ -129,7 +129,7 @@ pub(crate) fn super_call_with_parameters(checker: &mut Checker, call: &ast::Expr let mut diagnostic = Diagnostic::new(SuperCallWithParameters, call.arguments.range()); if checker.patch(diagnostic.kind.rule()) { - diagnostic.set_fix(Fix::suggested(Edit::deletion( + diagnostic.set_fix(Fix::sometimes_applies(Edit::deletion( call.arguments.start() + TextSize::new(1), call.arguments.end() - TextSize::new(1), ))); diff --git a/crates/ruff_linter/src/rules/pyupgrade/rules/type_of_primitive.rs b/crates/ruff_linter/src/rules/pyupgrade/rules/type_of_primitive.rs index 2e9abe998d..42a22f9824 100644 --- a/crates/ruff_linter/src/rules/pyupgrade/rules/type_of_primitive.rs +++ b/crates/ruff_linter/src/rules/pyupgrade/rules/type_of_primitive.rs @@ -76,7 +76,7 @@ pub(crate) fn type_of_primitive(checker: &mut Checker, expr: &Expr, func: &Expr, if checker.patch(diagnostic.kind.rule()) { let builtin = primitive.builtin(); if checker.semantic().is_builtin(&builtin) { - diagnostic.set_fix(Fix::automatic(Edit::range_replacement( + diagnostic.set_fix(Fix::always_applies(Edit::range_replacement( pad(primitive.builtin(), expr.range(), checker.locator()), expr.range(), ))); diff --git a/crates/ruff_linter/src/rules/pyupgrade/rules/typing_text_str_alias.rs b/crates/ruff_linter/src/rules/pyupgrade/rules/typing_text_str_alias.rs index 1b10074c14..bf5eedec79 100644 --- a/crates/ruff_linter/src/rules/pyupgrade/rules/typing_text_str_alias.rs +++ b/crates/ruff_linter/src/rules/pyupgrade/rules/typing_text_str_alias.rs @@ -55,7 +55,7 @@ pub(crate) fn typing_text_str_alias(checker: &mut Checker, expr: &Expr) { let mut diagnostic = Diagnostic::new(TypingTextStrAlias, expr.range()); if checker.patch(diagnostic.kind.rule()) { if checker.semantic().is_builtin("str") { - diagnostic.set_fix(Fix::automatic(Edit::range_replacement( + diagnostic.set_fix(Fix::always_applies(Edit::range_replacement( "str".to_string(), expr.range(), ))); diff --git a/crates/ruff_linter/src/rules/pyupgrade/rules/unicode_kind_prefix.rs b/crates/ruff_linter/src/rules/pyupgrade/rules/unicode_kind_prefix.rs index b3589e0fbe..a65487de4c 100644 --- a/crates/ruff_linter/src/rules/pyupgrade/rules/unicode_kind_prefix.rs +++ b/crates/ruff_linter/src/rules/pyupgrade/rules/unicode_kind_prefix.rs @@ -44,7 +44,7 @@ pub(crate) fn unicode_kind_prefix(checker: &mut Checker, expr: &Expr, is_unicode if is_unicode { let mut diagnostic = Diagnostic::new(UnicodeKindPrefix, expr.range()); if checker.patch(diagnostic.kind.rule()) { - diagnostic.set_fix(Fix::automatic(Edit::range_deletion(TextRange::at( + diagnostic.set_fix(Fix::always_applies(Edit::range_deletion(TextRange::at( expr.start(), TextSize::from(1), )))); diff --git a/crates/ruff_linter/src/rules/pyupgrade/rules/unnecessary_builtin_import.rs b/crates/ruff_linter/src/rules/pyupgrade/rules/unnecessary_builtin_import.rs index f72a1f4719..1a4b8abe9d 100644 --- a/crates/ruff_linter/src/rules/pyupgrade/rules/unnecessary_builtin_import.rs +++ b/crates/ruff_linter/src/rules/pyupgrade/rules/unnecessary_builtin_import.rs @@ -136,7 +136,7 @@ pub(crate) fn unnecessary_builtin_import( checker.stylist(), checker.indexer(), )?; - Ok(Fix::suggested(edit).isolate(Checker::isolation( + Ok(Fix::sometimes_applies(edit).isolate(Checker::isolation( checker.semantic().current_statement_parent_id(), ))) }); diff --git a/crates/ruff_linter/src/rules/pyupgrade/rules/unnecessary_class_parentheses.rs b/crates/ruff_linter/src/rules/pyupgrade/rules/unnecessary_class_parentheses.rs index 4ba44b3b06..c760efcd43 100644 --- a/crates/ruff_linter/src/rules/pyupgrade/rules/unnecessary_class_parentheses.rs +++ b/crates/ruff_linter/src/rules/pyupgrade/rules/unnecessary_class_parentheses.rs @@ -51,7 +51,7 @@ pub(crate) fn unnecessary_class_parentheses(checker: &mut Checker, class_def: &a let mut diagnostic = Diagnostic::new(UnnecessaryClassParentheses, arguments.range()); if checker.patch(diagnostic.kind.rule()) { - diagnostic.set_fix(Fix::automatic(Edit::deletion( + diagnostic.set_fix(Fix::always_applies(Edit::deletion( arguments.start(), arguments.end(), ))); diff --git a/crates/ruff_linter/src/rules/pyupgrade/rules/unnecessary_coding_comment.rs b/crates/ruff_linter/src/rules/pyupgrade/rules/unnecessary_coding_comment.rs index 7a64de5a26..c76ecf6668 100644 --- a/crates/ruff_linter/src/rules/pyupgrade/rules/unnecessary_coding_comment.rs +++ b/crates/ruff_linter/src/rules/pyupgrade/rules/unnecessary_coding_comment.rs @@ -92,7 +92,7 @@ pub(crate) fn unnecessary_coding_comment( let mut diagnostic = Diagnostic::new(UTF8EncodingDeclaration, *comment_range); if settings.rules.should_fix(diagnostic.kind.rule()) { - diagnostic.set_fix(Fix::automatic(Edit::deletion( + diagnostic.set_fix(Fix::always_applies(Edit::deletion( line_range.start(), line_range.end(), ))); diff --git a/crates/ruff_linter/src/rules/pyupgrade/rules/unnecessary_encode_utf8.rs b/crates/ruff_linter/src/rules/pyupgrade/rules/unnecessary_encode_utf8.rs index 812d0ec4ce..c0a60432e5 100644 --- a/crates/ruff_linter/src/rules/pyupgrade/rules/unnecessary_encode_utf8.rs +++ b/crates/ruff_linter/src/rules/pyupgrade/rules/unnecessary_encode_utf8.rs @@ -151,7 +151,7 @@ fn replace_with_bytes_literal( prev = range.end(); } - Fix::automatic(Edit::range_replacement( + Fix::always_applies(Edit::range_replacement( pad(replacement, call.range(), locator), call.range(), )) @@ -202,7 +202,7 @@ pub(crate) fn unnecessary_encode_utf8(checker: &mut Checker, call: &ast::ExprCal Parentheses::Preserve, checker.locator().contents(), ) - .map(Fix::automatic) + .map(Fix::always_applies) }); } checker.diagnostics.push(diagnostic); @@ -222,7 +222,7 @@ pub(crate) fn unnecessary_encode_utf8(checker: &mut Checker, call: &ast::ExprCal Parentheses::Preserve, checker.locator().contents(), ) - .map(Fix::automatic) + .map(Fix::always_applies) }); } checker.diagnostics.push(diagnostic); @@ -249,7 +249,7 @@ pub(crate) fn unnecessary_encode_utf8(checker: &mut Checker, call: &ast::ExprCal Parentheses::Preserve, checker.locator().contents(), ) - .map(Fix::automatic) + .map(Fix::always_applies) }); } checker.diagnostics.push(diagnostic); @@ -269,7 +269,7 @@ pub(crate) fn unnecessary_encode_utf8(checker: &mut Checker, call: &ast::ExprCal Parentheses::Preserve, checker.locator().contents(), ) - .map(Fix::automatic) + .map(Fix::always_applies) }); } checker.diagnostics.push(diagnostic); diff --git a/crates/ruff_linter/src/rules/pyupgrade/rules/unnecessary_future_import.rs b/crates/ruff_linter/src/rules/pyupgrade/rules/unnecessary_future_import.rs index f2398a163d..b7afd2ee3d 100644 --- a/crates/ruff_linter/src/rules/pyupgrade/rules/unnecessary_future_import.rs +++ b/crates/ruff_linter/src/rules/pyupgrade/rules/unnecessary_future_import.rs @@ -125,7 +125,7 @@ pub(crate) fn unnecessary_future_import(checker: &mut Checker, stmt: &Stmt, name checker.stylist(), checker.indexer(), )?; - Ok(Fix::suggested(edit).isolate(Checker::isolation( + Ok(Fix::sometimes_applies(edit).isolate(Checker::isolation( checker.semantic().current_statement_parent_id(), ))) }); diff --git a/crates/ruff_linter/src/rules/pyupgrade/rules/unpacked_list_comprehension.rs b/crates/ruff_linter/src/rules/pyupgrade/rules/unpacked_list_comprehension.rs index ab95815c58..eefb804adb 100644 --- a/crates/ruff_linter/src/rules/pyupgrade/rules/unpacked_list_comprehension.rs +++ b/crates/ruff_linter/src/rules/pyupgrade/rules/unpacked_list_comprehension.rs @@ -74,7 +74,7 @@ pub(crate) fn unpacked_list_comprehension(checker: &mut Checker, targets: &[Expr content.push('('); content.push_str(&existing[1..existing.len() - 1]); content.push(')'); - diagnostic.set_fix(Fix::suggested(Edit::range_replacement( + diagnostic.set_fix(Fix::sometimes_applies(Edit::range_replacement( content, value.range(), ))); diff --git a/crates/ruff_linter/src/rules/pyupgrade/rules/use_pep585_annotation.rs b/crates/ruff_linter/src/rules/pyupgrade/rules/use_pep585_annotation.rs index 548d12f0bc..329b3ee20b 100644 --- a/crates/ruff_linter/src/rules/pyupgrade/rules/use_pep585_annotation.rs +++ b/crates/ruff_linter/src/rules/pyupgrade/rules/use_pep585_annotation.rs @@ -92,7 +92,7 @@ pub(crate) fn use_pep585_annotation( ModuleMember::BuiltIn(name) => { // Built-in type, like `list`. if checker.semantic().is_builtin(name) { - diagnostic.set_fix(Fix::automatic(Edit::range_replacement( + diagnostic.set_fix(Fix::always_applies(Edit::range_replacement( (*name).to_string(), expr.range(), ))); @@ -107,7 +107,7 @@ pub(crate) fn use_pep585_annotation( checker.semantic(), )?; let reference_edit = Edit::range_replacement(binding, expr.range()); - Ok(Fix::suggested_edits(import_edit, [reference_edit])) + Ok(Fix::sometimes_applies_edits(import_edit, [reference_edit])) }); } } diff --git a/crates/ruff_linter/src/rules/pyupgrade/rules/use_pep604_annotation.rs b/crates/ruff_linter/src/rules/pyupgrade/rules/use_pep604_annotation.rs index 04fb3bb7b5..a8dc7b18b8 100644 --- a/crates/ruff_linter/src/rules/pyupgrade/rules/use_pep604_annotation.rs +++ b/crates/ruff_linter/src/rules/pyupgrade/rules/use_pep604_annotation.rs @@ -79,7 +79,7 @@ pub(crate) fn use_pep604_annotation( // Invalid type annotation. } _ => { - diagnostic.set_fix(Fix::suggested(Edit::range_replacement( + diagnostic.set_fix(Fix::sometimes_applies(Edit::range_replacement( pad( checker.generator().expr(&optional(slice)), expr.range(), @@ -100,7 +100,7 @@ pub(crate) fn use_pep604_annotation( // Invalid type annotation. } Expr::Tuple(ast::ExprTuple { elts, .. }) => { - diagnostic.set_fix(Fix::suggested(Edit::range_replacement( + diagnostic.set_fix(Fix::sometimes_applies(Edit::range_replacement( pad( checker.generator().expr(&union(elts)), expr.range(), @@ -111,7 +111,7 @@ pub(crate) fn use_pep604_annotation( } _ => { // Single argument. - diagnostic.set_fix(Fix::suggested(Edit::range_replacement( + diagnostic.set_fix(Fix::sometimes_applies(Edit::range_replacement( pad( checker.locator().slice(slice).to_string(), expr.range(), diff --git a/crates/ruff_linter/src/rules/pyupgrade/rules/use_pep604_isinstance.rs b/crates/ruff_linter/src/rules/pyupgrade/rules/use_pep604_isinstance.rs index bd3536a9e5..5c1be57d01 100644 --- a/crates/ruff_linter/src/rules/pyupgrade/rules/use_pep604_isinstance.rs +++ b/crates/ruff_linter/src/rules/pyupgrade/rules/use_pep604_isinstance.rs @@ -117,7 +117,7 @@ pub(crate) fn use_pep604_isinstance( let mut diagnostic = Diagnostic::new(NonPEP604Isinstance { kind }, expr.range()); if checker.patch(diagnostic.kind.rule()) { - diagnostic.set_fix(Fix::suggested(Edit::range_replacement( + diagnostic.set_fix(Fix::sometimes_applies(Edit::range_replacement( checker.generator().expr(&union(elts)), types.range(), ))); diff --git a/crates/ruff_linter/src/rules/pyupgrade/rules/use_pep695_type_alias.rs b/crates/ruff_linter/src/rules/pyupgrade/rules/use_pep695_type_alias.rs index 07863a2616..8cb7fc1aeb 100644 --- a/crates/ruff_linter/src/rules/pyupgrade/rules/use_pep695_type_alias.rs +++ b/crates/ruff_linter/src/rules/pyupgrade/rules/use_pep695_type_alias.rs @@ -132,7 +132,7 @@ pub(crate) fn non_pep695_type_alias(checker: &mut Checker, stmt: &StmtAnnAssign) }) }; - diagnostic.set_fix(Fix::automatic(Edit::range_replacement( + diagnostic.set_fix(Fix::always_applies(Edit::range_replacement( checker.generator().stmt(&Stmt::from(StmtTypeAlias { range: TextRange::default(), name: target.clone(), diff --git a/crates/ruff_linter/src/rules/pyupgrade/rules/useless_metaclass_type.rs b/crates/ruff_linter/src/rules/pyupgrade/rules/useless_metaclass_type.rs index cb4f9137d1..1a0f10fe95 100644 --- a/crates/ruff_linter/src/rules/pyupgrade/rules/useless_metaclass_type.rs +++ b/crates/ruff_linter/src/rules/pyupgrade/rules/useless_metaclass_type.rs @@ -67,7 +67,7 @@ pub(crate) fn useless_metaclass_type( let stmt = checker.semantic().current_statement(); let parent = checker.semantic().current_statement_parent(); let edit = fix::edits::delete_stmt(stmt, parent, checker.locator(), checker.indexer()); - diagnostic.set_fix(Fix::automatic(edit).isolate(Checker::isolation( + diagnostic.set_fix(Fix::always_applies(edit).isolate(Checker::isolation( checker.semantic().current_statement_parent_id(), ))); } diff --git a/crates/ruff_linter/src/rules/pyupgrade/rules/useless_object_inheritance.rs b/crates/ruff_linter/src/rules/pyupgrade/rules/useless_object_inheritance.rs index a1d55abe20..bf8223f880 100644 --- a/crates/ruff_linter/src/rules/pyupgrade/rules/useless_object_inheritance.rs +++ b/crates/ruff_linter/src/rules/pyupgrade/rules/useless_object_inheritance.rs @@ -76,7 +76,7 @@ pub(crate) fn useless_object_inheritance(checker: &mut Checker, class_def: &ast: Parentheses::Remove, checker.locator().contents(), ) - .map(Fix::automatic) + .map(Fix::always_applies) }); } checker.diagnostics.push(diagnostic); diff --git a/crates/ruff_linter/src/rules/pyupgrade/rules/yield_in_for_loop.rs b/crates/ruff_linter/src/rules/pyupgrade/rules/yield_in_for_loop.rs index 90ecb92704..89aa5db61a 100644 --- a/crates/ruff_linter/src/rules/pyupgrade/rules/yield_in_for_loop.rs +++ b/crates/ruff_linter/src/rules/pyupgrade/rules/yield_in_for_loop.rs @@ -114,7 +114,7 @@ pub(crate) fn yield_in_for_loop(checker: &mut Checker, stmt_for: &ast::StmtFor) .unwrap_or(iter.range()), ); let contents = format!("yield from {contents}"); - diagnostic.set_fix(Fix::suggested(Edit::range_replacement( + diagnostic.set_fix(Fix::sometimes_applies(Edit::range_replacement( contents, stmt_for.range(), ))); diff --git a/crates/ruff_linter/src/rules/refurb/rules/check_and_remove_from_set.rs b/crates/ruff_linter/src/rules/refurb/rules/check_and_remove_from_set.rs index 6a3bc5767f..9aaca3172b 100644 --- a/crates/ruff_linter/src/rules/refurb/rules/check_and_remove_from_set.rs +++ b/crates/ruff_linter/src/rules/refurb/rules/check_and_remove_from_set.rs @@ -113,7 +113,7 @@ pub(crate) fn check_and_remove_from_set(checker: &mut Checker, if_stmt: &ast::St if_stmt.range(), ); if checker.patch(diagnostic.kind.rule()) { - diagnostic.set_fix(Fix::suggested(Edit::replacement( + diagnostic.set_fix(Fix::sometimes_applies(Edit::replacement( make_suggestion(check_set, check_element, checker.generator()), if_stmt.start(), if_stmt.end(), diff --git a/crates/ruff_linter/src/rules/refurb/rules/delete_full_slice.rs b/crates/ruff_linter/src/rules/refurb/rules/delete_full_slice.rs index 9ca1b4d8e3..c40ba35b49 100644 --- a/crates/ruff_linter/src/rules/refurb/rules/delete_full_slice.rs +++ b/crates/ruff_linter/src/rules/refurb/rules/delete_full_slice.rs @@ -71,7 +71,7 @@ pub(crate) fn delete_full_slice(checker: &mut Checker, delete: &ast::StmtDelete) // Fix is only supported for single-target deletions. if checker.patch(diagnostic.kind.rule()) && delete.targets.len() == 1 { let replacement = generate_method_call(name, "clear", checker.generator()); - diagnostic.set_fix(Fix::suggested(Edit::replacement( + diagnostic.set_fix(Fix::sometimes_applies(Edit::replacement( replacement, delete.start(), delete.end(), diff --git a/crates/ruff_linter/src/rules/refurb/rules/implicit_cwd.rs b/crates/ruff_linter/src/rules/refurb/rules/implicit_cwd.rs index 442909f496..0060703cc5 100644 --- a/crates/ruff_linter/src/rules/refurb/rules/implicit_cwd.rs +++ b/crates/ruff_linter/src/rules/refurb/rules/implicit_cwd.rs @@ -95,7 +95,7 @@ pub(crate) fn no_implicit_cwd(checker: &mut Checker, call: &ExprCall) { call.start(), checker.semantic(), )?; - Ok(Fix::suggested_edits( + Ok(Fix::sometimes_applies_edits( Edit::range_replacement(format!("{binding}.cwd()"), call.range()), [import_edit], )) diff --git a/crates/ruff_linter/src/rules/refurb/rules/print_empty_string.rs b/crates/ruff_linter/src/rules/refurb/rules/print_empty_string.rs index 08b6fade27..2d9fdf7dbb 100644 --- a/crates/ruff_linter/src/rules/refurb/rules/print_empty_string.rs +++ b/crates/ruff_linter/src/rules/refurb/rules/print_empty_string.rs @@ -91,7 +91,7 @@ pub(crate) fn print_empty_string(checker: &mut Checker, call: &ast::ExprCall) { let mut diagnostic = Diagnostic::new(PrintEmptyString { reason }, call.range()); if checker.patch(diagnostic.kind.rule()) { - diagnostic.set_fix(Fix::suggested(Edit::replacement( + diagnostic.set_fix(Fix::sometimes_applies(Edit::replacement( generate_suggestion(call, Separator::Remove, checker.generator()), call.start(), call.end(), @@ -113,7 +113,7 @@ pub(crate) fn print_empty_string(checker: &mut Checker, call: &ast::ExprCall) { ); if checker.patch(diagnostic.kind.rule()) { - diagnostic.set_fix(Fix::suggested(Edit::replacement( + diagnostic.set_fix(Fix::sometimes_applies(Edit::replacement( generate_suggestion(call, Separator::Remove, checker.generator()), call.start(), call.end(), @@ -178,7 +178,7 @@ pub(crate) fn print_empty_string(checker: &mut Checker, call: &ast::ExprCall) { ); if checker.patch(diagnostic.kind.rule()) { - diagnostic.set_fix(Fix::suggested(Edit::replacement( + diagnostic.set_fix(Fix::sometimes_applies(Edit::replacement( generate_suggestion(call, separator, checker.generator()), call.start(), call.end(), diff --git a/crates/ruff_linter/src/rules/refurb/rules/reimplemented_starmap.rs b/crates/ruff_linter/src/rules/refurb/rules/reimplemented_starmap.rs index 8928953379..f602b8272a 100644 --- a/crates/ruff_linter/src/rules/refurb/rules/reimplemented_starmap.rs +++ b/crates/ruff_linter/src/rules/refurb/rules/reimplemented_starmap.rs @@ -147,7 +147,7 @@ pub(crate) fn reimplemented_starmap(checker: &mut Checker, target: &StarmapCandi target.try_make_suggestion(starmap_name, &comprehension.iter, func, checker)?, target.range(), ); - Ok(Fix::suggested_edits(import_edit, [main_edit])) + Ok(Fix::sometimes_applies_edits(import_edit, [main_edit])) }); } checker.diagnostics.push(diagnostic); diff --git a/crates/ruff_linter/src/rules/refurb/rules/repeated_append.rs b/crates/ruff_linter/src/rules/refurb/rules/repeated_append.rs index 3dbc0760f3..4e805f7078 100644 --- a/crates/ruff_linter/src/rules/refurb/rules/repeated_append.rs +++ b/crates/ruff_linter/src/rules/refurb/rules/repeated_append.rs @@ -108,7 +108,7 @@ pub(crate) fn repeated_append(checker: &mut Checker, stmt: &Stmt) { // We only suggest a fix when all appends in a group are clumped together. If they're // non-consecutive, fixing them is much more difficult. if checker.patch(diagnostic.kind.rule()) && group.is_consecutive { - diagnostic.set_fix(Fix::suggested(Edit::replacement( + diagnostic.set_fix(Fix::sometimes_applies(Edit::replacement( replacement, group.start(), group.end(), diff --git a/crates/ruff_linter/src/rules/refurb/rules/slice_copy.rs b/crates/ruff_linter/src/rules/refurb/rules/slice_copy.rs index 67c19aeae0..2c85f6575e 100644 --- a/crates/ruff_linter/src/rules/refurb/rules/slice_copy.rs +++ b/crates/ruff_linter/src/rules/refurb/rules/slice_copy.rs @@ -63,7 +63,7 @@ pub(crate) fn slice_copy(checker: &mut Checker, subscript: &ast::ExprSubscript) let mut diagnostic = Diagnostic::new(SliceCopy, subscript.range()); if checker.patch(diagnostic.kind.rule()) { let replacement = generate_method_call(name, "copy", checker.generator()); - diagnostic.set_fix(Fix::suggested(Edit::replacement( + diagnostic.set_fix(Fix::sometimes_applies(Edit::replacement( replacement, subscript.start(), subscript.end(), diff --git a/crates/ruff_linter/src/rules/refurb/rules/unnecessary_enumerate.rs b/crates/ruff_linter/src/rules/refurb/rules/unnecessary_enumerate.rs index db34998f31..c0e237e79f 100644 --- a/crates/ruff_linter/src/rules/refurb/rules/unnecessary_enumerate.rs +++ b/crates/ruff_linter/src/rules/refurb/rules/unnecessary_enumerate.rs @@ -149,7 +149,7 @@ pub(crate) fn unnecessary_enumerate(checker: &mut Checker, stmt_for: &ast::StmtF ), stmt_for.target.range(), ); - diagnostic.set_fix(Fix::suggested_edits(replace_iter, [replace_target])); + diagnostic.set_fix(Fix::sometimes_applies_edits(replace_iter, [replace_target])); } checker.diagnostics.push(diagnostic); @@ -212,7 +212,8 @@ pub(crate) fn unnecessary_enumerate(checker: &mut Checker, stmt_for: &ast::StmtF stmt_for.target.range(), ); - diagnostic.set_fix(Fix::suggested_edits(replace_iter, [replace_target])); + diagnostic + .set_fix(Fix::sometimes_applies_edits(replace_iter, [replace_target])); } } checker.diagnostics.push(diagnostic); diff --git a/crates/ruff_linter/src/rules/ruff/rules/collection_literal_concatenation.rs b/crates/ruff_linter/src/rules/ruff/rules/collection_literal_concatenation.rs index bbc2688935..6c03919abb 100644 --- a/crates/ruff_linter/src/rules/ruff/rules/collection_literal_concatenation.rs +++ b/crates/ruff_linter/src/rules/ruff/rules/collection_literal_concatenation.rs @@ -202,7 +202,7 @@ pub(crate) fn collection_literal_concatenation(checker: &mut Checker, expr: &Exp if !checker.indexer().has_comments(expr, checker.locator()) { // This suggestion could be unsafe if the non-literal expression in the // expression has overridden the `__add__` (or `__radd__`) magic methods. - diagnostic.set_fix(Fix::suggested(Edit::range_replacement( + diagnostic.set_fix(Fix::sometimes_applies(Edit::range_replacement( contents, expr.range(), ))); diff --git a/crates/ruff_linter/src/rules/ruff/rules/explicit_f_string_type_conversion.rs b/crates/ruff_linter/src/rules/ruff/rules/explicit_f_string_type_conversion.rs index f485b6a8e6..22a7378a17 100644 --- a/crates/ruff_linter/src/rules/ruff/rules/explicit_f_string_type_conversion.rs +++ b/crates/ruff_linter/src/rules/ruff/rules/explicit_f_string_type_conversion.rs @@ -160,7 +160,7 @@ fn convert_call_to_conversion_flag( formatted_string_expression.expression = call.args[0].value.clone(); Ok(expression) }) - .map(|output| Fix::automatic(Edit::range_replacement(output, expr.range()))) + .map(|output| Fix::always_applies(Edit::range_replacement(output, expr.range()))) } /// Return the [`FormattedStringContent`] at the given index in an f-string or implicit diff --git a/crates/ruff_linter/src/rules/ruff/rules/implicit_optional.rs b/crates/ruff_linter/src/rules/ruff/rules/implicit_optional.rs index 22dfc5bab3..1ba9c8ef6c 100644 --- a/crates/ruff_linter/src/rules/ruff/rules/implicit_optional.rs +++ b/crates/ruff_linter/src/rules/ruff/rules/implicit_optional.rs @@ -134,7 +134,7 @@ fn generate_fix(checker: &Checker, conversion_type: ConversionType, expr: &Expr) range: TextRange::default(), }); let content = checker.generator().expr(&new_expr); - Ok(Fix::suggested(Edit::range_replacement( + Ok(Fix::sometimes_applies(Edit::range_replacement( content, expr.range(), ))) @@ -156,7 +156,7 @@ fn generate_fix(checker: &Checker, conversion_type: ConversionType, expr: &Expr) ctx: ast::ExprContext::Load, }); let content = checker.generator().expr(&new_expr); - Ok(Fix::suggested_edits( + Ok(Fix::sometimes_applies_edits( Edit::range_replacement(content, expr.range()), [import_edit], )) diff --git a/crates/ruff_linter/src/rules/ruff/rules/quadratic_list_summation.rs b/crates/ruff_linter/src/rules/ruff/rules/quadratic_list_summation.rs index 27e58f4c7c..4e3a9f4932 100644 --- a/crates/ruff_linter/src/rules/ruff/rules/quadratic_list_summation.rs +++ b/crates/ruff_linter/src/rules/ruff/rules/quadratic_list_summation.rs @@ -112,7 +112,7 @@ fn convert_to_reduce(iterable: &Expr, call: &ast::ExprCall, checker: &Checker) - .unwrap_or(iterable.range()), ); - Ok(Fix::suggested_edits( + Ok(Fix::sometimes_applies_edits( Edit::range_replacement( format!("{reduce_binding}({iadd_binding}, {iterable}, [])"), call.range(), diff --git a/crates/ruff_linter/src/rules/ruff/rules/unnecessary_iterable_allocation_for_first_element.rs b/crates/ruff_linter/src/rules/ruff/rules/unnecessary_iterable_allocation_for_first_element.rs index 3ebf6670ee..83ae0ad967 100644 --- a/crates/ruff_linter/src/rules/ruff/rules/unnecessary_iterable_allocation_for_first_element.rs +++ b/crates/ruff_linter/src/rules/ruff/rules/unnecessary_iterable_allocation_for_first_element.rs @@ -97,7 +97,7 @@ pub(crate) fn unnecessary_iterable_allocation_for_first_element( ); if checker.patch(diagnostic.kind.rule()) { - diagnostic.set_fix(Fix::suggested(Edit::range_replacement( + diagnostic.set_fix(Fix::sometimes_applies(Edit::range_replacement( format!("next({iterable})"), *range, ))); diff --git a/crates/ruff_linter/src/rules/tryceratops/rules/verbose_raise.rs b/crates/ruff_linter/src/rules/tryceratops/rules/verbose_raise.rs index 63c9f5c378..46d6777e4b 100644 --- a/crates/ruff_linter/src/rules/tryceratops/rules/verbose_raise.rs +++ b/crates/ruff_linter/src/rules/tryceratops/rules/verbose_raise.rs @@ -97,10 +97,9 @@ pub(crate) fn verbose_raise(checker: &mut Checker, handlers: &[ExceptHandler]) { if id == exception_name.as_str() { let mut diagnostic = Diagnostic::new(VerboseRaise, exc.range()); if checker.patch(diagnostic.kind.rule()) { - diagnostic.set_fix(Fix::suggested(Edit::range_replacement( - "raise".to_string(), - raise.range(), - ))); + diagnostic.set_fix(Fix::sometimes_applies( + Edit::range_replacement("raise".to_string(), raise.range()), + )); } checker.diagnostics.push(diagnostic); }