a
    td`H                    @   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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zej dZW n ey   d	ZY n0 eeerd
ndZe
 jZerejZnejZerdd Zdd Z ndd Zdd Z e!Z"er*dd Z#ndd Z#erbej$ej%fZ&ej'ej$ej%fZ(ej)ej*fZ+nej$fZ&ej'ej$fZ(ej)fZ+erej,fZ-ndZ-erdd Z.nesdd Z.ndd Z.dd Z/erdd Z0n&ej1ej2fZ3ese3ej4f7 Z3dd Z0dd  Z5d!d" Z6e	7d#Z8d$9d%d& e:d'D Z;e	7e8j<d(=e; Z>e	7d)Z?e	7d*Z@e	7d+ZAe	7d,ZBe	7d-ZCe	7d.ZDeEd/ZFd0d1 ZGd2d3 ZHG d4d5 d5eIZJd6d7 ZKdeJ fd8d9ZLd:d; ZMd<d= ZNG d>d? d?eOZPG d@dA dAePZQG dBdC dCeQZRG dDdE dEeOZSG dFdG dGeOZTG dHdI dIeQZUG dJdK dKeUZVG dLdM dMeUZWG dNdO dOeUZXG dPdQ dQeWZYG dRdS dSePZZG dTdU dUePZ[G dVdW dWePZ\G dXdY dYeQZ]G dZd[ d[eQZ^G d\d] d]ePZ_G d^d_ d_eIZ`G d`da dae`ZaG dbdc dce`ZbG ddde dee`ZcG dfdg dge`ZdG dhdi diedZeG djdk dkeOZfG dldm dmZgg dnZherbehido dpdq ZjeEdrZkdsdt Zldudv Zmdwdx Zndydz ZoG d{d| d|Zpd}d~ Zqdd Zrdd ZsG dd dejtZudd ZvG dd deOZwd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.9/site-packages/pyflakes/checker.pygetNodeType*   s    r   c                 C   s   | j S r   )typenoder   r   r   get_raise_argument.   s    r   c                 C   s
   | j  S r   )r   r   r   r   r   r   r   2   s    c                 C   s   | j S r   )excr   r   r   r   r   5   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>A       #getAlternatives.<locals>.<listcomp>)
isinstanceastIfZ
TryFinallybodyZ	TryExceptorelsehandlersnr   r   r   getAlternatives=   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   G   r   r   )r   r   r   r    ZTryr!   r"   r#   r   r   r   r%   C   s    r   c                 C   s&   t | tjo$t | jttttd fS r   )r   r   Constantvalueboolr   Ellipsisr   r   r   r   _is_singletonX   s    r*   c                 C   s   t | tjtjfS r   )r   r   NameConstantr)   r   r   r   r   r*   ^   s    c                 C   s   t | tjo| jdv S )N>   Truer)   FalseNone)r   r   Nameidr   r   r   r   r*   a   s    c                 C   s    t | tjotdd | jD S )Nc                 s   s   | ]}t |V  qd S r   )_is_constantr   eltr   r   r   	<genexpr>k   r   z%_is_tuple_constant.<locals>.<genexpr>)r   r   Tuplealleltsr   r   r   r   _is_tuple_constanth   s    r8   c                 C   s   t | tjpt| S r   )r   r   r&   r8   r   r   r   r   r1   p   s    r1   c                 C   s   t | tpt| pt| S r   )r   
_const_tpsr*   r8   r   r   r   r   r1   w   s
    
c                 C   s   t | ot|  S r   )r1   r*   r   r   r   r   _is_const_non_singleton   s    r:   c                 C   s,   t | tjr| j|kp*t | tjo*| j|kS r   )r   r   r/   r0   	Attributeattr)r   namer   r   r   _is_name_or_attr   s    r>   z^#\s*type:\s* c                 C   s    g | ]}t | st |qS r   )chrisalnumr   ir   r   r   r      r   r      zignore([{}]|$)z^(\(.*?\))\s*->\s*(.*)$z\(([^()]*)\)z[#0+ -]*z
(?:\*|\d*)z(?:\.(?:\*|\d*))?z[hlL]?zdiouxXeEfFgGcrsa%c                 C   s   |  ||}|d usJ |S r   )match)ZregexstringposrE   r   r   r   _must_match   s    rH   c                    s    fdd}t | S )zParses the string component of a `'...' % ...` format call

    Copied from https://github.com/asottile/pyupgrade at v1.20.1
    c                  3   sr  d} d}d}d}|t  k r`|slz d|}W n& tyX    | d  d fV  Y d S 0 |}|d7 }d}qt |}|r|d}| }nd }tt |}| pd }| }tt	 |}| pd }	| }tt
 |}
|
 pd }|
 }tt | }z | }W n ty,   tdY n0 |d7 }|||	||f} | | |fV  d}|} q|rntdd S )Nr   F%   Tz"end-of-string while parsing format)lenindex
ValueErrorMAPPING_KEY_RErE   groupendrH   CONVERSION_FLAG_REWIDTH_REPRECISION_RE	LENGTH_RE
IndexError)Zstring_startZ
string_endZin_fmtrC   Z	key_matchkeyZconversion_flag_matchZconversion_flagZwidth_matchwidthZprecision_match	precision
conversionZfmtsr   r   _parse_inner   sP    

z*parse_percent_format.<locals>._parse_inner)tuple)r[   r\   r   rZ   r   parse_percent_format   s    8r^   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|v rdj}nd|v r&dj}ndj}tt||ddS )Niter
generatorsr'   T)rV   reverse)_fieldsfindr]   sorted)selfr   fieldsZ	key_firstr   r   r   _get_fields   s    z_FieldsOrder._get_fieldsc                 C   s   |  | | |< }|S r   )rh   )rf   r   rg   r   r   r   __missing__   s    z_FieldsOrder.__missing__N)r   
__module____qualname____doc__rh   ri   r   r   r   r   r_      s   r_   c                 C   s&   i }| D ]}| |dd ||< q|S )z|
    Simplest required implementation of collections.Counter. Required as 2.6
    does not have Counter in collections.
    r   rJ   )get)itemsresultsitemr   r   r   counter   s    rq   c                 c   s\   || j  D ]L}|r||v rq
t| |d}t|tjr<|V  q
t|tr
|D ]
}|V  qJq
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_orderr=   Zfieldrp   r   r   r   iter_child_nodes  s    
rv   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 r   convert_to_valuerB   r   r   r   r4     r   z#convert_to_value.<locals>.<genexpr>)rp   TF)r,   r-   r.   )r   r   Strr[   hasattrrw   r5   r]   r7   Numr$   r/   VariableKeyrm   r=   PY2r+   r'   UnhandledKeyType)rp   resultZconstants_lookupr   r   r   ry     s*    
ry   c                 C   s   t | tjot| dkS )NNotImplemented)r   r   r/   getNodeNamer   r   r   r   is_notimplemented_name_node4  s    r   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)r=   sourceusedrf   r=   r   r   r   r   __init__D  s    zBinding.__init__c                 C   s   | j S r   r=   rf   r   r   r   __str__I  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>)rr   r   r=   r   linenor0   r   r   r   r   __repr__L  s
    zBinding.__repr__c                 C   s   t |to| j|jkS r   )r   
