3
^^(             5   @   s:  d 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Zddlm	Z	m
Z
mZ ddlmZ ddlmZmZ ddlmZ ddlmZmZmZmZ dd	lmZ ejd
ZdZejdZddiZeddhZ dZ!dZ"edddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFh4Z#dGdH Z$dIdJ Z%edKdLdMdN Z&dOdP Z'dQdR Z(dSdT Z)dUdV Z*dWdX Z+dYdZ Z,d[d\ Z-d]d^ Z.d_d` Z/dadb Z0ddddddddddddddddddddddgifdddddgifddddZ1ej2ddZ3G dd dZ4G dd deZ5dd Z6dS )z#variables checkers for Python code
    N)	lru_cache)
decoratorsmodutilsobjects)InferenceContext)BaseCheckerutils)is_postponed_evaluation_enabled)HIGH	INFERENCEINFERENCE_FAILUREIAstroidChecker)get_global_optionz^_{2}[a-z]+_{2}$
__future__z_.*|^ignored_|^unused_Z_py_abcabcztyping.TYPE_CHECKINGZTYPE_CHECKINGzbuiltins.rangetypingZAnyCallableZClassVarZGenericOptionalTupleTypeZTypeVarUnionZAbstractSet
ByteString	ContainerZContextManagerHashable	ItemsViewIterableIteratorKeysViewMappingMappingViewMutableMappingMutableSequence
MutableSetSequenceSized
ValuesView	AwaitableAsyncIteratorAsyncIterable	Coroutine
CollectionAsyncGeneratorZAsyncContextManager
ReversibleZSupportsAbsZSupportsBytesZSupportsComplexZSupportsFloatZSupportsIntZSupportsRoundCounterZDequeDictZDefaultDictListSet	FrozenSetZ
NamedTuple	GeneratorZAnyStrZTextPatternc             C   s^   y| j | j}W n tjk
r&   dS X x0|jj|g D ]}t|tjr8|jtkr8dS q8W dS )z9Check if the name is a future import from another module.NT)	do_import_modulemodnameastroidAstroidBuildingExceptionlocalsget
isinstance
ImportFromFUTURE)stmtnamemoduleZ
local_node r@   ;/tmp/pip-build-8app2_gc/pylint/pylint/checkers/variables.py_is_from_future_importz   s    rB   c                s$   t | tjo"t fdd| jD S )zEReturns True if stmt in inside the else branch for a parent For stmt.c             3   s    | ]}|j  p| kV  qd S )N)	parent_of).0Z	else_stmt)r=   r@   rA   	<genexpr>   s    z%in_for_else_branch.<locals>.<genexpr>)r:   r6   Foranyorelse)parentr=   r@   )r=   rA   in_for_else_branch   s    rJ   i  )maxsizec             C   sb   yt | j|}W n ttfk
r*   dS X y|| }W n tk
rL   dS X t|tjr^|S dS )zget overridden method if anyN)nextZlocal_attr_ancestorsStopIterationKeyErrorr:   r6   FunctionDef)klassr>   rI   Z	meth_noder@   r@   rA   overridden_method   s    rQ   c             C   s`   d}|j  j}| j  j|krH| j|jkr6d|j  }q\|jr\d|j }n|jr\d|j|f }|S )zxreturn extra information to add to the message for unpacking-non-sequence
    and unbalanced-tuple-unpacking errors
     z %sz defined at line %sz defined at line %s of %s)rootr>   lineno	as_string)nodeinferredZmoreZinferred_moduler@   r@   rA   _get_unpacking_extra_info   s    
rX   c             C   s   d }}|r|j r|j j }|r0|j r0|j j }t|tjrVt| j tjtjfspdS ntdd ||fD rpdS g }xP||fD ]D}|}x:|rt|tjtjfs|j	| P |j r|j j }qP qW q~W |rt
t|dkrdS |j|jk S )a   Detect that the given frames shares a global
    scope.

    Two frames shares a global scope when neither
    of them are hidden under a function scope, as well
    as any of parent scope of them, until the root scope.
    In this case, depending from something defined later on
    will not work, because it is still undefined.

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

    NFc             s   s"   | ]}t |tjtjf V  qd S )N)r:   r6   ClassDefModule)rD   fr@   r@   rA   rE      s    z'_detect_global_scope.<locals>.<genexpr>   )rI   scoper:   r6   rO   	ArgumentsrG   rY   rZ   appendlensetrT   )rV   framedefframeZ	def_scoper]   Zbreak_scopesZcurrent_scopeZparent_scoper@   r@   rA   _detect_global_scope   s0    





rd   c             C   s   t  }||_| j|ddS )NF)asname)r   Z
lookupnameinfer)rV   r>   contextr@   r@   rA   _infer_name_module   s    rh   c       	      C   s   i }x| j  D ]\}}tdd |D r*qx|D ]}t|tjtjfsHq0xl|jD ]b}d}|d }|dkrn|}n0d}|j|r|jddkrd	}|s||kr|}|rP||krP|||< qPW q0W qW t	|j  d
d dS )z 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             s   s*   | ]"}t |tjo t |j tjV  qd S )N)r:   r6   
AssignNameassign_type	AugAssign)rD   r=   r@   r@   rA   rE      s   z#_fix_dot_imports.<locals>.<genexpr>Nr   *F.r\   Tc             S   s
   | d j S )Nr\   )
fromlineno)ar@   r@   rA   <lambda>  s    z"_fix_dot_imports.<locals>.<lambda>)key)
itemsrG   r:   r6   r;   Importnames
startswithfindsorted)	not_consumedru   r>   stmtsr=   importsZsecond_nameZimport_module_nameZname_matches_dotted_importr@   r@   rA   _fix_dot_imports   s.    


r|   c             C   sZ   |j tjtjf}xB|D ]:}x4|jD ]*\}}|r>|| krNdS q$|r$|| kr$dS q$W qW dS )z
    Detect imports in the frame, with the required
    *name*. Such imports can be considered assignments.
    Returns True if an import for the given name was found.
    TN)nodes_of_classr6   rt   r;   ru   )r>   rb   r{   Zimport_nodeimport_nameimport_aliasr@   r@   rA   _find_frame_imports!  s    
r   c             C   s6   x0| j D ]&\}}|r"||kr.dS q||krdS qW dS )NTF)ru   )r=   global_namesr~   r   r@   r@   rA   _import_name_is_global4  s    r   c             C   s   dd | D }t tjj|S )Nc             s   s   | ]}t |jV  qd S )N)ra   ru   )rD   r=   r@   r@   rA   rE   A  s    z)_flattened_scope_names.<locals>.<genexpr>)ra   	itertoolschainfrom_iterable)iteratorvaluesr@   r@   rA   _flattened_scope_names@  s    r   c                s&    j  jtj}t fdd|D S )zN
    Checks if name_node has corresponding assign statement in same scope
    c             3   s   | ]}|j  j kV  qd S )N)r>   )rD   ro   )	name_noder@   rA   rE   J  s    z$_assigned_locally.<locals>.<genexpr>)r]   r}   r6   ri   rG   )r   Zassign_stmtsr@   )r   rA   _assigned_locallyE  s    r   c             C   s(   | j }t|tjsdS |j}|j tkS )NF)rI   r:   r6   IftestrU   TYPING_TYPE_CHECKS_GUARDS)rV   rI   r   r@   r@   rA   _is_type_checking_importM  s
    r   c             C   sh   t jt jt jt jf}xN|jt j|dD ]:}tj|j	}tj
|r&t|dd dkr&| j|jk r&dS q&W dS )N)Z
skip_klassr>   r8   TF)r6   rO   rY   rt   r;   r}   Callr   
safe_inferfuncZis_builtin_objectgetattrrT   )r=   r]   Z
skip_nodescallrW   r@   r@   rA   _has_locals_call_after_nodeU  s    
r   #Using variable %r before assignmentused-before-assignment=Used when a local variable is accessed before its assignment.Undefined variable %rundefined-variable,Used when an undefined variable is accessed.%Undefined variable name %r in __all__undefined-all-variable>Used when an undefined variable name is referenced in __all__.7Invalid object %r in __all__, must contain only stringsinvalid-all-object;Used when an invalid (non-string) object occurs in __all__.No name %r in module %rno-name-in-module-Used when a name cannot be found in a module.0Global variable %r undefined at the module levelglobal-variable-undefinedsUsed when a variable is defined through the "global" statement but the variable is not defined in the module scope.-Using global for %r but no assignment is doneglobal-variable-not-assignedjUsed when a variable is defined through the "global" statement but no assignment to this variable is done.Using the global statementglobal-statementUsed when you use the "global" statement to update a global variable. Pylint just try to discourage this usage. That doesn't mean you cannot use it !.Using the global statement at the module levelglobal-at-module-levelSUsed when you use the "global" statement at the module level since it has no effect	Unused %sunused-import5Used when an imported module or variable is not used.Unused variable %runused-variable-Used when a variable is defined but not used.Unused argument %runused-argument4Used when a function or method argument is not used.%Unused import %s from wildcard importunused-wildcard-import]Used when an imported module or variable is not used from a `'from X import *'` style import.-Redefining name %r from outer scope (line %s)redefined-outer-nameDUsed when a variable's name hides a name defined in the outer scope.Redefining built-in %rredefined-builtin5Used when a variable or function override a built-in./Redefining name %r from %s in exception handlerredefine-in-handlerHUsed when an exception handler assigns the exception to an existing name)Using possibly undefined loop variable %rundefined-loop-variableUsed when a loop variable (i.e. defined by a for loop or a list comprehension or a generator expression) is used outside the loop.zjPossible unbalanced tuple unpacking with sequence%s: left side has %d label(s), right side has %d value(s)zunbalanced-tuple-unpackingz>Used when there is an unbalanced tuple unpacking in assignmentZ	old_namesE0632old-unbalanced-tuple-unpackingz%Attempting to unpack a non-sequence%szunpacking-non-sequencezKUsed when something which is not a sequence is used in an unpack assignmentW0633old-unpacking-non-sequence Cell variable %s defined in loopcell-var-from-loopA 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.Possibly unused variable %rpossibly-unused-variableUsed 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"Invalid assignment to %s in methodself-cls-assignmentKInvalid assignment to self or cls in instance or class method respectively.)ZE0601ZE0602ZE0603ZE0604ZE0611ZW0601ZW0602ZW0603ZW0604ZW0611ZW0612ZW0613ZW0614ZW0621ZW0622ZW0623ZW0631ZW0632ZE0633ZW0640ZW0641ZW0642ScopeConsumerzto_consume consumed scope_typec               @   s\   e Zd ZdZdd Zdd Zdd Zedd	 Zed
d Z	edd Z
dd Zdd ZdS )NamesConsumerzZ
    A simple class to handle consumed, to consume and scope type info of node locals
    c             C   s   t tj|ji || _d S )N)r   copyr8   _atomic)selfrV   
scope_typer@   r@   rA   __init__  s    zNamesConsumer.__init__c             C   s^   dj djdd | jjj D }|dj djdd | jjj D 7 }|dj | jj7 }|S )Nz
to_consume : {:s}
z, c             S   s   g | ]\}}d j ||qS )z{}->{})format)rD   rq   valr@   r@   rA   
<listcomp>  s   z*NamesConsumer.__repr__.<locals>.<listcomp>zconsumed : {:s}
c             S   s   g | ]\}}d j ||qS )z{}->{})r   )rD   rq   r   r@   r@   rA   r     s   zscope_type : {:s}
)r   joinr   
to_consumers   consumedr   )r   msgr@   r@   rA   __repr__  s    zNamesConsumer.__repr__c             C   s
   t | jS )N)iterr   )r   r@   r@   rA   __iter__  s    zNamesConsumer.__iter__c             C   s   | j jS )N)r   r   )r   r@   r@   rA   r     s    zNamesConsumer.to_consumec             C   s   | j jS )N)r   r   )r   r@   r@   rA   r     s    zNamesConsumer.consumedc             C   s   | j jS )N)r   r   )r   r@   r@   rA   r     s    zNamesConsumer.scope_typec             C   s   || j |< | j|= dS )z`
        Mark the name as consumed and delete it from
        the to_consume dictionary
        N)r   r   )r   r>   new_noder@   r@   rA   mark_as_consumed  s    
