
    yIf             	         U d Z ddlmZ ddlZddlZddlZddlZddlZddlZddlm	Z	 ddl
mZmZmZ ddlmZ ddlmZ ddlmZmZmZ ddlZddlZdd	lmZmZmZmZ dd
lmZ ddlmZ ddl m!Z!m"Z" ddl#m$Z$m%Z%m&Z&m'Z'm(Z( ddl)m*Z*m+Z+m,Z, ddl-m.Z.m/Z/m0Z0m1Z1 ddl2m3Z3 erddl4m5Z5  ej6        d          Z7dZ8 ej6        d          Z9ddiZ:dZ;dZ< e=h d          Z>ej?        j@        ej?        jA        ej?        jB        ej        jC        jD        fZEejF        ejG        ejH        ejI        ejJ        ejK        ejL        fZM G d de          ZNdd"ZOdd'ZPdd-ZQdd0ZRdd4ZSdd5ZTdd9ZUdd<ZVdd>ZWddBZXi dCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdigifdjdkdldhdmgifdndodpdqdrdsZYdteZdu<    G dv dwe          Z[ G dx dy          Z\ G dz d{e!          Z]ddZ^dS )z#Variables checkers for Python code.    )annotationsN)defaultdict)	GeneratorIterableIterator)Enum)cached_property)TYPE_CHECKINGAny
NamedTuple)basesextract_nodenodesutil)_base_nodes)InferenceResult)BaseCheckerutils)in_type_checking_blockis_module_ignoredis_postponed_evaluation_enabledis_sys_guardoverridden_method)	PY39_PLUSTYPING_NEVERTYPING_NORETURN)CONTROL_FLOWHIGH	INFERENCEINFERENCE_FAILURE)MessageDefinitionTuple)PyLinterz^_{2}[a-z]+_{2}$
__future__z_.*|^ignored_|^unused__py_abcabczbuiltins.rangetyping>5   r   SetDictListTextTypeDequeSizedTupleUnionAnyStrCounterGenericMappingPatternTypeVarBinaryIOCallableClassVarHashabler   r   KeysViewOptionalSequence	Awaitable	Container	Coroutine	FrozenSetr   	ItemsView
ByteString
Collection
MutableSetr   
Reversible
ValuesViewAbstractSetDefaultDictMappingViewSupportsAbsSupportsIntAsyncIterableAsyncIteratorSupportsBytesSupportsFloatSupportsRoundAsyncGeneratorContextManagerMutableMappingMutableSequenceSupportsComplexAsyncContextManagerc                      e Zd ZdZdZdZdS )VariableVisitConsumerActionzReported by _check_consumer() and its sub-methods to determine the
    subsequent action to take in _undefined_and_used_before_checker().

    Continue -> continue loop to next consumer
    Return -> return and thereby break the loop
    r      N)__name__
__module____qualname____doc__CONTINUERETURN     M/var/www/piapp/venv/lib/python3.11/site-packages/pylint/checkers/variables.pyrX   rX      s$          HFFFra   rX   stmtnodes.ImportFromnamestrreturnbool | Nonec                    	 |                      | j                  }n# t          j        $ r Y dS w xY w|j                            |g           D ]/}t          |t          j                  r|j        t          k    r dS 0dS )z9Check if the name is a future import from another module.NT)
do_import_modulemodnameastroidAstroidBuildingErrorlocalsget
isinstancer   
ImportFromFUTURE)rc   re   module
local_nodes       rb   _is_from_future_importru      s    &&t|44'   tt m''b11  
j%"233 	
8Jf8T8T444s    00nodenodes.Assigninferredr   c                   d}t          |t                    rit          | t          j                  r| j                                        }n3t          | t          j                  r| j                                        }|S |                                j	        }|                                 j	        |k    r;| j
        |j
        k    rd|                                 d}n&|j
        r
d|j
         }n|j
        rd|j
         d| }|S )z~Return extra information to add to the message for unpacking-non-sequence
    and unbalanced-tuple/dict-unpacking errors.
     'zdefined at line z of )rp   
DICT_TYPESr   Assignvalue	as_stringForiterrootre   lineno)rv   rx   moreinferred_modules       rb   _get_unpacking_extra_infor      s    D(J'' dEL)) 	):''))DDei(( 	)9&&((Dmmoo*Oyy{{?**;(/)).x))++...DD_ 	87ho77D	 IH(/HHHHKra   
nodes.Nameframenodes.LocalsDictNodeNGdefframeboolc                .   dx}}|r |j         r|j                                         }|r |j         r|j                                         }t          |t          j                  r'||ur#|t          j        | t          j                  u rdS t          |t          j                  rR|                    |          r| j	        |j	        k     S t          | j         t          j        t          j
        f          sdS g }|p||fD ]f}|}|r`t          |t          j        t          j        f          s|                    |           n$|j         r|j                                         }nn|`gt          t          |                    dk    rdS |j	        |j	        k     S )a  Detect that the given frames share a global scope.

    Two frames share a global scope when neither
    of them are hidden under a function scope, as well
    as any parent scope of them, until the root scope.
    In this case, depending from something defined later on
    will only work if guarded by a nested function definition.

    Example:
        class A:
            # B has the same global scope as `C`, leading to a NameError.
            # Return True to indicate a shared scope.
            class B(C): ...
        class C: ...

    Whereas this does not lead to a NameError:
        class A:
            def guard():
                # Return False to indicate no scope sharing.
                class B(C): ...
        class C: ...
    NFrY   )parentscoperp   r   ClassDefr   get_node_first_ancestor_of_typeFunctionDef	parent_ofr   	ArgumentsModuleappendlenset)rv   r   r   	def_scoper   break_scopescurrent_scopeparent_scopes           rb   _detect_global_scoper      s   2 I % %""$$ ,HO ,O))++	5%.))""U:4ARSSSS u%*++ 	 ??8$$ 	1;00$+(95?'KLL 	5L.5)4   % 	lU^U\,JKK ##L111" +288::  	 3|!! u <(/))ra   nodes.Import&Generator[InferenceResult, None, None]c                z    t           j                                        }||_        |                     |d          S )NF)asname)rl   contextInferenceContext
lookupnameinfer)rv   re   r   s      rb   _infer_name_moduler      s5     o..00GG::ge:,,,ra   not_consumeddict[str, list[nodes.NodeNG]](list[tuple[str, _base_nodes.ImportNode]]c                   i }|                                  D ]\  }}t          d |D                       r|D ]}t          |t          j        t          j        f          s)|j        D ]Z}d}|d         }|dk    r|}n:d}|                    |          r|                    d          dk    rd}|s||v r|}|r	||vr|||<   [t          |                                 d	 
          S )a  Try to fix imports with multiple dots, by returning a dictionary
    with the import names expanded.

    The function unflattens root imports,
    like 'xml' (when we have both 'xml.etree' and 'xml.sax'), to 'xml.etree'
    and 'xml.sax' respectively.
    c              3     K   | ]J}t          |t          j                  o+t          |                                t          j                  V  Kd S N)rp   r   
AssignNameassign_type	AugAssign.0rc   s     rb   	<genexpr>z#_fix_dot_imports.<locals>.<genexpr>  sf       
 
  tU-.. @4++--u??
 
 
 
 
 
ra   Nr   *F.Tc                    | d         j         S NrY   )
fromlineno)as    rb   <lambda>z"_fix_dot_imports.<locals>.<lambda>/  s    qt ra   )key)
itemsanyrp   r   rq   Importnames
startswithfindsorted)	r   r   re   stmtsrc   importssecond_nameimport_module_namename_matches_dotted_imports	            rb   _fix_dot_importsr     sY    02E#))++ . .e 
 
 
 
 
 
 
 	
  	. 	.DdU%5u|$DEE : . ."%,QZ"%,, #'KK16.*55d;;:.33C882==5921 9TW__ '9 .;e#;#;)-E+&+.	.2 %++--%>%>????ra   c                   | t          |                    t          j                            v rdS |                    t          j        t          j        f          }|D ](}|j        D ]\  }}|r|| k    r  dS |r
|| k    r  dS )dS )zDetect imports in the frame, with the required *name*.

    Such imports can be considered assignments if they are not globals.
    Returns True if an import for the given name was found.
    FT)_flattened_scope_namesnodes_of_classr   Globalr   rq   r   )re   r   r   import_nodeimport_nameimport_aliass         rb   _find_frame_importsr   2  s     %e&:&:5<&H&HIIIIu""EL%2B#CDDG  )4): 	 	%K  4''444 ( !4!4ttt	 5ra   %nodes.Global | _base_nodes.ImportNodeglobal_namesset[str]c                B    | j         D ]\  }}|r||v r dS ||v r dS dS )NTF)r   )rc   r   r   r   s       rb   _import_name_is_globalr   H  sW     &*Z  !\  	|++tt ,L((44 )5ra   iterator'Iterator[nodes.Global | nodes.Nonlocal]c                r    d | D             }t          t          j                            |                    S )Nc              3  >   K   | ]}t          |j                  V  d S r   )r   r   r   s     rb   r   z)_flattened_scope_names.<locals>.<genexpr>Y  s*      33$c$*oo333333ra   )r   	itertoolschainfrom_iterable)r   valuess     rb   r   r   V  s5     43(333Fy,,V44555ra   	name_nodec                                                       }|                    t          j                  }t	           fd|D                       pt           j        |          S )zEChecks if name_node has corresponding assign statement in same scope.c              3  8   K   | ]}|j         j         k    V  d S r   re   )r   r   r   s     rb   r   z$_assigned_locally.<locals>.<genexpr>a  s,      >>Aqv'>>>>>>ra   )r   r   r   r   r   r   re   )r   name_node_scopeassign_stmtss   `  rb   _assigned_locallyr   ]  sh    oo''O"11%2BCCL>>>>>>>>> BUC C ra   nodes.NodeNGr   nodes.FunctionDefc                T   t           j        t           j        t           j        t           j        f}|                    t           j        |          D ]W}t          j        |j	                  }t          j
        |          r(t          |dd           dk    r| j        |j        k     r dS XdS )N)
skip_klassre   rn   TF)r   r   r   r   rq   r   Callr   
safe_inferfuncis_builtin_objectgetattrr   )rc   r   
skip_nodescallrx   s        rb   _has_locals_call_after_noder   f  s    	J $$UZJ$GG  #DI..#H--	&$//8;;{T[((tt5ra   E0601)z#Using variable %r before assignmentused-before-assignmentaf  Emitted when a local variable is accessed before its assignment took place. Assignments in try blocks are assumed not to have occurred when evaluating associated except/finally blocks. Assignments in except blocks are assumed not to have occurred when evaluating statements outside the block, except when the associated try block contains a return statement.E0602)zUndefined variable %rundefined-variablez,Used when an undefined variable is accessed.E0603)z%Undefined variable name %r in __all__undefined-all-variablez>Used when an undefined variable name is referenced in __all__.E0604)z7Invalid object %r in __all__, must contain only stringsinvalid-all-objectz;Used when an invalid (non-string) object occurs in __all__.E0605)z1Invalid format for __all__, must be tuple or listinvalid-all-formatz(Used when __all__ has an invalid format.E0611)zNo name %r in module %rno-name-in-modulez-Used when a name cannot be found in a module.W0601)z0Global variable %r undefined at the module levelglobal-variable-undefinedzsUsed when a variable is defined through the "global" statement but the variable is not defined in the module scope.W0602)z-Using global for %r but no assignment is doneglobal-variable-not-assignedzWhen a variable defined in the global scope is modified in an inner scope, the 'global' keyword is required in the inner scope only if there is an assignment operation done in the inner scope.W0603)zUsing the global statementglobal-statementzUsed when you use the "global" statement to update a global variable. Pylint discourages its usage. That doesn't mean you cannot use it!W0604)z.Using the global statement at the module levelglobal-at-module-levelzTUsed when you use the "global" statement at the module level since it has no effect.W0611)z	Unused %sunused-importz5Used when an imported module or variable is not used.W0612)zUnused variable %runused-variablez-Used when a variable is defined but not used.W0613)zUnused argument %runused-argumentz4Used when a function or method argument is not used.W0614)z.Unused import(s) %s from wildcard import of %sunused-wildcard-importz]Used when an imported module or variable is not used from a `'from X import *'` style import.W0621)z-Redefining name %r from outer scope (line %s)redefined-outer-namezUUsed when a variable's name hides a name defined in an outer scope or except handler.W0622)zRedefining built-in %rredefined-builtinz5Used when a variable or function override a built-in.W0631)z)Using possibly undefined loop variable %rundefined-loop-variablezUsed when a loop variable (i.e. defined by a for loop or a list comprehension or a generator expression) is used outside the loop.ziPossible unbalanced tuple unpacking with sequence %s: left side has %d label%s, right side has %d value%sunbalanced-tuple-unpackingz>Used when there is an unbalanced tuple unpacking in assignment	old_names)E0632zold-unbalanced-tuple-unpackingz%Attempting to unpack a non-sequence%sunpacking-non-sequencezKUsed when something which is not a sequence is used in an unpack assignment)W0633zold-unpacking-non-sequence)z Cell variable %s defined in loopcell-var-from-loopzA variable used in a closure is defined in a loop. This will result in all closures using the same value for the closed-over variable.)zPossibly unused variable %rpossibly-unused-variablezUsed when a variable is defined but might not be used. The possibility comes from the fact that locals() might be used, which could consume or not the said variable)z"Invalid assignment to %s in methodself-cls-assignmentzKInvalid assignment to self or cls in instance or class method respectively.)z!Invalid index for iterable lengthpotential-index-errorzREmitted when an index used on an iterable goes beyond the length of that iterable.)z_Possible unbalanced dict unpacking with %s: left side has %d label%s, right side has %d value%sunbalanced-dict-unpackingzIUsed when there is an unbalanced dict unpacking in assignment or for loop)W0632E0633W0640W0641W0642E0643W0644z!dict[str, MessageDefinitionTuple]MSGSc                  <    e Zd ZU dZded<   ded<   ded<   ded<   d	S )
ScopeConsumerz)Store nodes and their consumption states.r   
to_consumeconsumed$defaultdict[str, list[nodes.NodeNG]]consumed_uncertainrf   
scope_typeN)rZ   r[   r\   r]   __annotations__r`   ra   rb   r%  r%    sC         33----++++<<<<OOOOOra   r%  c                     e Zd ZdZd2dZd3d	Zd4dZed5d            Zed5d            Z	ed6d            Z
ed3d            Zd7dZd8dZed9d            Zed:d            Zd;dZed<d"            Zed=d%            Zed9d&            Zed9d'            Zed>d*            Zed?d.            Zed@d/            ZedAd0            Zd1S )BNamesConsumerzQA simple class to handle consumed, to consume and scope type info of node locals.rv   r   r*  rf   rg   Nonec                    t          t          j        |j                  i t          j        t
                    |          | _        || _        d S r   )r%  copyrn   collectionsr   list_atomicrv   )selfrv   r*  s      rb   __init__zNamesConsumer.__init__  s@    $Idk""B(?(E(Ez
 
 			ra   c           	        d | j         j                                        D             }d | j         j                                        D             }d | j         j                                        D             }d                    |          }d                    |          }d                    |          }d| d| d| d| j         j         d		S )
Nc                "    g | ]\  }}| d | S z->r`   r   kvs      rb   
<listcomp>z*NamesConsumer.__repr__.<locals>.<listcomp>  s&    PPP11PPPra   c                "    g | ]\  }}| d | S r8  r`   r9  s      rb   r<  z*NamesConsumer.__repr__.<locals>.<listcomp>  s&    KKKTQ[[Q[[KKKra   c                "    g | ]\  }}| d | S r8  r`   r9  s      rb   r<  z*NamesConsumer.__repr__.<locals>.<listcomp>   s3     
 
 
 AqqKKAKK
 
 
ra   , z
to_consume : z
consumed : z
consumed_uncertain: z
scope_type : 
)r3  r&  r   r'  r)  joinr*  )r4  _to_consumes	_consumed_consumed_uncertainto_consumesr'  r)  s          rb   __repr__zNamesConsumer.__repr__  s    PP0G0M0M0O0OPPPKKT\-B-H-H-J-JKKK	
 
$(L$C$I$I$K$K
 
 
 ii--99Y''!YY':;;   (  l%	   	ra   Iterator[Any]c                *    t          | j                  S r   )r   r3  r4  s    rb   __iter__zNamesConsumer.__iter__-  s    DL!!!ra   r   c                    | j         j        S r   )r3  r&  rI  s    rb   r&  zNamesConsumer.to_consume0      |&&ra   c                    | j         j        S r   )r3  r'  rI  s    rb   r'  zNamesConsumer.consumed4  s    |$$ra   r(  c                    | j         j        S )a  Retrieves nodes filtered out by get_next_to_consume() that may not
        have executed.

        These include nodes such as statements in except blocks, or statements
        in try blocks (when evaluating their corresponding except and finally
        blocks). Checkers that want to treat the statements as executed
        (e.g. for unused-variable) may need to add them back.
        )r3  r)  rI  s    rb   r)  z NamesConsumer.consumed_uncertain8  s     |..ra   c                    | j         j        S r   )r3  r*  rI  s    rb   r*  zNamesConsumer.scope_typeD  rL  ra   re   consumed_nodeslist[nodes.NodeNG]c                z    fd| j         |         D             }| j        |<   |r|| j         |<   dS | j         |= dS )zMark the given nodes as consumed for the name.

        If all of the nodes for the name were consumed, delete the name from
        the to_consume dictionary
        c                6    g | ]}|t                    v|S r`   )r   )r   nrP  s     rb   r<  z2NamesConsumer.mark_as_consumed.<locals>.<listcomp>N  s+    WWWA!3~CVCV:V:Va:V:V:Vra   N)r&  r'  )r4  re   rP  
