blob: 89405e020a700dd321c469db605d8371dd3b5e39 [file] [log] [blame]
from __future__ import annotations
from typing import TYPE_CHECKING
from astroid import nodes
from pylint.checkers import BaseChecker
if TYPE_CHECKING:
from pylint.lint import PyLinter
# Checkers should always inherit from `BaseChecker`.
class MyAstroidChecker(BaseChecker):
"""Add class member attributes to the class local's dictionary."""
# The name defines a custom section of the config for this checker.
name = "custom"
# This class variable declares the messages (i.e. the warnings and errors)
# that the checker can emit.
msgs = {
# Each message has a code, a message that the user will see,
# a unique symbol that identifies the message,
# and a detailed help message
# that will be included in the documentation.
"W0001": ("Message that will be emitted", "message-symbol", "Message help")
}
# This class variable declares the options
# that are configurable by the user.
options = (
# Each option definition has a name which is used on the command line
# and in config files, and a dictionary of arguments
# (similar to argparse.ArgumentParser.add_argument).
(
"store-locals-indicator",
{
"default": "properties",
"help": (
"The expression name that indicates that the locals should "
"be stored"
),
},
),
)
def visit_call(self, node: nodes.Call) -> None:
"""Called when a :class:`.nodes.Call` node is visited.
See :mod:`astroid` for the description of available nodes.
"""
if not (
isinstance(node.func, nodes.Attribute)
and isinstance(node.func.expr, nodes.Name)
and node.func.expr.name == self.linter.config.store_locals_indicator
and node.func.attrname == "create"
):
return
in_class = node.frame()
for param in node.args:
in_class.locals[param.name] = node
def register(linter: PyLinter) -> None:
"""This required method auto registers the checker during initialization.
:param linter: The linter to register the checker to.
"""
linter.register_checker(MyAstroidChecker(linter))