zNamesConsumer.mark_as_consumedc             C   sX   |j }|j}| jj|}|rTt|tjrT||d jkrT|d jjd }|j |krTd }|S )Nr   )r>   rI   r   r9   r:   r6   Assigntargets)r   rV   r>   parent_node
found_nodelhsr@   r@   rA   get_next_to_consume#  s    
z!NamesConsumer.get_next_to_consumeN)__name__
__module____qualname____doc__r   r   r   propertyr   r   r   r   r   r@   r@   r@   rA   r     s   r   c               @   s  e Zd ZdZeZdZeZdZ	dddddd	fd
ddddd	fdf dddd	fdddddd	fdddddd	fde
ddd d	fd!d"ddd#d	ffZdd%d&Zejd'd(d) Zejd'd*d+ Zd,d- Zejd.d/d0d1d2d3d4d5 Zd6d7 Zd8d9 Zd:d; Zd<d= Zd>d? Zd@dA ZdBdC ZdDdE ZdFdG ZdHdI ZdJdK ZdLdM ZeZeZ ejdNdOdPdQd0dRdS Z!dTdU Z"dVdW Z#eje dXdY Z$ejdZd[d\ Z%ejdZd]d^ Z&ejd_d`dadbdc Z'ddde Z(dfdg Z)dhdi Z*djdk Z+dldm Z,e-j.dndo Z/e-j.dpdq Z0e-j.drds Z1e2dtdu Z3e2dvdw Z4dxdy Z5dzd{ Z6d|d} Z7d~d Z8dd Z9dd Z:dd Z;dd Z<dd Z=dd Z>dd Z?dd Z@dd ZAdd ZBdd ZCdd ZDdd ZEdd ZFd$S )VariablesCheckerzchecks for
    * unused variables / imports
    * undefined variables
    * redefinition of variable from builtins or from an outer scope
    * use of variable before assignment
    * __all__ consistency
    * self/cls assignment
    	variablesr\   zinit-importr   Z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-builtins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	six.movespast.builtinsfuture.builtinsbuiltinsiozQList of qualified module names which can have objects that can redefine builtins.zignored-argument-nameszcArgument names that match this expression will be ignored. Default to name with leading underscore.zallow-global-unused-variablesTzGTells whether unused global variables should be treated as a violation.Nc             C   s.   t j| | d | _d | _g | _g | _d| _d S )NF)r   r   _to_consumeZ_checking_mod_attr_loop_variables_type_annotation_names_postponed_evaluation_enabled)r   linterr@   r@   rA   r     s    zVariablesChecker.__init__zredefined-outer-namec                s   dd |j jtjD }| jj  fdd|D }xL|D ]D}x>| jD ]4\}}||krDt|| rD| jd||j	f|d P qDW q8W | jj