unconsumeds     ` rb   mark_as_consumedzNamesConsumer.mark_as_consumedH  s\     XWWW!6WWW
,d 	&$.DOD!!!%%%ra   r   list[nodes.NodeNG] | Nonec                   j         }j        }| j                            |          }                                }|rjt          |t          j                  rP||d         j        k    r?|d         j        j        d         }t          |t          j	                  r|j         |k    rd}|r0t          |t          j
                  r|j        k    r|j        |v rd}t          fd                                                                D                       r|S t                                         r|S |rM|                     |          }| j        j         xx         |z  cc<   t)          |          fd|D             }|rfd|D             }|rN|                     ||          }| j        j         xx         |z  cc<   t)          |          fd|D             }|rN|                     |||          }| j        j         xx         |z  cc<   t)          |          fd|D             }|rM|                     ||          }| j        j         xx         |z  cc<   t)          |          fd|D             }|S )	aG  Return a list of the nodes that define `node` from this scope.

        If it is uncertain whether a node will be consumed, such as for statements in
        except blocks, add it to self.consumed_uncertain instead of returning it.
        Return None to indicate a special case that needs to be handled by the caller.
        r   Nc              3  h   K   | ],}t          |t          j                  oj        |j        v V  -d S r   rp   r   Nonlocalre   r   r   childrv   s     rb   r   z4NamesConsumer.get_next_to_consume.<locals>.<genexpr>u  sQ       
 
 uen--J$)u{2J
 
 
 
 
 
ra   c                    g | ]}|v|	S r`   r`   r   rT  uncertain_nodes_sets     rb   r<  z5NamesConsumer.get_next_to_consume.<locals>.<listcomp>  $    RRRQ>Q5Q5Q15Q5Q5Qra   c                    g | ]W}t          |                                t          j                  r'|                                                              U|XS r`   )rp   	statementr   ExceptHandlerr   r   rT  rv   s     rb   r<  z5NamesConsumer.get_next_to_consume.<locals>.<listcomp>  sd       !!++--1DEE ;;==**400	  ra   c                    g | ]}|v|	S r`   r`   r_  s     rb   r<  z5NamesConsumer.get_next_to_consume.<locals>.<listcomp>  ra  ra   c                    g | ]}|v|	S r`   r`   r_  s     rb   r<  z5NamesConsumer.get_next_to_consume.<locals>.<listcomp>  ra  ra   c                    g | ]}|v|	S r`   r`   r_  s     rb   r<  z5NamesConsumer.get_next_to_consume.<locals>.<listcomp>  ra  ra   )re   r   r&  ro   rc  rp   r   r}   targetsr   r   r   targetr   r   get_childrenVariablesChecker%_comprehension_between_frame_and_node_uncertain_nodes_in_false_testsr)  r   !_uncertain_nodes_in_except_blocks=_uncertain_nodes_in_try_blocks_when_evaluating_finally_blocks<_uncertain_nodes_in_try_blocks_when_evaluating_except_blocks)	r4  rv   re   parent_nodefound_nodesnode_statementlhsuncertain_nodesr`  s	    `      @rb   get_next_to_consumez!NamesConsumer.get_next_to_consumeV  sP    yko))$//))		#;55		# {1~444a.'/2C3 011#69h$6F6F" 	;	22	  D(("k11K  
 
 
 
2244
 
 
 
 
 	  AA$GG 	  	S"BB;PTUUO#DI.../A..."%o"6"6RRRRkRRRK  	   $  K  	S"DDT> O #DI.../A..."%o"6"6RRRRkRRRK  	SRR  
 #DI.../A..."%o"6"6RRRRkRRRK  	SQQ  
 #DI.../A..."%o"6"6RRRRkRRRKra   r   c                    t          |t          j                  r|}|j        r7t	          d |                    t          j                  D             d          }|r|j        ng }t                               |          pt           fd|D                       S t          |t          j
        t          j        t          j        f          rt                               |          S t          |t          j                  sdS t          |                    t          j                            rdS t                               |          rdS t          |j        t          j                  r|j        j        n|j        }t)          j        |          }d}d}|D ]:}t          |t          j                  sd}|j        }	|p|	t.          k    o|	}|o|	 };|r"|r t                               |j                  S |r"|r t                               |j                  S t                               |j                  pt                               |j                  S )zyReturn True if there is a path under this `if_node`
        that is inferred to define `name`, raise, or return.
        c              3     K   | ]}|V  d S r   r`   r   r]  s     rb   r   zINamesConsumer._inferred_to_define_name_raise_or_return.<locals>.<genexpr>  s"      GGuUGGGGGGra   Nc              3  N   K   | ]}t                               |          V   d S r   r-  )_defines_name_raises_or_returns_recursiver   handlerre   s     rb   r   zINamesConsumer._inferred_to_define_name_raise_or_return.<locals>.<genexpr>  sG         GGgVV     ra   FT)rp   r   Try	finalbodynextr   handlersr-  r}  allWithr   WhileIfr   Break_defines_name_raises_or_returnstest	NamedExprr~   r   	infer_allConstNotImplemented_branch_handles_nameorelsebody)
re   rv   try_except_noder  r  all_inferredonly_search_ifonly_search_elserx   vals
   `         rb   (_inferred_to_define_name_raise_or_returnz6NamesConsumer._inferred_to_define_name_raise_or_return  s    dEI&& 	"O~ "&GG(;(;EI(F(FGGG# # 4CJ//H JJd      '     dUZEK@AA 	W JJ4QUVVV$)) 	5 t""5;//00 	4 88tDD 	4",TY"H"HWtydit,,$ 	< 	<Hh44 #( .C+N~0E0M#N/;G  	I, 	I 55dDKHHH 	GN 	G 55dDIFFF11$)
 
 C//dkBB	Cra   r  Iterable[nodes.NodeNG]c                :     t           fd|D                       S )Nc           	   3    K   | ]}t                               |          pat          |t          j        t          j        t          j        t          j        t          j        f          ot           	                    |          V  d S r   )
r-  r  rp   r   r  r  r  r   r  r  )r   if_body_stmtre   s     rb   r   z5NamesConsumer._branch_handles_name.<locals>.<genexpr>  s       
 
  99$MM HIJIK	 	  FFl 
 
 
 
 
 
ra   )r   )re   r  s   ` rb   r  z"NamesConsumer._branch_handles_name  s=     
 
 
 
 !%
 
 
 
 
 	
ra   rs  c                p   g }|D ].}t          |t          j                  r|j        }n/t          |t          j        t          j        f          rj        }nTfd|                                D             }|sw|d         }t          t          j                  r)                                |                                ur|                              r|d         }t          
                    |          rt                              ||          r|                    |           0|S )a	  Identify nodes of uncertain execution because they are defined under
        tests that evaluate false.

        Don't identify a node if there is a path that is inferred to
        define the name, raise, or return (e.g. any executed if/elif/else branch).
        c                r    g | ]3}t          |t          j                  |                              1|4S r`   )rp   r   r  r   re  s     rb   r<  zANamesConsumer._uncertain_nodes_in_false_tests.<locals>.<listcomp>  sQ       a** 45;;t3D3D  ra   r   r   )rp   r   r   re   r   rq   node_ancestorsr   r   r-  _node_guarded_by_same_testr  r   )	r4  rs  rv   rv  
other_nodere   all_if
closest_ifouter_ifs	     `      rb   rn  z-NamesConsumer._uncertain_nodes_in_false_tests  sW    % !	/ !	/J*e&677 !Ju7G(HII y   #2244  F
  J4!122JJLL
(8(8(:(:::##D)) bzH77hGG  EEdHUU "":....ra   other_ifnodes.Ifc                :   |j                                         }t          j        |j                   }|                                 D ]}t          |t          j                  s|j                                         |k    r dS t          |j         t          j                  r]t          j        |j                   }t          |          t          |          k    r=t          d g ||R D                       rd |D             d |D             k    r dS dS )a3  Identify if `node` is guarded by an equivalent test as `other_if`.

        Two tests are equivalent if their string representations are identical
        or if their inferred values consist only of constants and those constants
        are identical, and the if test guarding `node` is not a Name.
        Tc              3  L   K   | ]}t          |t          j                   V   d S r   )rp   r   r  r   r  s     rb   r   z;NamesConsumer._node_guarded_by_same_test.<locals>.<genexpr>E  sE         #4555     ra   c                    h | ]	}|j         
S r`   r~   r  s     rb   	<setcomp>z;NamesConsumer._node_guarded_by_same_test.<locals>.<setcomp>J  s    8884DJ888ra   c                    h | ]	}|j         
S r`   r  r  s     rb   r  z;NamesConsumer._node_guarded_by_same_test.<locals>.<setcomp>J  s'     = = =#'DJ= = =ra   F)r  r   r   r  r  rp   r   r  Namer   r   )rv   r  other_if_test_as_stringother_if_test_all_inferredancestorr  s         rb   r  z(NamesConsumer._node_guarded_by_same_test2  sT    #+-"9"9";";%*_X]%C%C"++-- 	 	Hh11 }&&((,CCCtt(-44  ?8=99L<  C(B$C$CCC   L, L1K L L      88<888 = =+E= = =   tt D ura   rt  _base_nodes.Statementc                j   g }| D ]+}|                                 }t          j        |t          j                  }|s9|                              rO|j        }t          d |j        D                       }t          d |j	        D                       }	t          d |j	        D                       }
t          d |j	        D                       }|rGt          |j        t          j        t          j        f          r|j                            |          r|s|	s|
rt          |j        t          j                  r>||j        j        v r0|j                            |          r|                    |           nt          |j        t          j                  r>||j        j	        v r0|j                            |          r|                    |           n"t!          fd|j        D                       rt$                              |          r|                    |           -|S )z}Return any nodes in ``found_nodes`` that should be treated as uncertain
        because they are in an except block.
        c              3  J   K   | ]}t          |t          j                  V  d S r   rp   r   Return)r   try_statements     rb   r   zBNamesConsumer._uncertain_nodes_in_except_blocks.<locals>.<genexpr>i  sB       $ $! =%,77$ $ $ $ $ $ra   c              3  J   K   | ]}t          |t          j                  V  d S r   r  r   else_statements     rb   r   zBNamesConsumer._uncertain_nodes_in_except_blocks.<locals>.<genexpr>m  sB       % %" >5<88% % % % % %ra   c              3     K   | ]V}t          |t          j                  o7t          |j        t          j                  ot          j        |j                  V  Wd S r   )rp   r   Exprr~   r   r   is_terminating_funcr  s     rb   r   zBNamesConsumer._uncertain_nodes_in_except_blocks.<locals>.<genexpr>q  ss       # # # >5:66 D~3UZ@@D-n.BCC# # # # # #ra   c              3  J   K   | ]}t          |t          j                  V  d S r   )rp   r   Continuer  s     rb   r   zBNamesConsumer._uncertain_nodes_in_except_blocks.<locals>.<genexpr>w  sB       ' '" >5>::' ' ' ' ' 'ra   c              3  X   K   | ]$}t                               j        |          V  %d S r   )r-  r}  re   )r   r  rv   s     rb   r   zBNamesConsumer._uncertain_nodes_in_except_blocks.<locals>.<genexpr>  sP           "KK	7      ra   )rc  r   r   r   rd  r   r   r   r  r  rp   r   r  r  r  r   r  r  r-  _check_loop_finishes_via_except)rs  rv   rt  rv  r  other_node_statementclosest_except_handlerclosest_try_excepttry_block_returnselse_block_returnselse_block_exitselse_block_continuess    `          rb   ro  z/NamesConsumer._uncertain_nodes_in_except_blocksR  s    % D	/ D	/J#-#7#7#9#9 %*%J$e&9& &" * %//55 ,B,I # $ $%7%<$ $ $ ! ! "% % %&8&?% % % " "  # # # '9&?	# # #     $' ' '&8&?' ' ' $ $ 
 %~4uy%+6NOO '-77GG
   $6 :J  ~4ei@@&.*?*III*1;;NKK J $**:6666 ~4ei@@&.*?*FFF*1;;NKK G $**:6666      $6#>	      <<TCUVV  "":....ra   c                    t          |t          j        t          j        t          j        f          rdS t          |t          j                  r8|j        r1t          |j        t          j                  r|j        j	         k    rdS t          |t          j
                  rk|j        D ]c}t          j        |          D ]L}t          |t          j                  r|j        }t          |t          j                  r|j	         k    r  dS Mdt          |t          j                  r:t!           fd|                    t          j                  D                       rdS t          |t          j        t          j        f          r"t!           fd|j        D                       rdS t          |t          j                  r"t!           fd|j        D                       rdS t          |t          j        t          j        f          r|j	         k    rdS t          |t          j                  r|j	        r|j	        j	         k    rdS dS )NTc              3  8   K   | ]}|j         j        k    V  d S r   )rj  re   )r   child_named_exprre   s     rb   r   z@NamesConsumer._defines_name_raises_or_returns.<locals>.<genexpr>  sB        $ !',4     ra   c              3  X   K   | ]$}|d          r|d          k    p|d         k    V  %dS )rY   r   Nr`   )r   	node_namere   s     rb   r   z@NamesConsumer._defines_name_raises_or_returns.<locals>.<genexpr>  s_       F
 F
 q\2ild2M	!8LF
 F
 F
 F
 F
 F