Definitionr=   rf   otherr   r   r   	redefinesR  s    zBinding.redefinesN)r   rj   rk   rl   r   r   r   r   r   r   r   r   r   8  s
   r   c                   @   s   e Zd ZdZdS )r   z7
    A binding that defines a function or a class.
    Nr   rj   rk   rl   r   r   r   r   r   V  s   r   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 r   )superr   r   )rf   r=   rr   r   r   r   _  s    zBuiltin.__init__c                 C   s   d| j j| jt| f S )Nz<%s object %r at 0x%x>)rr   r   r=   r0   r   r   r   r   r   b  s    zBuiltin.__repr__)r   rj   rk   rl   r   r   __classcell__r   r   r   r   r   \  s   r   c                   @   s   e Zd ZdZdS )r   zS
    A dictionary key of a type that we cannot or do not check for duplicates.
    Nr   r   r   r   r   r   h  s   r   c                   @   s(   e Zd ZdZdd Zdd Zdd ZdS )	r}   zY
    A dictionary key which is a variable.

    @ivar item: The variable AST object.
    c                 C   s   |j | _d S r   )r0   r=   )rf   rp   r   r   r   r   t  s    zVariableKey.__init__c                 C   s   |j | j ko|j| jkS r   )rr   r=   )rf   Zcomparer   r   r   __eq__w  s    
zVariableKey.__eq__c                 C   s
   t | jS r   )hashr=   r   r   r   r   __hash__}  s    zVariableKey.__hash__N)r   rj   rk   rl   r   r   r   r   r   r   r   r}   n  s   r}   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 r   )fullName	redefinedr   r   r   )rf   r=   r   	full_namer   r   r   r     s    
zImportation.__init__c                 C   s,   t |tr| j|jkS t |to*| j|jkS r   )r   SubmoduleImportationr   r   r=   r   r   r   r   r     s    
zImportation.redefinesc                 C   s   | j dd | jk S )z.Return whether importation needs an as clause..)r   splitr=   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r   r   r=   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 Nr   r   r   r   r   r     s    zImportation.__str__)N)r   rj   rk   rl   r   r   r   propertyr   r   r   r   r   r   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 )
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.
    c                    sF   d|v r|rt |tjsJ |dd }tt| || || _d S )Nr   r   )r   r   ZImportr   r   r   r   r   )rf   r=   r   Zpackage_namer   r   r   r     s    zSubmoduleImportation.__init__c                    s&   t |tr| j|jkS tt| |S r   )r   r   r   r   r   r   r   r   r   r   r     s    
zSubmoduleImportation.redefinesc                 C   s   | j S r   r   r   r   r   r   r     s    zSubmoduleImportation.__str__c                 C   s
   d| j  S )Nzimport r   r   r   r   r   r     s    z%SubmoduleImportation.source_statement)
r   rj   rk   rl   r   r   r   r   r   r   r   r   r   r   r     s   r   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 Nr   )module	real_nameendswithr   r   r   )rf   r=   r   r   r   r   r   r   r   r     s    

zImportationFrom.__init__c                 C   s&   | j | jkr| jd | j S | jS dS r   )r   r=   r   r   r   r   r   r     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)r   r=   r   r   r   r   r   r     s    z ImportationFrom.source_statement)N)r   rj   rk   r   r   r   r   r   r   r   r   r   r     s   r   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   r   r   r=   r   r   r   r   r   r     s    
zStarImportation.__init__c                 C   s   d| j  d S )Nzfrom z	 import *r   r   r   r   r   r     s    z StarImportation.source_statementc                 C   s   | j dr| jS | jS d S r   )r   r   r   r=   r   r   r   r   r     s    zStarImportation.__str__)	r   rj   rk   rl   r   r   r   r   r   r   r   r   r   r     s
   
r   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   r   r   r   )rf   r=   r   scoper   r   r   r   	  s    zFutureImportation.__init__r   rj   rk   rl   r   r   r   r   r   r   r     s   r   c                   @   s   e Zd ZdZdS )Argumentz3
    Represents binding a name as an argument.
    Nr   r   r   r   r   r     s   r   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.
    Nr   r   r   r   r   r     s   r   c                   @   s   e Zd ZdZdd ZdS )
Annotationa  
    Represents binding a name to a type without an associated value.

    As long as this name is not assigned a value in another binding, it is considered
    undefined for most purposes. One notable exception is using the name as a type
    annotation.
    c                 C   s   dS )zAAn Annotation doesn't define any name, so it cannot redefine one.Fr   r   r   r   r   r   '  s    zAnnotation.redefinesN)r   rj   rk   rl   r   r   r   r   r   r     s   r   c                   @   s   e Zd ZdS )FunctionDefinitionNr   rj   rk   r   r   r   r   r   ,  s   r   c                   @   s   e Zd ZdS )ClassDefinitionNr   r   r   r   r   r   0  s   r   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/tuple 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|v r&t |tjr&t|d j _ng  _ fdd}t |jtjtjfrX||j npt |jtjr|j}t |j	tjtjfr|j
}|j	}|| t |tjr|}qlt |tjtjfr|| qqlqqltt || d S )N__all__c                    s*   | j D ]}t|tjr j|j qd S r   )r7   r   r   rz   namesappendr[   )	containerr   r   r   r   _add_to_namesI  s    
z-ExportBinding.__init__.<locals>._add_to_names)r   r   Z	AugAssignrt   r   r'   Listr5   BinOprightleftr   r   r   )rf   r=   r   r   r   ZcurrentValuer   r   r   r   r   r   C  s&    zExportBinding.__init__r   r   r   r   r   r   4  s   r   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>)rr   r   r0   dictr   )rf   Z	scope_clsr   r   r   r   h  s    zScope.__repr__N)r   rj   rk   importStarredr   r   r   r   r   r   e  s   r   c                   @   s   e Zd ZdS )
ClassScopeNr   r   r   r   r   r   m  s   r   c                       s4   e Zd ZdZdZh d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.
    F>   Z__tracebackhide__Z__traceback_supplement__Z__traceback_info__c                    s*   t t|   | j | _d | _d| _d S r   )r   r   r   
alwaysUsedcopyglobalsreturnValueisGeneratorr   r   r   r   r   {  s    zFunctionScope.__init__c                 c   sH   |   D ]:\}}|js|dkr|| jvr| jst|tr||fV  qdS )zR
        Return a generator for the assignments which have not been used.
        _N)rn   r   r   
