B
    >\                 @   sl  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ZddlZddlZddl	Z	ddl
Z
ddlmZ e	jdk Ze	jdkZe	jdkZe	jdkZye	j dZW n ek
r   d	ZY nX eeerd
ndZere
jZne
j
Zerdd Zdd Zndd Zdd ZeZerdd Zndd Zer<ejej fZ!ej"ejej fZ#nejfZ!ej"ejfZ#e$dZ%e$e%j&d Z'e$dZ(G dd de)Z*dd Z+de* fddZ,dd Z-d d! Z.G d"d# d#e/Z0G d$d% d%e0Z1G d&d' d'e1Z2G d(d) d)e/Z3G d*d+ d+e/Z4G d,d- d-e1Z5G d.d/ d/e5Z6G d0d1 d1e5Z7G d2d3 d3e5Z8G d4d5 d5e7Z9G d6d7 d7e0Z:G d8d9 d9e0Z;G d:d; d;e1Z<G d<d= d=e1Z=G d>d? d?e0Z>G d@dA dAe)Z?G dBdC dCe?Z@G dDdE dEe?ZAG dFdG dGe?ZBG dHdI dIe?ZCG dJdK dKeCZDG dLdM dMe/ZEdNdOdPgZFer&eFGdQ dRdS ZHdTdU ZIdVdW ZJG dXdY dYejKZLdZd[ ZMG d\d] d]e/ZNdS )^z]
Main module.

Implement the central Checker class.
Also, it models the Bindings and Scopes.
    N)messages)   r   )r      )r      )r      TFZ__builtin__builtinsc             C   s   t t| j S )N)strunicode__name__upper)
node_class r   /lib/python3.7/site-packages/pyflakes/checker.pygetNodeType&   s    r   c             C   s   | j S )N)type)noder   r   r   get_raise_argument*   s    r   c             C   s
   | j  S )N)r
   r   )r   r   r   r   r   .   s    c             C   s   | j S )N)exc)r   r   r   r   r   1   s    c             C   sH   t | tjtjfr| jgS t | tjrD| j| j gdd | jD  S d S )Nc             S   s   g | ]
}|gqS r   r   ).0hdlr   r   r   
<listcomp>=   s    z#getAlternatives.<locals>.<listcomp>)
isinstanceastIfZ
TryFinallybodyZ	TryExceptorelsehandlers)nr   r   r   getAlternatives9   s    r   c             C   sB   t | tjr| jgS t | tjr>| j| j gdd | jD  S d S )Nc             S   s   g | ]
}|gqS r   r   )r   r   r   r   r   r   C   s    z#getAlternatives.<locals>.<listcomp>)r   r   r   r   ZTryr   r   )r   r   r   r   r   ?   s    z^#\s*type:\s*zignore\s*(#|$)z^(\(.*?\))\s*->\s*(.*)$c               @   s    e Zd ZdZdd Zdd ZdS )_FieldsOrderzFix order of AST node fields.c             C   s>   |j }d|krdj}nd|kr&dj}ndj}tt||ddS )NiterZ
generatorsvalueT)keyreverse)_fieldsfindtuplesorted)selfr   fieldsZ	key_firstr   r   r   _get_fieldsW   s    z_FieldsOrder._get_fieldsc             C   s   |  | | |< }|S )N)r*   )r(   r   r)   r   r   r   __missing__b   s    z_FieldsOrder.__missing__N)r
   
__module____qualname____doc__r*   r+   r   r   r   r   r   T   s   r   c             C   s*   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)itemsZresultsitemr   r   r   counterg   s    
r3   c             c   sd   x^|| j  D ]P}|r||krqt| |d}t|tjr>|V  qt|trx|D ]
}|V  qNW qW dS )a  
    Yield all direct child nodes of *node*, that is, all fields that
    are nodes and all items of fields that are lists of nodes.

    :param node:          AST node to be iterated upon
    :param omit:          String or tuple of strings denoting the
                          attributes of the node to be omitted from
                          further parsing
    :param _fields_order: Order of AST node fields
    N)	__class__getattrr   r   ZASTlist)r   omitZ_fields_ordernameZfieldr2   r   r   r   iter_child_nodesr   s    

