Your IP : 216.73.216.213


Current Path : /opt/alt/python35/lib/python3.5/site-packages/pyflakes/__pycache__/
Upload File :
Current File : //opt/alt/python35/lib/python3.5/site-packages/pyflakes/__pycache__/checker.cpython-35.pyc



2tX^��@s�dZddlZddlZddlZddlZejdKkZejdLkZejdMkZejdNkZ	yej
dZWnek
r�dZYnXe
eer�dnd	��ZyddlZWnTek
r"ddlZd
ejjkrfej_edd��ej_YnXdd
lmZerHdd�Zndd�Zeridd�Zndd�Ze	r�ejejfZnejejejfZGdd�de �Z!dd�Z"de!�dd�Z#dd�Z$Gdd�de%�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&�Z0Gd2d3�d3e'�Z1Gd4d5�d5e'�Z2Gd6d7�d7e&�Z3Gd8d9�d9e �Z4Gd:d;�d;e4�Z5Gd<d=�d=e4�Z6Gd>d?�d?e4�Z7Gd@dA�dAe4�Z8GdBdC�dCe8�Z9dDdEdFgZ:dGdH�Z;GdIdJ�dJe%�Z<dS)Oz]
Main module.

Implement the central Checker class.
Also, it models the Bindings and Scopes.
�N���TFZ__builtin__�builtins�decorator_listcCs|jS)N)Z
decorators)�s�r�A/opt/alt/python35/lib/python3.5/site-packages/pyflakes/checker.py�<lambda> sr
)�messagescCstt|j�j��S)N)�str�unicode�__name__�upper)�
node_classrrr	�getNodeType&srcCs
|jj�S)N)rr)rrrr	r*scCs`t|tjtjf�r%|jgSt|tj�r\|j|jgdd�|jD�SdS)NcSsg|]}|g�qSrr)�.0�hdlrrr	�
<listcomp>3s	z#getAlternatives.<locals>.<listcomp>)�
isinstance�ast�IfZ
TryFinally�bodyZ	TryExcept�orelse�handlers)�nrrr	�getAlternatives/s
rcCsWt|tj�r|jgSt|tj�rS|j|jgdd�|jD�SdS)NcSsg|]}|g�qSrr)rrrrr	r9s	z#getAlternatives.<locals>.<listcomp>)rrrr�Tryrr)rrrr	r5s
c@s.eZdZdZdd�Zdd�ZdS)�_FieldsOrderzFix order of AST node fields.cCs^|j}d|kr!dj}n!d|kr9dj}n	dj}tt|d|dd��S)N�iter�
generators�value�key�reverseT)�_fields�find�tuple�sorted)�selfr�fieldsZ	key_firstrrr	�_get_fieldsDs		z_FieldsOrder._get_fieldscCs|j|�||<}|S)N)r*)r(rr)rrr	�__missing__Osz_FieldsOrder.__missing__N)r�
__module__�__qualname__�__doc__r*r+rrrr	rAsrcCs5i}x(|D] }|j|d�d||<q
W|S)z|
    Simplest required implementation of collections.Counter. Required as 2.6
    does not have Counter in collections.
    r�)�get)�items�results�itemrrr	�counterTs
r4ccs|xu||jD]f}||kr#qt||d�}t|tj�rO|Vqt|t�rx|D]}|VqeWqWdS)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__�getattrrr�AST�list)�node�omitZ
_fields_order�name�fieldr3rrr	�iter_child_nodes_s
r=cCs�t|tj�r|jSttd�rAt|tj�rA|jSt|tj�rmtdd�|jD��St|tj	�r�|j
St|tj�r�td|�}ddddd	di}|j
|j|�Str�t|tj�r�|jSt�SdS)
N�Bytescss|]}t|�VqdS)N)�convert_to_value)r�irrr	�	<genexpr>usz#convert_to_value.<locals>.<genexpr>r3�TrueT�FalseF�None)rr�Strr�hasattrr>�Tupler&�elts�Numr�Name�VariableKeyr0r;�PY33�NameConstantr!�UnhandledKeyType)r3�resultZconstants_lookuprrr	r?os&!r?c@sFeZdZdZdd�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)r;�source�used)r(r;rQrrr	�__init__�s		zBinding.__init__cCs|jS)N)r;)r(rrr	�__str__�szBinding.__str__cCs)d|jj|j|jjt|�fS)Nz#<%s object %r from line %r at 0x%x>)r5rr;rQ�lineno�id)r(rrr	�__repr__�s	zBinding.__repr__cCst|t�o|j|jkS)N)r�
Definitionr;)r(�otherrrr	�	redefines�szBinding.redefinesN)rr,r-r.rSrTrWrZrrrr	rP�s

rPc@seZdZdZdS)rXz7
    A binding that defines a function or a class.
    N)rr,r-r.rrrr	rX�srXc@seZdZdZdS)rNzS
    A dictionary key of a type that we cannot or do not check for duplicates.
    N)rr,r-r.rrrr	rN�srNc@s:eZdZdZdd�Zdd�Zdd�ZdS)	rKzY
    A dictionary key which is a variable.

    @ivar item: The variable AST object.
    cCs|j|_dS)N)rVr;)r(r3rrr	rS�szVariableKey.__init__cCs"|j|jko!|j|jkS)N)r5r;)r(Zcomparerrr	�__eq__�szVariableKey.__eq__cCs
t|j�S)N)�hashr;)r(rrr	�__hash__�szVariableKey.__hash__N)rr,r-r.rSr[r]rrrr	rK�srKcsaeZdZdZd�fdd�Zdd�Zdd�Zed	d
��Zdd�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}
    Ncs5|p	||_g|_tt|�j||�dS)N)�fullName�	redefined�superr^rS)r(r;rQ�	full_name)r5rr	rS�s	zImportation.__init__cCs>t|t�r|j|jkSt|t�o=|j|jkS)N)r�SubmoduleImportationr_rXr;)r(rYrrr	rZ�szImportation.redefinescCs|jjd�d|jkS)z.Return whether importation needs an as clause.�.r/���)r_�splitr;)r(rrr	�
_has_alias�szImportation._has_aliascCs/|j�r d|j|jfSd|jSdS)z5Generate a source statement equivalent to the import.zimport %s as %sz	import %sN)rgr_r;)r(rrr	�source_statement�szImportation.source_statementcCs)|j�r|jd|jS|jSdS)z#Return import full name with alias.z as N)rgr_r;)r(rrr	rT�szImportation.__str__)
rr,r-r.rSrZrg�propertyrhrTrr)r5r	r^�sr^csXeZdZdZ�fdd�Z�fdd�Zdd�Zedd	��Z�S)
rca�
    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.
    csdd|kr%|s+t|tj�s+t�|jd�d}tt|�j||�||_dS)Nrdr)	rr�Import�AssertionErrorrfrarcrSr_)r(r;rQ�package_name)r5rr	rSs+zSubmoduleImportation.__init__cs5t|t�r|j|jkStt|�j|�S)N)rr^r_rarcrZ)r(rY)r5rr	rZszSubmoduleImportation.redefinescCs|jS)N)r_)r(rrr	rTszSubmoduleImportation.__str__cCsd|jS)Nzimport )r_)r(rrr	rhsz%SubmoduleImportation.source_statement)	rr,r-r.rSrZrTrirhrr)r5r	rc�s
rccsCeZdZd�fdd�Zdd�Zedd��Z�S)�ImportationFromNcsh||_|p||_|jd�r7||j}n|d|j}tt|�j|||�dS)Nrd)�module�	real_name�endswithrarmrS)r(r;rQrnrorb)r5rr	rSs	zImportationFrom.__init__cCs/|j|jkr$|jd|jS|jSdS)z#Return import full name with alias.z as N)ror;r_)r(rrr	rT!szImportationFrom.__str__cCsD|j|jkr,d|j|j|jfSd|j|jfSdS)Nzfrom %s import %s as %szfrom %s import %s)ror;rn)r(rrr	rh(s
	z ImportationFrom.source_statement)rr,r-rSrTrirhrr)r5r	rmsrmcsFeZdZdZ�fdd�Zedd��Zdd�Z�S)�StarImportationz3A binding created by a 'from x import *' statement.cs3tt|�jd|�|d|_||_dS)N�*z.*)rarqrSr;r_)r(r;rQ)r5rr	rS5s
zStarImportation.__init__cCsd|jdS)Nzfrom z	 import *)r_)r(rrr	rh<sz StarImportation.source_statementcCs$|jjd�r|jS|jSdS)Nrd)r_rprhr;)r(rrr	rT@szStarImportation.__str__)rr,r-r.rSrirhrTrr)r5r	rq2srqcs(eZdZdZ�fdd�Z�S)�FutureImportationzs
    A binding created by a from `__future__` import statement.

    `__future__` imports are implicitly used.
    cs/tt|�j||d�||f|_dS)N�
__future__)rarsrSrR)r(r;rQ�scope)r5rr	rSOszFutureImportation.__init__)rr,r-r.rSrr)r5r	rsHsrsc@seZdZdZdS)�Argumentz3
    Represents binding a name as an argument.
    N)rr,r-r.rrrr	rvTsrvc@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	rwZsrwc@seZdZdS)�FunctionDefinitionN)rr,r-rrrr	rxdsrxc@seZdZdS)�ClassDefinitionN)rr,r-rrrr	ryhsrycs(eZdZdZ�fdd�Z�S)�
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|kr7t|tj�r7t|dj�|_n	g|_t|jtjtjf�r�x9|jjD]+}t|tj	�rk|jj
|j�qkWtt
|�j||�dS)N�__all__)rr�	AugAssignr8�namesr!�ListrGrHrE�appendrrarzrS)r(r;rQrur9)r5rr	rS{s	zExportBinding.__init__)rr,r-r.rSrr)r5r	rzls
rzc@s"eZdZdZdd�ZdS)�ScopeFcCs,|jj}d|t|�tj|�fS)Nz<%s at 0x%x %s>)r5rrV�dictrW)r(Z	scope_clsrrr	rW�szScope.__repr__N)rr,r-�
importStarredrWrrrr	r��sr�c@seZdZdS)�
ClassScopeN)rr,r-rrrr	r��sr�csOeZdZdZdZedddg�Z�fdd�Zdd	�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�|jj�|_d|_d|_dS)NF)rar�rS�
alwaysUsed�copy�globals�returnValue�isGenerator)r()r5rr	rS�s	zFunctionScope.__init__ccs^xW|j�D]I\}}|jr
||jkr
|jr
t|t�r
||fVq
WdS)zR
        Return a generator for the assignments which have not been used.
        N)r1rRr��
usesLocalsrrw)r(r;�bindingrrr	�unusedAssignments�s

zFunctionScope.unusedAssignments)	rr,r-r.r��setr�rSr�rr)r5r	r��sr�c@seZdZdS)�GeneratorScopeN)rr,r-rrrr	r��sr�c@seZdZdZdZdS)�ModuleScopezScope for a module.TN)rr,r-r.�_futures_allowedrrrr	r��sr�c@seZdZdZdS)�DoctestScopezScope for a doctest.N)rr,r-r.rrrr	r��sr��__file__�__builtins__ZWindowsErrorcCs0t|d�r|jSt|d�r,|jSdS)NrVr;)rFrVr;)r9rrr	�getNodeName�sr�c@sNeZdZdZdZdZdZee�j	e
�Zej
jd�Zergejejd��[dddej
kd	d
�Zdd�Zd
d�Zdd�Zdd�Zedd��Zejdd��Zedd��Zdd�Zdd�Zedd�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(dd2d3�Z)d4d5�Z*d6d7�Z+d8d9�Z,d:d;�Z-e.j/�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�rpe)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)d�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|_||_|rQ|jj|�|_||_t	�g|_
fg|_||_|j
|�|j|j�d|_|j|j�d|_|j
dd�=|j�|j�dS)Nr/)�
_nodeHandlers�_deferredFunctions�_deferredAssignments�
deadScopesr�filename�builtIns�union�withDoctestr��
scopeStack�exceptHandlers�root�handleChildren�runDeferred�popScope�checkDeadScopes)r(�treer�rr�rrr	rS�s(								
		
zChecker.__init__cCs-|jj||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�rr��offset)r(�callablerrr	�
deferFunction�s	zChecker.deferFunctioncCs-|jj||jdd�|jf�dS)zl
        Schedule an assignment handler to be called just after deferred
        function handlers.
        N)r�rr�r�)r(r�rrr	�deferAssignmentszChecker.deferAssignmentcCs7x0|D](\}}}||_||_|�qWdS)zV
        Run the callables in C{deferred} using their associated scope stack.
        N)r�r�)r(Zdeferred�handlerrur�rrr	r�
s		zChecker.runDeferredcCs)t|j�dko(t|jdt�S)N�r/)�lenr�rr�)r(rrr	�_in_doctestszChecker._in_doctestcCs*tdd�|jD��s dS|jjS)Ncss|]}t|t�VqdS)N)rr�)rrurrr	rAsz)Checker.futuresAllowed.<locals>.<genexpr>F)�allr�rur�)r(rrr	�futuresAllowedszChecker.futuresAllowedcCs4|dkst�t|jt�r0d|j_dS)NF)rkrrur�r�)r(r!rrr	r�"scCs|jdS)Nr/re)r�)r(rrr	ru(sz
Checker.scopecCs|jj|jj��dS)N)r�rr��pop)r(rrr	r�,szChecker.popScopecCs�x�|jD]�}t|t�r"q
|jd�}|rMt|t�rMd}|rtt|j�}|j|�}n
g}}|r|jr�t	j
j|j�dkr�x+|D]#}|j
tj|dj|�q�W|jrx,|j�D]}t|t�r�||_q�Wx�|j�D]�}t|t�r|jpF|j|k}|sttj}	|j
|	|jt|��xi|jD]^}
t|j|
�tj�r�tj}	n|r�q~n	tj}	|j
|	|
|j|j�q~WqWq
WdS)z�
        Look at scopes which have been fully examined and report names in them
        which were imported but unused.
        r{Nz__init__.py)r�rr�r0rzr�r}�
differencer��os�path�basenamer��reportrZUndefinedExportrQ�valuesrqrRr^r;ZUnusedImportrr`�	getParentr�For�ImportShadowedByLoopVar�RedefinedWhileUnused)r(ruZall_bindingZ	all_namesZ	undefinedr;r�r!rRZmessgr9rrr	r�/sB


	
		zChecker.checkDeadScopescCs|jj|��dS)N)r�r)r(Z
scopeClassrrr	�	pushScopeaszChecker.pushScopecOs#|jj||j||��dS)N)rrr�)r(ZmessageClass�args�kwargsrrr	r�dszChecker.reportcCs8x1|j}t|d�rt|d�r|SqWdS)NrH�ctx)�parentrF)r(r9rrr	r�gs	 zChecker.getParentcCs�|||fks1t|d�o-t|d�r5dS||krE|S|j|jkrm|j|j||�S|j|jkr�|j||j|�S|j|j|j|�S)Nr�)rF�depth�getCommonAncestorr�)r(�lnode�rnode�stoprrr	r�ns!zChecker.getCommonAncestorcCs.x'|D]}|j|||�rdSqWdS)NTF)r�)r(r9Z	ancestorsr��arrr	�descendantOf{s
zChecker.descendantOfcCsk|j|||j�}t|�}|rgx:|D]2}|j|||�|j|||�Ar1dSq1WdS)zATrue, if lnode and rnode are located on different forks of IF/TRYTF)r�r�rr�)r(r�r�Zancestor�partsr1rrr	�differentForks�s
zChecker.differentForkscCs�x.|jddd�D]}|j|krPqW|j|j�}|r�|j||j�r�|j|j�}t|t�r�t|tj	�r�|j
tj||j|j�n�||j
krZt|tj�rt|j|j�tj	tjf�r|j
tj||j|j�q�|jr�|j|�r�|j
tj||j|j�n.t|t�r�|j|�r�|jj|�|j|j
kr�|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/re)r�r;r0r�rQr�rr^rr�r�rr�ru�
comprehensionZRedefinedInListComprRrZr�r`r)r(r9r!ru�existing�parent_stmtrrr	�
addBinding�s.!zChecker.addBindingcCsNy|j|SWntk
r/t|�}YnXt||�|j|<}|S)N)r��KeyErrorrr6)r(rZnodeTyper�rrr	�getNodeHandler�s
zChecker.getNodeHandlercCs�t|�}|sdSd}d}x�|jddd�D]�}|dkr]t|t�r]q9y|j|f||_Wntk
r�YnXdS|p�|j}|dk	r9t|t�}q9W||j	kr�dS|rxg}xf|jd	dd
�D]N}xE|j
�D]7}t|t�r|j|f|_|j|j
�qWq�Wdjt|��}|jtj|||�dS|dkr�tjj|j�dkr�dSd|jdkr�|jtj||�dS)Nr/Fz, �__path__z__init__.py�	NameErrorrerererere)r�r�rr�rurRr�r�r�r�r�rqrr_�joinr'r�rZImportStarUsager�r�r�r�r��
UndefinedName)r(r9r;Z
in_generatorsr�ru�	from_listr�rrr	�handleNodeLoad�s@
'zChecker.handleNodeLoadcCs�t|�}|sdSt|jt�r�||jkr�x�|jdd�D]�}t|ttf�siqK||ko||j}|rK|d|jkrK||jjkrK|jt	j
||jd|||j�PqKW|j|�}t|t
jt
jf�s&||jkr8|j|�r8t||�}nH|dkrqt|jt�rqt||j|j�}nt||�}|j||�dS)Nr/rr{re)r�rrur�r�r�rRr�r�rZUndefinedLocalrQr�rr�r�r��isLiteralTupleUnpackingrPrzrwr�)r(r9r;rurRr�r�rrr	�handleNodeStore�s*!+zChecker.handleNodeStorecs��fdd�}t��}|s(dS|�r5dSt|jt�ro||jjkro|jjj|�n9y|j|=Wn(tk
r�|jtj	�|�YnXdS)NcsZt�dd�}xA|rUt|tjtjtjf�r@dSt|dd�}qWdS)zN
            Return `True` if node is part of a conditional body.
            r�NTF)r6rrr�While�IfExp)�current)r9rr	�on_conditional_branchs	!z7Checker.handleNodeDelete.<locals>.on_conditional_branch)
r�rrur�r��remover�r�rr�)r(r9r�r;r)r9r	�handleNodeDeletes	$
zChecker.handleNodeDeletecCs1x*t|d|�D]}|j||�qWdS)Nr:)r=�
handleNode)r(r�r:r9rrr	r�.szChecker.handleChildrencCsKt|tj�rGx.|j|jgD]}t|d�s&dSq&WdSdS)NrHFT)rr�Assign�targetsr!rF)r(r9�childrrr	r�2s
zChecker.isLiteralTupleUnpackingcCs7t|tj�p6t|tj�o6t|jtj�S)z}
        Determine if the given node is a docstring, as long as it is at the
        correct place in the node tree.
        )rrrE�Exprr!)r(r9rrr	�isDocstring9s$zChecker.isDocstringcCsqt|tj�r|j}t|tj�s1dStrG|jd}n|j|jjd�d}|j|fS)Nr/�
)NN)	rrr�r!rE�PYPYrUr�count)r(r9Zdoctest_linenorrr	�getDocstringAs	zChecker.getDocstringcCs8|dkrdS|jr]t|dd�dk	r]|j|jd7_|j|jd7_|jr�td|j|jj�|j	r�t
|tj�p�|j
|�r�d|_	|jd7_|j|_||_z |j|j�}||�Wd|jd8_X|jr4td|jd|jj�dS)NrUrr/z  Fzend )r�r6rU�
col_offset�	traceTree�print�	nodeDepthr5rr�rr�
ImportFromr�r�r�r�)r(r9r�r�rrr	r�Os&!				zChecker.handleNodecCs�y5|j|jd�\}}|o1|j|�}Wnttfk
rSdSYnX|s^dS|j}|jdg|_|jp�d}|jt�d|j	k}|s�|j	j
d�x�|D]�}yt|jddt
j�}	Wn{tk
rdtj�d}
tr|
jd7_||j|
j|jd|
jpCdf}|jtj||�Yq�X|d||j|d|jdf|_|j|	�||_q�W|s�|j	jd�|j�||_dS)Nr�_z	<doctest>�execr/r)rr)r�r�_getDoctestExamples�
ValueError�
IndexErrorr�r�r�r�r��add�compilerQr�
PyCF_ONLY_AST�SyntaxError�sys�exc_infor�rU�indentr�rZDoctestSyntaxErrorr�r�r�)r(r9Z	docstringZnode_linenoZexamplesZsaved_stackZnode_offsetZunderscore_in_builtinsZexampler��e�positionrrr	�handleDoctestsgs@		





zChecker.handleDoctestscCsdS)Nr)r(r9rrr	�ignore�szChecker.ignorec	sdd��jD�}t|�}dd�|j�D�}x�|D]���fdd�t|�D�}t�fdd�|D��}tdd�|j�D��rBx\|D]T}�j|}t�t�r�|jtj	|�j
�q�|jtj|��q�WqBW|j��dS)NcSsg|]}t|��qSr)r?)rr"rrr	r�s	z Checker.DICT.<locals>.<listcomp>cSs(g|]\}}|dkr|�qS)r/r)rr"r�rrr	r�s		cs(g|]\}}|�kr|�qSrr)rr@Zi_key)r"rr	r�s	c3s"|]}t�j|�VqdS)N)r?r�)r�index)r9rr	rA�szChecker.DICT.<locals>.<genexpr>css!|]\}}|dkVqdS)r/Nr)rr!r�rrr	rA�s)
�keysr4r1�	enumerate�anyrrKr�rZMultiValueRepeatedKeyVariabler;ZMultiValueRepeatedKeyLiteralr�)	r(r9r�Z
key_countsZduplicate_keysZkey_indicesr�Z	key_indexZkey_noder)r"r9r	�DICT�s(




zChecker.DICTcCsKt|jtj�r:|jjgkr:|jtj|�|j|�dS)N)	r�testrrGrHr�rZAssertTupler�)r(r9rrr	�ASSERT�s'zChecker.ASSERTcs�|j�rdnd}|j|}|j|k	r�x�|jD]�t�|�}�fdd�|jD�|_|j�|�||f|_x)|j|dd�D]}||�<q�Wq>WdS)z5
        Keep track of globals declarations.
        r/rcs<g|]2}t|tj�s2|jd�kr|�qS)r)rrr�Zmessage_args)r�m)�	node_namerr	r�s	z"Checker.GLOBAL.<locals>.<listcomp>N)r�r�rur}rwr�
setdefaultrR)r(r9Zglobal_scope_indexZglobal_scopeZ
node_valuerur)rr	�GLOBAL�s
zChecker.GLOBALcCs(|jt�|j|�|j�dS)N)r�r�r�r�)r(r9rrr	�GENERATOREXP�s

zChecker.GENERATOREXPcCs�t|jtjtjf�rp|j|�|jdkr�t|jt�r�t|j	tj
�r�d|j_nit|jtjtj
f�r�|j|�n;t|jtj�r�|j|�ntd|jf��dS)zV
        Handle occurrence of Name (which can be a load/store/delete access.)
        �localsTz%Got impossible expression context: %rN)rr�r�Load�AugLoadr�rVrur�r��Callr��Store�AugStorer��Delr��RuntimeError)r(r9rrr	�NAMEs
!zChecker.NAMEcCs�|}x�t|d�r�|j|}}t|t�rJ||jkrJdSt|tjtjf�rfPt|d�r	t|tj�r	||j	kr	|j
tj|�dSq	Wt|tj�r�|j
tj
|�n|j
tj|�dS)Nr��	finalbody)rFr�r�
LOOP_TYPESrr�FunctionDef�ClassDef�Continuerr�rZContinueInFinallyZContinueOutsideLoopZBreakOutsideLoop)r(r9rZn_childrrr	�CONTINUEs!zChecker.CONTINUEcCs}t|jttf�r/|jtj|�dS|jrft|jd�rf|jj	rf|j|j_	|j
|j|�dS)Nr�)rrur�r�r�rZReturnOutsideFunctionr!rFr�r�)r(r9rrr	�RETURN-s	
zChecker.RETURNcCsRt|jttf�r/|jtj|�dSd|j_|j|j	|�dS)NT)
rrur�r�r�rZYieldOutsideFunctionr�r�r!)r(r9rrr	�YIELD:s
z
Checker.YIELDcs�x!�jD]}�j|��q
W�j���j�t�j����jr��j�r�t�j	t
�r��j��fdd��dS)Ncs
�j��S)N)r�r)r9r(rr	r
Nsz%Checker.FUNCTIONDEF.<locals>.<lambda>)rr��LAMBDAr�rxr;r�r�rrur�r�)r(r9�decor)r9r(r	�FUNCTIONDEFDs
	
zChecker.FUNCTIONDEFcsg�g}trF��fdd����jj��jj}nWx>�jj�jjD]&}�j|j�|j|j�q]W�jj�jj}t�d�}x�d	D]}t	�j|�}|s�q��jt
r�|n|j�|r�t
r"|d}|jt	�j|��q�|j|j�q�W|rL|j�j�tt
���t��kr�xFt��D]8\}	}|�d|	�krw�jtj�|�qwWx(||D]}
|
r��j|
��q�W���fdd�}�j|�dS)
NcsGx@|D]8}t|tj�r/�|j�q�j|j�qWdS)N)rrrGrHrrV)Zarglist�arg)�addArgsr�rr	rWs
zChecker.LAMBDA.<locals>.addArgs�returns�vararg�kwarg�
annotationcs��j�x'�D]}�j�t|���qWt�jt�rmx7�jD]}�j|��qPWn�j�j���fdd�}�j|�tr��fdd�}�j|��j	�dS)Ncs=x6�jj�D]%\}}�jtj|j|�qWdS)zU
                Check to see if any assignments have not been used.
                N)rur�r�rZUnusedVariablerQ)r;r�)r(rr	�checkUnusedAssignments�szCChecker.LAMBDA.<locals>.runFunction.<locals>.checkUnusedAssignmentscs5�jjr1�jjr1�jtj�jj�dS)z�
                    Check to see if there is any return statement with
                    arguments but the function is a generator.
                    N)rur�r�r�rZReturnWithArgsInsideGeneratorr)r(rr	�&checkReturnWithArgumentInsideGenerator�szSChecker.LAMBDA.<locals>.runFunction.<locals>.checkReturnWithArgumentInsideGenerator)
r�r�rvrrr8r�r��PY32r�)r;�stmtr#r$)r�r9r(rr	�runFunction�s



z#Checker.LAMBDA.<locals>.runFunction)r r!)�PY2r��defaults�
kwonlyargsrrr"�kw_defaultsrFr6rLrr�r�r�r�rZDuplicateArgumentr�r�)r(r9�annotationsr)rZis_py3_funcZarg_nameZwildcardZ
argannotation�idxr�r'r)rr�r9r(r	rRs@

!zChecker.LAMBDAcsx!�jD]}�j|��q
Wx!�jD]}�j|��q.Wtsrx!�jD]}�j|��qXW�jt��jr��j�r�t	�j
t�r��j��fdd��x!�j
D]}�j|��q�W�j��j�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
�j��S)N)r�r)r9r(rr	r
�sz"Checker.CLASSDEF.<locals>.<lambda>N)rr��basesr(�keywordsr�r�r�r�rrur�r�rr�r�ryr;)r(r9rZbaseNodeZkeywordNoder&r)r9r(r	�CLASSDEF�s 
	

zChecker.CLASSDEFcCs:|j|j�|j|j|�|j|j|�dS)N)r��targetr�r!)r(r9rrr	�	AUGASSIGN�szChecker.AUGASSIGNcCs�tr�t|jtj�r�d}d}xUt|j�D]D\}}t|tj�r8|rp|jt	j
|�Pd}|}q8W|dks�t|j�|ddkr�|jt	j|�|j
|�dS)	NFr/T��re�i)r(rr�rr
r�rH�Starredr�rZTwoStarredExpressionsr�Z%TooManyExpressionsInStarredAssignmentr�)r(r9Zhas_starredZstar_locr@rrrr	�TUPLE�s
)z
Checker.TUPLEcCs}xv|jD]k}d|jkr>|jr>t|j|�}n'|jpM|j}t|||j�}|j||�q
WdS)Nrd)r}r;�asnamercr^r�)r(r9�alias�importationr;rrr	�IMPORT�szChecker.IMPORTcCs~|jdkrA|jsJ|jtj|dd�|jD��n	d|_d|j|jp`d}x|jD]}|jp�|j}|jdkr�t	|||j
�}|jtjkrf|jtj
||j�n�|jdkrNtrt|j
t�r|jtj||�qnd|j
_|jtj||�t||�}nt||||j�}|j||�qnWdS)	NrtcSsg|]}|j�qSr)r;)rrrrr	r�s	z&Checker.IMPORTFROM.<locals>.<listcomp>Frd�rrT)rnr�r�rZLateFutureImportr}�levelr8r;rsrurt�all_feature_namesZFutureFeatureNotDefinedr(rr�ZImportStarNotPermittedr�ZImportStarUsedrqrmr�)r(r9rnr9r;r:rrr	�
IMPORTFROM�s0		
	zChecker.IMPORTFROMcCsg}x�t|j�D]�\}}t|jtj�rdxI|jjD]}|jt|��qDWn|jr�|jt|j��|jdkr|t	|j�dkr|j