usesLocalsr   r   )rf   r=   bindingr   r   r   unusedAssignments  s    zFunctionScope.unusedAssignments)	r   rj   rk   rl   r   r   r   r   r   r   r   r   r   r   q  s
   r   c                   @   s   e Zd ZdS )GeneratorScopeNr   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   rj   rk   rl   _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.Nr   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 r   )r   
col_offset)rf   r   r   r   r   r   r     s    zDummyNode.__init__N)r   rj   rk   rl   r   r   r   r   r   r     s   r   c                   @   s   e Zd Ze ZdS )DetectClassScopedMagicN)r   rj   rk   dirr   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 )Nr0   r=   )r{   r0   r=   r   r   r   r   r     s    

r   )typingZtyping_extensionsc                    sT    fdd}t | tjr$|| jpRt | tjoRt | jtjoR| jjtv oR | jS )aX  
    Internal helper to determine whether or not something is a member of a
    typing module. This is used as part of working out whether we are within a
    type annotation context.

    Note: you probably don't want to use this function directly. Instead see the
    utils below which wrap it (`_is_typing` and `_is_any_typing_member`).
    c                    sH   t D ]:}| |v rt||  to<||  jtv o< ||  j  S qdS r   )reversedr   r   r   TYPING_MODULESr   )r=   r   is_name_match_fnscope_stackr   r   _bare_name_is_attr  s    z-_is_typing_helper.<locals>._bare_name_is_attr)r   r   r/   r0   r;   r'   r   r<   )r   r   r   r   r   r   r   _is_typing_helper  s    

r   c                    s   t |  fdd|S )z
    Determine whether `node` represents the member of a typing module specified
    by `typing_attr`.

    This is used as part of working out whether we are within a type annotation
    context.
    c                    s   |  kS r   r   xtyping_attrr   r   <lambda>  r   z_is_typing.<locals>.<lambda>r   )r   r   r   r   r   r   
_is_typing  s    r   c                 C   s   t | dd |S )z
    Determine whether `node` represents any member of a typing module.

    This is used as part of working out whether we are within a type annotation
    context.
    c                 S   s   dS NTr   r   r   r   r   r     r   z'_is_any_typing_member.<locals>.<lambda>r   )r   r   r   r   r   _is_any_typing_member  s    r   c                    s&   t | jto$t fdd| jjD S )Nc                 3   s   | ]}t |d  V  qdS )overloadN)r   )r   Zdecr   r   r   r4     s   z%is_typing_overload.<locals>.<genexpr>)r   r   FUNCTION_TYPESanydecorator_list)r'   r   r   r   r   is_typing_overload  s
    r   c                   @   s   e Zd ZdZdZdZdS )AnnotationStater   rJ      N)r   rj   rk   NONESTRINGBAREr   r   r   r   r     s   r   c                    s   t   fdd}|S )Nc                    sB   |   &  | g|R i |W  d    S 1 s40    Y  d S r   )_enter_annotationrf   argskwargsfuncr   r   in_annotation_func  s    
z)in_annotation.<locals>.in_annotation_func	functoolswrapsr   r   r   r   r   in_annotation  s    r  c                    s   t   fdd}|S )Nc                    sF   |  tj&  | g|R i |W  d    S 1 s80    Y  d S r   )r   r   r   r   r   r   r   r     s    z0in_string_annotation.<locals>.in_annotation_funcr  r  r   r   r   in_string_annotation
  s    r  c                    s6   t | ts| d} t| d tt fddS )NzUTF-8Tc                      s
   t  dS )Nr   )nextr   linesr   r   r     r   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 r   )typeable_linestypeable_nodesr   r   r   r   r   !  s    z_TypeableVisitor.__init__c                 C   s(   | j |j || j|j< | | d S r   )r  r   r   r  Zgeneric_visitrf   r   r   r   r   	_typeable%  s    z_TypeableVisitor._typeableN)r   rj   rk   rl   r   r  Zvisit_AssignZ	visit_ForZvisit_FunctionDefZ
visit_WithZvisit_AsyncForZvisit_AsyncFunctionDefZvisit_AsyncWithr   r   r   r   r    s
   r  c                 C   s   t  }||  tt}|D ]t\}}}}}|tjkst|rt	|rLq|\}}t
|j|}	|	dkrlq|j|j|	d   }
||
 ||f q|S )Nr   rJ   )r  Zvisitcollectionsdefaultdictrt   tokenizeCOMMENTTYPE_COMMENT_RErE   TYPE_IGNORE_REbisectZbisect_rightr  r  r   )treetokensZvisitorZtype_commentstptextstartr   r   idxr   r   r   r   _collect_type_comments0  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rNe
eej< dZdZdZejZdZeeeZe j!"dZ#e#re$e#%d [#ddde j!v 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 Z0dd Z1e
fd d!Z2d"d# Z3d$d% Z4d&d' Z5d(d) Z6d*d+ Z7d,d- Z8d.d/ Z9d0d1 Z:d2d3 Z;d4d5 Z<d6d7 Z=d8d9 Z>d:d; Z?e@jAejBfd<d=ZCe+d>d? ZDd@dA ZEddBdCZFdDdE ZGdFdG ZHdHdI ZIdJdK ZJeKL jMZNdLdM ZOePdNdO ZQeRdPdQ ZSdRdS ZTeF ZU ZV ZW ZX ZY ZZ Z[ Z\ Z] Z^ Z_ Z`ZaeTZbeF Zc Zd Ze Zf Zg Zh ZiZjdTdU ZkdVdW ZldXdY ZmdZd[ Znd\d] Zod^d_ Zpeqrd`da ZrneT Zs Zt ZuZreF Zv ZwZxeT Zy Zz Z{ Z| Z}Z~eT Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z ZZdbdc ZeF Z ZZdZddde Zdfdg Zdhdi ZeZdjdk Zdldm ZeZdndo ZereFneZe ZZdpdq Zdrds ZeZdtdu Zdvdw Ze ZZdxdy ZeZdzd{ Zd|d} Zd~d Zdd Zdd Zdd ZeZdd Zdd Zdd ZeZdd Zdd Zdd 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|| _|| _zt	j
t|  g| _W n tyr   td| Y n0 dg| _|| _t||| _| jD ]}| d t| q| | d| _| | j d | _| | j d | _| jdd = |   |   d S )Nz$No scope implemented for the node %rr   TrJ   )_nodeHandlers_deferredFunctions_deferredAssignments
deadScopesr   filenamebuiltInsunionwithDoctestr#  _ast_node_scoper   
scopeStackKeyErrorRuntimeErrorexceptHandlersrootr"  _type_comments
addBindingr   handleChildren_in_deferredrunDeferredpopScopecheckDeadScopes)rf   r  r)  r   r,  Zfile_tokensZbuiltinr   r   r   r   t  s6    

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rf   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   deferAssignment  s    zChecker.deferAssignmentc                 C   s&   |D ]\}}}|| _ || _|  qdS )zV
        Run the callables in C{deferred} using their associated scope stack.
        N)r.  r:  )rf   Zdeferredhandlerr   r:  r   r   r   r7    s    zChecker.runDeferredc                 C   s   t | jdkot| jd tS )Nr   rJ   )rK   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 r   )r   r   )r   r   r   r   r   r4     s   z)Checker.futuresAllowed.<locals>.<genexpr>F)r6   r.  r   r   r   r   r   r   futuresAllowed  s
    zChecker.futuresAllowedc                 C   s$   |du sJ t | jtr d| j_d S r   )r   r   r   r   rf   r'   r   r   r   rA    s    c                 C   s   | j d }t|tsdS |jS )Nr   F)r.  r   r   r   )rf   r   r   r   r   annotationsFutureEnabled  s    

