Skip to content

Commit 7a80f55

Browse files
author
Guido van Rossum
committed
Use a separate TypeChecker per file.
1 parent f061844 commit 7a80f55

File tree

2 files changed

+21
-19
lines changed

2 files changed

+21
-19
lines changed

mypy/build.py

Lines changed: 21 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,11 @@
3333
from mypy import moduleinfo
3434
from mypy import util
3535
from mypy.fixup import fixup_module_pass_one, fixup_module_pass_two
36+
from mypy.nodes import Expression
3637
from mypy.options import Options
3738
from mypy.parse import parse
3839
from mypy.stats import dump_type_stats
40+
from mypy.types import Type
3941
from mypy.version import __version__
4042

4143

@@ -62,7 +64,7 @@ class BuildResult:
6264
def __init__(self, manager: 'BuildManager') -> None:
6365
self.manager = manager
6466
self.files = manager.modules
65-
self.types = manager.type_checker.type_map
67+
self.types = manager.all_types
6668
self.errors = manager.errors.messages()
6769

6870

@@ -184,7 +186,7 @@ def build(sources: List[BuildSource],
184186
manager.log("Build finished in %.3f seconds with %d modules, %d types, and %d errors" %
185187
(time.time() - manager.start_time,
186188
len(manager.modules),
187-
len(manager.type_checker.type_map),
189+
len(manager.all_types),
188190
manager.errors.num_messages()))
189191
# Finish the HTML or XML reports even if CompileError was raised.
190192
reports.finish()
@@ -322,7 +324,7 @@ class BuildManager:
322324
Semantic analyzer, pass 2
323325
semantic_analyzer_pass3:
324326
Semantic analyzer, pass 3
325-
type_checker: Type checker
327+
all_types: Map {Expression: Type} collected from all modules
326328
errors: Used for reporting all errors
327329
options: Build options
328330
missing_modules: Set of modules that could not be imported encountered so far
@@ -349,7 +351,7 @@ def __init__(self, data_dir: str,
349351
self.semantic_analyzer = SemanticAnalyzer(lib_path, self.errors)
350352
self.modules = self.semantic_analyzer.modules
351353
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]
353355
self.indirection_detector = TypeIndirectionVisitor()
354356
self.missing_modules = set() # type: Set[str]
355357
self.stale_modules = set() # type: Set[str]
@@ -461,9 +463,9 @@ def module_not_found(self, path: str, line: int, id: str) -> None:
461463
'or using the "--silent-imports" flag would help)',
462464
severity='note', only_once=True)
463465

464-
def report_file(self, file: MypyFile) -> None:
466+
def report_file(self, file: MypyFile, type_map: Dict[Expression, Type]) -> None:
465467
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)
467469

468470
def log(self, *message: str) -> None:
469471
if self.options.verbosity >= 1:
@@ -1412,18 +1414,24 @@ def type_check(self) -> None:
14121414
if self.options.semantic_analysis_only:
14131415
return
14141416
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)
14161420

14171421
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)
14191424

14201425
if self.options.dump_inference_stats:
14211426
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)
14271435
valid = self.valid_references()
14281436

14291437
encountered = self.manager.indirection_detector.find_modules(types) | module_refs

mypy/checker.py

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -83,8 +83,6 @@ class TypeChecker(NodeVisitor[Type]):
8383
msg = None # type: MessageBuilder
8484
# Types of type checked nodes
8585
type_map = None # type: Dict[Expression, Type]
86-
# Types of type checked nodes within this specific module
87-
module_type_map = None # type: Dict[Expression, Type]
8886

8987
# Helper for managing conditional types
9088
binder = None # type: ConditionalTypeBinder
@@ -130,7 +128,6 @@ def __init__(self, errors: Errors, modules: Dict[str, MypyFile]) -> None:
130128
self.modules = modules
131129
self.msg = MessageBuilder(errors, modules)
132130
self.type_map = {}
133-
self.module_type_map = {}
134131
self.binder = ConditionalTypeBinder()
135132
self.expr_checker = mypy.checkexpr.ExpressionChecker(self, self.msg)
136133
self.return_types = []
@@ -152,7 +149,6 @@ def visit_file(self, file_node: MypyFile, path: str, options: Options) -> None:
152149
self.globals = file_node.names
153150
self.enter_partial_types()
154151
self.is_typeshed_stub = self.errors.is_typeshed_file(path)
155-
self.module_type_map = {}
156152
self.module_refs = set()
157153
if self.options.strict_optional_whitelist is None:
158154
self.suppress_none_errors = not self.options.show_none_errors
@@ -2210,8 +2206,6 @@ def check_type_equivalency(self, t1: Type, t2: Type, node: Context,
22102206
def store_type(self, node: Expression, typ: Type) -> None:
22112207
"""Store the type of a node in the type map."""
22122208
self.type_map[node] = typ
2213-
if typ is not None:
2214-
self.module_type_map[node] = typ
22152209

22162210
def in_checked_function(self) -> bool:
22172211
"""Should we type-check the current function?

0 commit comments

Comments
 (0)