r9   c             C   s   t | tjr| jS ttdr.t | tjr.| jS t | tjrNtdd | jD S t | tj	r`| j
S t | tjrt| d}ddd d}||j|S tst | tjr| jS t S d S )NBytesc             s   s   | ]}t |V  qd S )N)convert_to_value)r   ir   r   r   	<genexpr>   s    z#convert_to_value.<locals>.<genexpr>)r2   TF)TrueFalseNone)r   r   Strshasattrr:   Tupler&   eltsNumr   NameVariableKeyr0   r8   PY2ZNameConstantr!   UnhandledKeyType)r2   resultZconstants_lookupr   r   r   r;      s&    
r;   c             C   s   t | tjot| dkS )NNotImplemented)r   r   rG   getNodeName)r   r   r   r   is_notimplemented_name_node   s    rN   c               @   s0   e Zd ZdZdd Zdd Zdd Zdd	 Zd
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.
    c             C   s   || _ || _d| _d S )NF)r8   sourceused)r(   r8   rP   r   r   r   __init__   s    zBinding.__init__c             C   s   | j S )N)r8   )r(   r   r   r   __str__   s    zBinding.__str__c             C   s   d| j j| j| jjt| f S )Nz#<%s object %r from line %r at 0x%x>)r4   r
   r8   rP   linenoid)r(   r   r   r   __repr__   s    zBinding.__repr__c             C   s   t |to| j|jkS )N)r   
Definitionr8   )r(   otherr   r   r   	redefines   s    zBinding.redefinesN)r
   r,   r-   r.   rR   rS   rV   rY   r   r   r   r   rO      s
   
rO   c               @   s   e Zd ZdZdS )rW   z7
    A binding that defines a function or a class.
    N)r
   r,   r-   r.   r   r   r   r   rW      s   rW   c                   s(   e Zd ZdZ fddZdd Z  ZS )Builtinz-A definition created for all Python builtins.c                s   t t| |d  d S )N)superrZ   rR   )r(   r8   )r4   r   r   rR      s    zBuiltin.__init__c             C   s   d| j j| jt| f S )Nz<%s object %r at 0x%x>)r4   r
   r8   rU   )r(   r   r   r   rV      s    zBuiltin.__repr__)r
   r,   r-   r.   rR   rV   __classcell__r   r   )r4   r   rZ      s   rZ   c               @   s   e Zd ZdZdS )rJ   zS
    A dictionary key of a type that we cannot or do not check for duplicates.
    N)r
   r,   r-   r.   r   r   r   r   rJ      s   rJ   c               @   s(   e Zd ZdZdd Zdd Zdd ZdS )	rH   zY
    A dictionary key which is a variable.

    @ivar item: The variable AST object.
    c             C   s   |j | _d S )N)rU   r8   )r(   r2   r   r   r   rR      s    zVariableKey.__init__c             C   s   |j | j ko|j| jkS )N)r4   r8   )r(   Zcomparer   r   r   __eq__   s    zVariableKey.__eq__c             C   s
   t | jS )N)hashr8   )r(   r   r   r   __hash__   s    zVariableKey.__hash__N)r
   r,   r-   r.   rR   r]   r_   r   r   r   r   rH      s   rH   c                   sF   e Zd ZdZd fdd	Zdd Zdd Zed	d
 Zdd 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}
    Nc                s&   |p|| _ g | _tt| || d S )N)fullName	redefinedr[   r`   rR   )r(   r8   rP   	full_name)r4   r   r   rR      s    
zImportation.__init__c             C   s,   t |tr| j|jkS t |to*| j|jkS )N)r   SubmoduleImportationra   rW   r8   )r(   rX   r   r   r   rY      s    
zImportation.redefinesc             C   s   | j dd | jk S )z.Return whether importation needs an as clause..)ra   splitr8   )r(   r   r   r   
_has_alias  s    zImportation._has_aliasc             C   s&   |   rd| j| jf S d| j S dS )z5Generate a source statement equivalent to the import.zimport %s as %sz	import %sN)rh   ra   r8   )r(   r   r   r   source_statement  s    zImportation.source_statementc             C   s"   |   r| jd | j S | jS dS )z#Return import full name with alias.z as N)rh   ra   r8   )r(   r   r   r   rS     s    zImportation.__str__)N)r
   r,   r-   r.   rR   rY   rh   propertyri   rS   r\   r   r   )r4   r   r`      s   r`   c                   s@   e Zd ZdZ fddZ fddZdd Zedd	 Z  Z	S )