z Checker.annotationsFutureEnabledc                 C   s(   |du sJ t | jtsJ d| j_d S r   )r   r   r   r   rB  r   r   r   rC    s    c                 C   s
   | j d S )Nr   )r.  r   r   r   r   r     s    zChecker.scopec                 C   s   | j | j  d S r   )r(  r   r.  popr   r   r   r   r8    s    zChecker.popScopec              	      s  | j D ] t trq d}|r4t|ts4d}|rXt|j} fdd|jD }ng  }}|r jstj	
| jdkr|D ]}| tj d j| q jrg }  D ] }t|tr||_||j qdt|}|D ]}| tj d j|| q  D ]}t|tr|jp,|j|v }|sNtj}	| |	|jt| |jD ]F}
t| |
trrtj}	n|r~qTntj }	| |	|
|j|j qTqqdS )z
        Look at scopes which have been fully examined and report names in them
        which were imported but unused.
        r   Nc                    s   g | ]}| vr|qS r   r   )r   r=   r   r   r   r     s   z+Checker.checkDeadScopes.<locals>.<listcomp>__init__.py, )!r(  r   r   rm   r   setr   r   ospathbasenamer)  reportr   ZUndefinedExportr   valuesr   r   r   r   joinre   ImportStarUsager   r=   ZUnusedImportr	   r   	getParent	FOR_TYPESImportShadowedByLoopVarRedefinedWhileUnused)rf   Zall_bindingZ	all_namesZ	undefinedr=   	from_listr   r'   r   Zmessgr   r   rE  r   r9    sX    






zChecker.checkDeadScopesc                 C   s   | j |  d S r   )r.  r   )rf   Z
scopeClassr   r   r   	pushScope  s    zChecker.pushScopec                 O   s$   | j || jg|R i | d S r   )r   r   r)  )rf   ZmessageClassr   r   r   r   r   rL    s    zChecker.reportc                 C   s$   |j }t|ds t|ds |S q d S )Nr7   ctx)_pyflakes_parentr{   r  r   r   r   rP    s    zChecker.getParentc                 C   sz   |||fv s t |dr t |ds$d S ||u r0|S |j|jkrL| |j||S |j|jk rh| ||j|S | |j|j|S )NrW  )r{   _pyflakes_depthgetCommonAncestorrW  )rf   lnodernodestopr   r   r   rY     s$    
zChecker.getCommonAncestorc                 C   s"   |D ]}|  |||r dS qdS )NTF)rY  )rf   r   Z	ancestorsr\  ar   r   r   descendantOf6  s    zChecker.descendantOfc                 C   s0   |}|| j u rd S | |}t||r|S qd S r   )r2  rP  r   )rf   r   Zancestor_typeparentr   r   r   _getAncestor<  s    


