@@ -312,8 +312,7 @@ def resolve_builtin_types(self, mod_ast, *, lookup_ast=None):
312312 visitors .ExpandCompatibleBuiltins (self .builtins_ast ))
313313 return mod_ast
314314
315- def resolve_external_types (self , mod_ast , module_map , aliases , * ,
316- mod_name = None ):
315+ def resolve_external_types (self , mod_ast , module_map , aliases , * , mod_name ):
317316 name = mod_name or mod_ast .name
318317 try :
319318 mod_ast = mod_ast .Visit (visitors .LookupExternalTypes (
@@ -616,10 +615,15 @@ def finish_and_verify_ast(self, mod_ast):
616615 if mod_ast :
617616 try :
618617 self ._resolver .verify (mod_ast )
619- except BadDependencyError :
618+ except ( BadDependencyError , visitors . ContainerError ) :
620619 # In the case of a circular import, an external type may be left
621- # unresolved. As long as the module containing the unresolved type does
622- # not also contain a circular import, an extra lookup should resolve it.
620+ # unresolved, so we re-resolve lookups in this module and its direct
621+ # dependencies. Technically speaking, we should re-resolve all
622+ # transitive imports, but lookups are expensive.
623+ dependencies = self ._resolver .collect_dependencies (mod_ast )
624+ for k in dependencies :
625+ self ._modules [k ].ast = self ._resolve_external_types (
626+ self ._modules [k ].ast )
623627 mod_ast = self ._resolve_external_types (mod_ast )
624628 self ._resolver .verify (mod_ast )
625629 return mod_ast
0 commit comments