Skip to content

Commit b48ef4e

Browse files
ilevkivskyiJukkaL
authored andcommitted
Fix order of processing of deferred nodes in fine-grained mode (#4503)
This fixes the order of processing of deferred nodes in fine-grained incremental mode. (This reflects how they are processed in normal, i.e. full, mode.) Fixes #4465.
1 parent 2f8f472 commit b48ef4e

File tree

2 files changed

+25
-13
lines changed

2 files changed

+25
-13
lines changed

mypy/server/update.py

Lines changed: 5 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -809,20 +809,12 @@ def reprocess_nodes(manager: BuildManager,
809809
old_symbols = find_symbol_tables_recursive(file_node.fullname(), file_node.names)
810810
old_symbols = {name: names.copy() for name, names in old_symbols.items()}
811811

812-
def key(node: DeferredNode) -> str:
813-
fullname = node.node.fullname()
814-
if fullname is None:
815-
if isinstance(node.node, FuncDef):
816-
info = node.node.info
817-
elif isinstance(node.node, OverloadedFuncDef):
818-
info = node.node.items[0].info
819-
else:
820-
assert False, "'None' fullname for %s instance" % type(node.node)
821-
assert info is not None
822-
fullname = '%s.%s' % (info.fullname(), node.node.name())
823-
return fullname
812+
def key(node: DeferredNode) -> int:
813+
# Unlike modules which are sorted by name within SCC,
814+
# nodes within the same module are sorted by line number, because
815+
# this is how they are processed in normal mode.
816+
return node.node.line
824817

825-
# Sort nodes by full name so that the order of processing is deterministic.
826818
nodes = sorted(nodeset, key=key)
827819

828820
# TODO: ignore_all argument to set_file_ignored_lines

test-data/unit/fine-grained.test

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1564,6 +1564,26 @@ class C:
15641564
main:5: error: Too few arguments for "__init__" of "C"
15651565
main:6: error: Too few arguments for "D"
15661566

1567+
[case testInferAttributeTypeAndMultipleStaleTargets]
1568+
import a
1569+
1570+
class A:
1571+
def g(self) -> None:
1572+
a.x
1573+
self.x = 1
1574+
1575+
def f(self) -> None:
1576+
a.x
1577+
b = self.x
1578+
self.x = 1
1579+
1580+
[file a.py]
1581+
x = 0
1582+
[file a.py.2]
1583+
x = ''
1584+
[out]
1585+
==
1586+
15671587
[case testNamedTupleUpdate]
15681588
import b
15691589
[file a.py]

0 commit comments

Comments
 (0)