rd   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.
    c                sF   d|kr|rt |tjst|dd }tt| || || _d S )Nre   r   )	r   r   ZImportAssertionErrorrg   r[   rd   rR   ra   )r(   r8   rP   Zpackage_name)r4   r   r   rR   )  s    zSubmoduleImportation.__init__c                s&   t |tr| j|jkS tt| |S )N)r   r`   ra   r[   rd   rY   )r(   rX   )r4   r   r   rY   0  s    
zSubmoduleImportation.redefinesc             C   s   | j S )N)ra   )r(   r   r   r   rS   5  s    zSubmoduleImportation.__str__c             C   s
   d| j  S )Nzimport )ra   )r(   r   r   r   ri   8  s    z%SubmoduleImportation.source_statement)
r
   r,   r-   r.   rR   rY   rS   rj   ri   r\   r   r   )r4   r   rd     s
   rd   c                   s2   e Zd Zd fdd	Zdd Zedd Z  ZS )	ImportationFromNc                sL   || _ |p|| _|dr&|| j }n|d | j }tt| ||| d S )Nre   )module	real_nameendswithr[   rl   rR   )r(   r8   rP   rm   rn   rc   )r4   r   r   rR   ?  s    

zImportationFrom.__init__c             C   s&   | j | jkr| jd | j S | jS dS )z#Return import full name with alias.z as N)rn   r8   ra   )r(   r   r   r   rS   J  s    zImportationFrom.__str__c             C   s4   | j | jkr d| j| j | jf S d| j| jf S d S )Nzfrom %s import %s as %szfrom %s import %s)rn   r8   rm   )r(   r   r   r   ri   Q  s
    
z ImportationFrom.source_statement)N)r
   r,   r-   rR   rS   rj   ri   r\   r   r   )r4   r   rl   =  s   rl   c                   s4   e Zd ZdZ fddZedd Zdd Z  ZS )StarImportationz3A binding created by a 'from x import *' statement.c                s&   t t| d| |d | _|| _d S )N*z.*)r[   rp   rR   r8   ra   )r(   r8   rP   )r4   r   r   rR   ^  s    
zStarImportation.__init__c             C   s   d| j  d S )Nzfrom z	 import *)ra   )r(   r   r   r   ri   e  s    z StarImportation.source_statementc             C   s   | j dr| jS | jS d S )Nre   )ra   ro   ri   r8   )r(   r   r   r   rS   i  s    zStarImportation.__str__)	r
   r,   r-   r.   rR   rj   ri   rS   r\   r   r   )r4   r   rp   [  s   rp   c                   s    e Zd ZdZ fddZ  ZS )FutureImportationzs
    A binding created by a from `__future__` import statement.

    `__future__` imports are implicitly used.
    c                s"   t t| ||d ||f| _d S )N
__future__)r[   rr   rR   rQ   )r(   r8   rP   scope)r4   r   r   rR   x  s    zFutureImportation.__init__)r
   r,   r-   r.   rR   r\   r   r   )r4   r   rr   q  s   rr   c               @   s   e Zd ZdZdS )Argumentz3
    Represents binding a name as an argument.
    N)r
   r,   r-   r.   r   r   r   r   ru   }  s   ru   c               @   s   e Zd ZdZdS )
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)r
   r,   r-   r.   r   r   r   r   rv     s   rv   c               @   s   e Zd ZdS )FunctionDefinitionN)r
   r,   r-   r   r   r   r   rw     s   rw   c               @   s   e Zd ZdS )ClassDefinitionN)r
   r,   r-   r   r   r   r   rx     s   rx   c                   s    e Zd ZdZ fddZ  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 recognized C{__all__} assignment via list concatenation is in the
    following format:

        __all__ = ['a'] + ['b'] + ['c']

    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.
    c                s   d|kr&t |tjr&t|d j _ng  _ fdd}t |jtjtjfrX||j nht |jtjr|j}xRt |j	tjr|j
}|j	}|| t |tjr|}qnt |tjr|| P qnP qnW tt || d S )N__all__c                s.   x(| j D ]}t|tjr j|j qW d S )N)rE   r   r   rA   namesappendrB   )Z	containerr   )r(   r   r   _add_to_names  s    z-ExportBinding.__init__.<locals>._add_to_names)r   r   Z	AugAssignr6   r{   r!   ZListrD   BinOprightleftr[   ry   rR   )r(   r8   rP   rt   r}   ZcurrentValuer   r   )r4   )r(   r   rR     s&    zExportBinding.__init__)r
   r,   r-   r.   rR   r\   r   r   )r4   r   ry     s   ry   c               @   s   e Zd ZdZdd ZdS )ScopeFc             C   s    | j j}d|t| t| f S )Nz<%s at 0x%x %s>)r4   r
   rU   dictrV   )r(   Z	scope_clsr   r   r   rV     s    zScope.__repr__N)r
   r,   r-   importStarredrV   r   r   r   r   r     s   r   c               @   s   e Zd ZdS )
ClassScopeN)r
   r,   r-   r   r   r   r   r     s   r   c                   s6   e Zd ZdZdZdddhZ fddZdd	 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__c                s*   t t|   | j | _d | _d| _d S )NF)r[   r   rR   
alwaysUsedcopyglobalsreturnValueisGenerator)r(   )r4   r   r   rR     s    zFunctionScope.__init__c             c   sL   xF|   D ]:\}}|js
|dkr
|| jkr
| js
t|tr
||fV  q
W dS )zR
        Return a generator for the assignments which have not been used.
        _N)r1   rQ   r   
usesLocalsr   rv   )r(   r8   bindingr   r   r   unusedAssignments  s    

zFunctionScope.unusedAssignments)	r
   r,   r-   r.   r   r   rR   r   r\   r   r   )r4   r   r     s   r   c               @   s   e Zd ZdS )GeneratorScopeN)r
   r,   r-   r   r   r   r   r     s   r   c               @   s   e Zd ZdZdZdZdS )ModuleScopezScope for a module.TFN)r
   r,   r-   r.   _futures_allowed_annotations_future_enabledr   r   r   r   r     s   r   c               @   s   e Zd ZdZdS )DoctestScopezScope for a doctest.N)r
   r,   r-   r.   r   r   r   r   r     s   r   c               @   s   e Zd ZdZdd ZdS )	DummyNodez<Used in place of an `ast.AST` to set error message positionsc             C   s   || _ || _d S )N)rT   
col_offset)r(   rT   r   r   r   r   rR      s    zDummyNode.__init__N)r
   r,   r-   r.   rR   r   r   r   r   r     s   r   __file____builtins__ZWindowsError__annotations__c             C   s$   t | dr| jS t | dr | jS d S )NrU   r8   )rC   rU   r8   )r   r   r   r   rM     s    

rM   c                s:    fdd}t | jtjo8t| jjdko8|| jjd S )Nc                sf   t | tjr6| j kr6t  | j tr6 | j jdkpdt | tjodt | jtjod| jjdkod| jdkS )Nztyping.overloadtypingZoverload)	r   r   rG   rU   rl   ra   Z	Attributer!   attr)r   )rt   r   r   is_typing_overload_decorator  s    
z8is_typing_overload.<locals>.is_typing_overload_decoratorr/   r   )r   rP   r   FunctionDeflendecorator_list)r!   rt   r   r   )rt   r   is_typing_overload  s    r   c                s6   t | ts| d} t| d tt fddS )NzUTF-8Tc                  s
   t  dS )N    )nextr   )linesr   r   <lambda>2  s    zmake_tokens.<locals>.<lambda>)r   bytesencoder    
splitlinesr&   tokenize_tokenize)coder   )r   r   make_tokens,  s    

r   c               @   s<   e Zd ZdZdd Zdd Ze Z Z ZZ	e Z
 ZZdS )_TypeableVisitorzCollect the line number and nodes which are deemed typeable by
    PEP 484

    https://www.python.org/dev/peps/pep-0484/#type-comments
    c             C   s   g | _ i | _d S )N)typeable_linestypeable_nodes)r(   r   r   r   rR   ;  s    z_TypeableVisitor.__init__c             C   s(   | j |j || j|j< | | d S )N)r   r|   rT   r   Zgeneric_visit)r(   r   r   r   r   	_typeable?  s    z_TypeableVisitor._typeableN)r
   r,   r-   r.   rR   r   Zvisit_AssignZ	visit_ForZvisit_FunctionDefZ
visit_WithZvisit_AsyncForZvisit_AsyncFunctionDefZvisit_AsyncWithr   r   r   r   r   5  s
   r   c             C   s   t  }||  tt}x||D ]t\}}}}}|tjks t|r t	|rNq |\}}t
|j|}	|	dkrnq |j|j|	d   }
||
 ||f q W |S )Nr   r/   )r   Zvisitcollectionsdefaultdictr6   tokenizeCOMMENTTYPE_COMMENT_REmatchTYPE_IGNORE_REbisectZbisect_rightr   r   r|   )treetokensZvisitorZtype_commentstptextstartr   rT   idxr   r   r   r   _collect_type_commentsJ  s    




r   c               @   s  e Zd ZdZejeejeej	e
eje
ejeejeejeejeiZerPe
feej< dZdZdZeeeZejdZere e!d [dddejkd	fd
dZ"dd Z#dd Z$dd Z%dd Z&e'dd Z(e(j)dd Z(e'dd Z*e*j)dd Z*e'dd Z+dd Z,dd Z-e
fd d!Z.d"d# Z/d$d% Z0d&d' Z1d(d) Z2d*d+ Z3d,d- Z4d.d/ Z5d0d1 Z6d2d3 Z7d4d5 Z8d6d7 Z9d8d9 Z:d:d; Z;dzd<d=Z<d>d? Z=d@dA Z>dBdC Z?dDdE Z@eAB jCZDdFdG ZEdHdI ZFdJdK ZGdLdM ZHe< ZI ZJ ZK ZL ZM ZN ZO ZP ZQ ZR ZS ZT ZUZVeHZWe< ZX ZY ZZ Z[ Z\ Z] Z^ Z_ Z` ZaZbeH Zc Zd Ze ZfZge< Zh ZiZjeH Zk Zl Zm Zn ZoZpeH Zq Zr Zs Zt Zu Zv Zw Zx Zy Zz Z{ Z| Z} Z~ Z Z Z Z Z Z Z Z Z Z Z Z Z ZZdNdO Ze< Z Z ZZdPdQ ZdRdS ZdTdU ZeZdVdW Zer6e<neZe ZZdXdY ZdZd[ ZeZd\d] Zd^d_ Ze ZZd`da ZeZdbdc Zddde Zdfdg Zdhdi Zdjdk Zdldm ZeZdndo Zdpdq Zdrds ZeZdtdu Zdvdw Zdxdy ZdS ){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.
    r   NFZPYFLAKES_BUILTINS,z(none)ZPYFLAKES_DOCTESTr   c             C   s   i | _ g | _g | _g | _g | _|| _|r6| j|| _|| _yt	j
t|  g| _W n  tk
rt   td| Y nX dg| _|| _t||| _x| jD ]}| d t| qW | | | | j d | _| | j d | _| jdd = |   |   d S )Nz$No scope implemented for the node %rr   r/   )_nodeHandlers_deferredFunctions_deferredAssignments
deadScopesr   filenamebuiltInsunionwithDoctestr   _ast_node_scoper   
scopeStackKeyErrorRuntimeErrorexceptHandlersrootr   _type_comments
addBindingrZ   handleChildrenrunDeferredpopScopecheckDeadScopes)r(   r   r   r   r   Zfile_tokensZbuiltinr   r   r   rR     s4    
zChecker.__init__c             C   s"   | j || jdd | jf dS )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   r|   r   offset)r(   callabler   r   r   deferFunction  s    	zChecker.deferFunctionc             C   s"   | j || jdd | jf dS )zl
        Schedule an assignment handler to be called just after deferred
        function handlers.
        N)r   r|   r   r   )r(   r   r   r   r   deferAssignment  s    zChecker.deferAssignmentc             C   s*   x$|D ]\}}}|| _ || _|  qW dS )zV
        Run the callables in C{deferred} using their associated scope stack.
        N)r   r   )r(   Zdeferredhandlerrt   r   r   r   r   r     s    zChecker.runDeferredc             C   s   t | jdkot| jd tS )N   r/   )r   r   r   r   )r(   r   r   r   _in_doctest  s    zChecker._in_doctestc             C   s    t dd | jD sdS | jjS )Nc             s   s   | ]}t |tV  qd S )N)r   r   )r   rt   r   r   r   r=     s   z)Checker.futuresAllowed.<locals>.<genexpr>F)allr   rt   r   )r(   r   r   r   futuresAllowed  s    zChecker.futuresAllowedc             C   s$   |dkst t| jtr d| j_d S )NF)rk   r   rt   r   r   )r(   r!   r   r   r   r     s    c             C   s   | j d }t|tsdS |jS )Nr   F)r   r   r   r   )r(   rt   r   r   r   annotationsFutureEnabled  s    

z Checker.annotationsFutureEnabledc             C   s(   |dkst t| jtst d| j_d S )NT)rk   r   rt   r   r   )r(   r!   r   r   r   r     s    c             C   s
   | j d S )Nrf   )r   )r(   r   r   r   rt     s    zChecker.scopec             C   s   | j | j  d S )N)r   r|   r   pop)r(   r   r   r   r     s    zChecker.popScopec          	   C   s  x| j D ]}t|trq
|d}|r8t|ts8d}|rRt|j}||}ng  }}|r
|jst	j
| jdkrx"|D ]}| tj|d j| q~W |jr
g }x,| D ] }t|tr||_||j qW dt|}x$|D ]}| tj|d j|| qW x| D ]}t|tr|jp4|j|k}	|	sVtj}
| |
|jt| xP|jD ]F}t| |tr|tj }
n|	rq^ntj!}
| |
||j|j q^W qW q
W dS )z
        Look at scopes which have been fully examined and report names in them
        which were imported but unused.
        rz   Nz__init__.pyz, )"r   r   r   r0   ry   setr{   
differencer   ospathbasenamer   reportr   ZUndefinedExportrP   valuesrp   rQ   r|   ra   joinr'   ImportStarUsager`   r8   ZUnusedImportr   rb   	getParent	FOR_TYPESImportShadowedByLoopVarRedefinedWhileUnused)r(   rt   Zall_bindingZ	all_namesZ	undefinedr8   	from_listr   r!   rQ   Zmessgr   r   r   r   r     sN    





zChecker.checkDeadScopesc             C   s   | j |  d S )N)r   r|   )r(   Z
scopeClassr   r   r   	pushScope'  s    zChecker.pushScopec             O   s   | j || jf|| d S )N)r   r|   r   )r(   ZmessageClassargskwargsr   r   r   r   *  s    zChecker.reportc             C   s(   x"|j }t|dst|ds|S qW d S )NrE   ctx)parentrC   )r(   r   r   r   r   r   -  s    zChecker.getParentc             C   sz   |||fks t |dr t |ds$d S ||kr0|S |j|jkrL| |j||S |j|jk rh| ||j|S | |j|j|S )Nr   )rC   depthgetCommonAncestorr   )r(   lnodernodestopr   r   r   r   4  s    
zChecker.getCommonAncestorc             C   s$   x|D ]}|  |||rdS qW dS )NTF)r   )r(   r   Z	ancestorsr   ar   r   r   descendantOfA  s    
zChecker.descendantOfc             C   s4   |}x*|| j krd S | |}t||r|S qW d S )N)r   r   r   )r(   r   Zancestor_typer   r   r   r   _getAncestorG  s    


zChecker._getAncestorc             C   s   |  |ttj S )N)r   r&   r   r   keys)r(   r   r   r   r   getScopeNodeP  s    zChecker.getScopeNodec             C   sN   |  ||| j}t|}|rJx,|D ]$}| |||| |||A r"dS q"W dS )zATrue, if lnode and rnode are located on different forks of IF/TRYTF)r   r   r   r   )r(   r   r   Zancestorpartsr1   r   r   r   differentForksS  s    
zChecker.differentForksc             C   sv  x$| j ddd D ]}|j|krP qW ||j}|rHt|tsH| ||jsH| |j}t|trt|t	r| 
tj||j|j n|| jkr$t|tjrt| |jt	tjfs| 
tj||j|j nN|jsH||rH|jdkst|trHt|| jsH| 
tj||j|j n$t|trH||rH|j| |j| jkrf| j|j j|_|| j|j< dS )z
        Called when a binding is altered.

        - `node` is the statement responsible for the change
        - `value` is the new value, a Binding instance
        Nrf   r   )r   r8   r0   r   rZ   r   rP   r   r`   r   r   r   r   rt   r   comprehensionZRedefinedInListComprQ   rY   r   r   rb   r|   )r(   r   r!   rt   existingparent_stmtr   r   r   r   ^  s4    
zChecker.addBindingc             C   s@   y
| j | S  tk
r&   t|}Y nX t| | | j |< }|S )N)r   r   r   r5   )r(   r   ZnodeTyper   r   r   r   getNodeHandler  s    
zChecker.getNodeHandlerc       
   	   C   s  t |}|sd S d }d }x| jdd d D ]}t|trVtsL|dkrLd S |dkrVq,|dkrt||d tr| |}t|tj	rt|j
tjr| tj| yZ| j|f|| _|| }t|tr| ry| j|f||j _W n tk
r   Y nX W n tk
r   Y nX d S |p"|j}|dk	r,t|t}q,W |rg }xR| jdd d D ]>}x6| D ]*}	t|	trd| j|f|	_||	j qdW qVW dt|}| tj||| d S |dkrtj| j dkrd S |dkrt| jtrd S d	| j!d kr| tj"|| d S )
Nrf   r4   Fprintz, __path__z__init__.pyr,   	NameError)#rM   r   r   r   rI   r0   rZ   r   r   r~   opZRShiftr   r   ZInvalidPrintSyntaxrt   rQ   r`   rh   ra   r   r   r   r   rp   r|   r   r'   r   r   r   r   r   r   UndefinedName)
r(   r   r8   Zin_generatorsr   rt   r   r   r   r   r   r   r   handleNodeLoad  s^    


zChecker.handleNodeLoadc             C   sH  t |}|sd S t| jtr|| jkrxz| jd d D ]h}t|ttfsJq6||koZ|| j}|r6|d | jkr6|| jjkr6| t	j
|| jd ||| j P q6W | |}t|ttjfs||jkr| |st||}n\|dkrt| jtrt||j| j}n2tt|dd tjr.t|| |}n
t||}| || d S )Nrf   r   r/   rz   r   )rM   r   rt   r   r   r   rQ   r   r   r   ZUndefinedLocalrP   r   r   r   r   r   isLiteralTupleUnpackingrO   ry   r5   Paramru   r   rv   r   )r(   r   r8   rt   rQ   r   r   r   r   r   handleNodeStore  s.    



zChecker.handleNodeStorec                s    fdd}t  }|sd S | r&d S t| jtrN|| jjkrN| jj| n2y| j|= W n$ tk
r~   | tj	 | Y nX d S )Nc                 s@   t  dd} x.| r:t| tjtjtjfr,dS t | dd} qW dS )zN
            Return `True` if node is part of a conditional body.
            r   NTF)r5   r   r   r   WhileZIfExp)Zcurrent)r   r   r   on_conditional_branch  s    z7Checker.handleNodeDelete.<locals>.on_conditional_branch)
