Skip to content

Commit 9a453cf

Browse files
committed
Support loading from cache in fine-grained incremental mdoe
1 parent 01caf88 commit 9a453cf

File tree

3 files changed

+28
-8
lines changed

3 files changed

+28
-8
lines changed

mypy/build.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2374,6 +2374,13 @@ def process_graph(graph: Graph, manager: BuildManager) -> None:
23742374
manager.log("Processing SCC of size %d (%s) as %s" % (size, scc_str, fresh_msg))
23752375
process_stale_scc(graph, scc, manager)
23762376

2377+
# If we are running in fine-grained incremental mode with caching,
2378+
# we need to always process fresh SCCs.
2379+
if manager.options.fine_grained_incremental and manager.options.cache_fine_grained:
2380+
for prev_scc in fresh_scc_queue:
2381+
process_fresh_scc(graph, prev_scc, manager)
2382+
fresh_scc_queue = []
2383+
23772384
sccs_left = len(fresh_scc_queue)
23782385
nodes_left = sum(len(scc) for scc in fresh_scc_queue)
23792386
manager.add_stats(sccs_left=sccs_left, nodes_left=nodes_left)

mypy/dmypy_server.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,8 @@ def __init__(self, flags: List[str]) -> None:
103103
if self.fine_grained:
104104
options.incremental = True
105105
options.show_traceback = True
106-
options.cache_dir = os.devnull
106+
if not options.cache_fine_grained:
107+
options.cache_dir = os.devnull
107108

108109
def serve(self) -> None:
109110
"""Serve requests, synchronously (no thread or fork)."""

mypy/server/update.py

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -279,10 +279,11 @@ def update_single(self, module: str, path: str) -> Tuple[List[str],
279279
print('triggered:', sorted(filtered))
280280
self.triggered.extend(triggered | self.previous_targets_with_errors)
281281
collect_dependencies({module: tree}, self.deps, graph)
282-
propagate_changes_using_dependencies(manager, graph, self.deps, triggered,
283-
{module},
284-
self.previous_targets_with_errors,
285-
graph)
282+
remaining += propagate_changes_using_dependencies(
283+
manager, graph, self.deps, triggered,
284+
{module},
285+
self.previous_targets_with_errors,
286+
graph)
286287

287288
# Preserve state needed for the next update.
288289
self.previous_targets_with_errors = manager.errors.targets()
@@ -704,9 +705,10 @@ def propagate_changes_using_dependencies(
704705
triggered: Set[str],
705706
up_to_date_modules: Set[str],
706707
targets_with_errors: Set[str],
707-
modules: Iterable[str]) -> None:
708+
modules: Iterable[str]) -> List[Tuple[str, str]]:
708709
# TODO: Multiple type checking passes
709710
num_iter = 0
711+
remaining_modules = []
710712

711713
# Propagate changes until nothing visible has changed during the last
712714
# iteration.
@@ -730,7 +732,13 @@ def propagate_changes_using_dependencies(
730732
# TODO: Preserve order (set is not optimal)
731733
for id, nodes in sorted(todo.items(), key=lambda x: x[0]):
732734
assert id not in up_to_date_modules
733-
triggered |= reprocess_nodes(manager, graph, id, nodes, deps)
735+
# TODO: Is there a better way to detect that the file isn't loaded?
736+
if not manager.modules[id].defs:
737+
# We haven't actually loaded this file! Add it to the
738+
# queue of files that need to be processed fully.
739+
remaining_modules.append((id, manager.modules[id].path))
740+
else:
741+
triggered |= reprocess_nodes(manager, graph, id, nodes, deps)
734742
# Changes elsewhere may require us to reprocess modules that were
735743
# previously considered up to date. For example, there may be a
736744
# dependency loop that loops back to an originally processed module.
@@ -739,6 +747,8 @@ def propagate_changes_using_dependencies(
739747
if DEBUG:
740748
print('triggered:', list(triggered))
741749

750+
return remaining_modules
751+
742752

743753
def find_targets_recursive(
744754
triggers: Set[str],
@@ -994,4 +1004,6 @@ def lookup_target(modules: Dict[str, MypyFile], target: str) -> List[DeferredNod
9941004

9951005

9961006
def extract_type_maps(graph: Graph) -> Dict[str, Dict[Expression, Type]]:
997-
return {id: state.type_map() for id, state in graph.items()}
1007+
# This is used to export information used only by the testmerge harness.
1008+
return {id: state.type_map() for id, state in graph.items()
1009+
if state.tree}

0 commit comments

Comments
 (0)