11use crate :: checkers:: ast:: Checker ;
22use crate :: fix:: edits:: remove_unused_imports;
3+ use crate :: importer:: ImportRequest ;
34use crate :: rules:: airflow:: helpers:: { is_guarded_by_try_except, match_head, ProviderReplacement } ;
45use ruff_diagnostics:: { Diagnostic , Edit , Fix , FixAvailability , Violation } ;
56use 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