ra   c              3  z   K   | ]5}t          |d          t          j                  o|d          j        k    V  6dS )rY   Nrp   r   r   re   )r   itemre   s     rb   r   z@NamesConsumer._defines_name_raises_or_returns.<locals>.<genexpr>  sX       0
 0
 tAw 011Jd1gld6J0
 0
 0
 0
 0
 0
ra   F)rp   r   RaiseAssertr  	AnnAssignr~   rj  r   re   r}   ri  r   get_all_elementsStarredr  r   r   r  r   rq   r   r  r   r   r   rd  )re   rv   rj  elts   `   rb   r  z-NamesConsumer._defines_name_raises_or_returns  s   dU[%,EFF 	4tU_--	
	 4;(899	  D((4dEL)) 	$, $ $ 1&99 $ $C!#u}55 (!i!#u'788 $SX=M=M#ttt	$
 dEH%% 	    (,(;(;EO(L(L      tdU\5+;<== 	# F
 F
 F
 F
!ZF
 F
 F
 C
 C
 	 4dEJ'' 	C 0
 0
 0
 0

0
 0
 0
 -
 -
 	 4dU^U->?@@ 	TYRVEVEV4tU011			 	$&&4ura   c                    |                                 D ]}t                               |          r dS t          |t          j        t          j        f          r0t           fd|                                 D                       r dS t          |t          j                  r%|j	        st          
                     |          r dS dS )zaReturn True if some child of `node` defines the name `name`,
        raises, or returns.
        Tc              3  N   K   | ]}t                               |          V   d S r   )r-  r  )r   nested_stmtre   s     rb   r   zJNamesConsumer._defines_name_raises_or_returns_recursive.<locals>.<genexpr>  sG        # "AA$TT     ra   F)rk  r-  r  rp   r   r  r  r   r  r  r}  )re   rv   rc   s   `  rb   r}  z7NamesConsumer._defines_name_raises_or_returns_recursive  s     %%'' 	 	D<<T4HH tt$5: 677      '+'8'8':':        444++ "KKDRVWW
 ttura   other_node_try_except	nodes.Tryc                    |j         sdS t          j         t          j        t          j        f          }|dS t           fd|j         D                       sdS |j         D ] }t          |t          j                  r|} n!dS dd
} |||          sM|	                                D ]6}t          |t          j        t          j        f          r |||          r n7dS |j
        D ]}t                              ||          r n dS dS )aM  Check for a specific control flow scenario.

        Described in https://github.com/pylint-dev/pylint/issues/5683.

        A scenario where the only non-break exit from a loop consists of the very
        except handler we are examining, such that code in the `else` branch of
        the loop can depend on it being assigned.

        Example:

        for _ in range(3):
            try:
                do_something()
            except:
                name = 1  <-- only non-break exit from loop
            else:
                break
        else:
            print(name)
        FNc              3  J   K   | ]}|u p|                               V  d S r   r   )r   r  rv   s     rb   r   z@NamesConsumer._check_loop_finishes_via_except.<locals>.<genexpr>  sO       
 
 d"Dn&>&>t&D&D
 
 
 
 
 
ra   r  r  loopnodes.For | nodes.Whilerg   r   c                D     t           fd|j        D                       S )zAReturn True if `other_node_try_except` is a descendant of `loop`.c              3  J   K   | ]}|u p|                               V  d S r   r  )r   loop_body_statementr  s     rb   r   z[NamesConsumer._check_loop_finishes_via_except.<locals>._try_in_loop_body.<locals>.<genexpr>  sW         ( $'<< H&001FGG     ra   )r   r  )r  r  s   ` rb   _try_in_loop_bodyzHNamesConsumer._check_loop_finishes_via_except.<locals>._try_in_loop_body  sA          ,09     ra   T)r  r  r  r  rg   r   )r  r   r   r   r   r  r   rp   r  r  r  r-  +_recursive_search_for_continue_before_break)rv   r  closest_loopinner_else_statement
break_stmtr  r  	loop_stmts   `       rb   r  z-NamesConsumer._check_loop_finishes_via_except  s   0 %+ 	51$EK8PQQ 	 5 
 
 
 
"."5
 
 
 
 
 	
 5$9$@ 	 	 .<< 1

 5	 	 	 	 ! !6EE 	(7799  hEK(@AA (()>II  u%* 	 	IHH:    4ura   rc   r  nodes.Breakc                   | |u rdS t          | t          j                  rdS |                                 D ]G}t          | t          j        t          j        f          r)t                              ||          r dS HdS )zReturn True if any Continue node can be found in descendants of `stmt`
        before encountering `break_stmt`, ignoring any nested loops.
        FT)rp   r   r  rk  r   r  r-  r  )rc   r  r]  s      rb   r  z9NamesConsumer._recursive_search_for_continue_before_break1  s     :5dEN++ 	4&&(( 	 	E$EK 899 HHz   tt ura   c                \   g }t          j        |t          j                  |S | D ]}|                                }|u rt          j        |t          j                  \  }@|j        vrJt          fdj	        D                       sl|
                    |           |S )zReturn any nodes in ``found_nodes`` that should be treated as uncertain.

        Nodes are uncertain when they are in a try block and the ``node_statement``
        being evaluated is in one of its except handlers.
        Nc              3  V   K   | ]#}j         v p|                                v V  $d S r   )r  r  )r   &other_node_try_ancestor_except_handlerr  other_node_try_ancestors     rb   r   z]NamesConsumer._uncertain_nodes_in_try_blocks_when_evaluating_except_blocks.<locals>.<genexpr>j  s^         ; '*A*JJ ;9)88::;     ra   )r   r   r   rd  rc  -get_node_first_ancestor_of_type_and_its_childr  r  r   r  r   )rs  rt  rv  r  r  %other_node_try_ancestor_visited_childr  r  s         @@rb   rq  zJNamesConsumer._uncertain_nodes_in_try_blocks_when_evaluating_except_blocksE  s    /1!&!FE/"
 "
 ")""% 	/ 	/J#-#7#7#9#9 #'===
 C$ei '5 '.5.34 4        ?V>^	      "":....ra   c                  	 g }t          j        |t          j                  \  	}	|S |	j        vr|S | D ]}|                                }t          j        |t          j                  \  }}|;||j        vrE|	ur!t          	fd|j        D                       sj|j        r!t          fd|j        D                       r|
                    |           |S )Nc              3  J   K   | ]}|u p|                               V  d S r   r  )r   other_node_final_statementclosest_try_finally_ancestors     rb   r   z^NamesConsumer._uncertain_nodes_in_try_blocks_when_evaluating_finally_blocks.<locals>.<genexpr>  sZ        
 3	 /2NN 1;;4      ra   c              3  N   K   | ]}t                               |          V   d S r   r|  r~  s     rb   r   z^NamesConsumer._uncertain_nodes_in_try_blocks_when_evaluating_finally_blocks.<locals>.<genexpr>  sO       @ @ GGgVV@ @ @ @ @ @ra   )r   r  r   r  r  rc  r  r   r  r  r   )
rs  rt  re   rv  %child_of_closest_try_finally_ancestorr  r  other_node_try_finally_ancestor(child_of_other_node_try_finally_ancestorr  s
     `      @rb   rp  zKNamesConsumer._uncertain_nodes_in_try_blocks_when_evaluating_finally_blocksu  s    /1 ?EI
 
	
(1 (/""1/9: : #"% &	/ &	/J#-#7#7#9#9  C$ei /8 /6 96;< <  07SSS    
 7V6_     T .7 C @ @ @ @>G@ @ @ = =  "":....ra   N)rv   r   r*  rf   rg   r.  )rg   rf   )rg   rG  )rg   r   )rg   r(  )re   rf   rP  rQ  rg   r.  )rv   r   rg   rW  )re   rf   rv   r   rg   r   )re   rf   r  r  rg   r   )rs  rQ  rv   r   rg   rQ  )rv   r   r  r  rg   r   )rs  rQ  rv   r   rt  r  rg   rQ  )rv   r   r  r  rg   r   )rc   r  r  r  rg   r   )rs  rQ  rt  r  rg   rQ  )rs  rQ  rt  r  re   rf   rg   rQ  )rZ   r[   r\   r]   r5  rF  rJ  propertyr&  r'  r)  r*  rV  rw  staticmethodr  r  rn  r  ro  r  r}  r  r  rq  rp  r`   ra   rb   r-  r-    si       [[       " " " " ' ' ' X' % % % X% 	/ 	/ 	/ X	/ ' ' ' X'& & & &[ [ [ [z 9C 9C 9C \9Cv 
 
 
 \
