Skip to content

Commit d96b9dc

Browse files
authored
Fix generation of incorrect indirect deps from locals (#19906)
Don't generate an indirect dependency to module `bar` if a local variable has name `bar`. This aims to fix the root cause of the issue #19903 tries to solve.
1 parent fa3566a commit d96b9dc

File tree

2 files changed

+31
-8
lines changed

2 files changed

+31
-8
lines changed

mypy/semanal.py

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5928,8 +5928,7 @@ def visit_member_expr(self, expr: MemberExpr) -> None:
59285928
if isinstance(sym.node, PlaceholderNode):
59295929
self.process_placeholder(expr.name, "attribute", expr)
59305930
return
5931-
if sym.node is not None:
5932-
self.record_imported_symbol(sym.node)
5931+
self.record_imported_symbol(sym)
59335932
expr.kind = sym.kind
59345933
expr.fullname = sym.fullname or ""
59355934
expr.node = sym.node
@@ -5960,7 +5959,7 @@ def visit_member_expr(self, expr: MemberExpr) -> None:
59605959
if type_info:
59615960
n = type_info.names.get(expr.name)
59625961
if n is not None and isinstance(n.node, (MypyFile, TypeInfo, TypeAlias)):
5963-
self.record_imported_symbol(n.node)
5962+
self.record_imported_symbol(n)
59645963
expr.kind = n.kind
59655964
expr.fullname = n.fullname or ""
59665965
expr.node = n.node
@@ -6282,14 +6281,17 @@ def lookup(
62826281
self, name: str, ctx: Context, suppress_errors: bool = False
62836282
) -> SymbolTableNode | None:
62846283
node = self._lookup(name, ctx, suppress_errors)
6285-
if node is not None and node.node is not None:
6284+
if node is not None:
62866285
# This call is unfortunate from performance point of view, but
62876286
# needed for rare cases like e.g. testIncrementalChangingAlias.
6288-
self.record_imported_symbol(node.node)
6287+
self.record_imported_symbol(node)
62896288
return node
62906289

6291-
def record_imported_symbol(self, node: SymbolNode) -> None:
6290+
def record_imported_symbol(self, sym: SymbolTableNode) -> None:
62926291
"""If the symbol was not defined in current module, add its module to module_refs."""
6292+
if sym.kind == LDEF or sym.node is None:
6293+
return
6294+
node = sym.node
62936295
if not node.fullname:
62946296
return
62956297
if isinstance(node, MypyFile):
@@ -6519,8 +6521,8 @@ def lookup_qualified(
65196521
self.name_not_defined(name, ctx, namespace=namespace)
65206522
return None
65216523
sym = nextsym
6522-
if sym is not None and sym.node is not None:
6523-
self.record_imported_symbol(sym.node)
6524+
if sym is not None:
6525+
self.record_imported_symbol(sym)
65246526
return sym
65256527

65266528
def lookup_type_node(self, expr: Expression) -> SymbolTableNode | None:

test-data/unit/check-incremental.test

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7290,3 +7290,24 @@ tmp/m.py:3: error: Argument 1 to "accept_int" has incompatible type "str"; expec
72907290
[out2]
72917291
tmp/n.py:3: note: Revealed type is "builtins.str"
72927292
tmp/m.py:3: error: Argument 1 to "accept_int" has incompatible type "str"; expected "int"
7293+
7294+
[case testIncrementalNoIndirectDepFromLocal]
7295+
import foo
7296+
import bar
7297+
7298+
[file foo.py]
7299+
# Having a local named 'bar' shouldn't generate a dependency on module 'bar'
7300+
def f(bar: int) -> int:
7301+
return bar
7302+
7303+
[file bar.py]
7304+
import foo
7305+
x = 1
7306+
7307+
[file bar.py.2]
7308+
import foo
7309+
x = 2
7310+
7311+
[out]
7312+
[rechecked bar]
7313+
[stale]

0 commit comments

Comments
 (0)