From 4a3363a3d634e872c7418fa12e4fa692c9bbc026 Mon Sep 17 00:00:00 2001 From: LordBaryhobal Date: Fri, 29 May 2026 22:04:03 +0200 Subject: [PATCH] feat(checker): add cast expression --- .../02_simple_types.py | 4 +-- midas/checker/checker.py | 3 ++ midas/resolver/resolver.py | 3 ++ tests/cases/checker/04_custom_types.py | 4 +-- .../cases/checker/04_custom_types.py.ref.json | 31 +------------------ 5 files changed, 11 insertions(+), 34 deletions(-) diff --git a/examples/01_simple_type_checking/02_simple_types.py b/examples/01_simple_type_checking/02_simple_types.py index 7968069..e964159 100644 --- a/examples/01_simple_type_checking/02_simple_types.py +++ b/examples/01_simple_type_checking/02_simple_types.py @@ -3,6 +3,6 @@ midas.using("02_simple_types.midas") -distance: Meter = 123.45 -time: Second = 6.7 +distance: Meter = cast(Meter, 123.45) +time: Second = cast(Second, 6.7) speed = distance / time diff --git a/midas/checker/checker.py b/midas/checker/checker.py index 428a52d..c5e827a 100644 --- a/midas/checker/checker.py +++ b/midas/checker/checker.py @@ -291,6 +291,9 @@ class Checker( def visit_set_expr(self, expr: p.SetExpr) -> Type: ... + def visit_cast_expr(self, expr: p.CastExpr) -> Type: + return expr.type.accept(self) + def visit_base_type(self, node: p.BaseType) -> Type: return self.ctx.get_type(node.base) diff --git a/midas/resolver/resolver.py b/midas/resolver/resolver.py index d63d893..f09a54d 100644 --- a/midas/resolver/resolver.py +++ b/midas/resolver/resolver.py @@ -114,3 +114,6 @@ class Resolver(p.Stmt.Visitor[None], p.Expr.Visitor[None]): def visit_set_expr(self, expr: p.SetExpr) -> None: self.resolve(expr.value) self.resolve(expr.object) + + def visit_cast_expr(self, expr: p.CastExpr) -> None: + self.resolve(expr.expr) diff --git a/tests/cases/checker/04_custom_types.py b/tests/cases/checker/04_custom_types.py index d176181..93569b8 100644 --- a/tests/cases/checker/04_custom_types.py +++ b/tests/cases/checker/04_custom_types.py @@ -3,6 +3,6 @@ midas.using("04_custom_types.midas") -distance: Meter = 123.45 -time: Second = 6.7 +distance: Meter = cast(Meter, 123.45) +time: Second = cast(Second, 6.7) speed = distance / time diff --git a/tests/cases/checker/04_custom_types.py.ref.json b/tests/cases/checker/04_custom_types.py.ref.json index de13745..c37fb01 100644 --- a/tests/cases/checker/04_custom_types.py.ref.json +++ b/tests/cases/checker/04_custom_types.py.ref.json @@ -1,32 +1,3 @@ { - "diagnostics": [ - { - "type": "Error", - "location": { - "start": [ - 6, - 0 - ], - "end": [ - 6, - 24 - ] - }, - "message": "Cannot assign BaseType(name='float') to distance of type SimpleType(name='Meter', base=BaseType(name='float'))" - }, - { - "type": "Error", - "location": { - "start": [ - 7, - 0 - ], - "end": [ - 7, - 18 - ] - }, - "message": "Cannot assign BaseType(name='float') to time of type SimpleType(name='Second', base=BaseType(name='float'))" - } - ] + "diagnostics": [] } \ No newline at end of file