
    zi             	         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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.m/Z/m0Z0 ddl1m2Z2 erddl3m4Z4  ej5        d          Z6dZ7 ej5        d          Z8ddiZ9dZ:dZ; e<h d          Z=ej>        j?        ej>        j@        ej>        jA        ej        jB        jC        fZDejE        ejF        ejG        ejH        ejI        ejJ        ejK        fZL G d de          ZMdd"ZNdd'ZOdd-ZPdd0ZQdd4ZRdd5ZSdd9ZTdd<ZUdd>ZVddBZWi 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ZXdteYdu<    G dv dwe          ZZ 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     d/var/www/tmov.alphamb/tmov_inventario/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AstroidBuildingException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   1  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   G  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>X  s*      33$c$*oo333333ra   )r   	itertoolschainfrom_iterable)r   valuess     rb   r   r   U  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>`  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   e  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d@d0            Zd1S )A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_consume/      |&&ra   c                    | j         j        S r   )r3  r'  rI  s    rb   r'  zNamesConsumer.consumed3  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_uncertain7  s     |..ra   c                    | j         j        S r   )r3  r*  rI  s    rb   r*  zNamesConsumer.scope_typeC  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>M  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_consumedG  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             }|rM|                     ||          }| 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>t  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_consumeU  sN    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>D  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>I  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>I  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_test1  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  nodes.Statementc                   g }| D ]}|                                 }t          j        |t          j                  }|s9|                              rO|j        }t          d |j        D                       }t          d |j	        D                       }	t          d |j	        D                       }
|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>h  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>l  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>p  ss       # # # >5:66 D~3UZ@@D-n.BCC# # # # # #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-  _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_exitss    `         rb   ro  z/NamesConsumer._uncertain_nodes_in_except_blocksQ  s[    % :	/ :	/J#-#7#7#9#9 %*%J$e&9& &" * %//55 ,B,I # $ $%7%<$ $ $ ! ! "% % %&8&?% % % " "  # # # '9&?	# # #     ! $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   Continuerk  r   r  r-  r  )rc   r  r]  s      rb   r  z9NamesConsumer._recursive_search_for_continue_before_break&  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>_  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_blocks:  s    /1!&!FE/"
 "
 ")""% 	/ 	/J#-#7#7#9#9 #'===
 C$ei '5 '.5.34 4        ?V>^	      "":....ra   c                r   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|                    |           |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   )	r   r  r   r~  r  rc  r  r   r   )	rs  rt  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_blocksj  s0    /1 ?EI
 
	
(1 (/""1/9: : #"%  	/  	/J#-#7#7#9#9  C$ei /8 /6 96;< <  07SSS    
 7V6_     T "":....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  )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 
 
 
 \
&- - - -^    \> D D D \DL ) ) ) \)V    \. G G G \GR    \& - - - \-^ 2 2 2 \2 2 2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>0  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><  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_forK      ))$/////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_moduleN  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_module[  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_classdefy  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  r3  )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.lambdaNr>  r%  s     rb   visit_lambdazVariablesChecker.visit_lambda  s)    dH = =>>>>>ra   _c                8    | j                                          dS )z3Leave lambda: update consumption analysis variable.Nr  r3  r4  rJ  s     rb   leave_lambdazVariablesChecker.leave_lambda       	ra   nodes.GeneratorExpc                V    | j                             t          |d                     dS )z4Visit genexpr: update consumption analysis variable.comprehensionNr>  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.NrL  rM  s     rb   leave_generatorexpz#VariablesChecker.leave_generatorexp  rO  ra   nodes.DictCompc                V    | j                             t          |d                     dS )z5Visit dictcomp: update consumption analysis variable.rR  Nr>  r%  s     rb   visit_dictcompzVariablesChecker.visit_dictcomp  rT  ra   c                8    | j                                          dS )z5Leave dictcomp: update consumption analysis variable.NrL  rM  s     rb   leave_dictcompzVariablesChecker.leave_dictcomp  rO  ra   nodes.SetCompc                V    | j                             t          |d                     dS )z4Visit setcomp: update consumption analysis variable.rR  Nr>  r%  s     rb   visit_setcompzVariablesChecker.visit_setcomp  rT  ra   c                8    | j                                          dS )z4Leave setcomp: update consumption analysis variable.NrL  rM  s     rb   leave_setcompzVariablesChecker.leave_setcomp  rO  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_ignoredr.  r   r,  _allowed_redefined_builtinr-  )r4  rv   globsre   rc   rd  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   )r2  type_comment_returns_store_type_annotation_nodetype_comment_argsr  r3  r&  r  re  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   rq  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>&  sJ       4 4 55<1A"BCC4 4 4 4 4 4ra   r`   r   r+  rv   r  Fr  r*  r   r  )r   rp   r   r   r.  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_assignnameV  sD    d&&((%/:: 	"OOD!!!!!	" 	"ra   nodes.DelNamec                0    |                      |           d S r   )r  r%  s     rb   visit_delnamezVariablesChecker.visit_delnameZ  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_name]  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
  r.  r   r   )r4  rv   outer_exceptouter_except_assign_names       rb   visit_excepthandlerz$VariablesChecker.visit_excepthandlerl  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
  r3  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   rq  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   r,  r  r6  additional_builtinsr   r  node_ignores_exception	NameErrorr.  )
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   rD  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.
        r=  Trb  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   FrH  )r*  r   is_ancestor_namerv   _ignore_class_scoperp   r   r   Keywordr   _defined_in_function_definitionr   type_paramsis_default_argument)r4  rv   rD  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  rH  r   r  r   )4re   r'  r   is_func_decoratorrv   rp   r   rs  _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   r.  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   r.  )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   rJ  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   rJ  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>  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.rR  Nr>  r%  s     rb   visit_listcompzVariablesChecker.visit_listcomp)  rT  ra   c                8    | j                                          dS )z5Leave listcomp: update consumption analysis variable.NrL  rM  s     rb   leave_listcompzVariablesChecker.leave_listcomp-  rO  ra   c                0    |                      |           d S r   r#  r%  s     rb   leave_assignzVariablesChecker.leave_assign2  r'  ra   
