Your IP : 216.73.216.213


Current Path : /opt/alt/python37/lib/python3.7/site-packages/pyflakes/__pycache__/
Upload File :
Current File : //opt/alt/python37/lib/python3.7/site-packages/pyflakes/__pycache__/checker.cpython-37.opt-1.pyc

B

2tX^��@s�dZddlZddlZddlZddlZejdkZejdkZejdkZejdkZ	yej
dZWnek
rrdZYnXe
eer�d	nd
��ZyddlZWn@ek
r�ddlZdejjkr�dej_ed
d��ej_YnXddlmZer�dd�Zndd�Ze�rdd�Zndd�Ze	�r$ejejfZnejejejfZGdd�de �Z!dd�Z"de!�fdd�Z#dd�Z$Gdd�de%�Z&Gd d!�d!e&�Z'Gd"d#�d#e%�Z(Gd$d%�d%e%�Z)Gd&d'�d'e'�Z*Gd(d)�d)e*�Z+Gd*d+�d+e*�Z,Gd,d-�d-e*�Z-Gd.d/�d/e,�Z.Gd0d1�d1e&�Z/Gd2d3�d3e&�Z0Gd4d5�d5e'�Z1Gd6d7�d7e'�Z2Gd8d9�d9e&�Z3Gd:d;�d;e �Z4Gd<d=�d=e4�Z5Gd>d?�d?e4�Z6Gd@dA�dAe4�Z7GdBdC�dCe4�Z8GdDdE�dEe8�Z9dFdGdHgZ:dIdJ�Z;GdKdL�dLe%�Z<dS)Mz]
Main module.

Implement the central Checker class.
Also, it models the Bindings and Scopes.
�N)�r)rr)r�)r�TFZ__builtin__�builtins�decorator_list�cCs|jS)N)Z
decorators)�srr�A/opt/alt/python37/lib/python3.7/site-packages/pyflakes/checker.py�<lambda> �r
)�messagescCstt|j����S)N)�strZunicode�__name__�upper)�
node_classrrr	�getNodeType&srcCs
|j��S)N)rr)rrrr	r*scCsHt|tjtjf�r|jgSt|tj�rD|j|jgdd�|jD�SdS)NcSsg|]
}|g�qSrr)�.0�hdlrrr	�
<listcomp>3sz#getAlternatives.<locals>.<listcomp>)�
isinstance�ast�IfZ
TryFinally�bodyZ	TryExcept�orelse�handlers)�nrrr	�getAlternatives/srcCsBt|tj�r|jgSt|tj�r>|j|jgdd�|jD�SdS)NcSsg|]
}|g�qSrr)rrrrr	r9sz#getAlternatives.<locals>.<listcomp>)rrrrZTryrr)rrrr	r5sc@s eZdZdZdd�Zdd�ZdS)�_FieldsOrderzFix order of AST node fields.cCs>|j}d|krdj}nd|kr&dj}ndj}tt||dd��S)N�iterZ
generators�valueT)�key�reverse)�_fields�find�tuple�sorted)�selfr�fieldsZ	key_firstrrr	�_get_fieldsDsz_FieldsOrder._get_fieldscCs|�|�||<}|S)N)r()r&rr'rrr	�__missing__Osz_FieldsOrder.__missing__N)r�
__module__�__qualname__�__doc__r(r)rrrr	rAsrcCs*i}x |D]}|�|d�d||<q
W|S)z|
    Simplest required implementation of collections.Counter. Required as 2.6
    does not have Counter in collections.
    r�)�get)�itemsZresults�itemrrr	�counterTs
r1ccs`xZ||jD]L}||krqt||d�}t|tj�r:|Vqt|t�rx|D]
}|VqJWqWdS)z�
    Yield all direct child nodes of *node*, that is, all fields that
    are nodes and all items of fields that are lists of nodes.
    N)�	__class__�getattrrrZAST�list)�node�omitZ
_fields_order�nameZfieldr0rrr	�iter_child_nodes_s

r8cCs�t|tj�r|jSttd�r.t|tj�r.|jSt|tj�rNtdd�|jD��St|tj	�r`|j
St|tj�r�t|d�}dddd�}|�
|j|�Sts�t|tj�r�|jSt�SdS)N�Bytescss|]}t|�VqdS)N)�convert_to_value)r�irrr	�	<genexpr>usz#convert_to_value.<locals>.<genexpr>)r0TF)�True�False�None)rr�Strr�hasattrr9�Tupler$�eltsZNumr�Name�VariableKeyr.r7�PY33ZNameConstantr�UnhandledKeyType)r0�resultZconstants_lookuprrr	r:os&
r:c@s0eZdZdZdd�Zdd�Zdd�Zdd	�Zd
S)�Bindingar
    Represents the binding of a value to a name.

    The checker uses this to keep track of which names have been bound and
    which names have not. See L{Assignment} for a special type of binding that
    is checked with stricter rules.

    @ivar used: pair of (L{Scope}, node) indicating the scope and
                the node that this binding was last used.
    cCs||_||_d|_dS)NF)r7�source�used)r&r7rJrrr	�__init__�szBinding.__init__cCs|jS)N)r7)r&rrr	�__str__�szBinding.__str__cCsd|jj|j|jjt|�fS)Nz#<%s object %r from line %r at 0x%x>)r2rr7rJ�lineno�id)r&rrr	�__repr__�szBinding.__repr__cCst|t�o|j|jkS)N)r�
