| from __future__ import annotations |
| |
| from typing import Callable |
| |
| from mypy.plugin import FunctionContext, Plugin |
| from mypy.types import CallableType, Type, get_proper_type |
| |
| |
| class MyPlugin(Plugin): |
| def get_function_hook(self, fullname: str) -> Callable[[FunctionContext], Type] | None: |
| if fullname == "m.decorator1": |
| return decorator_call_hook |
| if fullname == "m._decorated": # This is a dummy name generated by the plugin |
| return decorate_hook |
| return None |
| |
| |
| def decorator_call_hook(ctx: FunctionContext) -> Type: |
| default = get_proper_type(ctx.default_return_type) |
| if isinstance(default, CallableType): |
| return default.copy_modified(name="m._decorated") |
| return ctx.default_return_type |
| |
| |
| def decorate_hook(ctx: FunctionContext) -> Type: |
| default = get_proper_type(ctx.default_return_type) |
| if isinstance(default, CallableType): |
| return default.copy_modified(ret_type=ctx.api.named_generic_type("builtins.str", [])) |
| return ctx.default_return_type |
| |
| |
| def plugin(version: str) -> type[MyPlugin]: |
| return MyPlugin |