@@ -279,10 +279,11 @@ def update_single(self, module: str, path: str) -> Tuple[List[str],
279
279
print ('triggered:' , sorted (filtered ))
280
280
self .triggered .extend (triggered | self .previous_targets_with_errors )
281
281
collect_dependencies ({module : tree }, self .deps , graph )
282
- propagate_changes_using_dependencies (manager , graph , self .deps , triggered ,
283
- {module },
284
- self .previous_targets_with_errors ,
285
- graph )
282
+ remaining += propagate_changes_using_dependencies (
283
+ manager , graph , self .deps , triggered ,
284
+ {module },
285
+ self .previous_targets_with_errors ,
286
+ graph )
286
287
287
288
# Preserve state needed for the next update.
288
289
self .previous_targets_with_errors = manager .errors .targets ()
@@ -704,9 +705,10 @@ def propagate_changes_using_dependencies(
704
705
triggered : Set [str ],
705
706
up_to_date_modules : Set [str ],
706
707
targets_with_errors : Set [str ],
707
- modules : Iterable [str ]) -> None :
708
+ modules : Iterable [str ]) -> List [ Tuple [ str , str ]] :
708
709
# TODO: Multiple type checking passes
709
710
num_iter = 0
711
+ remaining_modules = []
710
712
711
713
# Propagate changes until nothing visible has changed during the last
712
714
# iteration.
@@ -730,7 +732,13 @@ def propagate_changes_using_dependencies(
730
732
# TODO: Preserve order (set is not optimal)
731
733
for id , nodes in sorted (todo .items (), key = lambda x : x [0 ]):
732
734
assert id not in up_to_date_modules
733
- triggered |= reprocess_nodes (manager , graph , id , nodes , deps )
735
+ # TODO: Is there a better way to detect that the file isn't loaded?
736
+ if not manager .modules [id ].defs :
737
+ # We haven't actually loaded this file! Add it to the
738
+ # queue of files that need to be processed fully.
739
+ remaining_modules .append ((id , manager .modules [id ].path ))
740
+ else :
741
+ triggered |= reprocess_nodes (manager , graph , id , nodes , deps )
734
742
# Changes elsewhere may require us to reprocess modules that were
735
743
# previously considered up to date. For example, there may be a
736
744
# dependency loop that loops back to an originally processed module.
@@ -739,6 +747,8 @@ def propagate_changes_using_dependencies(
739
747
if DEBUG :
740
748
print ('triggered:' , list (triggered ))
741
749
750
+ return remaining_modules
751
+
742
752
743
753
def find_targets_recursive (
744
754
triggers : Set [str ],
@@ -994,4 +1004,6 @@ def lookup_target(modules: Dict[str, MypyFile], target: str) -> List[DeferredNod
994
1004
995
1005
996
1006
def extract_type_maps (graph : Graph ) -> Dict [str , Dict [Expression , Type ]]:
997
- return {id : state .type_map () for id , state in graph .items ()}
1007
+ # This is used to export information used only by the testmerge harness.
1008
+ return {id : state .type_map () for id , state in graph .items ()
1009
+ if state .tree }
0 commit comments