Definitionr7)r&�otherrrr	�	redefines�szBinding.redefinesN)rr*r+r,rLrMrPrSrrrr	rI�s

rIc@seZdZdZdS)rQz7
    A binding that defines a function or a class.
    N)rr*r+r,rrrr	rQ�srQc@seZdZdZdS)rGzS
    A dictionary key of a type that we cannot or do not check for duplicates.
    N)rr*r+r,rrrr	rG�srGc@s(eZdZdZdd�Zdd�Zdd�ZdS)	rEzY
    A dictionary key which is a variable.

    @ivar item: The variable AST object.
    cCs|j|_dS)N)rOr7)r&r0rrr	rL�szVariableKey.__init__cCs|j|jko|j|jkS)N)r2r7)r&Zcomparerrr	�__eq__�szVariableKey.__eq__cCs
t|j�S)N)�hashr7)r&rrr	�__hash__�szVariableKey.__hash__N)rr*r+r,rLrTrVrrrr	rE�srEcsFeZdZdZd
�fdd�	Zdd�Zdd�Zed	d
��Zdd�Z	�Z
S)�Importationz�
    A binding created by an import statement.

    @ivar fullName: The complete name given to the import statement,
        possibly including multiple dotted components.
    @type fullName: C{str}
    Ncs&|p||_g|_tt|��||�dS)N)�fullName�	redefined�superrWrL)r&r7rJ�	full_name)r2rr	rL�s
