@@ -528,16 +528,29 @@ def add_needed_imports_from_module(
528528
529529 try :
530530 for mod in gatherer .module_imports :
531+ # Skip __future__ imports as they cannot be imported directly
532+ # __future__ imports should only be imported with specific objects i.e from __future__ import annotations
533+ if mod == "__future__" :
534+ continue
531535 if mod not in dotted_import_collector .imports :
532536 AddImportsVisitor .add_needed_import (dst_context , mod )
533537 RemoveImportsVisitor .remove_unused_import (dst_context , mod )
538+ aliased_objects = set ()
539+ for mod , alias_pairs in gatherer .alias_mapping .items ():
540+ for alias_pair in alias_pairs :
541+ if alias_pair [0 ] and alias_pair [1 ]: # Both name and alias exist
542+ aliased_objects .add (f"{ mod } .{ alias_pair [0 ]} " )
543+
534544 for mod , obj_seq in gatherer .object_mapping .items ():
535545 for obj in obj_seq :
536546 if (
537547 f"{ mod } .{ obj } " in helper_functions_fqn or dst_context .full_module_name == mod # avoid circular deps
538548 ):
539549 continue # Skip adding imports for helper functions already in the context
540550
551+ if f"{ mod } .{ obj } " in aliased_objects :
552+ continue
553+
541554 # Handle star imports by resolving them to actual symbol names
542555 if obj == "*" :
543556 resolved_symbols = resolve_star_import (mod , project_root )
@@ -559,6 +572,8 @@ def add_needed_imports_from_module(
559572 return dst_module_code
560573
561574 for mod , asname in gatherer .module_aliases .items ():
575+ if not asname :
576+ continue
562577 if f"{ mod } .{ asname } " not in dotted_import_collector .imports :
563578 AddImportsVisitor .add_needed_import (dst_context , mod , asname = asname )
564579 RemoveImportsVisitor .remove_unused_import (dst_context , mod , asname = asname )
@@ -568,12 +583,16 @@ def add_needed_imports_from_module(
568583 if f"{ mod } .{ alias_pair [0 ]} " in helper_functions_fqn :
569584 continue
570585
586+ if not alias_pair [0 ] or not alias_pair [1 ]:
587+ continue
588+
571589 if f"{ mod } .{ alias_pair [1 ]} " not in dotted_import_collector .imports :
572590 AddImportsVisitor .add_needed_import (dst_context , mod , alias_pair [0 ], asname = alias_pair [1 ])
573591 RemoveImportsVisitor .remove_unused_import (dst_context , mod , alias_pair [0 ], asname = alias_pair [1 ])
574592
575593 try :
576- transformed_module = AddImportsVisitor (dst_context ).transform_module (parsed_dst_module )
594+ add_imports_visitor = AddImportsVisitor (dst_context )
595+ transformed_module = add_imports_visitor .transform_module (parsed_dst_module )
577596 transformed_module = RemoveImportsVisitor (dst_context ).transform_module (transformed_module )
578597 return transformed_module .code .lstrip ("\n " )
579598 except Exception as e :
0 commit comments