@@ -817,6 +817,7 @@ def reprocess_nodes(manager: BuildManager,
817
817
file_node = manager .modules [module_id ]
818
818
old_symbols = find_symbol_tables_recursive (file_node .fullname (), file_node .names )
819
819
old_symbols = {name : names .copy () for name , names in old_symbols .items ()}
820
+ old_symbols_snapshot = snapshot_symbol_table (file_node .fullname (), file_node .names )
820
821
821
822
def key (node : DeferredNode ) -> int :
822
823
# Unlike modules which are sorted by name within SCC,
@@ -829,9 +830,6 @@ def key(node: DeferredNode) -> int:
829
830
# TODO: ignore_all argument to set_file_ignored_lines
830
831
manager .errors .set_file_ignored_lines (file_node .path , file_node .ignored_lines )
831
832
832
- # Keep track of potentially affected attribute types before type checking.
833
- old_types_map = get_enclosing_namespace_types (nodes )
834
-
835
833
# Strip semantic analysis information.
836
834
for deferred in nodes :
837
835
strip_target (deferred .node )
@@ -878,8 +876,12 @@ def key(node: DeferredNode) -> int:
878
876
if graph [module_id ].type_checker ().check_second_pass ():
879
877
more = True
880
878
879
+ new_symbols_snapshot = snapshot_symbol_table (file_node .fullname (), file_node .names )
881
880
# Check if any attribute types were changed and need to be propagated further.
882
- new_triggered = get_triggered_namespace_items (old_types_map )
881
+ changed = compare_symbol_table_snapshots (file_node .fullname (),
882
+ old_symbols_snapshot ,
883
+ new_symbols_snapshot )
884
+ new_triggered = {make_trigger (name ) for name in changed }
883
885
884
886
# Dependencies may have changed.
885
887
update_deps (module_id , nodes , graph , deps , manager .options )
@@ -909,40 +911,6 @@ def find_symbol_tables_recursive(prefix: str, symbols: SymbolTable) -> Dict[str,
909
911
return result
910
912
911
913
912
- NamespaceNode = Union [TypeInfo , MypyFile ]
913
-
914
-
915
- def get_enclosing_namespace_types (nodes : List [DeferredNode ]) -> Dict [NamespaceNode ,
916
- Dict [str , Type ]]:
917
- types = {} # type: Dict[NamespaceNode, Dict[str, Type]]
918
- for deferred in nodes :
919
- info = deferred .active_typeinfo
920
- if info :
921
- target = info # type: Optional[NamespaceNode]
922
- elif isinstance (deferred .node , MypyFile ):
923
- target = deferred .node
924
- else :
925
- target = None
926
- if target and target not in types :
927
- local_types = {name : node .node .type
928
- for name , node in target .names .items ()
929
- if isinstance (node .node , Var ) and node .node .type }
930
- types [target ] = local_types
931
- return types
932
-
933
-
934
- def get_triggered_namespace_items (old_types_map : Dict [NamespaceNode , Dict [str , Type ]]) -> Set [str ]:
935
- new_triggered = set ()
936
- for namespace_node , old_types in old_types_map .items ():
937
- for name , node in namespace_node .names .items ():
938
- if (name in old_types and
939
- (not isinstance (node .node , Var ) or
940
- node .node .type and not is_identical_type (node .node .type , old_types [name ]))):
941
- # Type checking a method changed an attribute type.
942
- new_triggered .add (make_trigger ('{}.{}' .format (namespace_node .fullname (), name )))
943
- return new_triggered
944
-
945
-
946
914
def update_deps (module_id : str ,
947
915
nodes : List [DeferredNode ],
948
916
graph : Dict [str , State ],
0 commit comments