&- - - -^    \> N N N \N` ) ) ) \)V    \. G G G \GR    \& - - - \-^ : : : \: : :ra   r-  c                      e Zd ZdZdZeZddddddfd	d
ddddfddddddfddddddfddddddfdeddddfddddddfddddd dffZdӈ fd%Z	 e
j        d&          dd)            Zdd*Zdd,Z e
j        d-d.d/d0d1d2d3d4          dd5            Zdd7Zdd8Zdd:Zdd<Zdd>Zdd?ZddAZddBZddDZddEZddGZddHZeZeZ e
j        dIdJdKdLd/          ddN            ZddPZddRZ ddTZ! e
j        dU          ddW            Z" e
j        dU          ddX            Z#dd\Z$ddaZ%ddhZ&ddiZ'ddlZ( e
j        dm          ddo            Z) e
j        dm          ddq            Z* e
j        drdsdtdu          ddw            Z+ddyZ,ddzZ-dd{Z.dd}Z/ddZ0e1dd            Z2e1dd            Z3e1dd            Z4e5dd            Z6e5dd            Z7e5dd            Z8e5dd            Z9ddZ:e5dd            Z;e5dd            Z<e5dd            Z=e5dd            Z>ddZ?ddZ@ddZAddZBddZCddZDd dZEddZFe5dd            ZGddZHddZIddZJddZKe5dd            ZLe5dd            ZMddZNddZOd	dZPd
dZQddĄZRddńZSddǄZTdd˄ZUdd̈́ZVddЄZW e
j        d-d3          dd҄            ZX xZYS (  rl  a  BaseChecker for variables.

    Checks for
    * unused variables / imports
    * undefined variables
    * redefinition of variable from builtins or from an outer scope or except handler
    * use of variable before assignment
    * __all__ consistency
    * self/cls assignment
    	variableszinit-importFynz<y or n>zBTells whether we should check for unused import in __init__ files.)defaulttypemetavarhelpzdummy-variables-rgxz;_+$|(_[a-zA-Z0-9_]*[a-zA-Z0-9]+?$)|dummy|^ignored_|^unused_regexpz<regexp>zYA regular expression matching the name of dummy variables (i.e. expected to not be used).zadditional-builtinsr`   csvz<comma separated list>zList of additional names supposed to be defined in builtins. Remember that you should avoid defining new builtins when possible.	callbacks)cb__cbz<callbacks>z|List of strings which can identify a callback function by name. A callback name must start or end with one of those strings.zredefining-builtins-modules)z	six.moveszpast.builtinszfuture.builtinsbuiltinsiozQList of qualified module names which can have objects that can redefine builtins.zignored-argument-namesz:Argument names that match this expression will be ignored.zallow-global-unused-variablesTzGTells whether unused global variables should be treated as a violation.zallowed-redefined-builtinsz(List of names allowed to shadow builtinslinterr"   rg   r.  c                    t                                          |           g | _        g | _        g | _        	 i | _        d| _        d S NF)superr5  _to_consume_type_annotation_names_except_handler_names_queue_evaluated_type_checking_scopes_postponed_evaluation_enabled)r4  r	  	__class__s     rb   r5  zVariablesChecker.__init__  sZ       0213#  	( 	2  	, .3***ra   r  rv   	nodes.Forc                x   t          |j        t          j                  sd S |j        j        }t          j        |j                  }t          |t                    sd S | 	                    |          }|sd S t          |t          j        j                  rIt          |          dk    rt          d |D                       rd S t          d |D                       rd S t          |t          j                  r8t          |j        t          j                  rt          |          dk    rd S d S d S t          d |D                       }|D ]m}|                     |          }|o|t          |          k    }t          |          |k    r.|s,t'          ||          }	|                     |||||	            d S nd S )N   c              3  F   K   | ]}t          |j                  d k    V  dS )r  N)r   elts)r   xs     rb   r   z-VariablesChecker.visit_for.<locals>.<genexpr>>  s/      (J(JaQV)9(J(J(J(J(J(Jra   c              3  J   K   | ]}t          |t          j                  V  d S r   rp   r   r  r   rj  s     rb   r   z-VariablesChecker.visit_for.<locals>.<genexpr>C  s.      KK:fem44KKKKKKra   c              3  J   K   | ]}t          |t          j                  V  d S r   r  r  s     rb   r   z-VariablesChecker.visit_for.<locals>.<genexpr>O  s?       % %6<
65=11% % % % % %ra   )rp   rj  r   r.   r  r   r   r   r|   _nodes_to_unpackrl   objects	DictItemsr   r  r   r(   r  _get_value_lengthr   _report_unbalanced_unpacking)
r4  rv   ri  rx   r   is_starred_targetsr~   value_lengthis_valid_star_unpackdetailss
             rb   	visit_forzVariablesChecker.visit_for'  s    $+u{33 	F+"#DI..(J// 	F&&x00 	Fh 9:: 	
 7||q  S(J(J6(J(J(J%J%J  KK7KKKKK h
++ 	$)UZ00  w<<1$$F  %$ "% % %@G% % % " "   
 
#55e<<'9 (lcO O ?$ w<<<//8L/7hGGG55hw   EE
 
ra   c                0    |                      |           d S r   _store_type_annotation_namesr4  rv   s     rb   	leave_forzVariablesChecker.leave_for^      ))$/////ra   nodes.Modulec                @   t          |d          g| _        t          |          | _        |j                                        D ]Y\  }}t          j        |          r@|                     |d                   s|dk    r;| 	                    d||d                    ZdS )zoVisit module : update consumption analysis variable
        checks globals doesn't overrides builtins.
        rs   r   r]   r  argsrv   N)
r-  r  r   r  rn   r   r   
is_builtin _should_ignore_redefined_builtinadd_message)r4  rv   re   r   s       rb   visit_modulezVariablesChecker.visit_modulea  s     *$99:-LT-R-R*;,,.. 	P 	PKD%%% P88qBB diFWFW  !44eAh OOO		P 	Pra   r  r  r  r   r   r   r  r   c                t   t          | j                  dk    sJ |                     |           | j                                        j        }d|j        v r|                     ||           |                     |           | j        j	        j
        s	|j        rdS |                     |           g | _        dS )zLeave module: check globals.rY   __all__N)r   r  _check_metaclassespopr&  rn   
_check_all_check_globalsr	  configinit_importpackage_check_importsr  )r4  rv   r   s      rb   leave_modulezVariablesChecker.leave_modulen  s     4#$$))))%%%'++--8##OOD,/// 	L))) {!- 	$, 	FL)))&(###ra   nodes.ClassDefc                V    | j                             t          |d                     dS )z2Visit class: update consumption analysis variable.classNr  r   r-  r*  s     rb   visit_classdefzVariablesChecker.visit_classdef  s)    dG < <=====ra   c                    |                     t          j                  D ]}t          |j        t          j                  rt          |j        j        t          j                  rt          |j        j        j        t          j                  rV|j        j        j        }| j	        D ]=}|j
        |j        v r-|                    |j
        |j        |j
                             n>| j	                                         dS )z2Leave class: update consumption analysis variable.N)r   r   r  rp   r   r   r   	Attributeexprr  re   r&  rV  r8  )r4  rv   r   hidden_name_nodeconsumers        rb   leave_classdefzVariablesChecker.leave_classdef  s     ,,UZ88 	 	I9+UZ88y/4eoFF y/495:FF
 $-#3#8#=  $ 0  H',0CCC 11,1$/0@0EF    D 	ra   nodes.Lambdac                V    | j                             t          |d                     dS )z3Visit lambda: update consumption analysis variable.lambdaNrC  r*  s     rb   visit_lambdazVariablesChecker.visit_lambda  s)    dH = =>>>>>ra   _c                8    | j                                          dS )z3Leave lambda: update consumption analysis variable.Nr  r8  r4  rO  s     rb   leave_lambdazVariablesChecker.leave_lambda       	ra   nodes.GeneratorExpc                V    | j                             t          |d                     dS )z4Visit genexpr: update consumption analysis variable.comprehensionNrC  r*  s     rb   visit_generatorexpz#VariablesChecker.visit_generatorexp  )    dO D DEEEEEra   c                8    | j                                          dS )z4Leave genexpr: update consumption analysis variable.NrQ  rR  s     rb   leave_generatorexpz#VariablesChecker.leave_generatorexp  rT  ra   nodes.DictCompc                V    | j                             t          |d                     dS )z5Visit dictcomp: update consumption analysis variable.rW  NrC  r*  s     rb   visit_dictcompzVariablesChecker.visit_dictcomp  rY  ra   c                8    | j                                          dS )z5Leave dictcomp: update consumption analysis variable.NrQ  rR  s     rb   leave_dictcompzVariablesChecker.leave_dictcomp  rT  ra   nodes.SetCompc                V    | j                             t          |d                     dS )z4Visit setcomp: update consumption analysis variable.rW  NrC  r*  s     rb   visit_setcompzVariablesChecker.visit_setcomp  rY  ra   c                8    | j                                          dS )z4Leave setcomp: update consumption analysis variable.NrQ  rR  s     rb   leave_setcompzVariablesChecker.leave_setcomp  rT  ra   r   c                6   | j                             t          |d                     | j                            d          s| j                            d          sdS |                                j        }|                                D ]\  }}||v rt          |t          j
                  s||         d         }t          |t          j                  r|j        t          k    r]t          d ||         D                       r}|j        }|                     ||          s|                     d||f|           t%          j        |          rB|                     |          s-|                     |          s|                     d||           dS )zFVisit function: update consumption analysis variable and check locals.functionr  r  Nr   c              3  4   K   | ]}t          |          V  d S r   )r   )r   
definitions     rb   r   z5VariablesChecker.visit_functiondef.<locals>.<genexpr>  s<        ;E*:66     ra   r/  )r  r   r-  r	  is_message_enabledr   globalsr   rp   r   r   rq   rk   rr   r   r   _is_name_ignoredr3  r   r1  _allowed_redefined_builtinr2  )r4  rv   globsre   rc   ri  lines          rb   visit_functiondefz"VariablesChecker.visit_functiondef  s   dJ ? ?@@@K**+ABB	{--.ABB	 F		#**,, 	L 	LJD$u}}Zel%C%C}"4[^
z5+;<<"*f44    INt      !,,,T488 $$.dD\ %   
  &&L77==L ==dCCL   !44d KKK;	L 	Lra   c           	        |                      |           |j        r|                     |j                   |j        r|j        D ]}|                     |           | j                                        j        }| j                            d          s6| j                            d          s| j                            d          sdS t          j
        |          rdS |                                }|r|                                rdS t          |                    t          j                            }t          |                    t          j                            }t%                      }|                    t          j                  D ]=}|j        D ]3}	t          j        |	j                  D ]}
|                    |
           4>|                                D ]%\  }
}|                     |
||d         |||           &dS )z5Leave function: check function's locals are consumed.r  r  r	  Nr   )r7  type_comment_returns_store_type_annotation_nodetype_comment_argsr  r8  r&  r	  rj  r   is_error	is_methodis_abstractr   r   r   r   r[  r   ComprehensionScope
generatorsfind_assigned_names_recursiverj  addr   _check_is_unused)r4  rv   argument_annotationr   rv  r   nonlocal_namescomprehension_target_namescomprehension_scope	generatorre   r   s               rb   leave_functiondefz"VariablesChecker.leave_functiondef  s:   %%%$ 	H,,T-FGGG! 	F'+'= F F#001DEEEE'++--8K**+<==	{--.HII	 {--.?@@	
 F >$ 	F NN$$	 	))++ 	F-d.A.A%,.O.OPP/0C0CEN0S0STT/2uu"#'#6#6u7O#P#P 	9 	90; 9 9	!?	@PQQ 9 9D.224888899 (--// 	 	KD%!!a*   	 	ra   r   r   r  r  nodes.Globalc                   |                                 }t          |t          j                  r|                     d|t
                     dS |                                }d}|                                j        }|j	        D ]^}	 |
                    |          }n# t          j        $ r g }Y nw xY wt          d |                    |d          D                        }t          j        ||          s8t          j        ||          s#|r!|                     d||t
                     d	}|D ]}	t          |	t          j                  r(|	j        |j        v r|                     d
||            nl|	                                 |u r nTt          |	t          j        t          j        f          r|	j        |u r n#|r |                     d||t
                     d	}`|r|                     d|t
                     dS dS )z0Check names imported exists in the global scope.r  rv   
confidenceNTc              3  b   K   | ]*}t          |t          j        t          j        f          V  +d S r   )rp   r   r   rq   )r   locals     rb   r   z0VariablesChecker.visit_global.<locals>.<genexpr>9  sJ       4 4 55<1A"BCC4 4 4 4 4 4ra   r`   r   r0  rv   r  Fr  r/  r   r  )r   rp   r   r   r3  r   r   r   rn   r   r   rl   NotFoundErrorr   ro   r   is_reassigned_after_currentis_deleted_after_currentr   re   special_attributesr   r   r   )
r4  rv   r   rs   default_messagelocals_re   assign_nodesnot_defined_locally_by_importanodes
             rb   visit_globalzVariablesChecker.visit_global!  sr    

eU\** 	5DTRRRF**,,%J 2	, 2	,D"%~~d33( " " "!" 14 4 4$[[r224 4 4 1 1 -)
 5dDAA6tTBB 2
   2#	 !    #(% , ,ue&677
f&???$$%8t$$OOOE;;==F**Euu~u7H&IJJ.. E0 ,$$3!!#'	 %    ',O 	M/dtLLLLL	M 	Ms   BB21B2nodes.AssignNamec                    t          |                                t          j                  r|                     |           d S d S r   )rp   r   r   r   
visit_namer*  s     rb   visit_assignnamez!VariablesChecker.visit_assignnamei  sD    d&&((%/:: 	"OOD!!!!!	" 	"ra   nodes.DelNamec                0    |                      |           d S r   )r  r*  s     rb   visit_delnamezVariablesChecker.visit_delnamem  s    ra   -nodes.Name | nodes.AssignName | nodes.DelNamec                    |                                 }|j        0|                                j                            d          rJ dS |                     ||           |                     |           dS )zDon't add the 'utils.only_required_for_messages' decorator here!

        It's important that all 'Name' nodes are visited, otherwise the
        'NamesConsumers' won't be correct.
        Nz.py)rc  r   r   fileendswith"_undefined_and_used_before_checker_loopvar_name)r4  rv   rc   s      rb   r  zVariablesChecker.visit_namep  su     ~~?"yy{{'0077777F//d;;;4     ra   r  nodes.ExceptHandlerc                (   |j         rt          |j         t          j                  sd S | j        D ]@\  }}|j         j         |j         k    r&|                     d|j         |j        f|            nA| j                            ||j         f           d S )Nr  r/  )re   rp   r   r   r  r3  r   r   )r4  rv   outer_exceptouter_except_assign_names       rb   visit_excepthandlerz$VariablesChecker.visit_excepthandler  s    y 	
49e6F G G 	F6:6V 	 	2L2y~!9!>>>  *279PQ !   
  ? 	(//ty0ABBBBBra   c                    |j         rt          |j         t          j                  sd S | j                                         d S r   )re   rp   r   r   r  r8  r*  s     rb   leave_excepthandlerz$VariablesChecker.leave_excepthandler  sB    y 	
49e6F G G 	F(,,.....ra   r   rc   r   c                V   |                                 }t          | j                  dz
  }| j        |         j        }t	          |dd          D ]}| j        |         }|                     ||||k              r+|                     |||||          \  }}	|	r0|	|j        |j                 z  }	|	                    |j        |	           |t          j        u r|t          j        u r d S |j        t          j        j        v st!          j        |j                  s|j        | j        j        j        v ss|j        dk    r+t+          d |                                D                       sAt!          j        |t0                    s%|                     d|j        |           d S d S d S d S d S d S )NrY   r   r  c              3  r   K   | ]2}t          |t          j                  |                                V  3d S r   )rp   r   r   rv  r   is     rb   r   zFVariablesChecker._undefined_and_used_before_checker.<locals>.<genexpr>  sQ        !!U%677KKMM     ra   r   r/  )r   r   r  r*  range_should_node_be_skipped_check_consumerr)  re   rV  rX   r^   r_   r   r   scope_attrsr   r1  r	  r;  additional_builtinsr   r  node_ignores_exception	NameErrorr3  )
r4  rv   rc   r   start_indexbase_scope_typer  current_consumeractionnodes_to_consumes
             rb   r  z3VariablesChecker._undefined_and_used_before_checker  s    

