@@ -269,6 +269,7 @@ def default_data_dir() -> str:
269269 ('interface_hash' , str ), # hash representing the public interface
270270 ('version_id' , str ), # mypy version for cache invalidation
271271 ('ignore_all' , bool ), # if errors were ignored
272+ ('plugin_data' , Any ), # config data from plugins
272273 ])
273274# NOTE: dependencies + suppressed == all reachable imports;
274275# suppressed contains those reachable imports that were prevented by
@@ -303,6 +304,7 @@ def cache_meta_from_dict(meta: Dict[str, Any], data_json: str) -> CacheMeta:
303304 meta .get ('interface_hash' , '' ),
304305 meta .get ('version_id' , sentinel ),
305306 meta .get ('ignore_all' , True ),
307+ meta .get ('plugin_data' , None ),
306308 )
307309
308310
@@ -1162,6 +1164,13 @@ def find_cache_meta(id: str, path: str, manager: BuildManager) -> Optional[Cache
11621164 if manager .plugins_snapshot != manager .old_plugins_snapshot :
11631165 manager .log ('Metadata abandoned for {}: plugins differ' .format (id ))
11641166 return None
1167+ # So that plugins can return data with tuples in it without
1168+ # things silently always invalidating modules, we round-trip
1169+ # the config data. This isn't beautiful.
1170+ plugin_data = json .loads (json .dumps (manager .plugin .report_config_data (id , path )))
1171+ if m .plugin_data != plugin_data :
1172+ manager .log ('Metadata abandoned for {}: plugin configuration differs' .format (id ))
1173+ return None
11651174
11661175 manager .add_stats (fresh_metas = 1 )
11671176 return m
@@ -1284,6 +1293,7 @@ def validate_meta(meta: Optional[CacheMeta], id: str, path: Optional[str],
12841293 'interface_hash' : meta .interface_hash ,
12851294 'version_id' : manager .version_id ,
12861295 'ignore_all' : meta .ignore_all ,
1296+ 'plugin_data' : meta .plugin_data ,
12871297 }
12881298 if manager .options .debug_cache :
12891299 meta_str = json .dumps (meta_dict , indent = 2 , sort_keys = True )
@@ -1366,6 +1376,8 @@ def write_cache(id: str, path: str, tree: MypyFile,
13661376 data_str = json_dumps (data , manager .options .debug_cache )
13671377 interface_hash = compute_hash (data_str )
13681378
1379+ plugin_data = manager .plugin .report_config_data (id , path )
1380+
13691381 # Obtain and set up metadata
13701382 try :
13711383 st = manager .get_stat (path )
@@ -1429,6 +1441,7 @@ def write_cache(id: str, path: str, tree: MypyFile,
14291441 'interface_hash' : interface_hash ,
14301442 'version_id' : manager .version_id ,
14311443 'ignore_all' : ignore_all ,
1444+ 'plugin_data' : plugin_data ,
14321445 }
14331446
14341447 # Write meta cache file
0 commit comments