
    e~                        d dl mZ d dlmZ d dlmZ d dlmZ d dlm	Z	m
Z
mZmZmZ d dlmZ erd dlmZ  G d d	e      Zdd
ZddZy)    )annotations)TYPE_CHECKING)nodes)BaseChecker)	PYMETHODSdecorated_with_propertyis_overload_stubis_protocol_classoverrides_a_method)	INFERENCE)PyLinterc                  b     e Zd ZdZddddddgifiZd fdZdd	Zdd
ZeZddZ	ddZ
e
Z xZS )NoSelfUseCheckerno_self_useR6301zMethod could be a functionno-self-usezYUsed when a method doesn't use its bound instance, and so could be written as a function.	old_names)R0201zold-no-self-usec                @    t         |   |       g | _        d | _        y N)super__init___first_attrs_meth_could_be_func)selflinter	__class__s     ?/usr/lib/python3/dist-packages/pylint/extensions/no_self_use.pyr   zNoSelfUseChecker.__init__%   s      .004     c                    | j                   r4|j                  | j                   d   k(  s| j                   d   sd| _        yyy)zYCheck if the name handle an access to a class member
        if so, register it.
        FN)r   namer   r   nodes     r   
visit_namezNoSelfUseChecker.visit_name*   sD     II**2..d6G6G6K',D$ 7L r   c                V    |j                         sy d| _        | j                  |       y )NT)	is_methodr   _check_first_arg_for_typer#   s     r   visit_functiondefz"NoSelfUseChecker.visit_functiondef3   s%    ~~#' &&t,r   c                D   |j                   j                  r$|j                   j                  d   j                  }n,|j                   j                   r|j                         d   }nd}| j                  j                  |       |j                  dk(  rd| j                  d<   yy)z!Check the name of first argument.r   Nstaticmethodr!   )argsposonlyargsr"   argnamesr   appendtype)r   r$   	first_args      r   r(   z*NoSelfUseChecker._check_first_arg_for_type;   s     99  		--a055IYY^^*II  +99&$(Db! 'r   c                   |j                         r| j                  j                         }|y|j                  j	                         }| j
                  r|j                  dk(  r|j                  t        vrq|j                         s`t        ||j                        sIt        |      s=t        |      s1t        |      s%t        |      s| j                  d|t                yyyyyyyyyyy)zOn method node, check if this method couldn't be a function.

        ignore class, static and abstract methods, initializer,
        methods overridden from a parent class.
        Nmethodr   )r$   
confidence)r'   r   popparentframer   r0   r"   r   is_abstractr   r   _has_bare_super_callr
   r	   add_messager   )r   r$   first
class_nodes       r   leave_functiondefz"NoSelfUseChecker.leave_functiondefI   s     >>%%))+E}**,J((II)IIY.$$&)*dii@.t4+D1(4'-   Ti P . 5 2 5 A ' / * ) r   r   r   returnNone)r$   z
nodes.Namer?   r@   )r$   nodes.FunctionDefr?   r@   )__name__
__module____qualname__r"   msgsr   r%   r)   visit_asyncfunctiondefr(   r=   leave_asyncfunctiondef__classcell__)r   s   @r   r   r      sX    D((789
D5
-- /)Q4 /r   r   c                    | j                  t        j                        D ]G  }|j                  }t	        |t        j
                        s*|j                  dk(  s:|j                  rG y y)Nr   TF)nodes_of_classr   Callfunc
isinstanceNamer"   r,   )fundef_nodecallrL   s      r   r9   r9   f   sP    **5::6 yydEJJ'DII,@ r   c                8    | j                  t        |              y r   )register_checkerr   )r   s    r   registerrS   n   s    
,V45r   N)rO   rA   r?   boolr>   )
__future__r   typingr   astroidr   pylint.checkersr   pylint.checkers.utilsr   r   r	   r
   r   pylint.interfacesr   pylint.lint.pylinterr   r   r9   rS    r   r   <module>r]      sA   
 #    '  (-J/{ J/Z6r   