zImportation.__init__cCs,t|t�r|j|jkSt|t�o*|j|jkS)N)r�SubmoduleImportationrXrQr7)r&rRrrr	rS�s
zImportation.redefinescCs|j�d�d|jkS)z.Return whether importation needs an as clause.�.���)rX�splitr7)r&rrr	�
_has_alias�szImportation._has_aliascCs&|��rd|j|jfSd|jSdS)z5Generate a source statement equivalent to the import.zimport %s as %sz	import %sN)r`rXr7)r&rrr	�source_statement�szImportation.source_statementcCs"|��r|jd|jS|jSdS)z#Return import full name with alias.z as N)r`rXr7)r&rrr	rM�szImportation.__str__)N)rr*r+r,rLrSr`�propertyrarM�
__classcell__rr)r2r	rW�srWcs@eZdZdZ�fdd�Z�fdd�Zdd�Zedd	��Z�Z	S)
r\a�
    A binding created by a submodule import statement.

    A submodule import is a special case where the root module is implicitly
    imported, without an 'as' clause, and the submodule is also imported.
    Python does not restrict which attributes of the root module may be used.

    This class is only used when the submodule import is without an 'as' clause.

    pyflakes handles this case by registering the root module name in the scope,
    allowing any attribute of the root module to be accessed.

    RedefinedWhileUnused is suppressed in `redefines` unless the submodule
    name is also the same, to avoid false positives.
    csFd|kr|rt|tj�st�|�d�d}tt|��||�||_dS)Nr]r)	rrZImport�AssertionErrorr_rZr\rLrX)r&r7rJZpackage_name)r2rr	rLszSubmoduleImportation.__init__cs&t|t�r|j|jkStt|��|�S)N)rrWrXrZr\rS)r&rR)r2rr	rSs
zSubmoduleImportation.redefinescCs|jS)N)rX)r&rrr	rMszSubmoduleImportation.__str__cCs
d|jS)Nzimport )rX)r&rrr	rasz%SubmoduleImportation.source_statement)
rr*r+r,rLrSrMrbrarcrr)r2r	r\�s
r\cs2eZdZd�fdd�	Zdd�Zedd��Z�ZS)	�ImportationFromNcsL||_|p||_|�d�r&||j}n|d|j}tt|��|||�dS)Nr])�module�	real_name�endswithrZrerL)r&r7rJrfrgr[)r2rr	rLs

zImportationFrom.__init__cCs&|j|jkr|jd|jS|jSdS)z#Return import full name with alias.z as N)rgr7rX)r&rrr	rM!szImportationFrom.__str__cCs4|j|jkr d|j|j|jfSd|j|jfSdS)Nzfrom %s import %s as %szfrom %s import %s)rgr7rf)r&rrr	ra(s

z ImportationFrom.source_statement)N)rr*r+rLrMrbrarcrr)r2r	resrecs4eZdZdZ�fdd�Zedd��Zdd�Z�ZS)�StarImportationz3A binding created by a 'from x import *' statement.cs&tt|��d|�|d|_||_dS)N�*z.*)rZrirLr7rX)r&r7rJ)r2rr	rL5s
zStarImportation.__init__cCsd|jdS)Nzfrom z	 import *)rX)r&rrr	ra<sz StarImportation.source_statementcCs|j�d�r|jS|jSdS)Nr])rXrhrar7)r&rrr	rM@szStarImportation.__str__)	rr*r+r,rLrbrarMrcrr)r2r	ri2srics eZdZdZ�fdd�Z�ZS)�FutureImportationzs
    A binding created by a from `__future__` import statement.

    `__future__` imports are implicitly used.
    cs"tt|��||d�||f|_dS)N�
__future__)rZrkrLrK)r&r7rJ�scope)r2rr	rLOszFutureImportation.__init__)rr*r+r,rLrcrr)r2r	rkHsrkc@seZdZdZdS)�Argumentz3
    Represents binding a name as an argument.
    N)rr*r+r,rrrr	rnTsrnc@seZdZdZdS)�
Assignmenta
    Represents binding a name with an explicit assignment.

    The checker will raise warnings for any Assignment that isn't used. Also,
    the checker does not consider assignments in tuple/list unpacking to be
    Assignments, rather it treats them as simple Bindings.
    N)rr*r+r,rrrr	roZsroc@seZdZdS)�FunctionDefinitionN)rr*r+rrrr	rpdsrpc@seZdZdS)�ClassDefinitionN)rr*r+rrrr	rqhsrqcs eZdZdZ�fdd�Z�ZS)�
ExportBindinga
    A binding created by an C{__all__} assignment.  If the names in the list
    can be determined statically, they will be treated as names for export and
    additional checking applied to them.

    The only C{__all__} assignment that can be recognized is one which takes
    the value of a literal list containing literal strings.  For example::

        __all__ = ["foo", "bar"]

    Names which are imported and not otherwise used but appear in the value of
    C{__all__} will not have an unused import warning reported for them.
    cs�d|kr&t|tj�r&t|dj�|_ng|_t|jtjtjf�rlx*|jjD]}t|tj	�rJ|j�
|j�qJWtt
|��||�dS)N�__all__)rrZ	AugAssignr4�namesrZListrBrCr@�appendrrZrrrL)r&r7rJrmr5)r2rr	rL{szExportBinding.__init__)rr*r+r,rLrcrr)r2r	rrls
rrc@seZdZdZdd�ZdS)�ScopeFcCs |jj}d|t|�t�|�fS)Nz<%s at 0x%x %s>)r2rrO�dictrP)r&Z	scope_clsrrr	rP�szScope.__repr__N)rr*r+�
importStarredrPrrrr	rv�srvc@seZdZdS)�
ClassScopeN)rr*r+rrrr	ry�srycs:eZdZdZdZedddg�Z�fdd�Zdd	�Z�Z	S)
�
FunctionScopezp
    I represent a name scope for a function.

    @ivar globals: Names declared 'global' in this function.
    FZ__tracebackhide__Z__traceback_info__Z__traceback_supplement__cs*tt|���|j��|_d|_d|_dS)NF)rZrzrL�
alwaysUsed�copy�globals�returnValue�isGenerator)r&)r2rr	rL�szFunctionScope.__init__ccsDx>|��D]2\}}|js
||jkr
|js
t|t�r
||fVq
WdS)zR
        Return a generator for the assignments which have not been used.
        N)r/rKr}�
usesLocalsrro)r&r7�bindingrrr	�unusedAssignments�s

zFunctionScope.unusedAssignments)
rr*r+r,r��setr{rLr�rcrr)r2r	rz�s
rzc@seZdZdS)�GeneratorScopeN)rr*r+rrrr	r��sr�c@seZdZdZdZdS)�ModuleScopezScope for a module.TN)rr*r+r,�_futures_allowedrrrr	r��sr�c@seZdZdZdS)�DoctestScopezScope for a doctest.N)rr*r+r,rrrr	r��sr��__file__�__builtins__ZWindowsErrorcCs$t|d�r|jSt|d�r |jSdS)NrOr7)rArOr7)r5rrr	�getNodeName�s

r�c@sBeZdZdZdZdZdZee��	e
�Zej
�d�ZerFe�e�d��[dddej
kfd	d
�Zdd�Zd
d�Zdd�Zdd�Zedd��Zejdd��Zedd��Zdd�Zdd�Zefdd�Zdd�Zd d!�Z d"d#�Z!d$d%�Z"d&d'�Z#d(d)�Z$d*d+�Z%d,d-�Z&d.d/�Z'd0d1�Z(ddd2d3�Z)d4d5�Z*d6d7�Z+d8d9�Z,d:d;�Z-e.�/�j0Z1d<d=�Z2d>d?�Z3e)Z4Z5Z6Z7Z8Z9Z:Z;Z<Z=Z>Z?Z@ZAZBe3ZCe)ZDZEZFZGZHZIZJZKZLZMZNZOe3ZPZQZRZSe)ZTZUZVe3ZWZXZYZZZ[Z\e3Z]Z^Z_Z`ZaZbZcZdZeZfZgZhZiZjZkZlZmZnZoZpZqZrZsZtZuZvZwZxZye)ZzZ{Z|Z}d@dA�Z~dBdC�ZdDdE�Z�e�Z�dFdG�Z�e��r�e)ne�Z�e�Z�Z�dHdI�Z�dJdK�Z�e�Z�dLdM�Z�dNdO�Z�e�Z�Z�dPdQ�Z�e�Z�dRdS�Z�dTdU�Z�dVdW�Z�dXdY�Z�e�Z�dZd[�Z�d\d]�Z�d^d_�Z�e�Z�d`da�Z�dbdc�Z�dS)e�Checkera�
    I check the cleanliness and sanity of Python code.

    @ivar _deferredFunctions: Tracking list used by L{deferFunction}.  Elements
        of the list are two-tuples.  The first element is the callable passed
        to L{deferFunction}.  The second element is a copy of the scope stack
        at the time L{deferFunction} was called.

    @ivar _deferredAssignments: Similar to C{_deferredFunctions}, but for
        callables which are deferred assignment checks.
    rNFZPYFLAKES_BUILTINS�,z(none)ZPYFLAKES_DOCTESTcCs�i|_g|_g|_g|_g|_||_|r6|j�|�|_||_t	�g|_
dg|_||_|�
|�|�|j�d|_|�|j�d|_|j
dd�=|��|��dS)Nrr-)�
_nodeHandlers�_deferredFunctions�_deferredAssignments�
deadScopesr�filename�builtIns�union�withDoctestr��
scopeStack�exceptHandlers�root�handleChildren�runDeferred�popScope�checkDeadScopes)r&�treer�rr�rrr	rL�s(

zChecker.__init__cCs"|j�||jdd�|jf�dS)a{
        Schedule a function handler to be called just before completion.

        This is used for handling function bodies, which must be deferred
        because code later in the file might modify the global scope. When
        `callable` is called, the scope at the time this is called will be
        restored, however it will contain any new bindings added to it.
        N)r�rur��offset)r&�callablerrr	�
deferFunction�s	zChecker.deferFunctioncCs"|j�||jdd�|jf�dS)zl
        Schedule an assignment handler to be called just after deferred
        function handlers.
        N)r�rur�r�)r&r�rrr	�deferAssignmentszChecker.deferAssignmentcCs*x$|D]\}}}||_||_|�qWdS)zV
        Run the callables in C{deferred} using their associated scope stack.
        N)r�r�)r&Zdeferred�handlerrmr�rrr	r�
szChecker.runDeferredcCst|j�dkot|jdt�S)N�r-)�lenr�rr�)r&rrr	�_in_doctestszChecker._in_doctestcCs tdd�|jD��sdS|jjS)Ncss|]}t|t�VqdS)N)rr�)rrmrrr	r<sz)Checker.futuresAllowed.<locals>.<genexpr>F)�allr�rmr�)r&rrr	�futuresAllowedszChecker.futuresAllowedcCs$|dkst�t|jt�r d|j_dS)NF)rdrrmr�r�)r&rrrr	r�"scCs
|jdS)Nr^)r�)r&rrr	rm(sz
Checker.scopecCs|j�|j���dS)N)r�rur��pop)r&rrr	r�,szChecker.popScopec	Csj�xb|jD�]V}t|t�rq
|�d�}|r8t|t�s8d}|rRt|j�}|�|�}ng}}|r�|js�t	j
�|j�dkr�x"|D]}|�
tj|dj|�q|W|jr�x |��D]}t|t�r�||_q�Wx�|��D]�}t|t�r�|jp�|j|k}|�s
tj}	|�
|	|jt|��xR|jD]H}
t|�|
�tj��r2tj}	n|�r>�qntj}	|�
|	|
|j|j��qWq�Wq
WdS)z�
        Look at scopes which have been fully examined and report names in them
        which were imported but unused.
        rsNz__init__.py)r�rryr.rrr�rt�
differencerx�os�path�basenamer��reportrZUndefinedExportrJ�valuesrirKrWr7ZUnusedImportr
rY�	getParentr�For�ImportShadowedByLoopVar�RedefinedWhileUnused)r&rmZall_bindingZ	all_namesZ	undefinedr7r�rrKZmessgr5rrr	r�/sB






zChecker.checkDeadScopescCs|j�|��dS)N)r�ru)r&Z
scopeClassrrr	�	pushScopeaszChecker.pushScopecOs|j�||jf|�|��dS)N)rrur�)r&ZmessageClass�args�kwargsrrr	r�dszChecker.reportcCs(x"|j}t|d�st|d�s|SqWdS)NrC�ctx)�parentrA)r&r5rrr	r�gszChecker.getParentcCsz|||fks t|d�r t|d�s$dS||kr0|S|j|jkrL|�|j||�S|j|jkrh|�||j|�S|�|j|j|�S)Nr�)rA�depth�getCommonAncestorr�)r&�lnode�rnode�stoprrr	r�ns
zChecker.getCommonAncestorcCs$x|D]}|�|||�rdSqWdS)NTF)r�)r&r5Z	ancestorsr��arrr	�descendantOf{s
zChecker.descendantOfcCsN|�|||j�}t|�}|rJx,|D]$}|�|||�|�|||�Ar"dSq"WdS)zATrue, if lnode and rnode are located on different forks of IF/TRYTF)r�r�rr�)r&r�r�Zancestor�partsr/rrr	�differentForks�s
zChecker.differentForkscCsDx$|jddd�D]}|j|krPqW|�|j�}|�r|�||j��s|�|j�}t|t�r�t|tj	�r�|�
tj||j|j�n�||j
kr�t|tj�r�t|�|j�tj	tjf�s�|�
tj||j|j�n&|js�|�|�r�|�
tj||j|j�n$t|t��r|�|��r|j�|�|j|j
k�r4|j
|jj|_||j
|j<dS)z�
        Called when a binding is altered.

        - `node` is the statement responsible for the change
        - `value` is the new value, a Binding instance
        Nr^)r�r7r.r�rJr�rrWrr�r�rr�rm�
comprehensionZRedefinedInListComprKrSr�rYru)r&r5rrmZexisting�parent_stmtrrr	�
addBinding�s.

zChecker.addBindingcCs@y
|j|Stk
r&t|�}YnXt||�|j|<}|S)N)r��KeyErrorrr3)r&rZnodeTyper�rrr	�getNodeHandler�s
zChecker.getNodeHandlerc	Cs`t|�}|sdSd}d}xv|jddd�D]b}|dkrBt|t�rBq*y|j|f||_Wntk
rjYnXdS|px|j}|dk	r*t|t�}q*W||j	kr�dS|�rg}xL|jddd�D]8}x2|�
�D]&}t|t�r�|j|f|_|�|j
�q�Wq�Wd�t|��}|�tj|||�dS|dk�r<tj�|j�dk�r<dSd|jdk�r\|�tj||�dS)Nr^Fz, �__path__z__init__.py�	NameError)r�r�rryrmrKr�rxr�r�r�rirurX�joinr%r�rZImportStarUsager�r�r�r�r��
UndefinedName)r&r5r7Z
in_generatorsrxrm�	from_listr�rrr	�handleNodeLoad�s@


