From 130a794c2b894d8ffc96e49c2d48bdddd11c99a6 Mon Sep 17 00:00:00 2001 From: David Peter Date: Tue, 30 Sep 2025 08:44:18 +0200 Subject: [PATCH] [ty] Add tests for nested generic functions (#20631) ## Summary Add two simple tests that we recently discussed with @dcreager. They demonstrate that the `TypeMapping::MarkTypeVarsInferable` operation really does need to keep track of the binding context. ## Test Plan Made sure that those tests fail if we create `TypeMapping::MarkTypeVarsInferable(None)`s everywhere. --- .../resources/mdtest/generics/legacy/functions.md | 8 ++++++++ .../resources/mdtest/generics/pep695/functions.md | 7 +++++++ 2 files changed, 15 insertions(+) diff --git a/crates/ty_python_semantic/resources/mdtest/generics/legacy/functions.md b/crates/ty_python_semantic/resources/mdtest/generics/legacy/functions.md index 3175ed7216..50a5be7058 100644 --- a/crates/ty_python_semantic/resources/mdtest/generics/legacy/functions.md +++ b/crates/ty_python_semantic/resources/mdtest/generics/legacy/functions.md @@ -464,6 +464,7 @@ def f(x: str): from typing import TypeVar, overload T = TypeVar("T") +S = TypeVar("S") def outer(t: T) -> None: def inner(t: T) -> None: ... @@ -479,6 +480,13 @@ def overloaded_outer(t: T | None = None) -> None: if t is not None: inner(t) + +def outer(t: T) -> None: + def inner(inner_t: T, s: S) -> tuple[T, S]: + return inner_t, s + reveal_type(inner(t, 1)) # revealed: tuple[T@outer, Literal[1]] + + inner("wrong", 1) # error: [invalid-argument-type] ``` ## Unpacking a TypeVar diff --git a/crates/ty_python_semantic/resources/mdtest/generics/pep695/functions.md b/crates/ty_python_semantic/resources/mdtest/generics/pep695/functions.md index 4aef52a26e..1193e91ba5 100644 --- a/crates/ty_python_semantic/resources/mdtest/generics/pep695/functions.md +++ b/crates/ty_python_semantic/resources/mdtest/generics/pep695/functions.md @@ -474,6 +474,13 @@ def overloaded_outer[T](t: T | None = None) -> None: if t is not None: inner(t) + +def outer[T](t: T) -> None: + def inner[S](inner_t: T, s: S) -> tuple[T, S]: + return inner_t, s + reveal_type(inner(t, 1)) # revealed: tuple[T@outer, Literal[1]] + + inner("wrong", 1) # error: [invalid-argument-type] ``` ## Unpacking a TypeVar