From e4ab27673d2ca4de4911bff66f6a77b488e98ca7 Mon Sep 17 00:00:00 2001 From: LordBaryhobal Date: Sat, 20 Jun 2026 17:34:40 +0200 Subject: [PATCH] fix(gen): handle TypeVar variance in stubs generator --- midas/generator/stubs.py | 35 +++++++++++++++++++++++++---------- 1 file changed, 25 insertions(+), 10 deletions(-) diff --git a/midas/generator/stubs.py b/midas/generator/stubs.py index abbcf06..d54c948 100644 --- a/midas/generator/stubs.py +++ b/midas/generator/stubs.py @@ -18,6 +18,7 @@ from midas.checker.types import ( TypeVar, UnitType, UnknownType, + Variance, substitute_typevars, ) @@ -329,6 +330,29 @@ class StubsGenerator: def define_type_var(self, var: TypeVar) -> TypeVar: name: str = self.new_type_var_name() self.add_typing_import("TypeVar") + + kwargs: list[ast.keyword] = [] + if var.bound is not None: + kwargs.append( + ast.keyword( + arg="bound", + value=self.dump_type(var.bound), + ) + ) + if var.variance == Variance.COVARIANT: + kwargs.append( + ast.keyword( + arg="covariant", + value=ast.Constant(value=True), + ) + ) + elif var.variance == Variance.CONTRAVARIANT: + kwargs.append( + ast.keyword( + arg="contravariant", + value=ast.Constant(value=True), + ) + ) self.add_stub( ast.Assign( targets=[ast.Name(id=name)], @@ -337,16 +361,7 @@ class StubsGenerator: args=[ ast.Constant(value=name), ], - keywords=( - [] - if var.bound is None - else [ - ast.keyword( - arg="bound", - value=self.dump_type(var.bound), - ) - ] - ), + keywords=kwargs, ), ) )