||f d S )Nc             S   s   g | ]
}|j qS r@   )r>   )rD   varr@   r@   rA   r     s    z.VariablesChecker.visit_for.<locals>.<listcomp>c                s   g | ]} j |s|qS r@   )match)rD   r  )	dummy_rgxr@   rA   r     s    zredefined-outer-name)argsrV   )targetr}   r6   ri   configdummy_variables_rgxr  rJ   add_messagern   r_   )r   rV   Zassigned_tovariableZ	outer_forZouter_variablesr@   )r
  rA   	visit_for  s    



zVariablesChecker.visit_forc             C   s   | j j  | j| d S )N)r  pop_store_type_annotation_names)r   rV   r@   r@   rA   	leave_for  s    
zVariablesChecker.leave_forc             C   sz   t |dg| _t|| _x\|jj D ]N\}}tj|r$tj|d  r$| j	|d s$|dkr^q$| j
d||d d q$W dS )znvisit module : update consumption analysis variable
        checks globals doesn't overrides builtins
        r?   r   r   zredefined-builtin)r  rV   N)r   r  r	   r  r8   rs   r   
is_builtinis_inside_except _should_ignore_redefined_builtinr  )r   rV   r>   rz   r@   r@   rA   visit_module  s    
zVariablesChecker.visit_modulezunused-importzunused-wildcard-importzredefined-builtinzundefined-all-variablezinvalid-all-objectzunused-variablec             C   sj   t | jdkst| j| | jj j}d|jkr>| j|| | j| | j	j
 r\|jr\dS | j| dS )z$leave module: check globals
        r\   __all__N)r`   r  AssertionError_check_metaclassesr  r   r8   
_check_all_check_globalsr  Zinit_importpackage_check_imports)r   rV   ry   r@   r@   rA   leave_module  s    


zVariablesChecker.leave_modulec             C   s   | j jt|d dS )z:visit class: update consumption analysis variable
        classN)r  r_   r   )r   rV   r@   r@   rA   visit_classdef  s    zVariablesChecker.visit_classdefc             C   s   | j j  dS )z:leave class: update consumption analysis variable
        N)r  r  )r   _r@   r@   rA   leave_classdef  s    zVariablesChecker.leave_classdefc             C   s   | j jt|d dS )z;visit lambda: update consumption analysis variable
        lambdaN)r  r_   r   )r   rV   r@   r@   rA   visit_lambda  s    zVariablesChecker.visit_lambdac             C   s   | j j  dS )z;leave lambda: update consumption analysis variable
        N)r  r  )r   r#  r@   r@   rA   leave_lambda  s    zVariablesChecker.leave_lambdac             C   s   | j jt|d dS )z<visit genexpr: update consumption analysis variable
        comprehensionN)r  r_   r   )r   rV   r@   r@   rA   visit_generatorexp  s    z#VariablesChecker.visit_generatorexpc             C   s   | j j  dS )z<leave genexpr: update consumption analysis variable
        N)r  r  )r   r#  r@   r@   rA   leave_generatorexp  s    z#VariablesChecker.leave_generatorexpc             C   s   | j jt|d dS )z=visit dictcomp: update consumption analysis variable
        r(  N)r  r_   r   )r   rV   r@   r@   rA   visit_dictcomp  s    zVariablesChecker.visit_dictcompc             C   s   | j j  dS )z=leave dictcomp: update consumption analysis variable
        N)r  r  )r   r#  r@   r@   rA   leave_dictcomp	  s    zVariablesChecker.leave_dictcompc             C   s   | j jt|d dS )z<visit setcomp: update consumption analysis variable
        r(  N)r  r_   r   )r   rV   r@   r@   rA   visit_setcomp  s    zVariablesChecker.visit_setcompc             C   s   | j j  dS )z<leave setcomp: update consumption analysis variable
        N)r  r  )r   r#  r@   r@   rA   leave_setcomp  s    zVariablesChecker.leave_setcompc             C   s   | j jt|d | jjdp(| jjds.dS |j j}x|j D ]\}}tj	|rVqB||krt
|tj r|| d }t
|tjr|jtkrqBtdd || D rqB|j}| j||s| jd||f|d qBtj|rB| j| rB| jd||d qBW dS )	zNvisit function: update consumption analysis variable and check locals
        functionzredefined-outer-namezredefined-builtinNr   c             s   s,   | ]$}t |jtjo"|jjj tkV  qd S )N)r:   rI   r6   r   r   rU   r   )rD   
definitionr@   r@   rA   rE   3  s   z5VariablesChecker.visit_functiondef.<locals>.<genexpr>)r  rV   )r  r_   r   r  is_message_enabledrS   globalsrs   r   r  r:   r6   Globalr;   r5   r<   rG   rn   _is_name_ignoredr  r  r  )r   rV   Zglobsr>   r=   r0  liner@   r@   rA   visit_functiondef  s0    


z"VariablesChecker.visit_functiondefc       	      C   s   | j | |jr| j|j |jr<x|jD ]}| j| q*W | jj j}| jjdpj| jjdpj| jjdspdS t	j
|r~dS |j }|r|j rdS t|jtj}t|jtj}x*|j D ]\}}| j|||d || qW dS )z4leave function: check function's locals are consumedzunused-variablezpossibly-unused-variablezunused-argumentNr   )r  Ztype_comment_returns_store_type_annotation_nodetype_comment_argsr  r  r   r  r1  r   Zis_error	is_methodZis_abstractr   r}   r6   r3  Nonlocalrs   _check_is_unused)	r   rV   Zargument_annotationry   r9  r   nonlocal_namesr>   rz   r@   r@   rA   leave_functiondefE  s(    

z"VariablesChecker.leave_functiondefzglobal-variable-undefinedzglobal-variable-not-assignedzglobal-statementzglobal-at-module-levelc       
      C   s(  |j  }t|tjr&| jd|d dS |j }d}|j j}x|jD ]}y|j	|}W n tj
k
rp   g }Y nX tdd |j|f D  }| r|r| jd||d d	}qDx\|D ]<}	t|	tjr|	j|jkr| jd
||d P |	j  |krP qW |rD| jd||d d	}qDW |r$| jd|d dS )z/check names imported exists in the global scopezglobal-at-module-level)rV   NTc             s   s   | ]}t |tjjV  qd S )N)r:   r6   node_classesrt   )rD   localr@   r@   rA   rE     s   z0VariablesChecker.visit_global.<locals>.<genexpr>zglobal-variable-not-assigned)r  rV   Fzredefined-builtinzglobal-variable-undefinedzglobal-statement)rb   r:   r6   rZ   r  rS   r]   r8   ru   r   NotFoundErrorrG   r9   ri   r>   Zspecial_attributes)
r   rV   rb   r?   Zdefault_messageZlocals_r>   Zassign_nodesZnot_defined_locally_by_importZanoder@   r@   rA   visit_globalh  s>    	



zVariablesChecker.visit_globalc             C   s   t |j tjr| j| d S )N)r:   rj   r6   rk   
visit_name)r   rV   r@   r@   rA   visit_assignname  s    z!VariablesChecker.visit_assignnamec             C   s   | j | d S )N)rB  )r   rV   r@   r@   rA   visit_delname  s    zVariablesChecker.visit_delnamec             C   s  |j  }|jdkr,|j jjd s(tdS |j}|j }tj	|sZtj
|sZtj||rjt| jd }nt| jd }| j| j}xPt|ddD ]}| j| }|jdkr||kr|dko||d k r| j|rq||jko|jdko| j|| r*tj|j| d }	| j||	 | j|| P |j|}
|
dkr@qtj|j| d }	|	dk	rt| j||	 |	j  }|j }||ko|j|ot|tjo|j|jk}|rtj|rtj	| s|j jj |k	rP | j|||	||||||	\}}}|rq|rttj | rttj!||d rt||koHt|tj"tj#f}|sj|sj|sjt|tj$rtj%|t&st| j'ot|tj(tj)tj*fo||j j+kst| j,d	||d
 n|dkr| j'ot|tj(tj)fst| j,d||d
 n|dkrtt|tjrX||j+krXt|jtj*rF|j|jkrV| j,d||d
 n| j,d	||d
 n|jdkrt| j,d	||d |j-||
 | j|| P qW |tj.j/kptj0|p|| j1j2kstj%|t&s| j,d	||d
 dS )zbcheck that a name is defined if the current scope and doesn't
        redefine a built-in
        Nz.py   r\   r!  r(  r   	NameErrorzundefined-variable)r  rV   r%  zused-before-assignment)rV   r  rr   rr   )rF  )3	statementrn   rS   fileendswithr  r>   r]   r   Zis_default_argumentZis_func_decoratorZis_ancestor_namer`   r  r   range_ignore_class_scoper   $_has_homonym_in_upper_function_scopeZassign_parent_check_late_binding_closure_loopvar_namer   r   rb   rC   r:   r6   rY   Zis_inside_lambdarI   _is_variable_violationZis_defined_beforeZare_exclusiveZDelNameri   DeleteZnode_ignores_exceptionrF  r  	AnnAssignrO   r^   r8   r  r   rZ   scope_attrsr  r  additional_builtins)r   rV   r=   r>   rb   start_indexbase_scope_typeiZcurrent_consumerdefnoder   defstmtrc   recursive_klass
