33
33
from mypy import moduleinfo
34
34
from mypy import util
35
35
from mypy .fixup import fixup_module_pass_one , fixup_module_pass_two
36
+ from mypy .nodes import Expression
36
37
from mypy .options import Options
37
38
from mypy .parse import parse
38
39
from mypy .stats import dump_type_stats
40
+ from mypy .types import Type
39
41
from mypy .version import __version__
40
42
41
43
@@ -62,7 +64,7 @@ class BuildResult:
62
64
def __init__ (self , manager : 'BuildManager' ) -> None :
63
65
self .manager = manager
64
66
self .files = manager .modules
65
- self .types = manager .type_checker . type_map
67
+ self .types = manager .all_types
66
68
self .errors = manager .errors .messages ()
67
69
68
70
@@ -184,7 +186,7 @@ def build(sources: List[BuildSource],
184
186
manager .log ("Build finished in %.3f seconds with %d modules, %d types, and %d errors" %
185
187
(time .time () - manager .start_time ,
186
188
len (manager .modules ),
187
- len (manager .type_checker . type_map ),
189
+ len (manager .all_types ),
188
190
manager .errors .num_messages ()))
189
191
# Finish the HTML or XML reports even if CompileError was raised.
190
192
reports .finish ()
@@ -322,7 +324,7 @@ class BuildManager:
322
324
Semantic analyzer, pass 2
323
325
semantic_analyzer_pass3:
324
326
Semantic analyzer, pass 3
325
- type_checker : Type checker
327
+ all_types : Map {Expression: Type} collected from all modules
326
328
errors: Used for reporting all errors
327
329
options: Build options
328
330
missing_modules: Set of modules that could not be imported encountered so far
@@ -349,7 +351,7 @@ def __init__(self, data_dir: str,
349
351
self .semantic_analyzer = SemanticAnalyzer (lib_path , self .errors )
350
352
self .modules = self .semantic_analyzer .modules
351
353
self .semantic_analyzer_pass3 = ThirdPass (self .modules , self .errors )
352
- self .type_checker = TypeChecker ( self . errors , self . modules )
354
+ self .all_types = {} # type: Dict[Expression, Type]
353
355
self .indirection_detector = TypeIndirectionVisitor ()
354
356
self .missing_modules = set () # type: Set[str]
355
357
self .stale_modules = set () # type: Set[str]
@@ -461,9 +463,9 @@ def module_not_found(self, path: str, line: int, id: str) -> None:
461
463
'or using the "--silent-imports" flag would help)' ,
462
464
severity = 'note' , only_once = True )
463
465
464
- def report_file (self , file : MypyFile ) -> None :
466
+ def report_file (self , file : MypyFile , type_map : Dict [ Expression , Type ] ) -> None :
465
467
if self .source_set .is_source (file ):
466
- self .reports .file (file , type_map = self . type_checker . type_map )
468
+ self .reports .file (file , type_map )
467
469
468
470
def log (self , * message : str ) -> None :
469
471
if self .options .verbosity >= 1 :
@@ -1412,18 +1414,24 @@ def type_check(self) -> None:
1412
1414
if self .options .semantic_analysis_only :
1413
1415
return
1414
1416
with self .wrap_context ():
1415
- manager .type_checker .visit_file (self .tree , self .xpath , self .options )
1417
+ type_checker = TypeChecker (manager .errors , manager .modules )
1418
+ type_checker .visit_file (self .tree , self .xpath , self .options )
1419
+ manager .all_types .update (type_checker .type_map )
1416
1420
1417
1421
if self .options .incremental :
1418
- self ._patch_indirect_dependencies (manager .type_checker .module_refs )
1422
+ self ._patch_indirect_dependencies (type_checker .module_refs ,
1423
+ type_checker .type_map )
1419
1424
1420
1425
if self .options .dump_inference_stats :
1421
1426
dump_type_stats (self .tree , self .xpath , inferred = True ,
1422
- typemap = manager .type_checker .type_map )
1423
- manager .report_file (self .tree )
1424
-
1425
- def _patch_indirect_dependencies (self , module_refs : Set [str ]) -> None :
1426
- types = self .manager .type_checker .module_type_map .values ()
1427
+ typemap = type_checker .type_map )
1428
+ manager .report_file (self .tree , type_checker .type_map )
1429
+
1430
+ def _patch_indirect_dependencies (self ,
1431
+ module_refs : Set [str ],
1432
+ type_map : Dict [Expression , Type ]) -> None :
1433
+ types = set (type_map .values ())
1434
+ types .discard (None )
1427
1435
valid = self .valid_references ()
1428
1436
1429
1437
encountered = self .manager .indirection_detector .find_modules (types ) | module_refs
0 commit comments