From 6e06f9078e2da1213db72f47dc335b41085b2b63 Mon Sep 17 00:00:00 2001 From: LordBaryhobal Date: Fri, 3 Jul 2026 00:57:10 +0200 Subject: [PATCH] fix(checker): improve unknown method message --- midas/checker/frames/column_groupby_methods.py | 4 ++++ midas/checker/frames/column_methods.py | 4 ++++ midas/checker/frames/frame_groupby_methods.py | 4 ++++ midas/checker/frames/frame_methods.py | 4 ++++ midas/checker/frames/utils.py | 16 ++++++++++++---- 5 files changed, 28 insertions(+), 4 deletions(-) diff --git a/midas/checker/frames/column_groupby_methods.py b/midas/checker/frames/column_groupby_methods.py index de10c84..aaed5de 100644 --- a/midas/checker/frames/column_groupby_methods.py +++ b/midas/checker/frames/column_groupby_methods.py @@ -22,6 +22,10 @@ class Call: positional: list[TypedExpr] keywords: dict[str, TypedExpr] + @property + def subject(self) -> TypedExpr: + return (self.groupby_expr, self.groupby) + class ColumnGroupByMethodRegistry(MethodRegistry[Call]): @method() diff --git a/midas/checker/frames/column_methods.py b/midas/checker/frames/column_methods.py index 505caff..4b101f2 100644 --- a/midas/checker/frames/column_methods.py +++ b/midas/checker/frames/column_methods.py @@ -33,6 +33,10 @@ class Call: positional: list[TypedExpr] keywords: dict[str, TypedExpr] + @property + def subject(self) -> TypedExpr: + return (self.column_expr, self.column) + class ColumnMethodRegistry(MethodRegistry[Call]): def _element_binary_op(self, call: Call, method: str) -> ColumnType: diff --git a/midas/checker/frames/frame_groupby_methods.py b/midas/checker/frames/frame_groupby_methods.py index 4b0acc8..d3f882d 100644 --- a/midas/checker/frames/frame_groupby_methods.py +++ b/midas/checker/frames/frame_groupby_methods.py @@ -22,6 +22,10 @@ class Call: positional: list[TypedExpr] keywords: dict[str, TypedExpr] + @property + def subject(self) -> TypedExpr: + return (self.groupby_expr, self.groupby) + class FrameGroupByMethodRegistry(MethodRegistry[Call]): @method() diff --git a/midas/checker/frames/frame_methods.py b/midas/checker/frames/frame_methods.py index 02edb3c..4c413b4 100644 --- a/midas/checker/frames/frame_methods.py +++ b/midas/checker/frames/frame_methods.py @@ -33,6 +33,10 @@ class Call: positional: list[TypedExpr] keywords: dict[str, TypedExpr] + @property + def subject(self) -> TypedExpr: + return (self.frame_expr, self.frame) + class FrameMethodRegistry(MethodRegistry[Call]): def _get_method_result( diff --git a/midas/checker/frames/utils.py b/midas/checker/frames/utils.py index 95fa40a..dee4696 100644 --- a/midas/checker/frames/utils.py +++ b/midas/checker/frames/utils.py @@ -20,7 +20,7 @@ from midas.checker.types import Type, UnknownType from midas.generator.collector import AssertionCollector if TYPE_CHECKING: - from midas.checker.python import PythonTyper + from midas.checker.python import PythonTyper, TypedExpr class _MethodRegistryMeta(type): @@ -41,12 +41,18 @@ class _MethodRegistryMeta(type): return new_class -class HasLocation(Protocol): +class MethodCall(Protocol): @property def location(self) -> Location: ... + @property + def call_expr(self) -> p.Expr: ... -T = TypeVar("T", bound=HasLocation) + @property + def subject(self) -> TypedExpr: ... + + +T = TypeVar("T", bound=MethodCall) class MethodRegistry(Generic[T], metaclass=_MethodRegistryMeta): @@ -72,7 +78,9 @@ class MethodRegistry(Generic[T], metaclass=_MethodRegistryMeta): def call(self, method: str, call: T) -> Type: func: Optional[Callable[[Self, T], Type]] = self._methods.get(method) if func is None: - self.reporter.warning(call.location, f"Unknown method {method}") + self.reporter.warning( + call.location, f"Unknown method {method} on {call.subject[1]}" + ) return UnknownType() return func(self, call)