$*++a/ *;7B{B++ 	 	A#/2 ++D2BADTUU '+';';dE#3_( ($F$   O
 !$4$G	$RR  11$)=MNNN4===4;;; < I111	** 2yDK.BBB	[((  !0022     ) .tY?? ) 1	MMMMM 2111BB((((ra   rI  r-  is_start_indexr   c                   |j         dk    ryt          j        |j                  s|s|                               rdS t          j        t          j                  r&t          j        j        t          j	                  rdS nv|j         dk    rD| 
                    |j                  r)t          fd|j        j        D                       rdS dS |j         dk    rt          j        |j                  rdS dS )zTests a consumer and node for various conditions in which the node shouldn't
        be checked for the undefined-variable and used-before-assignment checks.
        rB  Trg  c              3  B   K   | ]}j         |j         j         k    V  d S r   r   )r   paramrv   s     rb   r   z;VariablesChecker._should_node_be_skipped.<locals>.<genexpr>  s.      WWE49
/WWWWWWra   FrM  )r*  r   is_ancestor_namerv   _ignore_class_scoperp   r   r   Keywordr   _defined_in_function_definitionr   type_paramsis_default_argument)r4  rv   rI  r  s    `  rb   r  z(VariablesChecker._should_node_be_skipped  s#    ')) %hmT:: "'+'?'?'E'E t $+u}55 *"EN; ;  t J..43W3W(-4
 4
. WWWWX]=VWWWWW u
 4 H,,1J(-2
 2
, 4ura   r   r   r  r  rf   =tuple[VariableVisitConsumerAction, list[nodes.NodeNG] | None]c           
     4   |j         |j        v rVt          j        |j                  st          |t          j                  s#|                     |           t          j
        dfS |                    |          }|t          j        dfS |sL|                     ||           |j        |j                  }|                     ||          }t          j
        |fS |                     |           t          j        |d                   }|                                }	|	                                }
||
u o>|
                    |          o)t          |
t          j                  o|j         |
j         k    }|rnt          j        |t          j                  rOt          j        |          r-|                                j                                        |
urt          j
        dfS |                     ||||	||
||          \  }}}|rt          j        dfS |rt          j        |          st9          j        ||	d          s|	|u o%t          |t          j        t          j        f          }|s|s|st          |	t          j                   rt          j!        |tD                    sw| j#        rQt          |t          j$        t          j%        t          j&        f          r |j         |'                                j(        v s|rt          j        |gfS t          j        dfS nn|dk    r| j#        r&t          |t          j$        t          j%        f          sjt          |t          j$                  rt          j        |t          j%                  s1| )                    d|j         |tT                     t          j
        |fS n|dk    r[t          |t          j                  rA|j         |j(        v r3|j+        |	j+        k    r#| )                    d|j         |tT                     nl| ,                    |j                   s| -                    ||	          r|                                j(        .                    |j                   r$| )                    d|j         |tT                     n#| )                    d|j         |tT                     t          j
        |fS t          |	t          j                  r| /                    ||	|          S t          |t          j0                  rkt          |j        t          j1                  rL| 2                    ||j                  r1| )                    d|j         |tf                     t          j
        |fS t          j
        |fS )z>Checks a consumer for conditions that should trigger messages.Nr   )r  rM  r   r  r   )4re   r'  r   is_func_decoratorrv   rp   r   rx  _check_late_binding_closurerX   r_   rw  r^   _report_unfound_name_definitionr)  -_filter_type_checking_import_from_consumptionassign_parentrc  r   r   r   r   Lambdar  r   r   _is_variable_violationis_defined_beforerl   are_exclusiveDelNamer   Deleter  r  r  r  r   r   r   rn   r3  r   r   _is_builtin_is_only_type_assignmentro   _is_first_level_self_referencer  IfExp_is_never_evaluatedr   )r4  rv   rc   r   r  r  rs  r  defnodedefstmtr   is_recursive_klassmaybe_before_assignannotation_returnuse_outer_definitiondefined_by_stmts                   rb   r  z VariablesChecker._check_consumer  s    9(111 &'7'<== BZe.F F B 006663:DAA&::4@@/8$?? 	007GHHH  0B49M#QQ&    ,2  
 	((...%k!n55##%%==?? X +""4((+8U^44+ 	X]*	 	 	>5dELII	> -d33		>
 ::<<&,,..h>>( 06== ''	
 	
		
    	@/8$??  d	M+D11d	M )$HHd	M &o *u}e&673 3O #@"@ %@ gu|44	@ 3D)DD L :L&  % % 1 % L !I);;;* R$?$H4&#QQ ; DdKK H,, 6M"4%/5;L)MNNM tU_55	M
 =dEDUVVM $$0!Y!#'	 %    8>LL H,, uen55
	U\117+===$$0!Y!#'	 %    !!$),, 	M1N1N'2
 2
 	M zz||"&&ty11   ,494TX !       (tytPT !    06DD00 	M66tWkRRR11 		M'.%+66 M++GW^DD M$$,!Y!#,	 %    8>LL+2K@@ra   c                   | j         rt          j        |          rdS |                     |j                  rdS |                     |          rdS |j        | j        v r(|                                | j        |j                 v rdS |j        |j        v rt          nt          }|                     d|j        ||           dS )zqReports used-before-assignment when all name definition nodes
        get filtered out by NamesConsumer.
        Nr   r  )r  r   "is_node_in_type_annotation_contextr  re   #_is_variable_annotation_in_functionr  r   r)  r   r   r3  )r4  rv   r  r  s       rb   r  z0VariablesChecker._report_unfound_name_definition  s     .	8>>	 FDI&& 	F33D99 	FI===

 DTY OOOF !I)9)LLLLLRV 	 	$!	 	 	
 	
 	
 	
 	
ra   r  rQ  c                   t          d |D             d          rZ|                     |          sE| j                            |j        g                               |                                           fd|D             }|S )zsDo not consume type-checking import node as used-before-assignment
        may invoke in different scopes.
        c              3     K   | ];}t          |t          j        t          j        f          (t	          |          7|V  <d S r   )rp   r   r   rq   r   )r   rT  s     rb   r   zQVariablesChecker._filter_type_checking_import_from_consumption.<locals>.<genexpr>  sb        a%,0@!ABB +1--	     ra   Nc                     g | ]
}|k    |S r`   r`   )r   rT  type_checking_imports     rb   r<  zRVariablesChecker._filter_type_checking_import_from_consumption.<locals>.<listcomp>  s$    UUU!1@T;T;TA;T;T;Tra   )r  r  r  
setdefaultre   r   r   )r4  rv   r  r  s      @rb   r  z>VariablesChecker._filter_type_checking_import_from_consumption  s      $ )    
  
   	(P(PQU(V(V 	0;;DIrJJQQ

   VUUU'7UUUra   r   r   c                   | j         st          j        |          rdS t          |          rdS t	          |j        t          j                  rt          |j                  rdS |j	        D ]\  }}|
                    d          }	 t          t          ||d                             }n# t          j        $ r Y Pw xY wt	          |t          j                  so|                     |||dd                    dS )!Check modules attribute accesses.Nr   r   rY   )_analyse_fallback_blocksr   is_from_fallback_blockr   rp   r   r   r  r   r   splitr  r   rl   ResolveErrorr   _check_module_attrs)r4  rv   re   rO  partsrs   s         rb   visit_importzVariablesChecker.visit_import  s    , 	1Md1S1S 	 F!$'' 	Fdk58,, 	dk1J1J 	Fz 	> 	>GD!JJsOOE0uQx@@AA'   fel33 $$T659====	> 	>s   #B**B<;B<rd   c                (   | j         st          j        |          rdS t          |          rdS t	          |j        t          j                  rt          |j                  rdS |j	        
                    d          }	 |                    |d                   }n# t          j        $ r Y dS w xY w|                     |||dd                   }|sdS |j        D ]6\  }}|dk    r|                     |||
                    d                     7dS )r  Nr   r   rY   r   )r  r   r  r   rp   r   r   r  r   rk   r  rj   rl   rm   r  r   )r4  rv   
name_partsrs   re   rO  s         rb   visit_importfromz!VariablesChecker.visit_importfrom  sC    , 	1Md1S1S 	 F "$'' 	Fdk58,, 	dk1J1J 	F\'',,
	**:a=99FF+ 	 	 	FF	))$
122GG 	Fz 	D 	DGD!s{{$$T64::c??CCCC	D 	Ds   ?B B.-B.r  r  r  unbalanced_dict_unpackingrw   c                   |                      |           t          |j        d         t          j        t          j        f          sdS |j        d                                         }t          d |D                       rdS 	 t          j	        |j
                  }||                     |||           dS dS # t          j        $ r Y dS w xY w)zCheck unbalanced tuple unpacking for assignments and unpacking
        non-sequences as well as in case self/cls get assigned.
        r   Nc              3  J   K   | ]}t          |t          j                  V  d S r   r  r  s     rb   r   z0VariablesChecker.visit_assign.<locals>.<genexpr>1  s.      GGVz&%-00GGGGGGra   )_check_self_cls_assignrp   ri  r   r.   r)   iteredr   r   r   r~   _check_unpackingrl   InferenceError)r4  rv   ri  rx   s       rb   visit_assignzVariablesChecker.visit_assign   s     	##D)))$,q/EK+DEE 	F,q/((** GGwGGGGG 	F	'
33H#%%hg>>>>> $#% 	 	 	FF	s   2B: :CCnodes.ListCompc                V    | j                             t          |d                     dS )z5Visit listcomp: update consumption analysis variable.rW  NrC  r*  s     rb   visit_listcompzVariablesChecker.visit_listcomp<  rY  ra   c                8    | j                                          dS )z5Leave listcomp: update consumption analysis variable.NrQ  rR  s     rb   leave_listcompzVariablesChecker.leave_listcomp@  rT  ra   c                0    |                      |           d S r   r(  r*  s     rb   leave_assignzVariablesChecker.leave_assignE  r,  ra   
nodes.Withc                0    |                      |           d S r   r(  r*  s     rb   
leave_withzVariablesChecker.leave_withH  r,  ra   nodes.Argumentsc                D    |j         D ]}|                     |           d S r   )rt  rs  )r4  rv   
annotations      rb   visit_argumentsz VariablesChecker.visit_argumentsK  s5    0 	9 	9J,,Z8888	9 	9ra   c                >    t          | j        j        j                  S r   )r   r	  r;  analyse_fallback_blocksrI  s    rb   r  z)VariablesChecker._analyse_fallback_blocksP  s    DK&>???ra   Iterable[str]c                $    | j         j        j        S r   )r	  r;  ignored_modulesrI  s    rb   _ignored_modulesz!VariablesChecker._ignored_modulesT  s    {!11ra   c                >    t          | j        j        j                  S r   )r   r	  r;  allow_global_unused_variablesrI  s    rb   _allow_global_unused_variablesz/VariablesChecker._allow_global_unused_variablesX  s    DK&DEEEra   c                   d}t          |t          j                  r|                                 |u r| |j        j        v p7| |j        j        v p)| |j        j        v p| |j        j        u p| |j        j	        u pd|j        
                    |           pJ|j        o|j        
                    |           p)|j        o"| |j        u p|j        
                    |           }|S r  )rp   r   r   rc  r0  r   posonlyargs_annotationskwonlyargs_annotationsvarargannotationkwargannotationr   
decoratorsreturns)rv   r   %in_annotation_or_default_or_decorators      rb   r  z0VariablesChecker._defined_in_function_definition\  s	    16-eU.// 	DNN4D4D4M4M EJ22 :uzAA:uz@@: uz::: uz99 :''-- $I)9)C)CD)I)I M Q.O%-2I2I$2O2O 2 54ra   c                6   | }| j         }|||u rdS t          |t          j                  r||j        urdS t          |t          j                  r||j        urdS t          |t          j                  r|j        r||j        d         u sdS |}|j         }|dS )zReturn True if node within a lambda/comprehension body (or similar) and thus
        should not have access to class attributes in frame.
        NFTr   )	r   rp   r   r  r0  Comprehensionr   rx  ry  )rv   r   r]  r   s       rb    _in_lambda_or_comprehension_bodyz1VariablesChecker._in_lambda_or_comprehension_bodys  s      u&%,// E4L4Lt&%"566 5;S;St&%":;; !&+v/@/C&C&C tE]F!  " ura   r  r  r  r   r  tuple[bool, bool, bool]c                    d}d}	d}
||urt           ||          }n |j        0 j        |j        v st	          j         j                  d         rd}nt          |t          j                  p+t           	                                t          j
                  ot                     }|sV|                                                     j                  d         r$d}||k    ot          t          j                   }
n< j        |j        v r.t!           fd|                                D                        }|dk    rtt          |t          j                  rZ j        |j        v rLt          t          j                  o. j        v o%|j         j                 d         j        |j        k      }nt          |t          j                  rt          |t          j                  r |j        u rZ|                    |j                  r@d}	|j        j        |j        v r)|j         j                 d         j        |j        k     rd}nd}t           j        t          j                  r|j        |j        k    }n|rd}n|o|j        |j        k    }|r|j        |j        k    rt          |t          j                  r*||u r&|                               r|j        v s||urd}n_t          |t4                    r;t6                              |          r!||u r|                               r||u rd}nt          t          j                  r||u r|                    |          r||u r؉j         j        k    rj         j        k     sj         j        k     srt>          sj         j        k    rt          |t          j         t          j!        t          j"        t          j#        f          rUt          |j$        t          j%                  r6j$         u p,t!          fd &                                D                       }||	|
fS )NTFrY   c              3  h   K   | ],}t          |t          j                  oj        |j        v V  -d S r   rZ  r\  s     rb   r   z:VariablesChecker._is_variable_violation.<locals>.<genexpr>  sQ       . . uen55R$)u{:R. . . . . .ra   rM  r   c              3  *   K   | ]}|j         u V  d S r   r  )r   ancr  s     rb   r   z:VariablesChecker._is_variable_violation.<locals>.<genexpr>'	  sC       G G14w},G G G G G Gra   )'r   r   re   r  rl   builtin_lookuprp   r   r   r   r  r   r   lookupr  rn   r   rk  r   r   defaultsr   r  r   r   r  NODES_WITH_VALUE_ATTRrl   _maybe_used_and_assigned_at_oncer  
col_offsetr   r}   r  r   r  r~   	JoinedStrr  )rv   r  rc   r  r   r   r  r  r  r  r  forbid_lookups   ``          rb   r  z'VariablesChecker._is_variable_violation  s    #!$  "6tUH"M"M_$ 	X111)$)44Q7 2 ',# 5%"344 :djjllEL99* $D))  ! 
X]]__%;%;DI%F%Fq%I 
&+#'+w (zU0@ @ <$$ ho--*- . . . .!)!6!6!8!8. . . + + '# x''5%.11 (	U\)) 7EO44 OG,,OL+A.9G<NN#
 %.11 W	j5$7
 7
 W	
 u}$$););EM)J)J$$(!M&(/99 	215<u|KK +0''*.'$+u77 L&*o9K&K# E	"& $M7;M(M   # ?t':L'L'Lx):;;>)) **400 *  8#777  w.. +0''w(=>>2(II'RR2 )) **400 *
 +0'' ' )) **400 * $Ndk99 ' 2T_ D D#NT[88
 !* 9 !($+ = = * '$)L$)O$)O$)L	!"! ! !> !+7=%/ J J !>& +2-4*? +3 G G G G8<8K8K8M8MG G G D D' #$57KKKra   c                <   t          | t          j                  rt          d | j        D                       S t          | t          j                  rdS t          | t          j                  rdS t          | j        t          j                  r#t          d | j        j	        D                       S | j        }t          |t          j                  rdS t          |t          j
                  r!t          |j        t          j                  rdS t          |t          j                  r t          d |j        D                       rdS t          |t          j                  sdS t          d |                    t          j                  D                       S )zeCheck if `defstmt` has the potential to use and assign a name in the
        same statement.
        c              3  $   K   | ]}|j         V  d S r   )guard)r   cases     rb   r   zDVariablesChecker._maybe_used_and_assigned_at_once.<locals>.<genexpr>3	  s$      <<dtz<<<<<<ra   Tc              3     K   | ]N}t          |g t          t          j        t          j        R           2t
                              |          V  Od S r   )rp   r!  r   r  Matchrl  r"  r   r  s     rb   r   zDVariablesChecker._maybe_used_and_assigned_at_once.<locals>.<genexpr>9	  sl        c#U%:#UEK#U#U#UVV AA#FF     ra   c              3     K   | ]D}t          |d          t          j                  pt          |d         t          j                  V  EdS )r   rY   Nrp   r   r  )r   r  s     rb   r   zDVariablesChecker._maybe_used_and_assigned_at_once.<locals>.<genexpr>C	  s[       1
 1
 tAw,,P
47EK0P0P1
 1
 1
 1
 1
 1
ra   Fc              3    K   | ]}t          d  |j        D                       p`t          d |j        D                       pBt          |j        t
          j                  o#t          |j        j        t
          j                  V  dS )c              3  T   K   | ]#}t          |j        t          j                  V  $d S r   )rp   r~   r   r  )r   kwargs     rb   r   zNVariablesChecker._maybe_used_and_assigned_at_once.<locals>.<genexpr>.<genexpr>K	  s0      PP
