feat(types): WIP add AppliedType

This commit is contained in:
2026-06-08 18:26:11 +02:00
parent 89fdd1b47e
commit 0a748a36a3
3 changed files with 20 additions and 3 deletions

View File

@@ -534,7 +534,11 @@ class PythonTyper(
return self.types.apply_generic(list_type, [UnknownType()])
def visit_base_type(self, node: p.BaseType) -> Type:
return self.types.get_type(node.base)
base: Type = self.types.get_type(node.base)
if node.param is not None:
param: Type = node.param.accept(self)
return self.types.apply_generic(base, [param])
return base
def visit_constraint_type(self, node: p.ConstraintType) -> Type: ...

View File

@@ -3,6 +3,7 @@ from typing import Optional
from midas.checker.builtins import BUILTIN_SUBTYPES
from midas.checker.types import (
AliasType,
AppliedType,
BaseType,
ComplexType,
Function,
@@ -254,7 +255,7 @@ class TypesRegistry:
case AliasType(name=name, type=base):
return AliasType(name=name, type=self.apply_generic(base, params))
case GenericType(params=type_vars, body=body):
case GenericType(name=name, params=type_vars, body=body):
n_params: int = len(params)
n_type_vars: int = len(type_vars)
if n_params < n_type_vars:
@@ -274,7 +275,11 @@ class TypesRegistry:
f"Type parameter {param} is not a subtype of {type_var.bound}"
)
substitutions[type_var.name] = param
return substitute_typevars(body, substitutions)
return AppliedType(
name=name,
args=params,
body=substitute_typevars(body, substitutions),
)
case _:
raise ValueError(f"{type} is not a generic type")

View File

@@ -71,6 +71,13 @@ class GenericType:
body: Type
@dataclass(frozen=True, kw_only=True)
class AppliedType:
name: str
args: list[Type]
body: Type
def substitute_typevars(type: Type, substitutions: dict[str, Type]) -> Type:
def sub_argument(arg: Function.Argument):
return Function.Argument(
@@ -138,4 +145,5 @@ Type = (
| ComplexType
| TypeVar
| GenericType
| AppliedType
)