rM   r   rt   r   r   remover   r   r   r  )r(   r   r  r8   r   )r   r   handleNodeDelete  s    zChecker.handleNodeDeletec             C   s   x| j |dD ]\\}}}|ddd  }t|}|r`|ddd|d f}n|f}x@|D ]8}tr|dd}| 	t
| j|t||||tj qlW qW d S )	Nr   :r/   rq    r   z...Ellipsis)r   r0   rg   stripTYPE_FUNC_REr   groupreplacerI   r   	functoolspartialhandleStringAnnotationr   r   ZCommentAnnotationSyntaxError)r(   r   rT   r   commentZ
func_matchr   partr   r   r   _handle_type_comments  s    

zChecker._handle_type_commentsc             C   s0   |  | x t||dD ]}| || qW d S )N)r7   )r  r9   
handleNode)r(   r   r7   r   r   r   r   r   .  s    
zChecker.handleChildrenc             C   s:   t |tjr6x$|j|jg D ]}t|dsdS qW dS d S )NrE   FT)r   r   ZAssignZtargetsr!   rC   )r(   r   childr   r   r   r  3  s
    
zChecker.isLiteralTupleUnpackingc             C   s&   t |tjp$t |tjo$t |jtjS )z}
        Determine if the given node is a docstring, as long as it is at the
        correct place in the node tree.
        )r   r   rA   Exprr!   )r(   r   r   r   r   isDocstring:  s    zChecker.isDocstringc             C   sV   t |tjr|j}t |tjs"dS ts*tr6|jd }n|j|j	d d }|j|fS )N)NNr/   
)
r   r   r  r!   rA   PYPY	PY38_PLUSrT   rB   count)r(   r   Zdoctest_linenor   r   r   getDocstringB  s    zChecker.getDocstringc          	   C   s   |d krd S | j rJt|dd d k	rJ| j| j d 7  _| j| j d 7  _| jrftd| j |jj  | j	rt
|tjs| |sd| _	|  jd7  _| j|_||_z| |j}|| W d |  jd8  _X | jrtd| j d |jj  d S )NrT   r   r/   z  Fzend )r   r5   rT   r   	traceTreer  	nodeDepthr4   r
   r   r   r   Z
ImportFromr  r   r   r   )r(   r   r   r   r   r   r   r  P  s&    
zChecker.handleNodec          	   C   s  ydt |dr@|j}|j}t |drTt|gdd |jjD  }n| |jd \}}|o`| |}W n tt	fk
r|   d S X |sd S | j
}| j
d g| _
| jpd}| t | d td x|D ]}yt|jd}W nl tk
rF   t d	 }	tr|	 jd	7  _||j |	j |jd
 |	jp,d f}