nodes.Withc                0    |                      |           d S r   r#  r%  s     rb   
leave_withzVariablesChecker.leave_with5  r'  ra   nodes.Argumentsc                D    |j         D ]}|                     |           d S r   )ro  rn  )r4  rv   
annotations      rb   visit_argumentsz VariablesChecker.visit_arguments8  s5    0 	9 	9J,,Z8888	9 	9ra   c                >    t          | j        j        j                  S r   )r   r  r6  analyse_fallback_blocksrI  s    rb   r  z)VariablesChecker._analyse_fallback_blocks=  s    DK&>???ra   Iterable[str]c                $    | j         j        j        S r   )r  r6  ignored_modulesrI  s    rb   _ignored_modulesz!VariablesChecker._ignored_modulesA  s    {!11ra   c                >    t          | j        j        j                  S r   )r   r  r6  allow_global_unused_variablesrI  s    rb   _allow_global_unused_variablesz/VariablesChecker._allow_global_unused_variablesE  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  r+  r   posonlyargs_annotationskwonlyargs_annotationsvarargannotationkwargannotationr   
decoratorsreturns)rv   r   %in_annotation_or_default_or_decorators      rb   r  z0VariablesChecker._defined_in_function_definitionI  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  r+  Comprehensionr   rs  rt  )rv   r   r]  r   s       rb    _in_lambda_or_comprehension_bodyz1VariablesChecker._in_lambda_or_comprehension_body`  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   rH  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> 	  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>&	  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>0	  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>8	  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>9	  s.      EEC:c5;//EEEEEEra   N)	r   keywordsr+  rp   r   r   rA  rB  r  )r   r   s     rb   r   zDVariablesChecker._maybe_used_and_assigned_at_once.<locals>.<genexpr>7	  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  r6  r  r   r,  r4  re   s     rb   r  zVariablesChecker._is_builtinA	  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>U	  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>X	  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>t	  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_refsr<  s	   `       @rb   r  z)VariablesChecker._is_only_type_assignmentD	  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  rC  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 ]u\  }}||                                         
                    |          r.t          j        ||                                         |          s`|                    |           v|}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 tH          tJ          dv r d S t          |	tL          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 	 tY          |j-        .                                          }t          |t^          j'                  r|#                                dk    rx|j-        }t          |j-        t          j0                  r|j-        j1        }t          |t          j                  r,tY          |j2        d         .                                          }t          |t^          j'                  r|#                                tf          k    rd S t          j4        t          j5        t          j6        t          j7        t^          j8        j9        f}t          ||          s|                     d|j        |           d S tu          |d	tu          |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  	enumerater   in_for_else_branchr   r   r   r   r  GeneratorExpr.  r  r  r  r  r  r  r~   r   r   r   r  qnamer   r   r   Instancer   r  rs  rn   r  r   r   rl   r  r  r+  BUILTIN_RANGEr)   r.   r(   r'   r  r@   r   r  )r4  rv   astmts_astmtsr  rc   assign	else_stmtinferred_funcinferred_returnmaybe_walrusmaybe_comprehensionr{  rx   likely_call	sequenceselementsr   s                    @rb   r  zVariablesChecker._loopvar_name	  sL   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ay""$$..t44 U=Uq	##%%t> >  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   0CX) ),YYr   r   ry  rz  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   )#rg  rp   r   r   r   rn   r   r   r   rq   r   r	  argnamesre   r   rk  rO  _check_unused_argumentsr}   r  r.   r   r   r  r   r   r.  rk   r  r   is_overload_stubrd  r   r   r  )r4  re   rv   rc   r   ry  rz  rm  is_init_defrT  rW  r   import_namesmessage_namemsgs    `             rb   rw  z!VariablesChecker._check_is_unuseda
  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  r6  dummy_variables_rgxrp   r   r   r   r   ignored_argument_namesmatch)r4  rc   re   authorized_rgxregexs        rb   rg  z!VariablesChecker._is_name_ignored
  s     +?tU-..	#4;88	# $00	#
 &*[%7%NEE"E *T***ra   rm  	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  rf  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  )rq  r   r   rp   r   r   r   has_known_basesr   r    r   r  r   re   rm  	PYMETHODSr   r  r6  r  (is_registered_in_singledispatch_functionro  is_protocol_classr.  )
r4  re   rv   rc   rm  ry  rq  r0  r  
overriddens
     `       rb   rn  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   r+  r   )r  re  r   r   r  r   rp   r   r  r   re   rn   r  r   is_comprehensionr.  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  r6  redefining_builtins_modules)r4  rc   s     rb   r-  z1VariablesChecker._should_ignore_redefined_builtin@  s1    $ 011 	5|t{1MMMra   c                (    || j         j        j        v S r   )r  r6  allowed_redefined_builtinsr5  s     rb   rh  z+VariablesChecker._allowed_redefined_builtinE  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   rs  r   r   )rv   closest_comprehension_scopes     rb   rm  z6VariablesChecker._comprehension_between_frame_and_nodeH  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>i  s5       +
 +
 *JO+
 +
 +
 +
 +
 +
ra   )rp   r   r  r	  r   re   rA  rn  rB  	Subscriptr~   TYPING_MODULEextendr   )r4  r  s     rb   rn  z,VariablesChecker._store_type_annotation_nodeT  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  rn  )r4  rv   r  s      rb   r$  z-VariablesChecker._store_type_annotation_namesm  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   rv  re   r.   updater  r   r   r   r  r   rq  decoratornamesrm  r.  )r4  rv   assign_namesrj  r   nonlocals_with_same_nameargument_namesself_cls_names           rb   r  z'VariablesChecker._check_self_cls_assignu  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)rW  )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   rX  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   rP  r  r  )rv   r+  r  )r   rp   r|   r.  r   )r4  rv   rx   ri  r  r   r+  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   r.  )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	 t          |                    |          d                                                   }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  )r3  r  r   r   rp   r   r   rl   r  r   rW  r  r.  re   r  rA  )r4  rv   rs   r  re   rk   s         rb   r  z$VariablesChecker._check_module_attrs  s     	##A&&Dz!!fnnT2215;;==>>!&%,77  4 (    %%?%?%?%?AVWW  44  'tV[.A !    tt)   tt%  	(  	%+;fkkG#$chh|6L6Lg5V     4fel++ 	Mts   AA9 9;C+7C+C+*C+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 )Nr1  >   builtins.listbuiltins.tupler   )rj  r  rv   r  r`   r   r*  r   r   r5  r   ) r  igetattrrl   r  rp   r   r  pytypetolinenor  r.  r   r   r   r   r  r~   rf   r   rn   r8  ospathsplitextr  basenamere   modutilsfile_from_modpathr  ImportErrorSyntaxError)
r4  rv   r   assignedrj  colr  elt_namer  re   s
             rb   r4  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   r.  )r4  r   re   node_lstrv   s        rb   r5  zVariablesChecker._check_globalsJ  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   ri  rh  r  r*  rj  rk  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   rv  r	  r  r6  rv  rx  rp   r   r   rq   rk   SPECIAL_OBJsearchr   r.  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_importrs  rs   unused_list