zChecker._getAncestorc                 C   s   |  |ttj S r   )r`  r]   r#  r-  keysr  r   r   r   getScopeNodeE  s    zChecker.getScopeNodec                 C   sL   |  ||| j}t|}|rH|D ]&}| |||| |||A r  dS q dS )zATrue, if lnode and rnode are located on different forks of IF/TRYTF)rY  r2  r%   r^  )rf   rZ  r[  Zancestorpartsrn   r   r   r   differentForksH  s    zChecker.differentForksc                 C   s  | j ddd D ]}|j|v r q$q||j}|rFt|tsF| ||jsF| |j}t|trt|t	r| 
tj||j|j n|| ju r"t|tjrt| |jt	tjfs| 
tj||j|j nN|jsF||rF|jdkst|trFt|| j sF| 
tj||j|j n$t|trF||rF|j| |j| jv rd| j|j j|_|j| jvs~t|ts|| 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
        Nr   r   )r.  r=   rm   r   r   rd  r   rP  r   rQ  rL  r   rR  r   r   comprehensionZRedefinedInListCompr   r   r   rS  r   r   r   )rf   r   r'   r   existingparent_stmtr   r   r   r4  S  sB    



zChecker.addBindingc                 C   s.   t jdr tdt|n
| | d S )NZPYFLAKES_ERROR_UNKNOWNzUnexpected type: {})rI  environrm   NotImplementedErrorformatr   r5  r  r   r   r   _unknown_handler  s    zChecker._unknown_handlerc                 C   sD   z| j | W S  ty&   t|}Y n0 t| || j | j |< }|S r   )r%  r/  r   rs   rk  )rf   r   ZnodeTyper?  r   r   r   getNodeHandler  s    zChecker.getNodeHandlerc           
   	   C   s.  t |}|sd S d }d }| jdd d D ]$}t|trTtsJ|dkrJ d S |du rTq(||d }t|trr| jsrq(|dkrt|tr| 	|}t|t
jrt|jt
jr| tj| z^| j|f|| _|| }t|tr| rz| j|f||j _W n ty   Y n0 W n ty(   Y n0  d S |p:|j}|dur(t|t}q(|rg }	| jdd d D ]:}| D ]*}t|trv| j|f|_|	|j qvqjdt|	}	| tj|||	 d S |dkrtj !| j"dkrd S |t#j$v r
t| jtr
d S d| j%d vr*| tj&|| d S )	Nr   rr   FprintrG  __path__rF  	NameError)'r   r.  r   r   r~   rm   r   _in_postponed_annotationr   rP  r   r   opZRShiftrL  r   ZInvalidPrintSyntaxr   r   r   r   r   r/  r   r   rM  r   r   rN  re   rO  rI  rJ  rK  r)  r   r   r1  UndefinedName)
rf   r   r=   Zin_generatorsr   r   r   r_  r$   rT  r   r   r   handleNodeLoad  sd    


zChecker.handleNodeLoadc                 C   sl  t |}|sd S t| jtr|| jvr| jd d D ]j}t|ttfsHq4||v oX|| j}|r4|d | ju r4|| jjvr4| t	j
|| jd ||| j  qq4| |}t|tr|jd u rt||}nt|ttjfs||jkr| |st||}nb|dkr$t| jtr$t||j| j}n8trRtt|dd tjrRt|| |}n
t||}| || d S )Nr   r   rJ   r   rV  )r   r   r   r   r.  r   r   r   rL  r   ZUndefinedLocalr   rP  ANNASSIGN_TYPESr'   r   rQ  r   re  rW  isLiteralTupleUnpackingr   r   r~   rs   Paramr   rb  r   r4  )rf   r   r=   r   r   rg  r   r   r   r   handleNodeStore  s8    

zChecker.handleNodeStorec                    s    fdd}t  }|sd S | r&d S t| jtrN|| jjv rN| jj| n0z| j|= W n" ty|   | tj	 | Y n0 d S )Nc                     s<   t  dd} | r8t| tjtjtjfr*dS t | dd} qdS )zN
            Return `True` if node is part of a conditional body.
            rW  NTF)rs   r   r   r   WhileZIfExp)currentr   r   r   on_conditional_branch  s    z7Checker.handleNodeDelete.<locals>.on_conditional_branch)
r   r   r   r   r   remover/  rL  r   rr  )rf   r   rz  r=   r   r   r   handleNodeDelete
  s    zChecker.handleNodeDeletec                 c   s,   | j | }| _ zd V  W || _ n|| _ 0 d S r   )_in_annotation)rf   Zann_typeorigr   r   r   r   (  s    zChecker._enter_annotationc                 C   s   | j tjkp| jS r   )r}  r   r   rC  r   r   r   r   rp  0  s    z Checker._in_postponed_annotationc                 C   s   | j |dD ]\\}}}|ddd  }t|}|r^|ddd|d f}n|f}|D ]8}tr||dd}| 	t
| j|t||||tj qhqd S )	Nr   :rJ   r   r?   r   z...r)   )r3  rm   r   stripTYPE_FUNC_RErE   rO   replacer~   r=  r  partialhandleStringAnnotationr   r   ZCommentAnnotationSyntaxError)rf   r   r   r   ZcommentZ
func_matchrc  partr   r   r   _handle_type_comments7  s     
zChecker._handle_type_commentsc                 C   s,   |  | t||dD ]}| || qd S )Nru   )r  rv   
handleNode)rf   r  ru   r   r   r   r   r5  L  s    
zChecker.handleChildrenc                 C   s8   t |tjr4|j|jg D ]}t|ds dS qdS d S )Nr7   FT)r   r   ZAssigntargetsr'   r{   )rf   r   childr   r   r   ru  Q  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   rz   Exprr'   r  r   r   r   isDocstringX  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)NNrJ   
)
r   r   r  r'   rz   PYPY	PY38_PLUSr   r[   count)rf   r   Zdoctest_linenor   r   r   getDocstring`  s    zChecker.getDocstringc              	   C   s   |d u rd S | j rJt|dd d u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 |  jd8  _n|  jd8  _0 | jrtd| j d |jj  d S )Nr   r   rJ   z  Fzend )r:  rs   r   r   	traceTreerm  	nodeDepthrr   r   rA  r   r   Z
ImportFromr  rX  rW  rl  )rf   r   r_  r?  r   r   r   r  n  s(    
 zChecker.handleNodec              	   C   s  zdt |dr@|j}|j}t |drTt|gdd |jjD  }n| |jd \}}|o`| |}W n tt	fy|   Y d S 0 |sd S | j
}| j
d g| _
| jpd}| t d| j
d vr| d td |D ]}zt|jd}W nj tyP   t d	 }	tr|	 jd	7  _||j |	j |jd
 |	jp6d f}
| tj||
 Y q0 |d | |j |d	 |j d
 f| _| | || _q|   || _
d S )N	docstringr   c                 S   s   g | ]
}|j qS r   )r   r   argr   r   r   r     r   z*Checker.handleDoctests.<locals>.<listcomp>r   )r   r   r   z	<doctest>rJ      )r{   r  r   maxr   r  r    _getDoctestExamplesrM   rU   r.  r:  rU  r   r4  r   r   parser   SyntaxErrorsysexc_infor  indentrL  r   ZDoctestSyntaxErrorr5  r8  )rf   r   r  Znode_linenoZexamplesZsaved_stackZnode_offsetZexampler  eZpositionr   r   r   handleDoctests  sL    




zChecker.handleDoctestsc           
      C   s   zt |}W n" ty0   | ||| Y d S 0 |j}t|dksTt|d t jsf| ||| d S |jd j}t 	|D ]$}	d|	j
v r|d|	j
v r|||	_||	_q|| || d S )NrJ   r   r   r   )r   r  r  rL  r    rK   r   r  r'   walk_attributesr   r   r  )
rf   r[   r   Z
ref_linenoZref_col_offseterrr  r    Zparsed_annotationZ
descendantr   r   r   r    s$    zChecker.handleStringAnnotationc              
      sl   t  tjr2tj j j j	t
j n6jr\ttj fdd n  d S )Nc                      s    S r   r   r   
annotationfnr   rf   r   r   r     r   z*Checker.handleAnnotation.<locals>.<lambda>)r   r   rz   r=  r  r  r  r[   r   r   r   ForwardAnnotationSyntaxErrorrC  r  r#  r  )rf   r  r   r   r  r   handleAnnotation  s    
zChecker.handleAnnotationc                 C   s   d S r   r   r  r   r   r   ignore  s    zChecker.ignorec                 C   s  t |jdrF| tj | | W d    n1 s80    Y  nDt |jdr:| |j| t|jt	j
rx|j}n,t|jt	jrt|jjt	j
r|jj}nd }|d u st|jdk r| |j| n`| |jd | | tj0 |jdd  D ]}| || qW d    n1 s 0    Y  | |j| nPt|j| jr|   | | W d    n1 st0    Y  n
| | d S )NLiteral	Annotatedr   r   rJ   )r>   r'   r   r   r   r5  r  r   slicer   r5   ZIndexrK   r7   rV  r   r.  )rf   r   Zslice_tupler  r   r   r   	SUBSCRIPT  s0    ,
.
,zChecker.SUBSCRIPTc                    sH  zt t jjj}W n6 tyL } ztj | W Y d }~d S d }~0 0 G dd dt	 t	  fdd}|D ]\}}}}||r d S |d urzt t|}W n: t y } z tj | W Y d }~ d S d }~0 0 |D ]L\}}	}
}|
d ur*d|
v r*tj d   d S ||	 r  d S  qqt
 dd st
 dd std	d
  jD stdd
  jD rd S t	tt j}dd  jD }| }| }B ||B  }|rtj dtdd
 |D  |rtj dt| |rDtj dtdd
 |D  d S )Nc                   @   s   e Zd ZdZdZdS )z0Checker._handle_string_dot_format.<locals>.stateNr   )r   rj   rk   auto	next_autor   r   r   r   state  s   r  c                    s   | du rdS |  d\} }}|  d\} }}zt| } W n tyJ   Y n$0 jdu rhtj  dS d_| dkrjdu rtj  dS d_j}  jd7  _t| tr	|  n
	|  dS )z9Returns True if there is an error which should early-exitNFr   [Tr?   rJ   )
	partitionintrM   r  rL  r   ZStringDotFormatMixingAutomaticr  r   add)fmtkeyr   r   Zplaceholder_namedZplaceholder_positionalrf   r  r   r   _add_key#  s.    



