diff --git a/mypy/mixedtraverser.py b/mypy/mixedtraverser.py index 9fdc4457d18e..324e8a87c1bd 100644 --- a/mypy/mixedtraverser.py +++ b/mypy/mixedtraverser.py @@ -10,7 +10,9 @@ NamedTupleExpr, NewTypeExpr, PromoteExpr, + TypeAlias, TypeAliasExpr, + TypeAliasStmt, TypeApplication, TypedDictExpr, TypeVarExpr, @@ -48,9 +50,7 @@ def visit_class_def(self, o: ClassDef, /) -> None: def visit_type_alias_expr(self, o: TypeAliasExpr, /) -> None: super().visit_type_alias_expr(o) - self.in_type_alias_expr = True - o.node.target.accept(self) - self.in_type_alias_expr = False + o.node.accept(self) def visit_type_var_expr(self, o: TypeVarExpr, /) -> None: super().visit_type_var_expr(o) @@ -81,6 +81,17 @@ def visit_assignment_stmt(self, o: AssignmentStmt, /) -> None: super().visit_assignment_stmt(o) self.visit_optional_type(o.type) + def visit_type_alias_stmt(self, o: TypeAliasStmt, /) -> None: + super().visit_type_alias_stmt(o) + if o.alias_node is not None: + o.alias_node.accept(self) + + def visit_type_alias(self, o: TypeAlias, /) -> None: + super().visit_type_alias(o) + self.in_type_alias_expr = True + o.target.accept(self) + self.in_type_alias_expr = False + def visit_for_stmt(self, o: ForStmt, /) -> None: super().visit_for_stmt(o) self.visit_optional_type(o.index_type) diff --git a/test-data/unit/check-python312.test b/test-data/unit/check-python312.test index 8b4d638ecdaa..80cceea85581 100644 --- a/test-data/unit/check-python312.test +++ b/test-data/unit/check-python312.test @@ -1972,3 +1972,19 @@ class D: class G[Q]: def g(self, x: Q): ... d: G[str] + +[case testTypeAliasNormalization] +from collections.abc import Callable +from typing import Unpack +from typing_extensions import TypeAlias + +type RK_function_args = tuple[float, int] +type RK_functionBIS = Callable[[Unpack[RK_function_args], int], int] + +def ff(a: float, b: int, c: int) -> int: + return 2 + +bis: RK_functionBIS = ff +res: int = bis(1.0, 2, 3) +[builtins fixtures/tuple.pyi] +[typing fixtures/typing-full.pyi]