arg_strings                    rb   r9  zVariablesChecker._check_importsT  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_metaclassesr3  )r4  rv   r'  
child_nodescope_localsre   s         rb   r2  z#VariablesChecker._check_metaclasses  s    DF++-- 	T 	TJ*en55 T @ @T R RSSS #+ 	) 	)L$T4((((	) 	)ra   r0  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   rA  rB  r   r   r   METACLASS_NAME_TRANSFORMSro   r  r   r   rn   r   r  r   r,  r  r6  r  r.  )r4  r0  rr  r'  r  re   attrfoundr  rJ  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  r.  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~   rn  
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   rF  rg   r.  )rJ  rF  rg   r.  )rv   rP  rg   r.  )rJ  rP  rg   r.  )rv   rW  rg   r.  )rJ  rW  rg   r.  )rv   r\  rg   r.  )rJ  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  rg   r.  )rv   r   rc   r   rg   r.  )rv   r   rD  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.  )rJ  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  rB  rC  rD  rg   r   )rv   r   rg   r   )rv   rL  rg   r.  )re   rf   rv   r   rc   r   r   r   ry  r  rz  r  rg   r.  )rc   r   re   rf   rg   rt  )re   rf   rv   r   rc   r   rm  r{  ry  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.  )r0  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&  r/  r:  r?  rE  rI  rN  rS  rV  rY  r[  r^  r`  rk  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  rw  rg  rn  r  r-  rh  rm  rn  r$  r  r  r  r  r  r  r  r4  r5  r9  r2  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 5 5 5 \5n A A A \A(    \ 
 
 
 \
&
 &
 &
 &
RKW KW KW KW\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
% % % %N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  +  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   r   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  rY  r  	frozensetTYPING_NAMESr  
DictValuesDictKeysr  node_classesr(   r|   r}   r  r   r  r  r&  r2  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   J
 J
 J
 J
 J
 J
 J
 J
\G" G" G" G" G"{ G" G" G"TD6 6 6 6 6 6ra   