z3Checker._handle_string_dot_format.<locals>._add_key{zMax string recursion exceededZstarargsr   c                 s   s    | ]}t |ttd dV  qdS Starredr   Nr   rs   r   r  r   r   r   r4   f  s   z4Checker._handle_string_dot_format.<locals>.<genexpr>c                 s   s   | ]}|j d u V  qd S r   r  r   Zkwdr   r   r   r4   k  r   c                 S   s   h | ]
}|j qS r   r  r  r   r   r   	<setcomp>p  r   z4Checker._handle_string_dot_format.<locals>.<setcomp>rG  c                 s   s   | ]}t |V  qd S r   r	   r   r   r   r   r   r4   ~  r   c                 s   s   | ]}t |V  qd S r   r  r  r   r   r   r4     r   )r]   parse_format_stringr   r'   r[   rM   rL  r   ZStringDotFormatInvalidFormatrH  rs   r   r   keywordsrangerK   Z'StringDotFormatExtraPositionalArgumentsrN  re   Z"StringDotFormatExtraNamedArgumentsZStringDotFormatMissingArgument)rf   r   placeholdersr  r  r   r  specZspec_placeholdersZspec_fmtkeyZ	spec_specZsubstitution_positionalZsubstitution_namedZextra_positionalZextra_namedZmissing_argumentsr   r  r   _handle_string_dot_format  s    %



z!Checker._handle_string_dot_formatc                 C   sR  t |jtjr4t |jjtjr4|jjdkr4| | g }g }g }t|jd| j	rt
|jdkr|  " | |jd | W d    n1 s0    Y  nt|jd| j	r
|dg7 }|dd |jdd  D 7 }|d	g7 }|d
d |jD 7 }|dd |jD 7 }nt|jd| j	rt
|jdkrrt |jd tjrr|dg7 }||jd j7 }|dd t|jD 7 }|d	g7 }|dd |jD 7 }|dd |jD 7 }nt|jd| j	rt
|jdkrnt |jd tjtjfrntdd |jd jD rn|dg7 }|dd |jd jD 7 }|dd |jd jD 7 }|dd t|jD 7 }|dd |jd jD 7 }|d	g7 }|dd |jD 7 }|dd |jD 7 }|rD| tj< |D ]\}}| j||d q| j||d W d    n1 s0    Y  |  ( |D ]}| || qW d    n1 s80    Y  n
| | d S )Nrj  castrJ   r   TypeVarr   c                 S   s   g | ]}|qS r   r   r  r   r   r   r     r   z Checker.CALL.<locals>.<listcomp>r  c                 S   s   g | ]}|j d kr|jqS )bound)r  r'   r   kr   r   r   r     r   c                 S   s$   g | ]}||j d krdgndfqS )r  r'   Nr  r  r   r   r   r     s   	TypedDictc                 S   s&   g | ]\}}||d krdgndfqS )rJ   rM  Nr   r   rC   r  r   r   r   r     s   c                 S   s   g | ]
}|j qS r   r'   r  r   r   r   r     r   c                 S   s   g | ]}|d gfqS r  r   r  r   r   r   r     r   
NamedTuplec                 s   s.   | ]&}t |tjtjfo$t|jd kV  qdS )r   N)r   r   r5   r   rK   r7   r  r   r   r   r4     s   zChecker.CALL.<locals>.<genexpr>c                 S   s   g | ]}|j d  qS rJ   r7   r2   r   r   r   r     r   c                 S   s   g | ]}|j d  dfqS )r   Nr  r2   r   r   r   r     r   c                 S   s&   g | ]\}}||d krdgndfqS )rJ   r7   Nr   r  r   r   r   r     s   c                 S   s   g | ]}|d fqS r  r   r2   r   r   r   r     r   c                 S   s   g | ]
}|j qS r   r  r  r   r   r   r     r   c                 S   s   g | ]}|d gfqS r  r   r  r   r   r   r     r   r  )r   r   r   r;   r'   rz   r<   r  r   r.  rK   r   r   r  r  DictrM  	enumerater5   r   r6   r7   r   r   r5  )rf   r   ru   Z	annotatedZnot_annotatedZna_nodeZna_omitZannotated_noder   r   r   CALL  s|    


4

$




.
2zChecker.CALLc                 C   sf  zt |jj}W n$ ty4   | tj|d Y d S 0 t }d}d }|D ]\}}|d u rZqH|\}}}	}
}|dkrrqH|tvr| tj	|| |d u r|r|d u }|	|
fD ]0}|d urd|v r|s| tj
| q|d7 }q|r|d ur| tj|  d S |s|d u r| tj|  d S |r,|d7 }qH|| qHt|jtjtjfrtdd |jjD st|jj}|r||kr| tj||| n|s| tj| t|jtjrbtdd |jjD rb|r|dkr| tj| d S d	d
 |jjD }|| }|| }|s<|r<| tj|dt| |sb|rb| tj|dt| d S )Nzincomplete formatr   rI   r   rJ   c                 s   s    | ]}t |ttd dV  qdS r  r  r2   r   r   r   r4     s   z1Checker._handle_percent_format.<locals>.<genexpr>c                 s   s   | ]}t |tjV  qd S r   )r   r   rz   r  r   r   r   r4   0  r   c                 S   s   h | ]
}|j qS r   rZ   r  r   r   r   r  6  r   z1Checker._handle_percent_format.<locals>.<setcomp>rG  )r^   r   r[   rM   rL  r   ZPercentFormatInvalidFormatrH  VALID_CONVERSIONSZ'PercentFormatUnsupportedFormatCharacterZ!PercentFormatStarRequiresSequenceZ$PercentFormatMixedPositionalAndNamedr  r   r   r   r   r5   r   r7   rK   Z$PercentFormatPositionalCountMismatchZPercentFormatExpectedMappingr  r6   ra  ZPercentFormatExpectedSequenceZ PercentFormatExtraNamedArgumentsrN  re   ZPercentFormatMissingArgument)rf   r   r  ZnamedZpositional_countZ
positionalr   Zplaceholderr=   rW   rX   rY   r  Zsubstitution_countZsubstitution_keysZ
extra_keysZmissing_keysr   r   r   _handle_percent_format  s    

zChecker._handle_percent_formatc                 C   s4   t |jtjr&t |jtjr&| | | | d S r   )r   rq  r   ZModr   rz   r  r5  r  r   r   r   BINOPF  s    
zChecker.BINOPc                 C   s@   | j r<t| j|j||j|jtj}| j	r2|  n
| 
| d S r   )r}  r  r  r  r[   r   r   r   r  r6  r=  )rf   r   r  r   r   r   STRN  s    zChecker.STRc                 C   s   t |jtr| |S d S r   )r   r'   r	   r  r  r   r   r   CONSTANT^  s    zChecker.CONSTANTc                 C   sR   |  | t|}t|tjr8t|jrN| tj	| nt|rN| tj	| d S r   )
r5  r   r   r   Callr   r   rL  r   ZRaiseNotImplemented)rf   r   r  r   r   r   RAISEp  s    