| tj||
 Y qX |d | |j |d	 |j d
 f| _| | || _qW |   || _
d S )N	docstringr   c             S   s   g | ]
}|j qS r   )rT   )r   argr   r   r   r   t  s    z*Checker.handleDoctests.<locals>.<listcomp>r   )r   r   r   z	<doctest>r/      )rC   r&  rT   maxr   r#  r   _getDoctestExamples
ValueError
IndexErrorr   r   r   r   r   rZ   r   parserP   SyntaxErrorsysexc_infor   indentr   r   ZDoctestSyntaxErrorr   r   )r(   r   r&  Znode_linenoZexamplesZsaved_stackZnode_offsetZexampler   eZpositionr   r   r   handleDoctestsh  sD    






zChecker.handleDoctestsc       
      C   s   yt |}W n" tk
r0   | ||| d S X |j}t|dksTt|d t jsf| ||| d S |jd j}x2t 	|D ]$}	d|	j
kr~d|	j
kr~||	_||	_q~W | || d S )Nr/   r   rT   r   )r   r-  r.  r   r   r   r   r  r!   walk_attributesrT   r   r  )
r(   rB   r   Z
ref_linenoZref_col_offseterrr   r   Zparsed_annotationZ
descendantr   r   r   r    s     


zChecker.handleStringAnnotationc          
      s`   t  tjr2tj j j j	t
j n*jrP fdd n  d S )Nc                  s     S )N)r  r   )
annotationr   r(   r   r   r     s    z*Checker.handleAnnotation.<locals>.<lambda>)r   r   rA   r   r  r  r  rB   rT   r   r   ZForwardAnnotationSyntaxErrorr   r  )r(   r7  r   r   )r7  r   r(   r   handleAnnotation  s    zChecker.handleAnnotationc             C   s   d S )Nr   )r(   r   r   r   r   ignore  s    zChecker.ignorec             C   sR   |  | t|}t|tjr8t|jrN| tj	| nt|rN| tj	| d S )N)
r   r   r   r   CallrN   funcr   r   ZRaiseNotImplemented)r(   r   r'  r   r   r   RAISE  s    

zChecker.RAISEc       	         s   dd j D }t|}dd | D }x|D ]  fddt|D }tfdd|D }tdd | D r0xD|D ]<}j | }t tr| tj	| j
 q|| tj|  q|W q0W |  d S )Nc             S   s   g | ]}t |qS r   )r;   )r   r"   r   r   r   r     s    z Checker.DICT.<locals>.<listcomp>c             S   s   g | ]\}}|d kr|qS )r/   r   )r   r"   r"  r   r   r   r     s    c                s   g | ]\}}| kr|qS r   r   )r   r<   Zi_key)r"   r   r   r     s    c             3   s   | ]}t  j| V  qd S )N)r;   r   )r   index)r   r   r   r=     s   zChecker.DICT.<locals>.<genexpr>c             s   s   | ]\}}|d kV  qdS )r/   Nr   )r   r!   r"  r   r   r   r=      s    )r   r3   r1   	enumerateanyr   rH   r   r   ZMultiValueRepeatedKeyVariabler8   ZMultiValueRepeatedKeyLiteralr   )	r(   r   r   Z
key_countsZduplicate_keysZkey_indicesr   Z	key_indexZkey_noder   )r"   r   r   DICT  s(    






zChecker.DICTc             C   s6   t |jtjr(|jjg kr(| tj| | | d S )N)	r   Ztestr   rD   rE   r   r   ZAssertTupler   )r(   r   r   r   r   ASSERT  s    zChecker.ASSERTc                s   |   rdnd}| j| }| j|k	rxh|jD ]^ t |} fdd| jD | _| | ||f|_x"| j|d d D ]}|| < qzW q,W dS )z5
        Keep track of globals declarations.
        r/   r   c                s*   g | ]"}t |tjr"|jd   kr|qS )r   )r   r   r  Zmessage_args)r   m)	node_namer   r   r   &  s    z"Checker.GLOBAL.<locals>.<listcomp>N)r   r   rt   r{   rv   r   
setdefaultrQ   )r(   r   Zglobal_scope_indexZglobal_scopeZ
node_valuert   r   )rC  r   GLOBAL  s    



zChecker.GLOBALc             C   s    |  t | | |   d S )N)r   r   r   r   )r(   r   r   r   r   GENERATOREXP4  s    

zChecker.GENERATOREXPc             C   s   t |jtjtjfrL| | |jdkrt | jtrt |j	tj
rd| j_nNt |jtjtjtjfrp| | n*t |jtjr| | ntd|jf dS )zV
        Handle occurrence of Name (which can be a load/store/delete access.)
        localsTz%Got impossible expression context: %rN)r   r   r   ZLoadZAugLoadr  rU   rt   r   r   r:  r   StoreZAugStorer  r	  ZDelr  r   )r(   r   r   r   r   NAME=  s    

zChecker.NAMEc             C   s   |}xxt |dr||j| }}t|tr4||jkr4d S t|tjtjfrHP t |drt|tjr||j	kr| 
tj| d S qW t|tjr| 
tj| n| 
tj| d S )Nr   	finalbody)rC   r   r   
LOOP_TYPESr   r   r   ClassDefZContinuerJ  r   r   ZContinueInFinallyZContinueOutsideLoopZBreakOutsideLoop)r(   r   r   Zn_childr   r   r   CONTINUEP  s    


zChecker.CONTINUEc             C   sX   t | jttfr"| tj| d S |jrFt| jdrF| jj	sF|j| j_	| 
|j| d S )Nr   )r   rt   r   r   r   r   ZReturnOutsideFunctionr!   rC   r   r  )r(   r   r   r   r   RETURNi  s    
zChecker.RETURNc             C   s<   t | jttfr"| tj| d S d| j_| |j	| d S )NT)
r   rt   r   r   r   r   ZYieldOutsideFunctionr   r  r!   )r(   r   r   r   r   YIELDv  s
    zChecker.YIELDc                sl   x j D ]}|  qW    t j  jrh shtj	t
sh fdd d S )Nc                  s
     S )N)r3  r   )r   r(   r   r   r     s    z%Checker.FUNCTIONDEF.<locals>.<lambda>)r   r  LAMBDAr   rw   r8   r   r   r   rt   r   r   )r(   r   decor   )r   r(   r   FUNCTIONDEF  s    
zChecker.FUNCTIONDEFc                s  g g }t r0 fdd  jj jj}nBx0jjjj D ]}|j ||j qBW jjjj }td}xbdD ]Z}t	j|}|sqt r|n|j |rt r|d }|t	j| q||j qW |r|j
 tttk r@x8tD ],\}	}|d |	 krtj| qW x|D ]}
|
 qFW x|D ]}| qbW fdd}| d S )Nc                s6   x0| D ](}t |tjr" |j q|j qW d S )N)r   r   rD   rE   r|   rU   )Zarglistr'  )addArgsr   r   r   rS    s    
zChecker.LAMBDA.<locals>.addArgsreturns)varargkwargr7  c                 sR      j dd fdd} |  trFfdd}|   d S )Nr   )r7   c                 s.   x( j  D ]\} } tj|j|  qW dS )zU
                Check to see if any assignments have not been used.
                N)rt   r   r   r   UnusedVariablerP   )r8   r   )r(   r   r   checkUnusedAssignments  s    zCChecker.LAMBDA.<locals>.runFunction.<locals>.checkUnusedAssignmentsc                  s&    j jr" j jr" tj j j dS )z
                    Check to see if there is any return statement with
                    arguments but the function is a generator.
                    N)rt   r   r   r   r   ZReturnWithArgsInsideGeneratorr   )r(   r   r   &checkReturnWithArgumentInsideGenerator  s    zSChecker.LAMBDA.<locals>.runFunction.<locals>.checkReturnWithArgumentInsideGenerator)r   r   r   rI   r   )rX  rY  )r   r(   r   r   runFunction  s    

z#Checker.LAMBDA.<locals>.runFunction)rI   r   defaultsZ
kwonlyargsr|   r'  r7  kw_defaultsrC   r5   rT  r   r   r>  r   r   ZDuplicateArgumentr8  r  r   )r(   r   annotationsr[  r'  Zis_py3_funcZarg_nameZwildcardZargannotationr   r7  defaultrZ  r   )rS  r   r   r(   r   rP    sB    




zChecker.LAMBDAc             C   sT   | j |dd trP| |}|jr6| |t|j| |jrP| |t|j| d S )N)r[  r\  )r7   )r   rI   r   rU  r   ru   rV  )r(   r   Z
scope_noder   r   r   	ARGUMENTS  s    
zChecker.ARGUMENTSc             C   s   |  |t|j| | d S )N)r   ru   r'  r   )r(   r   r   r   r   ARG  s    zChecker.ARGc                s   x j D ]}|  qW x jD ]}|  q$W tsXx jD ]}|  qDW t jr st	j
ts fdd x jD ]}|  qW    t j  dS )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.
        c                  s
     S )N)r3  r   )r   r(   r   r   r     s    z"Checker.CLASSDEF.<locals>.<lambda>N)r   r  basesrI   keywordsr   r   r   r   r   rt   r   r   r   r   r   rx   r8   )r(   r   rQ  ZbaseNodeZkeywordNodeZstmtr   )r   r(   r   CLASSDEF  s     
zChecker.CLASSDEFc             C   s,   |  |j | |j| | |j| d S )N)r  targetr  r!   )r(   r   r   r   r   	AUGASSIGN  s    zChecker.AUGASSIGNc             C   s   t st|jtjrd}d}x>t|jD ]0\}}t|tjr&|rN| t	j
| P d}|}q&W |dksxt|j| d dkr| t	j| | | d S )NFrf   T   r/   i   )rI   r   r   r   rH  r>  rE   ZStarredr   r   ZTwoStarredExpressionsr   Z%TooManyExpressionsInStarredAssignmentr   )r(   r   Zhas_starredZstar_locr<   r   r   r   r   TUPLE  s    zChecker.TUPLEc             C   sX   xR|j D ]H}d|jkr*|js*t|j|}n|jp4|j}t|||j}| || qW d S )Nre   )r{   r8   asnamerd   r`   r   )r(   r   aliasimportationr8   r   r   r   IMPORT  s    zChecker.IMPORTc             C   s  |j dkr.| js4| tj|dd |jD  nd| _d|j |j pDd }x|jD ]}|jp^|j}|j dkrt	||| j
}|jtjkr| tj||j |jdkrd| _n`|jd	krtst| j
ts| tj|| qPd| j
_| tj|| t||}nt||||j}| || qPW d S )
Nrs   c             S   s   g | ]
}|j qS r   )r8   )r   r   r   r   r   r   *  s    z&Checker.IMPORTFROM.<locals>.<listcomp>Fre   r  r]  Trq   )rm   r   r   r   ZLateFutureImportr{   levelrh  r8   rr   rt   rs   Zall_feature_namesZFutureFeatureNotDefinedr   rI   r   r   ZImportStarNotPermittedr   ZImportStarUsedrp   rl   r   )r(   r   rm   ri  r8   rj  r   r   r   
IMPORTFROM&  s4    





zChecker.IMPORTFROMc             C   s   g }xt |jD ]x\}}t|jtjrHx6|jjD ]}|t| q0W n|jr^|t|j |jd kr|t	|jd k r| 
tj| qW | j| x|jD ]}| || qW | j  | j|dd d S )Nr/   r   )r7   )r>  r   r   r   r   rD   rE   r|   rM   r   r   r   ZDefaultExceptNotLastr   r   r  r   r   )r(   r   Zhandler_namesr<   r   exc_typer  r   r   r   TRYH  s    
zChecker.TRYc             C   s   t s|jd kr| | d S |j| jkr2| | y| j|j}W n tk
r\   d }Y nX | | | | y| j|j}W n tk
r   Y nX |js| t	j
||j |r|| j|j< d S )N)rI   r8   r   rt   r	  r   r   rQ   r   r   rW  )r(   r   Zprev_definitionr   r   r   r   EXCEPTHANDLER^  s&    




zChecker.EXCEPTHANDLERc             C   s:   |j r| |j| | |j| |j r6| |j | d S )N)r!   r  rd  r8  r7  )r(   r   r   r   r   	ANNASSIGN  s
    zChecker.ANNASSIGNc             C   s   t jt jf}ts|t jf7 }|j}xRt|j|jD ]@\}}t	|t j
t jfrnt	||s`t	||rn| tj| |}q2W | | d S )N)r   rA   rF   rI   r:   r   zipZopsZcomparatorsr   ZIsZIsNotr   r   Z	IsLiteralr   )r(   r   literalsr   r  r   r   r   r   COMPARE  s    zChecker.COMPARE)N)r
   r,   r-   r.   r   ZModuler   rL  r   r   r   ZLambdaZListCompr   ZSetCompZGeneratorExpZDictCompr   	PY35_PLUSZAsyncFunctionDefr%  r   r$  r   builtin_varsr   _MAGIC_GLOBALSr   r   environr0   Z_customBuiltInsupdaterg   rR   r   r   r   r   rj   r   setterr   rt   r   r   r   r   r   r   r   r   r   r   r   r   r  r	  r  r  r   r  r  r#  r  doctestZDocTestParserZget_examplesr*  r3  r  r8  r9  ZDELETEZPRINTZFORZASYNCFORZWHILEZIFZWITHZWITHITEMZ	ASYNCWITHZASYNCWITHITEMZ
