| from __future__ import annotations | |
| from typing import Callable | |
| from mypy.nodes import StrExpr | |
| from mypy.plugin import FunctionContext, MethodContext, Plugin | |
| from mypy.types import Type | |
| class ArgNamesPlugin(Plugin): | |
| def get_function_hook(self, fullname: str) -> Callable[[FunctionContext], Type] | None: | |
| if fullname in { | |
| "mod.func", | |
| "mod.func_unfilled", | |
| "mod.func_star_expr", | |
| "mod.ClassInit", | |
| "mod.Outer.NestedClassInit", | |
| }: | |
| return extract_classname_and_set_as_return_type_function | |
| return None | |
| def get_method_hook(self, fullname: str) -> Callable[[MethodContext], Type] | None: | |
| if fullname in { | |
| "mod.Class.method", | |
| "mod.Class.myclassmethod", | |
| "mod.Class.mystaticmethod", | |
| "mod.ClassUnfilled.method", | |
| "mod.ClassStarExpr.method", | |
| "mod.ClassChild.method", | |
| "mod.ClassChild.myclassmethod", | |
| }: | |
| return extract_classname_and_set_as_return_type_method | |
| return None | |
| def extract_classname_and_set_as_return_type_function(ctx: FunctionContext) -> Type: | |
| arg = ctx.args[ctx.callee_arg_names.index("classname")][0] | |
| if not isinstance(arg, StrExpr): | |
| return ctx.default_return_type | |
| return ctx.api.named_generic_type(arg.value, []) | |
| def extract_classname_and_set_as_return_type_method(ctx: MethodContext) -> Type: | |
| arg = ctx.args[ctx.callee_arg_names.index("classname")][0] | |
| if not isinstance(arg, StrExpr): | |
| return ctx.default_return_type | |
| return ctx.api.named_generic_type(arg.value, []) | |
| def plugin(version: str) -> type[ArgNamesPlugin]: | |
| return ArgNamesPlugin |