tj|�qW|j
j|�x!|jD]}|j||�q�W|j
j�|j|dd�dS)Nr/r:r)r�rr�typerrGrHrr�r�r�rZDefaultExceptNotLastr�rr�r�r�)r(r9Z
handler_namesr@r��exc_typer�rrr	�TRYs	(
zChecker.TRYcCs�ts|jdkr&|j|�dSx:|jddd�D]}|j|kr=d}Pq=Wd}|j|�|j|�|s�y|j|j=Wntk
r�YnXdS)Nr/TFre)r(r;r�r�r�rur�)r(r9ruZis_name_previously_definedrrr	�
EXCEPTHANDLERs



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

        See: PEP 526.
        N)r!r�r1rrur�r")r(r9rrr	�	ANNASSIGN;s		zChecker.ANNASSIGN)�rr,r-r.r�r�r�r��builtin_varsr��_MAGIC_GLOBALSr�r��environr0Z_customBuiltIns�updaterfrSr�r�r�r�rir��setterrur�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r��doctestZ
DocTestParserZget_examplesr�r�r�ZDELETEZPRINTZFORZASYNCFORZWHILEZIFZWITHZWITHITEMZ	ASYNCWITHZ
ASYNCWITHITEMZRAISEZ
TRYFINALLYZEXECZEXPRZASSIGNZPASS�BOOLOPZBINOPZUNARYOPZIFEXPZSETZCOMPARE�CALLZREPRZ	ATTRIBUTEZ	SUBSCRIPTZSTARREDZNAMECONSTANTZNUMZSTRZBYTES�ELLIPSISZSLICEZEXTSLICEZINDEXZLOADZSTOREZDELZAUGLOADZAUGSTOREZPARAMZAND�ORZADDZSUBZMULTZDIVZMODZPOWZLSHIFTZRSHIFTZBITORZBITXORZBITANDZFLOORDIVZINVERTZNOTZUADDZUSUBZEQZNOTEQZLTZLTEZGTZGTEZISZISNOT�INZNOTINZMATMULTZ
COMPREHENSIONZKEYWORDZFORMATTEDVALUEZ	JOINEDSTRrrrZNONLOCALrr(ZLISTCOMPZDICTCOMPZSETCOMPrrZBREAKrr�AWAITZ	YIELDFROMrZASYNCFUNCTIONDEFrr0r2r7ZLISTr;r?rBZ	TRYEXCEPTrCrDrrrr	r��s�	2
'6'>2v$


Q	 "r�)rr)rr)rr)rr)=r.rtrJr�r��version_infor(r%rL�PY34Zpypy_version_infor��AttributeError�dir�
__import__rEr�ImportError�_astrr$rrir�pyflakesrrrr�r�r�AsyncForr�rr4r=r?�objectrPrXrNrKr^rcrmrqrsrvrwrxryrzr�r�r�r�r�r�rFr�r�rrrr	�<module>st


(%