zChecker.handleNodeLoadcCs"t|�}|sdSt|jt�r�||jkr�xz|jdd�D]h}t|ttf�sJq6||koZ||j}|r6|d|jkr6||jjkr6|�t	j
||jd|||j�Pq6W|�|�}t|t
jt
jf�s�||jkr�|�|�s�t||�}n4|dk�rt|jt��rt||j|j�}n
t||�}|�||�dS)Nr^rr-rs)r�rrmrzr�r�rKr}r�rZUndefinedLocalrJr�rr�r�r��isLiteralTupleUnpackingrIrrror�)r&r5r7rmrKr�r�rrr	�handleNodeStore�s*



zChecker.handleNodeStorecs��fdd�}t��}|sdS|�r&dSt|jt�rN||jjkrN|jj�|�n2y|j|=Wn$tk
r~|�tj	�|�YnXdS)Ncs@t�dd�}x.|r:t|tjtjtjf�r,dSt|dd�}qWdS)zN
            Return `True` if node is part of a conditional body.
            r�NTF)r3rrr�WhileZIfExp)�current)r5rr	�on_conditional_branchsz7Checker.handleNodeDelete.<locals>.on_conditional_branch)
r�rrmrzr}�remover�r�rr�)r&r5r�r7r)r5r	�handleNodeDeleteszChecker.handleNodeDeletecCs&x t||d�D]}|�||�qWdS)N)r6)r8�
handleNode)r&r�r6r5rrr	r�.szChecker.handleChildrencCs:t|tj�r6x$|j|jgD]}t|d�sdSqWdSdS)NrCFT)rrZAssign�targetsrrA)r&r5�childrrr	r�2s