maybee0601annotation_returnuse_outer_definitionZdefined_by_stmtr@   r@   rA   rB    s    













zVariablesChecker.visit_namezno-name-in-modulec             C   s~   | j  rtj|rdS xb|jD ]X\}}|jd}ytt||d }W n tjk
r^   wY nX | j	|||dd  qW dS )z check modules attribute accessesNrm   r   r\   )
_analyse_fallback_blocksr   is_from_fallback_blockru   splitrL   rh   r6   ZResolveError_check_module_attrs)r   rV   r>   r#  partsr?   r@   r@   rA   visit_importl  s    
zVariablesChecker.visit_importc             C   s   | j  rtj|rdS |jjd}y|j|d }W n tjk
rJ   dS X | j|||dd }|sjdS x0|j	D ]&\}}|dkrqr| j|||jd qrW dS )z check modules attribute accessesNrm   r   r\   rl   )
r]  r   r^  r5   r_  r4   r6   r7   r`  ru   )r   rV   Z
name_partsr?   r>   r#  r@   r@   rA   visit_importfrom|  s    z!VariablesChecker.visit_importfromzunbalanced-tuple-unpackingzunpacking-non-sequencezself-cls-assignmentc             C   sv   | j | t|jd tjtjfs&dS |jd j }y&tj|j	}|dk	rX| j
||| W n tjk
rp   dS X dS )zCheck unbalanced tuple unpacking for assignments
        and unpacking non-sequences as well as in case self/cls
        get assigned.
        r   N)_check_self_cls_assignr:   r   r6   r   r/   iteredr   r   value_check_unpackingInferenceError)r   rV   r   rW   r@   r@   rA   visit_assign  s    
zVariablesChecker.visit_assignc             C   s   | j jt|d dS )z=visit dictcomp: update consumption analysis variable
        r(  N)r  r_   r   )r   rV   r@   r@   rA   visit_listcomp  s    zVariablesChecker.visit_listcompc             C   s   | j j  dS )z=leave dictcomp: update consumption analysis variable
        N)r  r  )r   r#  r@   r@   rA   leave_listcomp  s    zVariablesChecker.leave_listcompc             C   s   | j | d S )N)r  )r   rV   r@   r@   rA   leave_assign  s    zVariablesChecker.leave_assignc             C   s   | j | d S )N)r  )r   rV   r@   r@   rA   
leave_with  s    zVariablesChecker.leave_withc             C   s   x|j D ]}| j| qW d S )N)r8  r7  )r   rV   
annotationr@   r@   rA   visit_arguments  s    z VariablesChecker.visit_argumentsc             C   s   t | dddS )Nzanalyse-fallback-blocksF)r   )r   )r   r@   r@   rA   r]    s    z)VariablesChecker._analyse_fallback_blocksc             C   s   t | dg dS )Nzignored-modules)r   )r   )r   r@   r@   rA   _ignored_modules  s    z!VariablesChecker._ignored_modulesc             C   s   t | dddS )Nzallow-global-unused-variablesT)r   )r   )r   r@   r@   rA   _allow_global_unused_variables  s    z/VariablesChecker._allow_global_unused_variablesc             C   s\   d}t |tjrX| j |krX| |jjkpV| |jjkpV| |jjkpV| |jjkpV|jj	| }|S )NF)
r:   r6   rO   rG  r  annotationsZkwonlyargs_annotationsZvarargannotationZkwargannotationrC   )rV   rb   in_annotation_or_defaultr@   r@   rA   _defined_in_function_definition  s    z0VariablesChecker._defined_in_function_definitionc	                s  d}	d}
d}||k	r"t | ||}	n|jd krJ |jksDtj d rd}	nt|tjsft| j tjolt	| }| r|j
 j d rd}	||kot|tjj }n& |jkrt fdd|j D  }	|dkot|tjo |jkr t|tjo| |jko|j  d j|jk  }	nt|tjrt|tjr| |jkr^|j|jr^d }	}
|	r|j|jkr|j  d j|jk rd}	t| jtjr|j|jk}	n|rd}	n|	o|j|jk}	|	r|j|jkrt|tjr||kr|j| r||k	rd}	t|tjtjfr|j}t|tjr|jj tkr|j| }d}x>|jD ]4}t|tj r^t fdd|j!D }|r^P q^W | r| rd}	|	|
|fS )	NTFr\   c             3   s$   | ]}t |tjo |jkV  qd S )N)r:   r6   r:  ru   )rD   child)r>   r@   rA   rE     s   z:VariablesChecker._is_variable_violation.<locals>.<genexpr>r%  r   c             3   s   | ]}|j  kV  qd S )N)r>   )rD   r  )r>   r@   rA   rE   O  s    )"rd   rI   rR  r6   Zbuiltin_lookupr:   rO   rb   Lambdar   rS   lookupr>  Comprehensionr8   rG   get_childrenrY   r^   defaultsrn   ZreturnsrC   r>   rT   rt   r;   r   r   rU   r   rH   r   r   )rV   r>   rW  r=   rX  rb   rc   rU  rY  rZ  r[  r\  Zforbid_lookupZdefstmt_parentZused_in_branchZdefined_in_or_elser0  r@   )r>   rA   rO    sv    






z'VariablesChecker._is_variable_violationc             C   sP   |j }|j j }| j||}|r0|jj j}n|j}t|tjsF|oL||k S )a  
        Return True if the node is in a local class scope, as an assignment.

        :param node: Node considered
        :type node: astroid.Node
        :return: True if the node is in a local class scope, as an assignment. False otherwise.
        :rtype: bool
        )	r>   rG  r]   rt  rI   r8   r:   r6   rY   )r   rV   r>   rb   rs  Zframe_localsr@   r@   rA   rK  Y  s    z$VariablesChecker._ignore_class_scopec                s  | j jdsd S dd |j|d D }|j  t tjrVt fdd|D rVd S | s|d jsp|d j	r|d j
 j|rg }n|d d }xNt|dd  D ]:\}}|| j
 j|rt|| j
 | rq|j| qW |}t|dkrd S |d j }t|tjtjtjfo*|j
 |j
 k	s2d S t|tjsT| jd||d d S yt|jj }W n( tjk
r   | jd||d Y nX t|tjr|j tkrd S tjtjtjtjt j!f}	t||	s| jd||d d S t"|d	t"|d
g }
|
s| jd||d d S )Nzundefined-loop-variablec             S   s   g | ]}t |d r|qS )rj   )hasattr)rD   r=   r@   r@   rA   r     s    z2VariablesChecker._loopvar_name.<locals>.<listcomp>r\   c             3   s   | ]}|j  j V  qd S )N)rG  rC   )rD   Zasmt)r]   r@   rA   rE     s    z1VariablesChecker._loopvar_name.<locals>.<genexpr>r   )r  rV   eltsrs   )#r  r1  rw  r]   r:   r6   rO   rG   Zis_statementrI   rG  rC   	enumeraterJ   r_   r`   rj   rF   rx  GeneratorExpr  rL   r   rf   rh  ZInstanceqnameBUILTIN_RANGEr/   r   r.   r0   r   r1   r   )r   rV   r>   ZastmtsZ_astmtsrV  r=   ZassignrW   	sequenceselementsr@   )r]   rA   rN  ~  s\    
zVariablesChecker._loopvar_namec                s  | j | rd S t|tjrP dkrPt|jd dkrPt|jd d tjrPd S t|tjtjtj	frx|rxt
||rxd S ttj|j dd |jjD } |kr| j ||| nX|jrt|jtjtjfr܈ |krd S d  }}t|tjtj	frFt|jdkr$t fdd|jD d }	n
|jd }	|	rF|	\}}|pD| t||j r\d}
nt|tjr|d k	rd	||f }nd
  }| jd||d d S t|tj	r|d k	rd||j|f }nd |jf }| jd||d d S d}