zChecker.RAISEc                 C   sX   | j s(tdd |jD s(| tj| d| j  | _ }z| | W || _ n|| _ 0 d S )Nc                 s   s   | ]}t |tjV  qd S r   )r   r   ZFormattedValuer  r   r   r   r4     r   z$Checker.JOINEDSTR.<locals>.<genexpr>T)_in_fstringr   rM  rL  r   ZFStringMissingPlaceholdersr5  )rf   r   r~  r   r   r   	JOINEDSTR  s    zChecker.JOINEDSTRc           	         s   dd j D }t|}dd | D }|D ]  fddt|D }tfdd|D }tdd | D r.|D ]<}j | }t tr| tj	| j
 qx| tj|  qxq.|  d S )Nc                 S   s   g | ]}t |qS r   rx   )r   rV   r   r   r   r     s   z Checker.DICT.<locals>.<listcomp>c                 S   s   g | ]\}}|d kr|qS r  r   )r   rV   r  r   r   r   r     s   c                    s   g | ]\}}| kr|qS r   r   )r   rC   Zi_key)rV   r   r   r     r   c                 3   s   | ]}t  j| V  qd S r   )ry   rM  )r   rL   r   r   r   r4     s   zChecker.DICT.<locals>.<genexpr>c                 s   s   | ]\}}|d kV  qdS )rJ   Nr   )r   r'   r  r   r   r   r4     r   )ra  rq   rn   r  r   r   r}   rL  r   ZMultiValueRepeatedKeyVariabler=   ZMultiValueRepeatedKeyLiteralr5  )	rf   r   ra  Z
key_countsZduplicate_keysZkey_indicesrM  Z	key_indexZkey_noder   )rV   r   r   DICT  s4    

zChecker.DICTc                 C   s6   t |jtjr(|jjg kr(| tj| | | d S r   )	r   testr   r5   r7   rL  r   ZIfTupler5  r  r   r   r   IF  s    z
Checker.IFc                 C   s6   t |jtjr(|jjg kr(| tj| | | d S r   )	r   r  r   r5   r7   rL  r   ZAssertTupler5  r  r   r   r   ASSERT  s    zChecker.ASSERTc                    s   |   rdnd}| j| }| j|ur|jD ]Z t |} fdd| jD | _| | ||f|_| j|d d D ]}|| < qvq*dS )z5
        Keep track of globals declarations.
        rJ   r   c                    s*   g | ]"}t |tjr"|jd   kr|qS )r   )r   r   rr  Zmessage_args)r   mZ	node_namer   r   r     s   z"Checker.GLOBAL.<locals>.<listcomp>N)r@  r.  r   r   r   r   
setdefaultr   )rf   r   Zglobal_scope_indexZglobal_scopeZ
node_valuer   r   r  r   GLOBAL  s    





zChecker.GLOBALc                 C   s    |  t | | |   d S r   )rU  r   r5  r8  r  r   r   r   GENERATOREXP  s    

zChecker.GENERATOREXPc                 C   s   t |jtjrF| | |jdkrt | jtrt |jtj	rd| j_
nbt |jtjr`| | nHtr~t |jtjr~| | 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   rV  r   ZLoadrs  r0   r   r   rW  r  r   Storerw  r~   rv  ZDelr|  r0  r  r   r   r   NAME  s    

zChecker.NAMEc                 C   s   |}t |dr~|j| }}t|tr2||jvr2d S t|tjtjfrFq~t |drt|tjr||j	v rt
s| tj| d S qt|tjr| tj| n| tj| d S )NrW  	finalbody)r{   rW  r   
LOOP_TYPESr!   r   FunctionDefClassDefZContinuer  r  rL  r   ZContinueInFinallyZContinueOutsideLoopZBreakOutsideLoop)rf   r   r$   Zn_childr   r   r   CONTINUE  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   r   r   r   rL  r   ZReturnOutsideFunctionr'   r{   r   r  r  r   r   r   RETURN  s    

zChecker.RETURNc                 C   s<   t | jttfr"| tj| d S d| j_| |j	| d S r   )
r   r   r   r   rL  r   ZYieldOutsideFunctionr   r  r'   r  r   r   r   YIELD%  s
    zChecker.YIELDc                    sh    j D ]}|  q   t j  jrd sdtj	t
sd fdd d S )Nc                      s
     S r   r  r   r   rf   r   r   r   9  r   z%Checker.FUNCTIONDEF.<locals>.<lambda>)r   r  LAMBDAr4  r   r=   r,  r@  r   r   r   r=  )rf   r   decor   r  r   FUNCTIONDEF/  s    


zChecker.FUNCTIONDEFc                    s  g g }t r0 fdd  jj jj}nhtrZjjD ]}|j ||j q<jjjj D ]}|j ||j qjjjjj	 }t
d}dD ]Z}tj|}|sqt r|n|j |rt r|d }|tj| q||j q|r|j tttk r`tD ],\}	}|d |	 v r2tj| q2|D ]}
|
 qd|D ]}| q|fdd}| d S )Nc                    s2   | D ](}t |tjr  |j q|j qd S r   )r   r   r5   r7   r   r0   )Zarglistr  )addArgsr   r   r   r  B  s    zChecker.LAMBDA.<locals>.addArgsreturns)varargkwargr  c                     sV      j ddgd fdd} |  trJfdd}|   d S )Nr   r  r  c                     s*    j  D ]\} } tj|j|  q
dS )zU
                Check to see if any assignments have not been used.
                N)r   r   rL  r   UnusedVariabler   )r=   r   r   r   r   checkUnusedAssignmentsw  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)r   r   r   rL  r   ZReturnWithArgsInsideGeneratorr   r   r   r   &checkReturnWithArgumentInsideGenerator  s    zSChecker.LAMBDA.<locals>.runFunction.<locals>.checkReturnWithArgumentInsideGenerator)rU  r5  r>  r~   r8  )r  r  r  r   r   runFunctionq  s    