zChecker.isLiteralTupleUnpackingcCs&t|tj�p$t|tj�o$t|jtj�S)z}
        Determine if the given node is a docstring, as long as it is at the
        correct place in the node tree.
        )rrr@�Exprr)r&r5rrr	�isDocstring9szChecker.isDocstringcCsRt|tj�r|j}t|tj�s"dStr2|jd}n|j|j�d�d}|j|fS)N)NNr-�
)	rrr�rr@�PYPYrNr�count)r&r5Zdoctest_linenorrr	�getDocstringAszChecker.getDocstringc	Cs�|dkrdS|jrJt|dd�dk	rJ|j|jd7_|j|jd7_|jrftd|j|jj�|j	r�t
|tj�s�|�
|�s�d|_	|jd7_|j|_||_z|�|j�}||�Wd|jd8_X|jr�td|jd|jj�dS)NrNrr-z  Fzend )r�r3rN�
col_offset�	traceTree�print�	nodeDepthr2rr�rrZ
ImportFromr�r�r�r�)r&r5r�r�rrr	r�Os&
zChecker.handleNodec	Csry&|�|jd�\}}|o"|�|�}Wnttfk
r>dSX|sHdS|j}|jdg|_|jpdd}|�t�d|j	k}|s�|j	�
d�x�|D]�}yt|jddt
j�}	Wnhtk
�rt��d}
tr�|
jd7_||j|
j|jd|
jp�df}|�tj||�Yq�X|d||j|d|jdf|_|�|	�||_q�W|�s`|j	�d�|��||_dS)Nr)rr�_z	<doctest>�execr-r)r�r�_getDoctestExamples�
ValueError�
IndexErrorr�r�r�r�r��add�compilerJrZ
PyCF_ONLY_AST�SyntaxError�sys�exc_infor�rN�indentr�rZDoctestSyntaxErrorr�r�r�)r&r5Z	docstringZnode_linenoZexamplesZsaved_stackZnode_offsetZunderscore_in_builtinsZexampler��eZpositionrrr	�handleDoctestsgs@





zChecker.handleDoctestscCsdS)Nr)r&r5rrr	�ignore�szChecker.ignorec	s�dd��jD�}t|�}dd�|��D�}x�|D]���fdd�t|�D�}t�fdd�|D��}tdd�|��D��r0xD|D]<}�j|}t�t�r�|�tj	|�j
�q||�tj|��q|Wq0W|���dS)NcSsg|]}t|��qSr)r:)rr rrr	r�sz Checker.DICT.<locals>.<listcomp>cSsg|]\}}|dkr|�qS)r-r)rr r�rrr	r�scsg|]\}}|�kr|�qSrr)rr;Zi_key)r rr	r�sc3s|]}t�j|�VqdS)N)r:r�)r�index)r5rr	r<�szChecker.DICT.<locals>.<genexpr>css|]\}}|dkVqdS)r-Nr)rrr�rrr	r<�s)
�keysr1r/�	enumerate�anyrrEr�rZMultiValueRepeatedKeyVariabler7ZMultiValueRepeatedKeyLiteralr�)	r&r5r�Z
key_countsZduplicate_keysZkey_indicesr�Z	key_indexZkey_noder)r r5r	�DICT�s(






zChecker.DICTcCs6t|jtj�r(|jjgkr(|�tj|�|�|�dS)N)	rZtestrrBrCr�rZAssertTupler�)r&r5rrr	�ASSERT�szChecker.ASSERTcs�|��rdnd}|j|}|j|k	r�xh|jD]^�t�|�}�fdd�|jD�|_|��|�||f|_x"|j|dd�D]}||�<qzWq,WdS)z5
        Keep track of globals declarations.
        r-rcs*g|]"}t|tj�r"|jd�kr|�qS)r)rrr�Zmessage_args)r�m)�	node_namerr	r�sz"Checker.GLOBAL.<locals>.<listcomp>N)r�r�rmrtror�
setdefaultrK)r&r5Zglobal_scope_indexZglobal_scopeZ
node_valuermr)r�r	�GLOBAL�s



zChecker.GLOBALcCs |�t�|�|�|��dS)N)r�r�r�r�)r&r5rrr	�GENERATOREXP�s

zChecker.GENERATOREXPcCs�t|jtjtjf�rL|�|�|jdkr�t|jt�r�t|j	tj
�r�d|j_nJt|jtjtj
f�rl|�|�n*t|jtj�r�|�|�ntd|jf��dS)zV
        Handle occurrence of Name (which can be a load/store/delete access.)
        �localsTz%Got impossible expression context: %rN)rr�rZLoadZAugLoadr�rOrmrzr�ZCallr��StoreZAugStorer�ZDelr��RuntimeError)r&r5rrr	�NAMEs

zChecker.NAMEcCs�|}xxt|d�r||j|}}t|t�r4||jkr4dSt|tjtjf�rHPt|d�rt|tj�r||j	kr|�
tj|�dSqWt|tj�r�|�
tj
|�n|�
tj|�dS)Nr��	finalbody)rAr�r�
LOOP_TYPESrr�FunctionDef�ClassDefZContinuer�r�rZContinueInFinallyZContinueOutsideLoopZBreakOutsideLoop)r&r5rZn_childrrr	�CONTINUEs


zChecker.CONTINUEcCsXt|jttf�r"|�tj|�dS|jrFt|jd�rF|jj	sF|j|j_	|�
|j|�dS)Nr~)rrmryr�r�rZReturnOutsideFunctionrrAr~r�)r&r5rrr	�RETURN-s
zChecker.RETURNcCs<t|jttf�r"|�tj|�dSd|j_|�|j	|�dS)NT)
rrmryr�r�rZYieldOutsideFunctionrr�r)r&r5rrr	�YIELD:s
z
Checker.YIELDcslx�jD]}��|��qW�������t�j����jrh���sht�j	t
�sh����fdd��dS)Ncs
����S)N)r�r)r5r&rr	r
Nrz%Checker.FUNCTIONDEF.<locals>.<lambda>)rr��LAMBDAr�rpr7r�r�rrmrzr�)r&r5�decor)r5r&r	�FUNCTIONDEFDs
zChecker.FUNCTIONDEFcs�g�g}tr0��fdd����jj��jj}nBx0�jj�jjD]}��|j�|�|j�qBW�jj�jj}t�d�}xbdD]Z}t	�j|�}|s�q���t
r�|n|j�|r�t
r�|d}|�t	�j|��q�|�|j�q�W|r�|��j�tt
���t��k�r@x8t��D],\}	}|�d|	�k�r��tj�|��qWx$||D]}
|
�rJ��|
���qJW���fdd�}��|�dS)Ncs6x0|D](}t|tj�r"�|j�q��|j�qWdS)N)rrrBrCrurO)Zarglist�arg)�addArgsr�rr	rWs
zChecker.LAMBDA.<locals>.addArgs�returns)ZvarargZkwarg�
annotationcs����x�D]}���t|���qWt�jt�rRx*�jD]}��|��q<Wn���j���fdd�}��|�tr��fdd�}��|���	�dS)Ncs.x(�j��D]\}}��tj|j|�qWdS)zU
                Check to see if any assignments have not been used.
                N)rmr�r�rZUnusedVariablerJ)r7r�)r&rr	�checkUnusedAssignments�szCChecker.LAMBDA.<locals>.runFunction.<locals>.checkUnusedAssignmentscs&�jjr"�jjr"��tj�jj�dS)z�
                    Check to see if there is any return statement with
                    arguments but the function is a generator.
                    N)rmrr~r�rZReturnWithArgsInsideGeneratorr)r&rr	�&checkReturnWithArgumentInsideGenerator�szSChecker.LAMBDA.<locals>.runFunction.<locals>.checkReturnWithArgumentInsideGenerator)
r�r�rnrrr4r�r��PY32r�)r7�stmtr
r)r�r5r&rr	�runFunction�s


z#Checker.LAMBDA.<locals>.runFunction)�PY2r��defaultsZ
kwonlyargsrurr	Zkw_defaultsrAr3rFrr�r�r�r�rZDuplicateArgumentr�r�)r&r5ZannotationsrrZis_py3_funcZarg_nameZwildcardZ
argannotation�idxr�rr)rr�r5r&r	rRs@


!zChecker.LAMBDAcs�x�jD]}��|��qWx�jD]}��|��q$WtsXx�jD]}��|��qDW��t��jr����s�t	�j
t�s�����fdd��x�j
D]}��|��q�W������t�j���dS)z�
        Check names used in a class definition, including its decorators, base
        classes, and the body of its definition.  Additionally, add its name to
        the current scope.
        cs
����S)N)r�r)r5r&rr	r
�rz"Checker.CLASSDEF.<locals>.<lambda>N)rr��basesr�keywordsr�ryr�r�rrmrzr�rr�r�rqr7)r&r5rZbaseNodeZkeywordNoder
r)r5r&r	�CLASSDEF�s 
zChecker.CLASSDEFcCs,|�|j�|�|j|�|�|j|�dS)N)r��targetr�r)r&r5rrr	�	AUGASSIGN�szChecker.AUGASSIGNcCs�ts�t|jtj�r�d}d}x>t|j�D]0\}}t|tj�r&|rN|�t	j
|�Pd}|}q&W|dksxt|j�|ddkr�|�t	j|�|�
|�dS)NFr^T�r-i)rrr�rr�r�rCZStarredr�rZTwoStarredExpressionsr�Z%TooManyExpressionsInStarredAssignmentr�)r&r5Zhas_starredZstar_locr;rrrr	�TUPLE�sz
Checker.TUPLEcCsXxR|jD]H}d|jkr*|js*t|j|�}n|jp4|j}t|||j�}|�||�qWdS)Nr])rtr7�asnamer\rWr�)r&r5�alias�importationr7rrr	�IMPORT�szChecker.IMPORTcCs|jdkr.|js4|�tj|dd�|jD��nd|_d|j|jpDd}x�|jD]�}|jp^|j}|jdkr�t	|||j
�}|jtjkr�|�tj
||j�n`|jdkr�ts�t|j
t�s�|�tj||�qPd|j
_|�tj||�t||�}nt||||j�}|�||�qPWdS)	NrlcSsg|]
}|j�qSr)r7)rrrrr	r�sz&Checker.IMPORTFROM.<locals>.<listcomp>Fr]�rjT)rfr�r�rZLateFutureImportrt�levelrr7rkrmrlZall_feature_namesZFutureFeatureNotDefinedrrr�ZImportStarNotPermittedrxZImportStarUsedrirer�)r&r5rfrr7rrrr	�
IMPORTFROM�s0