TRYFINALLYZEXECZEXPRZASSIGNZPASSZBOOLOPZBINOPZUNARYOPZIFEXPZSETCALLZREPRZ	ATTRIBUTEZ	SUBSCRIPTZSTARREDZNAMECONSTANTZNUMZSTRZBYTESELLIPSISZCONSTANTZSLICEZEXTSLICEZINDEXZLOADZSTOREZDELZAUGLOADZAUGSTOREZPARAMZANDORZADDZSUBZMULTZDIVZMODZPOWZLSHIFTZRSHIFTZBITORZBITXORZBITANDZFLOORDIVZINVERTZNOTZUADDZUSUBZEQZNOTEQZLTZLTEZGTZGTEZISZISNOTINZNOTINZMATMULTr<  ZCOMPREHENSIONZKEYWORDZFORMATTEDVALUEZ	JOINEDSTRr@  rA  rE  ZNONLOCALrF  rI   ZLISTCOMPZDICTCOMPZSETCOMPrI  rM  ZBREAKrN  rO  ZAWAITZ	YIELDFROMrR  ZASYNCFUNCTIONDEFrP  r_  r`  rc  re  rg  ZLISTrk  rm  ro  Z	TRYEXCEPTrp  rq  rt  r   r   r   r   r   e  s   
 	9	*J!

/8,t$L		"-r   )Or.   rs   r   r   r   r{  r  r   rer/  r   Zpyflakesr   version_inforI   ru  Z	PY36_PLUSr!  Zpypy_version_infor   AttributeErrordir
__import__rv  generate_tokensr   r   r   r   r	   r   ZForZAsyncForr   r
  rK  compiler   patternr   r  r   r   r3   r9   r;   rN   objectrO   rW   rZ   rJ   rH   r`   rd   rl   rp   rr   ru   rv   rw   rx   ry   r   r   r   r   r   r   r   rw  r|   rM   r   r   ZNodeVisitorr   r   r   r   r   r   r   <module>   s   








(%
1	

	