5;44PPPPPPra   c              3  J   K   | ]}t          |t          j                  V  d S r   r.  )r   args     rb   r   zNVariablesChecker._maybe_used_and_assigned_at_once.<locals>.<genexpr>.<genexpr>L	  s.      EEC:c5;//EEEEEEra   N)	r   keywordsr0  rp   r   r   rF  rG  r  )r   r   s     rb   r   zDVariablesChecker._maybe_used_and_assigned_at_once.<locals>.<genexpr>J	  s       
 
  PP$-PPPPP EE49EEEEE 49eo66 <ty~u{;;
 
 
 
 
 
ra   )klass)rp   r   r+  r   casesr  	TypeAliasr~   BaseContainerr  r  r  r(   r   r   r   )r  r~   s     rb   r"  z1VariablesChecker._maybe_used_and_assigned_at_once-	  s   
 gu{++ 	=<<gm<<<<<<gu{++ 	4gu// 	4gmU%899 	  "=-     
 eU[)) 	4eU\** 	z%*ek/R/R 	4eUZ(( 	S 1
 1
1
 1
 1
 .
 .
 	 4%,, 	5 
 
 ,,5:,>>
 
 
 
 
 	
ra   re   c                P    || j         j        j        v pt          j        |          S r   )r	  r;  r  r   r1  r4  re   s     rb   r  zVariablesChecker._is_builtinT	  s&    t{)==WAQRVAWAWWra   c                    t          |t          j                  r|j        rdS |                                }                                 } }||j        urv|                                }|                    t          j                  D ]z}||u rt           fd|                    t          j
                  D                       r;t           fd|                    t          j                  D                       r dS {|j                             j        g           }|D ]||k    rj         j        k    r n{t          j        t          j                  rj        j        rOt          j        t          j                  r-t          fd                                 D                       s dS |j        }||j        uvdS )z>Check if variable only gets assigned a type and never a value.Fc              3  4   K   | ]}j         |j        v V  d S r   )re   r   )r   nlrv   s     rb   r   z<VariablesChecker._is_only_type_assignment.<locals>.<genexpr>j	  s@         I)     ra   c              3  8   K   | ]}j         |j         k    V  d S r   r   )r   anrv   s     rb   r   z<VariablesChecker._is_only_type_assignment.<locals>.<genexpr>m	  s@         I(     ra   c              3  4   K   | ]}|j         j        u V  d S r   )r   r~   )r   r  ref_nodes     rb   r   z<VariablesChecker._is_only_type_assignment.<locals>.<genexpr>	  s>        9<x44     ra   T)rp   r   r  r~   r   r   r   r   r   r   r[  r   rn   ro   re   r   r  r  )	rv   r  defstmt_frame
node_framer   r   
inner_func
local_refsrA  s	   `       @rb   r  z)VariablesChecker._is_only_type_assignmentW	  s&   
 '5?33 	w} 	5ZZ\\
M000!<<>>L +99%:KLL 
! 
!
--    (77GG     !     (778HII    ! !55%,00B??J& ! ! !J..8?T[3P3PE #8?EODD!,! x@@!     @D@S@S@U@U    ! !55!(FW M000X tra   rs  c                   |                                  j        |k    r|                                 |                                  k    rt          j        |           r0t          j        |           st          j        dfS t          j        dfS t          | j        t          j                  r2t          | j        j        t          j                  rt          j        dfS t          j        |fS )zCheck if a first level method's annotation or default values
        refers to its own class, and return a consumer action.
        N)r   r   rc  r   r  r   rX   r^   r_   rp   r   r   r   )rv   r  rs  s      rb   r  z/VariablesChecker._is_first_level_self_reference	  s     ::<<'))dnn.>.>$**,,.N.N 7== B<TBB H7@$GG3:DAA$+uz22 Dz"EO8 8 D 4<dCC+2K@@ra   nodes.NamedExprdefnode_parentnodes.IfExpc                    t          j        |j                  }t          |t          j                  r,|j        du r| |j        k    rdS |j        du r| |j        k    rdS dS )z`Check if a NamedExpr is inside a side of if ... else that never
        gets evaluated.
        TF)	r   r   r  rp   r   r  r~   r  r  )r  rH  inferred_tests      rb   r  z$VariablesChecker._is_never_evaluated	  sp     ()<==mU[11 	"d**w.:O/O/Ot"e++>;N0N0Ntura   c                    t          j        | t          j                  }|ot          j        |t          j                  S r   )r   r   r   r  r   )rv   is_annotations     rb   r  z4VariablesChecker._is_variable_annotation_in_function	  s;    =dEOTT 5u0 	
ra   c                v   |j         }|                                                                }|                     ||          }t	          j        ||          }|s|r|j                                        j        }n|j        }t          |t          j
                  s|o|                     ||           o||v  S )a  Return True if the node is in a local class scope, as an assignment.

        Detect if we are in a local class scope, as an assignment.
        For example, the following is fair game.

        class A:
           b = 1
           c = lambda b=b: b * b

        class B:
           tp = 1
           def func(self, arg: tp):
               ...
        class C:
           tp = 2
           def func(self, arg=tp):
               ...
        class C:
           class Tp:
               pass
           class D(Tp):
               ...
        )re   rc  r   r  r   r  r   rn   rp   r   r   r  )r4  rv   re   r   r  in_ancestor_listframe_localss          rb   r  z$VariablesChecker._ignore_class_scope	  s    0 y  &&((040T0T%1
 1
- !1%>>0 	(4D 	( <--//6LL <Lu~..W2W %99$FFF%$
 	
ra   astroid.Namec           	        d |                     |j                  d         D             }|                                t          t          j        t          j        f          rt          fd|D                       rd S |r|d         j        |d         	                                k    r |d         j        
                    |          s_|d         j        sRt          |d         j        t          j                  s0|d                                         
                    |          rg }n
|d d         }t          |dd                    D ]{\  }}	 ||                                         }n# t          j        j        $ r Y 7w xY w|
                    |          rt%          j        ||          sf|                    |           ||}t+          |          dk    rd S |d                                         }t          |t          j        t          j        t          j        f          r(|                                |                                usd S t          |t          j                  s|                     d|j        |           d S |j        D ]K}t          |t          j        t          j        t          j        t          j        f          r d S t          |t          j                   rt          |j!        t          j"                  rt%          j#        |j!        j$                  }	t          |	t          j                  r|	j%        rt%          j#        |	j%                  }
t          |
t          j                  r)|
&                                h tN          tP          dv r d S t          |
tR          j*                  r|
&                                dk    r d S Mt%          j+        |t          j,                  }|rnt%          j+        |t          j                  }|rMt%          j+        |t          j-                  }|n+|j                                        u r|j        |j.        v rd S 	 t_          |j0        1                                          }t          |t          j*                  r|&                                dk    rx|j0        }t          |j0        t          j2                  r|j0        j3        }t          |t          j"                  r,t_          |j4        d         1                                          }t          |t          j*                  r|&                                tj          k    rd S t          j6        t          j7        t          j8        t          j9        t          j:        j;        f}t          ||          s|                     d|j        |           d S ty          |d	ty          |d
g                     }|s|                     d|j        |           d S d S # t          j=        $ r! |                     d|j        |           Y d S w xY w)Nc                2    g | ]}t          |d           |S )r   )hasattr)r   ss     rb   r<  z2VariablesChecker._loopvar_name.<locals>.<listcomp>	  s'    TTT'!]:S:ST!TTTra   rY   c              3  f   K   | ]+}|                                                               V  ,d S r   )r   r   )r   asmtr   s     rb   r   z1VariablesChecker._loopvar_name.<locals>.<genexpr>	  sR       H
 H
.2DJJLL""5))H
 H
 H
 H
 H
 H
ra   r   r  r/  ztyping._SpecialFormzbuiltins.enumerater  r   )>r  re   r   rp   r   r  r   r   r   r   r   is_statementr   rc  	enumeraterl   
exceptionsParentMissingErrorr   in_for_else_branchr   r   r   r   r  GeneratorExpr3  r  r  r  r  r  r  r~   r   r   r   r  qnamer   r   r   Instancer   r  rx  rn   r  r   r   r  r  r0  BUILTIN_RANGEr)   r.   r(   r'   r  r@   r   r  )r4  rv   astmts_astmtsr  rc   astmt_statementassign	else_stmtinferred_funcinferred_returnmaybe_walrusmaybe_comprehensionr  rx   likely_call	sequenceselementsr   s                     @rb   r  zVariablesChecker._loopvar_name	  sn   TTT[[33A6TTT
 

eelE,=>?? 	C H
 H
 H
 H
6<H
 H
 H
 E
 E
 	 F 	! q	 F1INN$4$4441I$..t44 5 q	&	 5
 "&)"2ELAA 5 1I''))33D99 5 GGRaRjG ,, 		! 		!GAt"()"5"5"7"7%8   ((.. u7O8 8  NN4    v;;!F&&((v	5+>@RSTT	  ""$..*:*:::F&%),, 	6TYTRRRF 	 	IEL%+u{ENS   )UZ00 Z6 6  !& 01E F F}e.?@@%- ',&6}7L&M&MO!'):  )//11 6(6%6 .6  
  #?ENCC+11337LLL<T5?SS 	"'"Ge1# # # &+&K')A' '# '.'.4466%??	%8%???F$	WFK--//00H 8W%566ANN$$(<<<$kfk5;77 3"(+"2Kk5:66 A#K$4Q$7$=$=$?$?@@H
 8W%566NN$$55  

	)I h	22   !:QU VVVx7B1O1OPPH W  !:QU VVVVVW W/ % 	S 	S 	S6TYTRRRRRR	Ss%   E22F	F	6CX/ /,YYr   r   r~  r  c                "   |                      |          rd S t          |t          j                  rQdk    rKt	          |j        d                   dk    r-t          |j        d         d         t          j                  rd S t          |t          j        t          j        t          j	        f          r|rt          ||          rd S |v rd S | j        v rd S |                                }|v rg|j        dk    rAd}|j                                        D ]!}	t!          |	d          o
|	j        dk    }|r n"|rd S |                     ||||           d S |j        rGt          |j        t          j        t          j        t          j        t          j        f          r|v rd S d x}
}t          |t          j        t          j	        f          rRt	          |j                  dk    r"t/          fd|j        D             d           }n|j        d         }|r	|\  }
}|p|
t1          ||                                          rd	}nt          |t          j                  r)||
 d