tj|rd S | j|
 |d d S )N	__class__r\   r   c             S   s   g | ]
}|j qS r@   )r>   )rD   argr@   r@   rA   r     s    z5VariablesChecker._check_is_unused.<locals>.<listcomp>c             3   s   | ]} |kr|V  qd S )Nr@   )rD   ru   )r>   r@   rA   rE     s    z4VariablesChecker._check_is_unused.<locals>.<genexpr>zpossibly-unused-variablez%s imported as %sz	import %szunused-import)r  rV   z%s imported from %s as %sz%s imported from %szunused-variable)r4  r:   r6   rO   r`   r8   rY   r3  rt   r;   r   listr   r   argnamesr  
kwonlyargs_check_unused_argumentsrI   r   rQ  ru   rL   r   r]   r  r5   r   is_overload_stub)r   r>   rV   r=   r   r<  r  r  re   Zimport_namesZmessage_namer   r@   )r>   rA   r;    s`     




z!VariablesChecker._check_is_unusedc             C   sJ   | j j}t|tjr"t|jtjs.t|tjr8| j j}n|}|oH|j|S )N)	r  r  r:   r6   ri   rI   r^   Zignored_argument_namesr	  )r   r=   r>   Zauthorized_rgxregexr@   r@   rA   r4    s    
z!VariablesChecker._is_name_ignoredc       	         s    j  } jj }|r6t|tjr6tj|r0tnt	}nt
}|r jdkrX||d krXd S t| j}|d k	r|||j kr|d S  jtjkr jd	krd S t fdd| jjD rd S tj rd S tj rd S tj|rd S | jd|||d d S )
Nstaticmethodr   r   __new__c             3   s&   | ]} j j|p j j|V  qd S )N)r>   rv   rI  )rD   cb)rV   r@   rA   rE   @  s   z;VariablesChecker._check_unused_arguments.<locals>.<genexpr>zunused-argument)r  rV   
confidence)r   r  )r9  rI   rb   r:   r6   rY   r   Zhas_known_basesr   r   r
   r   rQ   r>   r  Z	PYMETHODSrG   r  r   Z(is_registered_in_singledispatch_functionr  Zis_protocol_classr  )	r   r>   rV   r=   r  r9  rP   r  Z
