| from __future__ import annotations | |
| from typing import Callable | |
| from mypy.plugin import MethodContext, Plugin | |
| from mypy.types import Instance, Type | |
| class CallableInstancePlugin(Plugin): | |
| def get_function_hook(self, fullname: str) -> None: | |
| assert not fullname.endswith(" of Foo") | |
| def get_method_hook(self, fullname: str) -> Callable[[MethodContext], Type] | None: | |
| # Ensure that all names are fully qualified | |
| assert not fullname.endswith(" of Foo") | |
| if fullname == "__main__.Class.__call__": | |
| return my_hook | |
| return None | |
| def my_hook(ctx: MethodContext) -> Type: | |
| if isinstance(ctx.type, Instance) and len(ctx.type.args) == 1: | |
| return ctx.type.args[0] | |
| return ctx.default_return_type | |
| def plugin(version: str) -> type[CallableInstancePlugin]: | |
| return CallableInstancePlugin |