| }nd }|                     d||           d S t          |t          j	                  r8||
 d|j         d| }n d|j         }|                     d||           d S d}t          |t          j                  r	|j        rd S t;          j        |          rd S t          |j        t          j                  r?tA          fd|j        !                    t          j"                  D                       rd S |                     ||           d S )Nr  rY   r   __new__Fre   r5  c              3  $   K   | ]
}|v |V  d S r   r`   )r   r   re   s     rb   r   z4VariablesChecker._check_is_unused.<locals>.<genexpr>
  s'      HH5$%------HHra   r   imported as import r  r/   imported from  as r  c              3  .   K   | ]}|j         k    V  d S r   r   )r   rT  re   s     rb   r   z4VariablesChecker._check_is_unused.<locals>.<genexpr>
  sB       D D#$$D D D D D Dra   )#rl  rp   r   r   r   rn   r   r   r   rq   r   r  argnamesre   r   rk  rT  _check_unused_argumentsr}   r  r.   r   r   r  r   r   r3  rk   r  r   is_overload_stubrd  r   r   r  )r4  re   rv   rc   r   r~  r  ru  is_init_defrT  r^  r   import_namesmessage_namemsgs    `             rb   r|  z!VariablesChecker._check_is_unusedz
  s%      t,, 	F tU.//	##DK,--224;{3A6GG 3 F dU\5<9IJKK 	  6t\ J J  ---F 4...F==??8yI%%#1133  A")!V"4"4"O!&J:NK"   F((tT8^TTTTT{ zelEOU[%)T     >))F!!EF$u/? @AA 
+tz??Q&&#'HHHHDJHHH$$ $LL $(:a=L +$0ME6!?UD*4>> 19dEL11 )!&==V==...$$_3T$JJJFdE$455 )!&QQt|QQQQ!%DDdlDD$$_3T$JJJF0$ 122 t  %d++  $+u':;;  D D D D(,(B(B5:(N(ND D D A A  \4@@@@@ra   &re.Pattern[str] | re.Match[str] | Nonec                    | j         j        j        }t          |t          j                  rt          |j        t          j                  st          |t          j                  r| j         j        j        }n|}|o|	                    |          S r   )
r	  r;  dummy_variables_rgxrp   r   r   r   r   ignored_argument_namesmatch)r4  rc   re   authorized_rgxregexs        rb   rl  z!VariablesChecker._is_name_ignored
  s     +?tU-..	#4;88	# $00	#
 &*[%7%NEE"E *T***ra   ru  	list[str]c                                                    }j                                        }|r=t          |t          j                  r#t          j        |          rt          nt          }nt          }|rfj        dk    r||d         k    rd S t          |j                  }	|	||	                                v rd S j        t          j        v rj        dvrd S t!          fd| j        j        j        D                       rd S t          j                  rd S t          j                  rd S t          j        |          rd S ||v rd S |                     d|||           d S )Nr  r   )r5  rn  c              3     K   | ]8}j                             |          pj                             |          V  9d S r   )re   r   r  )r   cbrv   s     rb   r   z;VariablesChecker._check_unused_arguments.<locals>.<genexpr>  s\       
 
 I  $$>	(:(:2(>(>
 
 
 
 
 
ra   r	  r  )rv  r   r   rp   r   r   r   has_known_basesr   r    r   r  r   re   ru  	PYMETHODSr   r	  r;  r  (is_registered_in_singledispatch_functionrw  is_protocol_classr3  )
r4  re   rv   rc   ru  r~  rv  r5  r  
overriddens
     `       rb   rv  z(VariablesChecker._check_unused_arguments
  s    NN$$	!!## 	E5>:: 	"2599P		?P J J 	yN**tx{/B/B*5$)<<J%$*2E2E2G2G*G*GyEO++	 B 1 1  
 
 
 
k(2
 
 
 
 
 	 F9$?? 	F !$'' 	F "5)) 	F>!!F*DZXXXXXra   c                   | j                             d          sdS |                                }t          j        ||          r|j                                        }t          |t          j        t          j	        f          r|j
        |j        v rdS |                    |j
                  \  }}|r|                    |          sdS t          j        |          r|                     d||j
                   dS |d         }|}|rCt          |t          j                  s)||u rdS |j        }|rt          |t          j                  )|r{|                    |          rht          j        |          sV|j        rQt          |                                t          j                  s'|                     d||j
                   dS dS dS dS dS dS )a:  Check whether node is a cell var that is assigned within a containing loop.

        Special cases where we don't care about the error:
        1. When the node's function is immediately called, e.g. (lambda: i)()
        2. When the node's function is returned from within the loop, e.g. return lambda: i
        r  Nrv   r0  r   )r	  rj  r   r   r  r   rp   r   r  r   re   rn   r  r   is_comprehensionr3  r   is_being_calledrc  r  )r4  rv   
node_scopeassign_scoper   assignment_node	maybe_fors          rb   r  z,VariablesChecker._check_late_binding_closure'  s.    {--.BCC 	FZZ\\
 $T:66 	3#*0022J :e6G'HII	yJ---F"kk$)44e 	L22:>> 	F!,// 	V149MMMMM $AhO'I VJy%)$D$D V,,E%,	  VJy%)$D$D V V!++J77V "1*==V #)	V
 'z';';'='=u|LLV $$%949$UUUUUV V V V V V V V V Vra   c                j    t          |t          j                  sdS |j        | j        j        j        v S r  )rp   r   rq   rk   r	  r;  redefining_builtins_modules)r4  rc   s     rb   r2  z1VariablesChecker._should_ignore_redefined_builtinY  s1    $ 011 	5|t{1MMMra   c                (    || j         j        j        v S r   )r	  r;  allowed_redefined_builtinsr:  s     rb   rm  z+VariablesChecker._allowed_redefined_builtin^  s    t{)DDDra   c                    t          j        | t          j                  }|duo&|                                                     |          S )z]Return True if a ComprehensionScope intervenes between `node` and its
        frame.
        N)r   r   r   rx  r   r   )rv   closest_comprehension_scopes     rb   rm  z6VariablesChecker._comprehension_between_frame_and_nodea  sP    
 ',&K%*'
 '
# +$6 
4::<<;Q;Q'<
 <
 	
ra   type_annotationc                   t          |t          j                  r!| j                            |j                   dS t          |t          j                  r|                     |j                   dS t          |t          j	                  sdS t          |j
        t          j                  r_t          |j
        j        t          j                  r;|j
        j        j        t          k    r!| j                            t                     dS | j                            d |                    t          j                  D                        dS )z?Given a type annotation, store all the name nodes it refers to.Nc              3  $   K   | ]}|j         V  d S r   r   )r   r  s     rb   r   z?VariablesChecker._store_type_annotation_node.<locals>.<genexpr>  s5       +
 +
 *JO+
 +
 +
 +
 +
 +
ra   )rp   r   r  r  r   re   rF  rs  rG  	Subscriptr~   TYPING_MODULEextendr   )r4  r  s     rb   rs  z,VariablesChecker._store_type_annotation_nodem  s4   ouz22 	'../CDDDFou77 	,,_-ABBBF/5?;; 	F ,eo>>	?05uzBB	  %*/=@@'..}===F#** +
 +
.=.L.LUZ.X.X+
 +
 +
 	
 	
 	
 	
 	
ra   %nodes.For | nodes.Assign | nodes.Withc                P    |j         }|sd S |                     |j                    d S r   )r  rs  )r4  rv   r  s      rb   r)  z-VariablesChecker._store_type_annotation_names  s6     . 	F(()=>>>>>ra   c                   t                      }|j        D ]u}t          |t          j                  r|                    |j                   7t          |t          j                  r$|                    d |j	        D                        v|
                                }|
                                j        ot          d |j        D                       }|r+|
                                j        
                                }t          |t          j                  r*|                                rd|                                vsdS |                                }|sdS |d         }||v r|                     d||f           dS dS )z'Check that self/cls don't get assigned.c              3  X   K   | ]%}t          |t          j                  |j        V  &d S r   r  r,  s     rb   r   z:VariablesChecker._check_self_cls_assign.<locals>.<genexpr>  sJ       $ $!$z#uGW7X7X$H$ $ $ $ $ $ra   c              3  N   K   | ] }t          |t          j                  |V  !d S r   )rp   r   r[  rz  s     rb   r   z:VariablesChecker._check_self_cls_assign.<locals>.<genexpr>  sG       ?
 ?
Zu~-N-N?
?
 ?
 ?
 ?
 ?
 ?
ra   zbuiltins.staticmethodNr   r  r  )r   ri  rp   r   r   r{  re   r.   updater  r   r   r   r  r   rv  decoratornamesru  r3  )r4  rv   assign_namesrj  r   nonlocals_with_same_nameargument_namesself_cls_names           rb   r  z'VariablesChecker._check_self_cls_assign  s   (+l 	 	F&%"233   ----FEK00 ## $ $(.$ $ $    

#'::<<#6 $
3 ?
 ?
$z?
 ?
 ?
 <
 <
  $ 	0JJLL'--//E ue/00	!!	 (u/C/C/E/EEEF)) 	F&q)L((2]DTUUUUU )(ra   rx   r   ri  c                   t          j        |          rdS t          j        |          rdS t          |t          j                  rdS t          |j        t          j                  r;t          |j	        t          j
                  r|j	        j        |j        j        k    rdS |                     |          }t          ||          }|Jt          |          t          |          k    r(|                     |||t          |          |           dS dS t          j        |          s|                     ||           dS dS )zRCheck for unbalanced tuple unpacking
        and unpacking non sequences.
        N)r   is_inside_abstract_classr  rp   r   UninferableBaser   r   r   r~   r  re   varargr  r   r   r!  is_iterable_report_unpacking_non_sequence)r4  rx   rv   ri  r   r%  s         rb   r  z!VariablesChecker._check_unpacking  sN    )$// 	F!$'' 	Fh 455 	Fx88	4:uz22	 
8?#999 F &&x00+D(;;7||s6{{**11(GS[['     +*
 "8,, 	?//g>>>>>	? 	?ra   
value_nodeintc                   t                               |           }|t          |          S t          | t          j                  r5t          | j        t          t          f          rt          | j                  S t          | t          j	                  rW| j
        j        pd}| j
        j        j        | j
        j        j        z
  }t          t          j        ||z                      }|S dS r   )rl  r  r   rp   r   r  r~   rf   bytesr  slicestepupperlowerr  mathceil)r  value_subnodesr  splice_rangesplice_lengths        rb   r   z"VariablesChecker._get_value_length  s    ):::FF%~&&&j%+.. 	):sEl4
 4
 	) z'(((j%/22 	!#(-AD%+17*:J:P:VVL	,*= > >??M  qra   rW  c                f   t          | t          j        t          j        t          j        gt
          R           r|                                 S t          | t          j                  rIt          d | 
                                D                       rd |                                 D             S dS )z/Return the list of values of the `Assign` node.c              3  F   K   | ]}|                                 d k    V  dS )ztyping.NamedTupleN)r^  )r   r  s     rb   r   z4VariablesChecker._nodes_to_unpack.<locals>.<genexpr>  sC       6
 6
8@HNN 336
 6
 6
 6
 6
 6
ra   c                F    g | ]}t          |t          j                  |S r`   )rp   r   r   r  s     rb   r<  z5VariablesChecker._nodes_to_unpack.<locals>.<listcomp>  s*    PPP!
1e>N0O0OPAPPPra   N)rp   r   r.   r)   r'   r|   r  rl   r_  r   	ancestorsr   )rv   s    rb   r  z!VariablesChecker._nodes_to_unpack  s     dU[%*eiM*MMNN 	!;;== dG,-- 	Q# 6
 6
DHNNDTDT6
 6
 6
 3
 3
 	Q QPt{{}}PPPPtra   values_countr%  c                    |t          |          t          |          dk    rdnd||dk    rdndf}t          |t                    rdnd}|                     |||t                     d S )NrY   rz   rU  r  r  )rv   r0  r  )r   rp   r|   r3  r   )r4  rv   rx   ri  r  r%  r0  symbols           rb   r!  z-VariablesChecker._report_unbalanced_unpacking  s     LLg,,!##BB!##BB
 (J//.''- 	
 	d)LLLLLra   c                n    |r|                     d          sd| }|                     d||           d S )N r  r  )r   r3  )r4  rv   r%  s      rb   r  z/VariablesChecker._report_unpacking_non_sequence  sL     	$7--c22 	$#'mmG17KKKKKra   _base_nodes.ImportNoders   module_namesnodes.Module | Nonec                   |r
|                     d          }|dk    rd}n	 |                    |          d         }t          |t          j                  s=t          |                                          }t          |t          j                  sdS nu# t          j        $ rR t          |
                                 d| | j                  rY dS |                     d||j        f|           Y dS t          j        $ r Y dS w xY w|
|r:|r|j        nd}|                     d|d                    |          |f           dS t          |t          j                  r|S dS )zCheck that module_names (list of string) are accessible through the
        given module, if the latest access name corresponds to a module, return it.
        r   __dict__Nr   r   r/  r  )r8  r   rp   r   r   r  r   rl   r  r   r^  r
  r3  re   r  rA  )r4  rv   rs   r  re   rk   s         rb   r  z$VariablesChecker._check_module_attrs  s     	##A&&Dz!!--a0!&%,77 $!&,,..11F%fel;; $#t(    %%?%?%?%?AVWW  44  'tV[.A !    tt)   tt)  	,  	%+;fkkG#$chh|6L6Lg5V     4fel++ 	Mts   A0B ;DD6DDr   r   c                   	 t          |                    d                    }n# t          j        $ r Y d S w xY wt	          |t
          j                  rd S |                                dvr)|j        |j	        }}| 
                    d|||           d S t          |dd          D ]}	 t          |                                          }n# t          j        $ r Y 7w xY wt	          |t
          j                  rV|j        s^t	          |t          j                  rt	          |j        t"                    s+| 
                    d|                                |           |j        }||v r||= ||j        vr|j        s| 
                    d	|f|           t*          j                            |j                  d
         }t*          j                            |          dk    rx|j        dz   |z   }		 t          j                            |	                    d                     # t<          $ r | 
                    d	|f|           Y t>          $ r Y w xY wd S )Nr6  >   builtins.listbuiltins.tupler   )ro  r#  rv   r  r`   r   r/  r   r   r5  r   ) r  igetattrrl   r  rp   r   r  pytypetolinenor#  r3  r   r   r   r   r  r~   rf   r   rn   r=  ospathsplitextr  basenamere   modutilsfile_from_modpathr  ImportErrorSyntaxError)