zChecker.IMPORTFROMcCs�g}x�t|j�D]x\}}t|jtj�rHx6|jjD]}|�t|��q0Wn|jr^|�t|j��|jdkr|t	|j�dkr|�
tj|�qW|j
�|�x|jD]}|�||�q�W|j
��|j|dd�dS)Nr-r)r6)r�rr�typerrBrCrur�r�r�rZDefaultExceptNotLastr�rr�r�r�)r&r5Z
handler_namesr;r��exc_typer�rrr	�TRYs
zChecker.TRYcCs�ts|jdkr|�|�dSx,|jddd�D]}|j|kr.d}Pq.Wd}|�|�|�|�|s�y|j|j=Wntk
r�YnXdS)Nr^TF)rr7r�r�r�rmr�)r&r5rmZis_name_previously_definedrrr	�
EXCEPTHANDLERs



zChecker.EXCEPTHANDLERcCsF|jr|�|j|�t|jt�s.|�|j|�|jrB|�|j|�dS)z�
        Annotated assignments don't have annotations evaluated on function
        scope, hence the custom implementation.

        See: PEP 526.
        N)rr�rrrmrzr	)r&r5rrr	�	ANNASSIGN;szChecker.ANNASSIGN)N)�rr*r+r,r�r�r�r��builtin_varsr��_MAGIC_GLOBALSr�r��environr.Z_customBuiltIns�updater_rLr�r�r�r�rbr��setterrmr�r�rzr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r��doctestZ