overriddenr@   )rV   rA   r  '  s4    
 



z(VariablesChecker._check_unused_argumentsc                s    fdd}|j   t tjtjfs*d S t|jtjr<d S t|tjrl|jj|j  r| j	d||j
d nd|j  }|}xVt|tjs||krP |j}qzW |j r|  rt j tj r| j	d||j
d d S )Nc                  s   t  jtjo jj kS )N)r:   rI   r6   r   r   r@   )
node_scoper@   rA   _is_direct_lambda_callS  s    zLVariablesChecker._check_late_binding_closure.<locals>._is_direct_lambda_callzcell-var-from-loop)rV   r  )r]   r:   r6   rv  rO   rI   r^   rx  rC   r  r>   rF   rG  Return)r   rV   Zassignment_noder  Zassign_scopeZ	maybe_forr@   )r  rA   rM  R  s&    

z,VariablesChecker._check_late_binding_closurec             C   s   t |tjsdS |j| jjkS )NF)r:   r6   r;   r5   r  Zredefining_builtins_modules)r   r=   r@   r@   rA   r  q  s    z1VariablesChecker._should_ignore_redefined_builtinc             C   s<   x6| j |d dd D ]}|jdkr|j|jkrdS qW dS )a  
        Return True if there is a node with the same name in the to_consume dict of an upper scope
        and if that scope is a function

        :param node: node to check for
        :type node: astroid.Node
        :param index: index of the current consumer inside self._to_consume
        :type index: int
        :return: True if there is a node with the same name in the to_consume dict of an upper scope
                 and if that scope is a function
        :rtype: bool
        r\   Nr/  TFrr   )r  r   r>   r   )r   rV   indexZ	_consumerr@   r@   rA   rL  v  s    z5VariablesChecker._has_homonym_in_upper_function_scopec             C   s   t |tjr| jj|j dS t |tjs.dS t |jtjrjt |jj	tjrj|jj	jt
