@@ -396,6 +396,8 @@ def default_lib_path(data_dir: str,
396
396
('suppressed' , List [str ]), # dependencies that weren't imported
397
397
('child_modules' , List [str ]), # all submodules of the given module
398
398
('options' , Optional [Dict [str , object ]]), # build options
399
+ # dep_prios and dep_lines are in parallel with
400
+ # dependencies + suppressed.
399
401
('dep_prios' , List [int ]),
400
402
('dep_lines' , List [int ]),
401
403
('interface_hash' , str ), # hash representing the public interface
@@ -964,8 +966,8 @@ def find_cache_meta(id: str, path: str, manager: BuildManager) -> Optional[Cache
964
966
# Ignore cache if generated by an older mypy version.
965
967
if ((m .version_id != manager .version_id and not manager .options .skip_version_check )
966
968
or m .options is None
967
- or len (m .dependencies ) != len (m .dep_prios )
968
- or len (m .dependencies ) != len (m .dep_lines )):
969
+ or len (m .dependencies ) + len ( m . suppressed ) != len (m .dep_prios )
970
+ or len (m .dependencies ) + len ( m . suppressed ) != len (m .dep_lines )):
969
971
manager .log ('Metadata abandoned for {}: new attributes are missing' .format (id ))
970
972
return None
971
973
@@ -1514,12 +1516,13 @@ def __init__(self,
1514
1516
# compare them to the originals later.
1515
1517
self .dependencies = list (self .meta .dependencies )
1516
1518
self .suppressed = list (self .meta .suppressed )
1517
- assert len (self .meta .dependencies ) == len (self .meta .dep_prios )
1519
+ all_deps = self .dependencies + self .suppressed
1520
+ assert len (all_deps ) == len (self .meta .dep_prios )
1518
1521
self .priorities = {id : pri
1519
- for id , pri in zip (self . meta . dependencies , self .meta .dep_prios )}
1520
- assert len (self . meta . dependencies ) == len (self .meta .dep_lines )
1522
+ for id , pri in zip (all_deps , self .meta .dep_prios )}
1523
+ assert len (all_deps ) == len (self .meta .dep_lines )
1521
1524
self .dep_line_map = {id : line
1522
- for id , line in zip (self . meta . dependencies , self .meta .dep_lines )}
1525
+ for id , line in zip (all_deps , self .meta .dep_lines )}
1523
1526
self .child_modules = set (self .meta .child_modules )
1524
1527
else :
1525
1528
# When doing a fine-grained cache load, pretend we only
@@ -1909,14 +1912,21 @@ def write_cache(self) -> None:
1909
1912
self .mark_interface_stale ()
1910
1913
self .interface_hash = new_interface_hash
1911
1914
1912
- def verify_dependencies (self ) -> None :
1913
- """Report errors for import targets in modules that don't exist."""
1914
- # Strip out indirect dependencies. See comment in build.load_graph().
1915
+ def verify_dependencies (self , suppressed_only : bool = False ) -> None :
1916
+ """Report errors for import targets in modules that don't exist.
1917
+
1918
+ If suppressed_only is set, only check suppressed dependencies.
1919
+ """
1915
1920
manager = self .manager
1916
- dependencies = [dep for dep in self .dependencies
1917
- if self .priorities .get (dep ) != PRI_INDIRECT ]
1918
1921
assert self .ancestors is not None
1919
- for dep in dependencies + self .suppressed + self .ancestors :
1922
+ if suppressed_only :
1923
+ all_deps = self .suppressed
1924
+ else :
1925
+ # Strip out indirect dependencies. See comment in build.load_graph().
1926
+ dependencies = [dep for dep in self .dependencies
1927
+ if self .priorities .get (dep ) != PRI_INDIRECT ]
1928
+ all_deps = dependencies + self .suppressed + self .ancestors
1929
+ for dep in all_deps :
1920
1930
options = manager .options .clone_for_module (dep )
1921
1931
if dep not in manager .modules and not options .ignore_missing_imports :
1922
1932
line = self .dep_line_map .get (dep , 1 )
@@ -1939,13 +1949,18 @@ def verify_dependencies(self) -> None:
1939
1949
pass
1940
1950
1941
1951
def dependency_priorities (self ) -> List [int ]:
1942
- return [self .priorities .get (dep , PRI_HIGH ) for dep in self .dependencies ]
1952
+ return [self .priorities .get (dep , PRI_HIGH ) for dep in self .dependencies + self . suppressed ]
1943
1953
1944
1954
def dependency_lines (self ) -> List [int ]:
1945
- return [self .dep_line_map .get (dep , 1 ) for dep in self .dependencies ]
1955
+ return [self .dep_line_map .get (dep , 1 ) for dep in self .dependencies + self . suppressed ]
1946
1956
1947
1957
def generate_unused_ignore_notes (self ) -> None :
1948
1958
if self .options .warn_unused_ignores :
1959
+ # If this file was initially loaded from the cache, it may have suppressed
1960
+ # dependencies due to imports with ignores on them. We need to generate
1961
+ # those errors to avoid spuriously flagging them as unused ignores.
1962
+ if self .meta :
1963
+ self .verify_dependencies (suppressed_only = True )
1949
1964
self .manager .errors .generate_unused_ignore_notes (self .xpath )
1950
1965
1951
1966
0 commit comments