DocTestParserZget_examplesr�r�r�ZDELETEZPRINTZFORZASYNCFORZWHILEZIFZWITHZWITHITEMZ	ASYNCWITHZ
ASYNCWITHITEMZRAISEZ
TRYFINALLYZEXECZEXPRZASSIGNZPASSZBOOLOPZBINOPZUNARYOPZIFEXPZSETZCOMPARE�CALLZREPRZ	ATTRIBUTEZ	SUBSCRIPTZSTARREDZNAMECONSTANTZNUMZSTRZBYTES�ELLIPSISZSLICEZEXTSLICEZINDEXZLOADZSTOREZDELZAUGLOADZAUGSTOREZPARAMZAND�ORZADDZSUBZMULTZDIVZMODZPOWZLSHIFTZRSHIFTZBITORZBITXORZBITANDZFLOORDIVZINVERTZNOTZUADDZUSUBZEQZNOTEQZLTZLTEZGTZGTEZISZISNOT�INZNOTINZMATMULTZ
COMPREHENSIONZKEYWORDZFORMATTEDVALUEZ	JOINEDSTRr�r�r�ZNONLOCALr�rZLISTCOMPZDICTCOMPZSETCOMPr�rZBREAKrrZAWAITZ	YIELDFROMrZASYNCFUNCTIONDEFrrrrZLISTrrr"Z	TRYEXCEPTr#r$rrrr	r��s�	2
'6

'<0t$
Q	 "r�)=r,rlr*r�r��version_inforrrFZPY34Zpypy_version_infor��AttributeError�dir�
__import__r%r�ImportError�_astr�r"rrbr�Zpyflakesrrrr�r�r�ZAsyncForrwrr1r8r:�objectrIrQrGrErWr\rerirkrnrorprqrrrvryrzr�r�r�r&r�r�rrrr	�<module>st






(%