z#Checker.LAMBDA.<locals>.runFunction)r~   r   defaultsr  posonlyargsr   r  r  
kwonlyargskw_defaultsr{   rs   r  rK   rH  r  rL  r   ZDuplicateArgumentr  r  r=  )rf   r   annotationsr  r  Zis_py3_funcZarg_nameZwildcardZargannotationr!  r  defaultr  r   )r  r   r   rf   r   r  =  sJ    

zChecker.LAMBDAc                 C   sT   | j |dd trP| |}|jr6| |t|j| |jrP| |t|j| d S )N)r  r  r  )r5  r~   rb  r  r4  r   r  )rf   r   Z
scope_noder   r   r   	ARGUMENTS  s    
zChecker.ARGUMENTSc                 C   s   |  |t|j| | d S r   )r4  r   r  rb  r  r   r   r   ARG  s    zChecker.ARGc                    s    j D ]}|  q jD ]}|  qtsL jD ]}|  q:t jr st	j
ts fdd  jD ]}|  q   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 r   r  r   r  r   r   r     r   z"Checker.CLASSDEF.<locals>.<lambda>N)r   r  basesr~   r  rU  r   r,  r@  r   r   r   r=  r    r8  r4  r   r=   )rf   r   r  ZbaseNodeZkeywordNodeZstmtr   r  r   CLASSDEF  s$    





zChecker.CLASSDEFc                 C   s,   |  |j | |j| | |j| d S r   )rs  targetr  r'   r  r   r   r   	AUGASSIGN  s    zChecker.AUGASSIGNc                 C   s   t st|jtjrd}d}t|jD ]2\}}t|tjr$|rN| t	j
|  qXd}|}q$|dksvt|j| d dkr| t	j| | | d S )NFr   T   rJ   i   )r~   r   rV  r   r  r  r7   r  rL  r   ZTwoStarredExpressionsrK   Z%TooManyExpressionsInStarredAssignmentr5  )rf   r   Zhas_starredZstar_locrC   r$   r   r   r   TUPLE  s    zChecker.TUPLEc                 C   sT   |j D ]H}d|jv r(|js(t|j|}n|jp2|j}t|||j}| || qd S r   )r   r=   asnamer   r   r4  )rf   r   aliasimportationr=   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 }|jD ]}|jp\|j}|j dkrt	||| j
}|jtjvr| tj||j |jdkrd| _n`|jd	krtst| j
ts| tj|| qNd| j
_| tj|| t||}nt||||j}| || qNd S )
Nr   c                 S   s   g | ]
}|j qS r   r   )r   r$   r   r   r   r     r   z&Checker.IMPORTFROM.<locals>.<listcomp>Fr   r?   r  Tr   )r   rA  rL  r   ZLateFutureImportr   levelr  r=   r   r   r   Zall_feature_namesZFutureFeatureNotDefinedrC  r~   r   r   ZImportStarNotPermittedr   ZImportStarUsedr   r   r4  )rf   r   r   r  r=   r  r   r   r   
IMPORTFROM  s<    




zChecker.IMPORTFROMc                 C   s   g }t |jD ]t\}}t|jtjrB|jjD ]}|t| q,n|jrX|t|j |jd u r|t	|jd k r| 
tj| q| j| |jD ]}| || q| j  | j|dd d S )NrJ   r    r  )r  r"   r   r   r   r5   r7   r   r   rK   rL  r   ZDefaultExceptNotLastr1  r    r  rD  r5  )rf   r   Zhandler_namesrC   r?  exc_typer  r   r   r   TRY  s    

zChecker.TRYc                 C   s   t s|jd u r| | d S |j| jv r2| | z| j|j}W n tyZ   d }Y n0 | | | | z| j|j}W n ty   Y n0 |js| t	j
||j |r|| j|j< d S r   )r~   r=   r5  r   rw  rD  r/  r   rL  r   r  )rf   r   Zprev_definitionr   r   r   r   EXCEPTHANDLER	  s&    




zChecker.EXCEPTHANDLERc                 C   s4   |  |j| | |j| |jr0|  |j| d S r   )r  r  r  r  r'   r  r   r   r   	ANNASSIGN>	  s    zChecker.ANNASSIGNc                 C   s`   |j }t|j|jD ]<\}}t|tjtjfrLt|s>t|rL| 	t
j| |}q| | d S r   )r   zipopscomparatorsr   r   ZIsZIsNotr:   rL  r   Z	IsLiteralr5  )rf   r   r   rq  r   r   r   r   COMPAREE	  s    zChecker.COMPARE)N)r   rj   rk   rl   r   ZModuler   r  r   r  r   ZLambdaZListCompr   ZSetCompZGeneratorExpZDictCompr-  	PY35_PLUSAsyncFunctionDefr  r:  r  r   r   r}  r6  rH  builtin_varsr+  _MAGIC_GLOBALSr*  rI  rh  rm   Z_customBuiltInsupdater   r   r=  r>  r7  r@  r   rA  setterrC  r   r8  r9  rU  rL  rP  rY  r^  r`  rb  rd  r4  rk  rl  rs  rw  r|  
contextlibcontextmanagerr   r   rp  r  r5  ru  r  r  r  doctestZDocTestParserZget_examplesr  r  r  r  r  r  r  ZDELETEZPRINTZFORZASYNCFORZWHILEZWITHZWITHITEMZ	ASYNCWITHZASYNCWITHITEMZ
TRYFINALLYZEXECZEXPRZASSIGNZPASSZBOOLOPZUNARYOPZSETZREPRZ	ATTRIBUTEZSTARREDZNAMECONSTANTZ	NAMEDEXPRr  r  r  r  r  r  r  r  ZNUMZBYTESELLIPSISZ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FORMATTEDVALUEr  r  r  r  ZIFEXPr  r  ZNONLOCALr  r~   ZLISTCOMPZDICTCOMPZSETCOMPr  r  ZBREAKr  r  AWAITZ	YIELDFROMr  ZASYNCFUNCTIONDEFr  r  r  r  r	  r  ZLISTr  r  r  Z	TRYEXCEPTr  r  r  r   r   r   r   r#  K  sb  



"	




<	-
M#


0

&xRg
*$P		"-r#  )xrl   r   r   r  r  r   r"  r  rI  rerF   r  r  Zpyflakesr   version_infor~   r  Z	PY36_PLUSr  Zpypy_version_infor  AttributeErrorr   
__import__r  Z	Formatterr  r  generate_tokensr  r   r   r	   r
   r%   ZForZAsyncForrQ  rx  r  r  r  r   Z	AnnAssignrt  r*   r8   r1   rz   r|   r9   rw   r:   r>   compiler  rN  r  ZASCII_NON_ALNUMpatternrj  r  r  rN   rQ   rR   rS   rT   	frozensetr  rH   r^   r   r_   rq   rv   ry   r   objectr   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  ZNodeVisitorr  r"  r#  r   r   r   r   <module>   s   


















A(%
1
"

	