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