Skip to content

Commit fe83dee

Browse files
committed
feat(AIR302): extract fix funcitons
1 parent f7ab3dd commit fe83dee

7 files changed

+182
-285
lines changed

crates/ruff_linter/src/rules/airflow/rules/moved_to_provider_in_3.rs

Lines changed: 61 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
use crate::checkers::ast::Checker;
22
use crate::fix::edits::remove_unused_imports;
3+
use crate::importer::ImportRequest;
34
use crate::rules::airflow::helpers::{is_guarded_by_try_except, match_head, ProviderReplacement};
45
use ruff_diagnostics::{Diagnostic, Edit, Fix, FixAvailability, Violation};
56
use ruff_macros::{derive_message_formats, ViolationMetadata};
@@ -965,6 +966,7 @@ fn check_names_moved_to_provider(checker: &Checker, expr: &Expr, ranged: TextRan
965966
);
966967

967968
let semantic = checker.semantic();
969+
968970
if let Some((module, name)) = match &replacement {
969971
ProviderReplacement::AutoImport { module, name, .. } => Some((module, *name)),
970972
ProviderReplacement::SourceModuleMovedToProvider { module, name, .. } => {
@@ -976,36 +978,64 @@ fn check_names_moved_to_provider(checker: &Checker, expr: &Expr, ranged: TextRan
976978
return;
977979
}
978980

979-
diagnostic.try_set_fix(|| {
980-
let head = match_head(expr);
981-
let binding = checker
982-
.semantic()
983-
.resolve_name(head.expect(""))
984-
.or_else(|| checker.semantic().lookup_symbol(&head.unwrap().id))
985-
.map(|id| checker.semantic().binding(id));
986-
let stmt = binding.expect("").statement(semantic);
987-
let remove_import_edit = remove_unused_imports(
988-
std::iter::once(name),
989-
stmt.expect(""),
990-
None,
991-
checker.locator(),
992-
checker.stylist(),
993-
checker.indexer(),
994-
);
995-
let import_edit = checker.importer().add_import(
996-
&NameImport::ImportFrom(MemberNameImport::member(
997-
(*module).to_string(),
998-
name.to_string(),
999-
)),
1000-
expr.start(),
1001-
);
1002-
1003-
let replacement_edit = Edit::range_replacement(name.to_string(), ranged.range());
1004-
Ok(Fix::unsafe_edits(
1005-
remove_import_edit.expect(""),
1006-
[import_edit, replacement_edit], // add_import_edit.into_edits(), //, replacement_edit],
1007-
))
1008-
});
981+
if let Some(fix) = generate_name_changed_fix(expr, checker, module, name, ranged) {
982+
diagnostic.try_set_fix(|| Ok(fix));
983+
} else if let Some(fix) = generate_module_change_only_fix(expr, checker, module, name) {
984+
diagnostic.try_set_fix(|| Ok(fix));
985+
}
986+
987+
checker.report_diagnostic(diagnostic);
1009988
}
1010-
checker.report_diagnostic(diagnostic);
989+
}
990+
991+
fn generate_name_changed_fix(
992+
expr: &Expr,
993+
checker: &Checker,
994+
module: &str,
995+
name: &str,
996+
ranged: TextRange,
997+
) -> Option<Fix> {
998+
let (import_edit, binding) = checker
999+
.importer()
1000+
.get_or_import_symbol(
1001+
&ImportRequest::import_from(module, name),
1002+
expr.start(),
1003+
checker.semantic(),
1004+
)
1005+
.ok()?;
1006+
let replacement_edit = Edit::range_replacement(binding, ranged.range());
1007+
Some(Fix::safe_edits(import_edit, [replacement_edit]))
1008+
}
1009+
1010+
fn generate_module_change_only_fix(
1011+
expr: &Expr,
1012+
checker: &Checker,
1013+
module: &str,
1014+
name: &str,
1015+
) -> Option<Fix> {
1016+
let head = match_head(expr)?;
1017+
let semantic = checker.semantic();
1018+
let binding = semantic
1019+
.resolve_name(head)
1020+
.or_else(|| checker.semantic().lookup_symbol(&head.id))
1021+
.map(|id| checker.semantic().binding(id))?;
1022+
let stmt = binding.statement(semantic)?;
1023+
let remove_edit = remove_unused_imports(
1024+
std::iter::once(name),
1025+
stmt,
1026+
None,
1027+
checker.locator(),
1028+
checker.stylist(),
1029+
checker.indexer(),
1030+
)
1031+
.ok()?;
1032+
let import_edit = checker.importer().add_import(
1033+
&NameImport::ImportFrom(MemberNameImport::member(
1034+
(*module).to_string(),
1035+
name.to_string(),
1036+
)),
1037+
expr.start(),
1038+
);
1039+
1040+
Some(Fix::unsafe_edits(remove_edit, [import_edit]))
10111041
}

0 commit comments

Comments
 (0)