krj| jjt
 dS | jjdd |jtjD  dS )z>Given a type annotation, store all the name nodes it refers toNc             s   s   | ]}|j V  qd S )N)r>   )rD   rn  r@   r@   rA   rE     s   z?VariablesChecker._store_type_annotation_node.<locals>.<genexpr>)r:   r6   Namer  r_   r>   	Subscriptrf  	AttributeexprTYPING_MODULEextendr}   )r   type_annotationr@   r@   rA   r7    s    z,VariablesChecker._store_type_annotation_nodec             C   s   |j }|sd S | j|j  d S )N)r  r7  )r   rV   r  r@   r@   rA   r    s    z-VariablesChecker._store_type_annotation_namesc                s   dd |j D  |j }t fdd|jD }|rB|j jj }t|tjjob|j	 obd|j
 kshdS |j }|sxdS |d }dd |j D }||kr| jd	||d
 dS )z&Check that self/cls don't get assignedc             S   s   h | ]}t |tjr|jqS r@   )r:   r6   ri   r>   )rD   r  r@   r@   rA   	<setcomp>  s   z:VariablesChecker._check_self_cls_assign.<locals>.<setcomp>c             3   s,   | ]$}t |tjr t|j@ r|V  qd S )N)r:   r6   r:  ra   ru   )rD   ru  )assign_namesr@   rA   rE     s   z:VariablesChecker._check_self_cls_assign.<locals>.<genexpr>zbuiltins.staticmethodNr   c             s   s"   | ]}t |tjjr|jV  qd S )N)r:   r6   r>  ri   r>   )rD   r  r@   r@   rA   rE     s   zself-cls-assignment)rV   r  )r   r]   rG   bodyrI   r:   r6   Zscoped_nodesrO   r9  Zdecoratornamesr  r  )r   rV   r]   Znonlocals_with_same_nameZargument_namesZself_cls_nameZtarget_assign_namesr@   )r  rA   rd    s(    


z'VariablesChecker._check_self_cls_assignc             C   s   t j|rdS t j|rdS |tjkr*dS t|jtjrZt|jtj	rZ|jj
|jjkrZdS t|tjtjfr|j }t|t|krtdd |D rdS | jd|t||t|t|fd n"t j|s| jd|t||fd dS )zS Check for unbalanced tuple unpacking
        and unpacking non sequences.
        Nc             s   s   | ]}t |tjV  qd S )N)r:   r6   Starred)rD   r  r@   r@   rA   rE     s    z4VariablesChecker._check_unpacking.<locals>.<genexpr>zunbalanced-tuple-unpacking)rV   r  zunpacking-non-sequence)r   Zis_inside_abstract_classZis_comprehensionr6   Uninferabler:   rI   r^   rf  r  r>   varargr   r/   re  r`   rG   r  rX   Zis_iterable)r   rW   rV   r   r   r@   r@   rA   rg    s4    



z!VariablesChecker._check_unpackingc             C   s   t |tjst|x|r|jd}|dkr2d}P y(t|j|d j }|tjkrXdS W q tj	k
r   |j
| jkr|dS | jd||j
f|d dS  tjk
r   dS X qW |r|r|j
nd}| jd|dj||fd 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__Nzno-name-in-module)r  rV   rm   )rV   r  )r:   r6   rZ   r  r  rL   r   rf   r  r@  r>   rp  r  rh  r   )r   rV   r?   Zmodule_namesr>   r5   r@   r@   rA   r`    s4    