r4  rv   r   assignedro  colr  elt_namer  re   s
             rb   r9  zVariablesChecker._check_all-  s   	DMM)4455HH% 	 	 	FF	h 455 	F??$GGG )8+>#D1SWXXXF8VR00 )	! )	!C		,,)   (D$899 ? h44 J= =    !5CMMOORU VVV~H<'' *t{**| !$$0{ %      "w//	::1=Hw''11Z??#y39
!#,>>tzz#OOOO*    ,, 8{QT -       + ! ! ! !D	!K)	! )	!s6   "% 88+!CCC82H,,#I	IIdict[str, nodes.NodeNG]c                    | j         rd S |                                D ]3\  }}|D ]+}t          |          r|                     d|f|           ,4d S )Nr  r/  )r  r   r   r3  )r4  r   re   node_lstrv   s        rb   r:  zVariablesChecker._check_globalse  s    . 	F*0022 	M 	MND(  M M)$//   !2$t LLLLM	M 	Mra   c                   t          |          }t                      }t          j        t                    }|D ]\  }}|j        D ]}|d         x}}	|	dk    r|}|d         }
||v r"|||
fvr)|                    |           |	| j        v p|
| j        v }|
o4| j        j	        j
        o#| j        j	        j
                            |
          }t          |t          j                  s!t          |t          j                  ry|j        srt          |t          j                  rt"                              |	          r|s|r|
d|	 }n|	 d|
 }t'          |          s|                     d||           4t          |t          j                  r|j        t*          k    rt"                              |	          rzt-          ||          r|s|r|	dk    r$||j        |f                             |           |
|	 d|j         }n|	 d|j         d	|
 }t'          |          s|                     d||           |                                D ]y\  }}t3          |          dk    r	|d         }n2d
                    d |d d         D                        d|d          }|                     d||d         f|d                    z| `d S )Nr   r   rY   rq  rp  r  r/  rr  rs  r?  c              3     K   | ]}|V  d S r   r`   r  s     rb   r   z2VariablesChecker._check_imports.<locals>.<genexpr>  s"       = =q = = = = = =ra   r   z and r  )r   r   r1  r   r2  r   r{  r  r	  r;  r~  r  rp   r   r   rq   rk   SPECIAL_OBJsearchr   r3  rr   ru   r   r   r   rA  r  )r4  r   local_namescheckedunused_wildcard_importsre   rc   r   	real_nameimported_nameas_nameis_type_annotation_importis_dummy_importr{  rs   unused_list
arg_strings                    rb   r>  zVariablesChecker._check_importso  s   &|44%% #D)) 	  & D	S D	SJD$: CS CS,3AJ6	M C'' $I!!*''	7333I&&& "T%@@ >$"== *  N*>N*>DDWMM   dEL11 -StU%566-S?C|-S "$(899 !k>P>P%? ? !
 !0 !O ! !777!.FFWFF1$77 O((s(NNNe&677 SDLF<R<R"))-88 ! !-dD99 ! !0 !O ! !$++/t0DELLTRRRR"?%2"Q"Q4<"Q"QCC%2"^"^4<"^"^U\"^"^C5d;; S ,,_3T,RRRGCSL $;#@#@#B#B 		 		FK;1$$(^

 yy = =K,< = = ===UUKPROUU  (
F1I/FVTUY      ra    nodes.Module | nodes.FunctionDefc                    g }|                                 D ]E}t          |t          j                  r)|                    |                     ||                     F|D ]\  }}|                    |d           dS )z,Update consumption analysis for metaclasses.N)rk  rp   r   r   r  _check_classdef_metaclassesr8  )r4  rv   r'  
child_nodescope_localsre   s         rb   r7  z#VariablesChecker._check_metaclasses  s    DF++-- 	T 	TJ*en55 T @ @T R RSSS #+ 	) 	)L$T4((((	) 	)ra   r5  rr  /list[tuple[dict[str, list[nodes.NodeNG]], str]]c                   |j         sg S g }|                                }d}t          |j         t          j                  r|j         j        }nt          |j         t          j                  r[|j         j        rO|j         j        }t          |t          j                  s!|j        }t          |t          j                  !|j        }npt          |j         t          j                  r6t          |j         j	        t          j                  r|j         j	        j        }n|r|
                                j        }d}t                              ||          }|r| j        d d d         D ]M\  }}	}	}	|                    |g           }
|
D ]-}|j        |j        k    r|                    ||f           d} n.N|j                            |g           }|D ]}|j        |j        k    rd} n|sU|sS|t          j        j        v s@t'          j        |          s,|| j        j        j        v s|                     d||f           |S )Nrz   Fr   Tr   r  )
_metaclass	metaclassrp   r   r  re   rF  rG  r   r   r   METACLASS_NAME_TRANSFORMSro   r  r   r   rn   r   r  r   r1  r	  r;  r  r3  )r4  r5  rr  r'  r  re   attrfoundr  rO  rs  
found_nodenodes_in_parent_scopefound_node_parents                 rb   r  z,VariablesChecker._check_classdef_metaclasses  sy     	IDFOO%%	e&
33 	)#(DD(%/:: 
	)u?O?T 
	)#(D uz22 !y !uz22 !9DD(%*55 	)*!5:;
 ;
 	) #(-DD 	)>>##(D(,,T488 	)-)9$$B$)?  %aA*..tR88"-  J!(EL88 t(<=== $ 9
 %0$6$:$:4$D$D!%:  !$+u|;; EE < 		M		M 000#D)) 14;-AAA 1TGLLLra   nodes.Subscriptc                d    t          j        |j                  }|                     ||           d S r   )r   r   r  _check_potential_index_errorr4  rv   inferred_slices      rb   visit_subscriptz VariablesChecker.visit_subscript  s0    )$*55))$?????ra   r  nodes.NodeNG | Nonec                P   t          |t          j                  rt          |j        t                    sdS t          |j        t          j        t          j        f          rDt          |j        j                  |j        dz   k     r| 	                    d|t                     dS dS )z,Check for the potential-index-error message.NrY   r  r  )rp   r   r  r~   r  r.   r)   r   r  r3  r   r   s      rb   r  z-VariablesChecker._check_potential_index_error  s    
 .%+66 	j #?
 ?
 	 F dj5;
";<< 	4:?##n&:Q&>>>  +$9 !    F	 	ra   nodes.Constc                   |                                 dk    rdS t          j        |          sdS |j        }t	          |t
          j                  r|j        }t	          |t
          j                  r;t          |	                                d          }|t          j
        |d          rdS 	 t          |j                  }|                     |           dS # t          $ r Y dS t          j        $ r Y dS w xY w)zTake note of names that appear inside string literal type annotations
        unless the string is a parameter to `typing.Literal` or `typing.Annotation`.
        zbuiltins.strN)	AnnotatedLiteral)r  r   r  r   rp   r   r.   r  r  rk  is_typing_memberr   r~   rs  
ValueErrorrl   AstroidSyntaxError)r4  rv   r   originr  s        rb   visit_constzVariablesChecker.visit_const#  s    ;;==N**F7== 	F fek** 	#]Ffeo.. 	&--//66F!e&<0' '! 	%dj11J,,Z88888 	 	 	DD) 	 	 	DD	s   /)C 
C9'C98C9r	  r"   rg   r.  )rv   r  rg   r.  )rv   r-  rg   r.  )rv   r@  rg   r.  )rv   rK  rg   r.  )rO  rK  rg   r.  )rv   rU  rg   r.  )rO  rU  rg   r.  )rv   r\  rg   r.  )rO  r\  rg   r.  )rv   ra  rg   r.  )rO  ra  rg   r.  )rv   r   rg   r.  )rv   r  rg   r.  )rv   r  rg   r.  )rv   r  rg   r.  )rv   r  rg   r.  )rv   r  rg   r.  )rv   r   rc   r   rg   r.  )rv   r   rI  r-  r  r   rg   r   )rv   r   rc   r   r   r   r  r-  r  rf   rg   r  )rv   r   r  r-  rg   r.  )rv   r   r  rQ  rg   rQ  )rv   r   rg   r.  )rv   rd   rg   r.  )rv   rw   rg   r.  )rv   r  rg   r.  )rO  r  rg   r.  )rv   r  rg   r.  )rv   r  rg   r.  )rg   r   )rg   r  )rv   r   r   r   rg   r   )rv   r   r  r   rc   r  r  r  r   r   r   r   r  rf   r  r   rg   r  )r  r  rg   r   )re   rf   rg   r   )rv   r   r  r  rg   r   )rv   r   r  r@  rs  rQ  rg   r  )r  rG  rH  rI  rg   r   )rv   r   rg   r   )rv   rQ  rg   r.  )re   rf   rv   r   rc   r   r   r   r~  r  r  r  rg   r.  )rc   r   re   rf   rg   r|  )re   rf   rv   r   rc   r   ru  r  r~  r  rg   r.  )rv   r   rg   r.  )rc   r   rg   r   )rv   r   rg   r   )r  r   rg   r.  )rv   r  rg   r.  )rx   r   rv   rw   ri  rQ  rg   r.  )r  r   rg   r  )rv   r   rg   rW  )rv   r   rx   r   ri  rQ  r  r  r%  rf   rg   r.  )rv   r   r%  rf   rg   r.  )rv   r  rs   r-  r  r  rg   r  )rv   r-  r   r   rg   r.  )r   r  rg   r.  )r   r   rg   r.  )rv   r  rg   r.  )r5  r@  rr  r  rg   r  )rv   r  rg   r.  )rv   r  r  r  rg   r.  )rv   r  rg   r.  )ZrZ   r[   r\   r]   re   r#  msgsIGNORED_ARGUMENT_NAMESoptionsr5  r   only_required_for_messagesr&  r+  r4  r?  rD  rJ  rN  rS  rX  r[  r^  r`  rc  re  rp  r  visit_asyncfunctiondefleave_asyncfunctiondefr  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r  r	   r  r
  r  r  r  r  r  r"  r  r  r  r  r  r  r  r|  rl  rv  r  r2  rm  rm  rs  r)  r  r  r   r  r!  r  r  r9  r:  r>  r7  r  r  r  r  __classcell__)r  s   @rb   rl  rl    s	       	 	 DD  %"	 		
 "X %<	 		
 "3!	 
	
 )(1	 
	
 * 3. 	
" %1 %T	 	
 ,%a	 	
 )3B	 	
[VGp3 3 3 3 3 3 &U%# 2 2 2 2h0 0 0 0P P P P &U%  	 	) ) )	 	)(> > > >   (? ? ? ?   
F F F F   
F F F F   
F F F F   
&L &L &L &LP, , , ,\ /.%U%#&  ?M ?M ?M ?MB" " " "   ! ! ! ! &U%&<==C C C >=C &U%&<==/ / / >=/
.N .N .N .N`( ( ( (VEA EA EA EAN
 
 
 
>       0 &U%&9::> > > ;:>, &U%&9::D D D ;:D4 &U%$ #	    ,F F F F   
0 0 0 00 0 0 09 9 9 9
 @ @ @ _@ 2 2 2 _2 F F F _F 5 5 5 \5,    \6 [L [L [L \[Lz $
 $
 $
 \$
LX X X X 7 7 7 \7r A A A \A(    \ 
 
 
 \
&
 &
 &
 &
ROW OW OW OWdeA eA eA eAN+ + + +"3Y 3Y 3Y 3Yj0V 0V 0V 0VdN N N N
E E E E 	
 	
 	
 \	

 
 
 
2? ? ? ?V V V V<? ? ? ?B    \    \M M M M.L L L L
' ' ' 'R6! 6! 6! 6!pM M M MW W W Wr) ) ) )4 4 4 4l@ @ @ @
   & &U%   	     ra   rl  r	  r"   r.  c                J    |                      t          |                      d S r   )register_checkerrl  )r	  s    rb   registerr  F  s%    
,V4455555ra   )rc   rd   re   rf   rg   rh   )rv   rw   rx   r   rg   rf   )rv   r   r   r   r   r   rg   r   )rv   r   re   rf   rg   r   )r   r   rg   r   )re   rf   r   r   rg   r   )rc   r   r   r   rg   r   )r   r   rg   r   )r   r   rg   r   )rc   r   r   r   rg   r   r  )_r]   r#   r   r1  r0  r   r  r  rer   collections.abcr   r   r   enumr   	functoolsr	   r&   r
   r   r   rl   astroid.exceptionsr   r   r   r   astroid.nodesr   astroid.typingr   pylint.checkersr   r   pylint.checkers.utilsr   r   r   r   r   pylint.constantsr   r   r   pylint.interfacesr   r   r   r    pylint.typingr!   pylint.lintr"   compiler  rr   r  r  r`  r  	frozensetTYPING_NAMESr  
DictValuesDictKeysr  node_classesr(   r|   r}   r  r   r  r  r+  r7  r!  rX   ru   r   r   r   r   r   r   r   r   r   r#  r+  r%  r-  rl  r  r`   ra   rb   <module>r,     s
  
 * ) ) " " " " " "           				 				 # # # # # # 9 9 9 9 9 9 9 9 9 9       % % % % % % 1 1 1 1 1 1 1 1 1 1      4 4 4 4 4 4 4 4 4 4 4 4 % % % % % % * * * * * * . . . . . . . .              F E E E E E E E E E N N N N N N N N N N N N 0 0 0 0 0 0 %$$$$$$bj+,,	#$<==  '.  y6 6 68 8v OOOM#	
 
L	O	O	J	L	K	O 	 	 	 	 	$ 	 	 	
 
 
 
   .I* I* I* I*X- - - -+@ +@ +@ +@\   ,   6 6 6 6      $P+ P+  P+  P+(  )P+2  3P+<  =P+F  GP+R  SP+`  aP+n  oP+z  {P+D  EP+N  OP+X  YP+d  eP+n  oP+x  yP+H	-$H	BCD 	0 U	>?@	UP+ P+ P+ P P P Pf    J   \
 \
 \
 \
 \
 \
 \
 \
@O" O" O" O" O"{ O" O" O"dD6 6 6 6 6 6ra   