Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 10 additions & 8 deletions mypy/semanal.py
Original file line number Diff line number Diff line change
Expand Up @@ -5928,8 +5928,7 @@ def visit_member_expr(self, expr: MemberExpr) -> None:
if isinstance(sym.node, PlaceholderNode):
self.process_placeholder(expr.name, "attribute", expr)
return
if sym.node is not None:
self.record_imported_symbol(sym.node)
self.record_imported_symbol(sym)
expr.kind = sym.kind
expr.fullname = sym.fullname or ""
expr.node = sym.node
Expand Down Expand Up @@ -5960,7 +5959,7 @@ def visit_member_expr(self, expr: MemberExpr) -> None:
if type_info:
n = type_info.names.get(expr.name)
if n is not None and isinstance(n.node, (MypyFile, TypeInfo, TypeAlias)):
self.record_imported_symbol(n.node)
self.record_imported_symbol(n)
expr.kind = n.kind
expr.fullname = n.fullname or ""
expr.node = n.node
Expand Down Expand Up @@ -6282,14 +6281,17 @@ def lookup(
self, name: str, ctx: Context, suppress_errors: bool = False
) -> SymbolTableNode | None:
node = self._lookup(name, ctx, suppress_errors)
if node is not None and node.node is not None:
if node is not None:
# This call is unfortunate from performance point of view, but
# needed for rare cases like e.g. testIncrementalChangingAlias.
self.record_imported_symbol(node.node)
self.record_imported_symbol(node)
return node

def record_imported_symbol(self, node: SymbolNode) -> None:
def record_imported_symbol(self, sym: SymbolTableNode) -> None:
"""If the symbol was not defined in current module, add its module to module_refs."""
if sym.kind == LDEF or sym.node is None:
return
node = sym.node
if not node.fullname:
return
if isinstance(node, MypyFile):
Expand Down Expand Up @@ -6519,8 +6521,8 @@ def lookup_qualified(
self.name_not_defined(name, ctx, namespace=namespace)
return None
sym = nextsym
if sym is not None and sym.node is not None:
self.record_imported_symbol(sym.node)
if sym is not None:
self.record_imported_symbol(sym)
return sym

def lookup_type_node(self, expr: Expression) -> SymbolTableNode | None:
Expand Down
21 changes: 21 additions & 0 deletions test-data/unit/check-incremental.test
Original file line number Diff line number Diff line change
Expand Up @@ -7290,3 +7290,24 @@ tmp/m.py:3: error: Argument 1 to "accept_int" has incompatible type "str"; expec
[out2]
tmp/n.py:3: note: Revealed type is "builtins.str"
tmp/m.py:3: error: Argument 1 to "accept_int" has incompatible type "str"; expected "int"

[case testIncrementalNoIndirectDepFromLocal]
import foo
import bar

[file foo.py]
# Having a local named 'bar' shouldn't generate a dependency on module 'bar'
def f(bar: int) -> int:
return bar

[file bar.py]
import foo
x = 1

[file bar.py.2]
import foo
x = 2

[out]
[rechecked bar]
[stale]
Loading