z$VariablesChecker._check_module_attrsc             C   sf  t |jd}|tjkrd S xBt|df D ]0}yt |j }W n tjk
rZ   w,Y nX |tjkrhq,|jspq,t|tj	 st|j
t r| jd|j |d q,|j
}||kr||= q,||jkr,|js| jd|f|d q,tjj|jd }tjj|dkr,|jd | }ytj|jd W q, tk
rH   | jd|f|d Y q, tk
r\   Y q,X q,W d S )	Nr  r|  zinvalid-all-object)r  rV   zundefined-all-variabler   r   rm   )rL   Zigetattrr6   r  r   rf   rh  rI   r:   ZConstrf  strr  rU   r8   r  ospathsplitextrH  basenamer>   r   Zfile_from_modpathr_  ImportErrorSyntaxError)r   rV   ry   assignedeltZelt_namer  r>   r@   r@   rA   r    sD    


zVariablesChecker._check_allc             C   sD   | j r
d S x4|j D ](\}}x|D ]}| jd|f|d q"W qW d S )Nzunused-variable)r  rV   )rq  rs   r  )r   ry   r>   ZnodesrV   r@   r@   rA   r  B  s
    
zVariablesChecker._check_globalsc             C   s  t |}t }x|D ]\}}xz|jD ]n}|d  }}|dkrH|}|d }	||krZq*|||	fkrhq*|j| t|tjst|tjr|j rt|tjrt	j
|rq*|| jkrq*|	dkrq*|	d krd| }
nd||	f }
t|s| jd|
|d q*t|tjr*|jtkr*t	j
|rq*t||r*q*|| jkr8q*|dkrT| jd	||d q*|	d krnd
||jf }
n||j|	f}d| }
t|s*| jd|
|d q*W qW | `d S )Nr   rl   r\   r#  z	import %sz%s imported as %szunused-import)r  rV   zunused-wildcard-importz%s imported from %sz%s imported from %s as %s)r|   ra   ru   addr:   r6   rt   r;   r5   SPECIAL_OBJsearchr  r   r  r<   rB   r  )r   ry   Zlocal_namescheckedr>   r=   r{   Z	real_nameZimported_nameZas_namer   fieldsr@   r@   rA   r  I  sV    




zVariablesChecker._check_importsc             C   sV   g }x.|j  D ]"}t|tjr|j| j|| qW x|D ]\}}|j|d q:W dS )z. Update consumption analysis for metaclasses. N)ry  r:   r6   rY   r  _check_classdef_metaclassesr  )r   rV   r   Z
child_nodescope_localsr>   r@   r@   rA   r    s    z#VariablesChecker._check_metaclassesc       	      C   s*  |j s
g S g }|j }d }t|j tjr2|j j}n|r@|j j}d }tj||}|rx<| j	d d d D ](\}}}|j|}|rf|j
||f P qfW |d ko| r&d }t|j tjr|j j}nt|j tjr|j j }|d k	r&|tjjkptj|p|| jjkp||jks&| jd||fd |S )Nr\   zundefined-variable)rV   r  rr   )Z
_metaclass	metaclassr:   r6   r  r>   rS   METACLASS_NAME_TRANSFORMSr9   r  r_   r  rU   rZ   rR  r   r  r  rS  r8   r  )	r   rP   r   r   r  r>   foundr  r#  r@   r@   rA   r    s<    





z,VariablesChecker._check_classdef_metaclassesrr   )r   r   )r   r   r   r  r  )N)Gr   r   r   r   r   Z__implements__r>   MSGSZmsgspriorityIGNORED_ARGUMENT_NAMESoptionsr   r   Zcheck_messagesr  r  r  r   r"  r$  r&  r'  r)  r*  r+  r,  r-  r.  r6  r=  Zvisit_asyncfunctiondefZleave_asyncfunctiondefrA  rC  rD  rB  rb  rc  ri  rj  rk  rl  rm  ro  r   Zcachedpropertyr]  rp  rq  r  rt  rO  rK  rN  r;  r4  r  rM  r  rL  r7  r  rd  rg  r`  r  r  r  r  r  r@   r@   r@   rA   r   4  s       

+ / J %RK+"*"0@r   c             C   s   | j t|  dS )z-required method to auto register this checkerN)Zregister_checkerr   )r  r@   r@   rA   register  s    r  )r   r   r   )r   r   r   )r   r   r   )r   r   r   )r   r   r   )r   r   r   )r   r   r   )r   r   r   )r   r   r   )r   r   r   )r   r   r   )r   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   )7r   collectionsr   r   r  re	functoolsr   r6   r   r   r   Zastroid.contextr   Zpylint.checkersr   r   Zpylint.checkers.utilsr	   Zpylint.interfacesr
   r   r   r   Zpylint.utilsr   compiler  r<   r  r  	frozensetr   r  r  ZTYPING_NAMESrB   rJ   rQ   rX   rd   rh   r|   r   r   r   r   r   r   r  
namedtupler   r   r   r  r@   r@   r@   rA   <module>$   sT  

A*                                  

      D           