Skip to content

Commit 4fdc938

Browse files
committed
Fix recursion with NamedTuple and recursive type alias
Fixes #19941
1 parent 89f7223 commit 4fdc938

File tree

2 files changed

+25
-0
lines changed

2 files changed

+25
-0
lines changed

mypy/types.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3934,6 +3934,14 @@ def strategy(self, items: list[list[mypy.nodes.TypeAlias]]) -> list[mypy.nodes.T
39343934
out.extend(item)
39353935
return out
39363936

3937+
def visit_instance(self, t: Instance) -> list[mypy.nodes.TypeAlias]:
3938+
aliases = super().visit_instance(t)
3939+
special_alias = t.type.special_alias
3940+
if special_alias is None or special_alias in self.seen_alias_nodes:
3941+
return aliases
3942+
self.seen_alias_nodes.add(special_alias)
3943+
return aliases + [special_alias] + special_alias.target.accept(self)
3944+
39373945
def visit_type_alias_type(self, t: TypeAliasType, /) -> list[mypy.nodes.TypeAlias]:
39383946
assert t.alias is not None
39393947
if t.alias not in self.seen_alias_nodes:

test-data/unit/check-namedtuple.test

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1530,3 +1530,20 @@ class Base:
15301530
names = [name for name in namespace if fail] # E: Name "fail" is not defined
15311531
self.n = namedtuple("n", names) # E: NamedTuple type as an attribute is not supported
15321532
[builtins fixtures/tuple.pyi]
1533+
1534+
[case testNamedTupleRecursiveTypeAlias]
1535+
from __future__ import annotations
1536+
from typing import Awaitable, NamedTuple, TypeVar, Union
1537+
1538+
T = TypeVar("T")
1539+
AwaitOrValue = Union[Awaitable[T], T]
1540+
1541+
class Leaf(NamedTuple):
1542+
data: Wrapper
1543+
1544+
class Wrapper(NamedTuple):
1545+
result: AwaitOrValue[Leaf]
1546+
1547+
def foo(value: Leaf | Wrapper) -> None:
1548+
wrapper: Wrapper = value # E: Incompatible types in assignment (expression has type "Union[Leaf, Wrapper]", variable has type "Wrapper")
1549+
[builtins fixtures/tuple.pyi]

0 commit comments

Comments
 (0)