@@ -393,6 +393,7 @@ def default_lib_path(data_dir: str,
393
393
('child_modules' , List [str ]), # all submodules of the given module
394
394
('options' , Optional [Dict [str , object ]]), # build options
395
395
('dep_prios' , List [int ]),
396
+ ('dep_lines' , List [int ]),
396
397
('interface_hash' , str ), # hash representing the public interface
397
398
('version_id' , str ), # mypy version for cache invalidation
398
399
('ignore_all' , bool ), # if errors were ignored
@@ -418,6 +419,7 @@ def cache_meta_from_dict(meta: Dict[str, Any], data_json: str) -> CacheMeta:
418
419
meta .get ('child_modules' , []),
419
420
meta .get ('options' ),
420
421
meta .get ('dep_prios' , []),
422
+ meta .get ('dep_lines' , []),
421
423
meta .get ('interface_hash' , '' ),
422
424
meta .get ('version_id' , sentinel ),
423
425
meta .get ('ignore_all' , True ),
@@ -1040,7 +1042,8 @@ def find_cache_meta(id: str, path: str, manager: BuildManager) -> Optional[Cache
1040
1042
# Ignore cache if generated by an older mypy version.
1041
1043
if ((m .version_id != manager .version_id and not manager .options .skip_version_check )
1042
1044
or m .options is None
1043
- or len (m .dependencies ) != len (m .dep_prios )):
1045
+ or len (m .dependencies ) != len (m .dep_prios )
1046
+ or len (m .dependencies ) != len (m .dep_lines )):
1044
1047
manager .log ('Metadata abandoned for {}: new attributes are missing' .format (id ))
1045
1048
return None
1046
1049
@@ -1157,6 +1160,7 @@ def validate_meta(meta: Optional[CacheMeta], id: str, path: Optional[str],
1157
1160
'options' : (manager .options .clone_for_module (id )
1158
1161
.select_options_affecting_cache ()),
1159
1162
'dep_prios' : meta .dep_prios ,
1163
+ 'dep_lines' : meta .dep_lines ,
1160
1164
'interface_hash' : meta .interface_hash ,
1161
1165
'version_id' : manager .version_id ,
1162
1166
'ignore_all' : meta .ignore_all ,
@@ -1186,7 +1190,7 @@ def compute_hash(text: str) -> str:
1186
1190
def write_cache (id : str , path : str , tree : MypyFile ,
1187
1191
serialized_fine_grained_deps : Dict [str , List [str ]],
1188
1192
dependencies : List [str ], suppressed : List [str ],
1189
- child_modules : List [str ], dep_prios : List [int ],
1193
+ child_modules : List [str ], dep_prios : List [int ], dep_lines : List [ int ],
1190
1194
old_interface_hash : str , source_hash : str ,
1191
1195
ignore_all : bool , manager : BuildManager ) -> Tuple [str , Optional [CacheMeta ]]:
1192
1196
"""Write cache files for a module.
@@ -1203,6 +1207,7 @@ def write_cache(id: str, path: str, tree: MypyFile,
1203
1207
suppressed: module IDs which were suppressed as dependencies
1204
1208
child_modules: module IDs which are this package's direct submodules
1205
1209
dep_prios: priorities (parallel array to dependencies)
1210
+ dep_lines: import line locations (parallel array to dependencies)
1206
1211
old_interface_hash: the hash from the previous version of the data cache file
1207
1212
source_hash: the hash of the source code
1208
1213
ignore_all: the ignore_all flag for this module
@@ -1286,6 +1291,7 @@ def write_cache(id: str, path: str, tree: MypyFile,
1286
1291
'child_modules' : child_modules ,
1287
1292
'options' : options .select_options_affecting_cache (),
1288
1293
'dep_prios' : dep_prios ,
1294
+ 'dep_lines' : dep_lines ,
1289
1295
'interface_hash' : interface_hash ,
1290
1296
'version_id' : manager .version_id ,
1291
1297
'ignore_all' : ignore_all ,
@@ -1633,8 +1639,10 @@ def __init__(self,
1633
1639
assert len (self .meta .dependencies ) == len (self .meta .dep_prios )
1634
1640
self .priorities = {id : pri
1635
1641
for id , pri in zip (self .meta .dependencies , self .meta .dep_prios )}
1642
+ assert len (self .meta .dependencies ) == len (self .meta .dep_lines )
1643
+ self .dep_line_map = {id : line
1644
+ for id , line in zip (self .meta .dependencies , self .meta .dep_lines )}
1636
1645
self .child_modules = set (self .meta .child_modules )
1637
- self .dep_line_map = {}
1638
1646
else :
1639
1647
# Parse the file (and then some) to get the dependencies.
1640
1648
self .parse_file ()
@@ -2023,11 +2031,12 @@ def write_cache(self) -> None:
2023
2031
self .mark_interface_stale (on_errors = True )
2024
2032
return
2025
2033
dep_prios = self .dependency_priorities ()
2034
+ dep_lines = self .dependency_lines ()
2026
2035
new_interface_hash , self .meta = write_cache (
2027
2036
self .id , self .path , self .tree ,
2028
2037
{k : list (v ) for k , v in self .fine_grained_deps .items ()},
2029
2038
list (self .dependencies ), list (self .suppressed ), list (self .child_modules ),
2030
- dep_prios , self .interface_hash , self .source_hash , self .ignore_all ,
2039
+ dep_prios , dep_lines , self .interface_hash , self .source_hash , self .ignore_all ,
2031
2040
self .manager )
2032
2041
if new_interface_hash == self .interface_hash :
2033
2042
self .manager .log ("Cached module {} has same interface" .format (self .id ))
@@ -2039,6 +2048,9 @@ def write_cache(self) -> None:
2039
2048
def dependency_priorities (self ) -> List [int ]:
2040
2049
return [self .priorities .get (dep , PRI_HIGH ) for dep in self .dependencies ]
2041
2050
2051
+ def dependency_lines (self ) -> List [int ]:
2052
+ return [self .dep_line_map .get (dep , 1 ) for dep in self .dependencies ]
2053
+
2042
2054
def generate_unused_ignore_notes (self ) -> None :
2043
2055
if self .options .warn_unused_ignores :
2044
2056
self .manager .errors .generate_unused_ignore_notes (self .xpath )
0 commit comments