From b260311372c7fdd84adad70f2ac227e8d56f184d Mon Sep 17 00:00:00 2001 From: dnwpark Date: Fri, 9 Jan 2026 09:59:03 -0800 Subject: [PATCH] Support higher order types. --- tests/test_type_eval.py | 9 +++++++++ typemap/type_eval/_eval_typing.py | 4 ++++ 2 files changed, 13 insertions(+) diff --git a/tests/test_type_eval.py b/tests/test_type_eval.py index c4f4b60..60d4ee3 100644 --- a/tests/test_type_eval.py +++ b/tests/test_type_eval.py @@ -696,3 +696,12 @@ def test_eval_length_01(): d = eval_typing(Length[tuple[int, ...]]) assert d == Literal[None] + + +type WrapInTuple[T] = tuple[T] +type ApplyToElements[T, F] = tuple[*[F[x] for x in Iter[T]]] + + +def test_eval_higher_order(): + d = eval_typing(ApplyToElements[tuple[int, str], WrapInTuple]) + assert d == tuple[tuple[int], tuple[str]] diff --git a/typemap/type_eval/_eval_typing.py b/typemap/type_eval/_eval_typing.py index a8a1c50..de7140d 100644 --- a/typemap/type_eval/_eval_typing.py +++ b/typemap/type_eval/_eval_typing.py @@ -277,6 +277,10 @@ def _eval_type_var(obj: typing.TypeVar, ctx: EvalContext): @_eval_types_impl.register def _eval_type_alias(obj: typing.TypeAliasType, ctx: EvalContext): + # If the type alias has type parameters, it hasn't been applied yet. + if obj.__type_params__: + return obj + assert obj.__module__ # FIXME: or can this really happen? func = obj.evaluate_value mod = sys.modules[obj.__module__]