B
    t\z                 @   st  d dl Z d dlZd dlZd dlmZ d dlmZmZmZm	Z	 d dl
mZ d dlmZ dZdZdZd	Zd
Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd ZG dd deZG dd  d eZG d!d" d"e	Zej d#d$G d%d& d&eZ!G d'd( d(eZ"G d)d* d*e	Z#ej d#d$G d+d, d,e#Z$ej d-d.G d/d0 d0e#Z%ej d1d.G d2d3 d3e#Z&ej d4d.G d5d6 d6e#Z'ej d7d.G d8d9 d9e#Z(ej d:d$G d;d< d<e#Z)ej d=d$G d>d? d?e#Z*ej d@d.G dAdB dBe#Z+ej dCd.G dDdE dEe#Z,ej dFd.ej dGd.G dHdI dIe#Z-ej dJd$G dKdL dLe#Z.ej dMd$G dNdO dOe#Z/ej dPd$G dQdR dRe#Z0ej dPd$G dSdT dTe#Z1ej dUd$G dVdW dWe#Z2ej edXG dYdZ dZe#Z3ej d[d$G d\d] d]e#Z4ej d^d$G d_d` d`e#Z5ej dad$G dbdc dce#Z6ej ddd$G dedf dfe#Z7ej dgd$ej dhd$G didj dje#Z8ej dkd$G dldm dme#Z9ej dnd$G dodp dpe#Z:G dqdr dre#Z;ej dsd$G dtdu due;Z<ej dvd$G dwdx dxe;Z=ej dyd$G dzd{ d{e;Z>ej d|d$G d}d~ d~e;Z?ej dd$G dd de;Z@ej dd$G dd de;ZAdS )    N)contextmanager)
NormalizerNormalizerConfigIssueRule)search_ancestor)ParserSyntaxError)Zif_stmt
while_stmtfor_stmttry_stmtZ	with_stmt)testlist_star_exprtestlist_compexprlist   d   )Zall_feature_namesZnested_scopesZ
generatorsZdivisionZabsolute_importZwith_statementZprint_functionZunicode_literalsc             c   sP   xJ| j D ]@}|jdkrBx0|j D ]}|jdks|dkr6q|V  qW q|V  qW dS )zB
    Iterates over all statements and splits up  simple_stmt.
    Zsimple_stmtnewline;N)childrentype)ZscopechildZchild2 r   2lib/python3.7/site-packages/parso/python/errors.py_iter_stmts   s    
r   c             C   sr   | j d d \}}|jdkr>|j d jdkr>|dkr8dS dS n0|jdkrn|j d	 jdkrn|j d d
krjdS dS d S )N   r      comp_for[zlist comprehensionzgenerator expressiondictorsetmaker:zdict comprehensionzset comprehension)r   r   )atomfirstsecondr   r   r   _get_comprehension_type$   s    r#   c             C   s   |   }dd |D dgkS )Nc             S   s   g | ]
}|j qS r   )value).0nr   r   r   
<listcomp>9   s    z%_is_future_import.<locals>.<listcomp>Z
__future__)Zget_from_names)import_fromZ
from_namesr   r   r   _is_future_import3   s    r)   c             C   sJ   y
| j }W n tk
r   Y n(X t|dkrF|d dkrFt| j d S | S )z_
    Returns the inner part of an expression like `(foo)`. Also removes nested
    parens.
       r   (r   )r   AttributeErrorlen_remove_parens)r    r   r   r   r   r.   <   s    
r.   c             C   s   dd | j D S )Nc             s   s   | ]}|j d kr|V  qdS )paramN)r   )r%   r&   r   r   r   	<genexpr>L   s    z_iter_params.<locals>.<genexpr>)r   )Zparent_noder   r   r   _iter_paramsK   s    r1   c             C   sT   d}xJt |  D ]:}|jdkr&|s&qd}|| kr6dS |jdkrJt|rJqdS W dS )z@
    Checks if the import is the first statement of a file.
    FstringTr(   N)r   Zget_root_noder   r)   )r(   Zfound_docstringZstmtr   r   r   _is_future_import_firstO   s    r3   c             c   s   x|| j d d d D ]h}|jdkrt|j d dkrt|j d }|jdkr^xt|D ]
}|V  qLW qn|j d dkrt|V  q|V  qW d S )Nr   r    r   )r+   r   r   r   )r   r   !_iter_definition_exprs_from_lists)r   r   r   exprr   r   r   r4   `   s    


r4   c             C   sD   g }x:| j d dd D ]&}|jdkr2|t|7 }q|| qW |S )Nr   )r   testlist)r   r   r4   append)	expr_stmtexprsZlist_r   r   r   _get_expr_stmt_definition_exprsn   s    
r;   c             C   s&   | j d }|jdkr|gS tt|S )Nr   r   )r   r   listr4   )r
   r   r   r   r   _get_for_stmt_definition_exprsx   s    

r=   c               @   sZ   e Zd ZdddZdd Zdd Zdd	 Zd
d Zdd Ze	dd Z
dd Zdd ZdS )_ContextNc             C   s4   || _ g | _|| _i | _g | _g | _g | _|| _d S )N)nodeblocksparent_context_used_name_dict_global_names_nonlocal_names_nonlocal_names_in_subscopes_add_syntax_error)selfr?   Zadd_syntax_errorrA   r   r   r   __init__   s    z_Context.__init__c             C   s   |   o| jjjdkS )N)Zasync_funcdefZ
async_stmt)is_functionr?   parentr   )rG   r   r   r   is_async_funcdef   s    z_Context.is_async_funcdefc             C   s   | j jdkS )Nfuncdef)r?   r   )rG   r   r   r   rI      s    z_Context.is_functionc             C   sZ   |j j}|dkrd S |dkr*| j| n,|dkr@| j| n| j|jg | d S )NtrailerZglobal_stmtnonlocal_stmt)rJ   r   rC   r8   rD   rB   
setdefaultr$   )rG   nameZparent_typer   r   r   add_name   s    z_Context.add_namec          	   C   s   |  | jd |  | jd tdd | jD }x`| jD ]V}y||j }W n tk
r`   w8Y nX d|j }|j|jk r~|}n|}| || q8W g }x\| jD ]R}|j}||ks| j	dkrd|j }| || q| 
 r|j| jkr|| qW | j| S )zV
        Returns a list of nonlocal names that need to be part of that scope.
        globalnonlocalc             s   s   | ]}|j |fV  qd S )N)r$   )r%   r&   r   r   r   r0      s    z$_Context.finalize.<locals>.<genexpr>z name '%s' is nonlocal and globalNz"no binding for nonlocal '%s' found)_analyze_namesrC   rD   dictr$   KeyError	start_posrF   rE   rA   rI   rB   r8   )rG   Zglobal_name_strsZnonlocal_nameZglobal_namemessageZ
error_nameZnonlocals_not_handledsearchr   r   r   finalize   s.    

z_Context.finalizec       
         s    fdd}g }j jdkr*j  }x|D ]Ɖ d}xtj jg D ]~}|j jkrbd}|j}|jdkr~|j	|kr~qN|
 r|jdkr|jd jd	kr|r| |d
 P qd}nd}|sN|| P qNW x$|D ]}	|	j	j jkr|df qW q0W d S )Nc                s     |  jf  d S )N)rF   r$   )rX   )	base_namerG   type_r   r   raise_   s    z'_Context._analyze_names.<locals>.raise_rL   FTr/   r9   r   	annassignzannotated name '%s' can't be %sz.name '%s' is assigned to before %s declarationz)name '%s' is used prior to %s declarationzname '%s' is parameter and %s)r?   r   Z
get_paramsreversedrB   getr$   rW   rJ   rP   is_definitionr   )
rG   Zglobals_or_nonlocalsr\   r]   paramsZfound_global_or_nonlocalrP   rJ   rX   r/   r   )r[   rG   r\   r   rT      s6    



z_Context._analyze_namesc             c   s    | j | d V  | j   d S )N)r@   r8   pop)rG   r?   r   r   r   	add_block   s    z_Context.add_blockc             C   s   t || j| dS )N)rA   )r>   rF   )rG   r?   r   r   r   add_context   s    z_Context.add_contextc             C   s   |  j | 7  _ d S )N)rE   rZ   )rG   Zchild_contextr   r   r   close_child_context   s    z_Context.close_child_context)N)__name__
__module____qualname__rH   rK   rI   rQ   rZ   rT   r   rd   re   rf   r   r   r   r   r>      s   

!-r>   c                   sl   e Zd ZdZ fddZdd Z fddZedd	 Z fd
dZ	dd Z
dd Zdd Zdd Z  ZS )ErrorFinderz1
    Searches for errors in the syntax tree.
    c                s&   t t| j|| i | _| jj| _d S )N)superrj   rH   _error_dictZgrammarversion_infoversion)rG   argskwargs)	__class__r   r   rH      s    zErrorFinder.__init__c                s.    fdd  |p t |j_d_d S )Nc                s2   | d krd S  | j }| jdkr.t| j|S |S )N)classdefrL   Z
file_input)rJ   r   r>   rF   )r?   rA   )create_contextrG   r   r   rs     s    

z.ErrorFinder.initialize.<locals>.create_contextr   )r>   rF   context_indentation_count)rG   r?   r   )rs   rG   r   
initialize  s    	zErrorFinder.initializec          	      s0   |j dkr | | dS Q R X tt| |S )N
error_node )r   
visit_noderk   rj   visit)rG   r?   )rq   r   r   rz     s    

zErrorFinder.visitc          	   c   s   |  | |jtkrR| j|( t| jjtkr>| |d d V  W d Q R X d S |jdkr|  j	d7  _	| j	t
kr| |jd d d V  |jdkr|  j	d8  _	n$|jdkr| j}|j| _| j| d S )Nz!too many statically nested blocksZsuiter   ztoo many levels of indentation)rr   rL   )Z_check_type_rulesr   _BLOCK_STMTSrt   rd   r-   r@   _MAX_BLOCK_SIZErF   ru   _MAX_INDENT_COUNT_add_indentation_errorr   rA   rf   )rG   r?   rt   r   r   r   ry     s$    





zErrorFinder.visit_nodec                s   |j dkr|jdkrJt|  d }|jdkr8d}nd}| || nV|jdr\d}n8t	d	|j}|d krxd
}nt
|ddkrd}nd}| || dS |jdkr|j}|j dkr| j|| _tt| |S )N
error_leaf)INDENTZERROR_DEDENTr   r   zunexpected indentz3unindent does not match any outer indentation level\z6unexpected character after line continuation characterz\w{,2}("{1,3}|'{1,3})zinvalid syntaxr   z!EOL while scanning string literalz/EOF while scanning triple-quoted string literalrx   r   )rr   rL   )r   
token_typer<   get_next_leaf_split_prefixr~   r$   
startswithrematchr-   grouprF   rJ   rt   re   rk   rj   
visit_leaf)rG   leafspacingrX   r   rJ   )rq   r   r   r   3  s,    




zErrorFinder.visit_leafc             C   s   |  |dd|  d S )Ni  zIndentationError: )	add_issue)rG   r   rX   r   r   r   r~   U  s    z"ErrorFinder._add_indentation_errorc             C   s   |  |dd|  d S )Ni  zSyntaxError: )r   )rG   r?   rX   r   r   r   rF   X  s    zErrorFinder._add_syntax_errorc             C   s&   |j d }|||f}| j|| d S )Nr   )rW   rl   rO   )rG   r?   coderX   linero   r   r   r   r   [  s    

zErrorFinder.add_issuec             C   s<   | j   x,| j D ]\}}}| jt||| qW d S )N)rt   rZ   rl   valuesZissuesr8   r   )rG   r   rX   r?   r   r   r   rZ   b  s    
zErrorFinder.finalize)rg   rh   ri   __doc__rH   rv   rz   r   ry   r   r~   rF   r   rZ   __classcell__r   r   )rq   r   rj      s   
"rj   c                   s    e Zd ZdZ fddZ  ZS )IndentationRulei  c                s   t t| |}d| S )NzIndentationError: )rk   r   _get_message)rG   rX   )rq   r   r   r   l  s    zIndentationRule._get_message)rg   rh   ri   r   r   r   r   r   )rq   r   r   i  s   r   rw   )r   c               @   s    e Zd ZdZdd Zdd ZdS )_ExpectIndentedBlockzexpected an indented blockc             C   s   |  }t| d S )Nr   )r   r<   r   )rG   r?   r   r   r   r   get_nodeu  s    z_ExpectIndentedBlock.get_nodec             C   s   |j d jdkS )Nr   r   )r   r   )rG   r?   r   r   r   is_issuey  s    z_ExpectIndentedBlock.is_issueN)rg   rh   ri   rX   r   r   r   r   r   r   r   q  s   r   c               @   s   e Zd ZeZdS )ErrorFinderConfigN)rg   rh   ri   rj   Znormalizer_classr   r   r   r   r   ~  s   r   c                   s    e Zd ZdZ fddZ  ZS )
SyntaxRulei  c                s   t t| |}d| S )NzSyntaxError: )rk   r   r   )rG   rX   )rq   r   r   r     s    zSyntaxRule._get_message)rg   rh   ri   r   r   r   r   r   )rq   r   r     s   r   c               @   s    e Zd ZdZdd Zdd ZdS )_InvalidSyntaxRulezinvalid syntaxc             C   s   |  S )N)r   )rG   r?   r   r   r   r     s    z_InvalidSyntaxRule.get_nodec             C   s   |  jdkS )Nr   )r   r   )rG   r?   r   r   r   r     s    z_InvalidSyntaxRule.is_issueN)rg   rh   ri   rX   r   r   r   r   r   r   r     s   r   await)r$   c               @   s    e Zd ZdZdd Zdd ZdS )_AwaitOutsideAsyncz'await' outside async functionc             C   s   | j j  S )N)_normalizerrt   rK   )rG   r   r   r   r   r     s    z_AwaitOutsideAsync.is_issuec             C   s   |j S )N)rJ   )rG   r?   r   r   r   get_error_node  s    z!_AwaitOutsideAsync.get_error_nodeN)rg   rh   ri   rX   r   r   r   r   r   r   r     s   r   breakc               @   s   e Zd ZdZdd ZdS )_BreakOutsideLoopz'break' outside loopc             C   s,   d}x | j jjD ]}|jdkrd}qW | S )NF)r
   r	   T)r   rt   r@   r   )rG   r   in_loopblockr   r   r   r     s
    
z_BreakOutsideLoop.is_issueN)rg   rh   ri   rX   r   r   r   r   r   r     s   r   continuec               @   s   e Zd ZdZdZdd ZdS )_ContinueChecksz'continue' not properly in loopz0'continue' not supported inside 'finally' clausec             C   sn   d}x\| j jjD ]N}|jdkr"d}|jdkr|jd }|dkr|j|jkr| j|| jd dS qW |sjdS d S )NF)r
   r	   Tr   finally)rX   )r   rt   r@   r   r   rW   r   message_in_finally)rG   r   r   r   Z
last_blockr   r   r   r     s    


z_ContinueChecks.is_issueN)rg   rh   ri   rX   r   r   r   r   r   r   r     s   r   fromc               @   s    e Zd ZdZdd Zdd ZdS )_YieldFromCheckz"'yield from' inside async functionc             C   s   |j j S )N)rJ   )rG   r   r   r   r   r     s    z_YieldFromCheck.get_nodec             C   s   |j jdko| jj S )NZ	yield_arg)rJ   r   r   rt   rK   )rG   r   r   r   r   r     s    z_YieldFromCheck.is_issueN)rg   rh   ri   rX   r   r   r   r   r   r   r     s   r   rP   c               @   s    e Zd ZdZdZdZdd ZdS )_NameCheckszcannot assign to __debug__zassignment to keywordzcannot assign to Nonec             C   sr   | j j| |jdkr@| r@| j jdk r0dS | j|| jd |jdkrn| j jdk rn| rn| j|| jd d S )N	__debug__)r*   r   T)rX   None)	r   rt   rQ   r$   ra   rn   r   message_keywordmessage_none)rG   r   r   r   r   r     s    z_NameChecks.is_issueN)rg   rh   ri   rX   r   r   r   r   r   r   r   r     s   r   r2   c               @   s   e Zd ZdZdd ZdS )_StringChecksz0bytes can only contain ASCII literal characters.c          
   C   s(  |j  }d|kr6| jjdkr6tdd |jD r6dS d|kr$| jjdk }d|krXd}d|krdd}| }|r|d	}tj	}ntj
}y*t  td
 || W d Q R X W np tk
r } z| j|dt| d W d d }~X Y n: tk
r" } z| j|dt| d W d d }~X Y nX d S )Nb)r*   r   c             s   s   | ]}t |d kr|V  qdS )   N)ord)r%   cr   r   r   r0     s    z)_StringChecks.is_issue.<locals>.<genexpr>TruFzutf-8ignorez(unicode error) )rX   z(value error) )string_prefixlowerr   rn   anyr$   Z_get_payloadencodecodecsescape_decodeunicode_escape_decodewarningscatch_warningsfilterwarningsUnicodeDecodeErrorr   str
ValueError)rG   r   r   Zis_bytesZpayloadfuncer   r   r   r     s0    




&z_StringChecks.is_issueN)rg   rh   ri   rX   r   r   r   r   r   r     s   r   *c               @   s   e Zd ZdZdd ZdS )
_StarCheckz"named arguments must follow bare *c             C   sL   |j }|jdkrH|rH|j|j|d d  }dd |D }t|dkS d S )N
parametersr   c             S   s   g | ]}|d kr|j s|qS )),))
star_count)r%   r   r   r   r   r'     s    z'_StarCheck.is_issue.<locals>.<listcomp>r   )rJ   r   r   indexr-   )rG   r   rb   Zafterr   r   r   r     s
    z_StarCheck.is_issueN)rg   rh   ri   rX   r   r   r   r   r   r     s   r   z**c               @   s   e Zd ZdZdd ZdS )_StarStarCheckz3dict unpacking cannot be used in dict comprehensionc             C   s.   |j jdkr*|  }|d k	o(|jdkS d S )Nr   r   )rJ   r   Zget_next_sibling)rG   r   r   r   r   r   r     s    z_StarStarCheck.is_issueN)rg   rh   ri   rX   r   r   r   r   r   r     s   r   yieldreturnc               @   s$   e Zd ZdZdZdd Zdd ZdS )_ReturnAndYieldChecksz&'return' with value in async generatorz'yield' inside async functionc             C   s   |j S )N)rJ   )rG   r   r   r   r   r   '  s    z_ReturnAndYieldChecks.get_nodec             C   s   | j jjjdkr,| j| |d|j d np| j j rt| j jj	 r|jdkrd|j
jdkrddS |jdkr| dkr| j jd	kr| j| || jd d S )
NrL   z'%s' outside function)rX   r   Zreturn_stmtTr   r   )r*      )r   rt   r?   r   r   r   r$   rK   r   Ziter_yield_exprsrJ   r   rn   message_async_yield)rG   r   r   r   r   r   *  s    
z_ReturnAndYieldChecks.is_issueN)rg   rh   ri   rX   r   r   r   r   r   r   r   r   !  s   r   stringsc               @   s    e Zd ZdZdd Zdd ZdS )_BytesAndStringMixz&cannot mix bytes and nonbytes literalsc             C   s   |j dkrdS d|j kS )NfstringFr   )r   r   r   )rG   r2   r   r   r   _is_bytes_literal<  s    
z$_BytesAndStringMix._is_bytes_literalc             C   sN   |j d }| jjdkrJ| |}x(|j dd  D ]}|| |kr0dS q0W d S )Nr   )r*   r   r   T)r   r   rn   r   )rG   r?   r!   Zfirst_is_bytesr2   r   r   r   r   A  s    

z_BytesAndStringMix.is_issueN)rg   rh   ri   rX   r   r   r   r   r   r   r   7  s   r   Zimport_as_namesc               @   s   e Zd ZdZdd ZdS )_TrailingImportCommaz:trailing comma not allowed without surrounding parenthesesc             C   s   |j d dkrdS d S )Nr   r   T)r   )rG   r?   r   r   r   r   P  s    z_TrailingImportComma.is_issueN)rg   rh   ri   rX   r   r   r   r   r   r   K  s   r   r(   c               @   s   e Zd ZdZdd ZdS )_ImportStarInFunctionz%import * only allowed at module levelc             C   s   |  o| jjjd k	S )N)Zis_star_importr   rt   rA   )rG   r?   r   r   r   r   Y  s    z_ImportStarInFunction.is_issueN)rg   rh   ri   rX   r   r   r   r   r   r   U  s   r   c               @   s   e Zd ZdZdd ZdS )_FutureImportRulez?from __future__ imports must occur at the beginning of the filec             C   s   t |rt|sdS x| D ]~\}}|j}tt}| jjdkrJ|d |dkrb| j	|dd q|dkr~d}| j	||d q|tkrd	| }| j	||d qW d S )
NT)r*   r   Zgenerator_stopZbracesznot a chance)rX   Zbarry_as_FLUFLz-Seriously I'm not implementing this :) ~ Davez future feature %s is not defined)
r)   r3   Z	get_pathsr$   r<   ALLOWED_FUTURESr   rn   r8   r   )rG   r?   	from_nameZfuture_namerP   Zallowed_futuresmrX   r   r   r   r   a  s     
z_FutureImportRule.is_issueN)rg   rh   ri   rX   r   r   r   r   r   r   ]  s   r   	star_exprc               @   s    e Zd ZdZdZdZdd ZdS )_StarExprRulez4starred assignment target must be in a list or tuplez2iterable unpacking cannot be used in comprehensionz4can use starred expression only as assignment targetc             C   s   |j jtkrdS |j jdkr>|j jd jdkr>| j|| jd | jjdkrt|dd}d	}|d k	r|jdkrvt	|}nt
|}||krd}|s| j|| jd d S )
NTr   r   r   )rX   )r*      r
   r9   F)rJ   r   _STAR_EXPR_PARENTSr   r   message_iterable_unpackingr   rn   r   r;   r=   message_assignment)rG   r?   r&   Zfound_definitionr:   r   r   r   r   |  s     

z_StarExprRule.is_issueN)rg   rh   ri   rX   r   r   r   r   r   r   r   r   v  s   r   )typesc               @   s   e Zd Zdd ZdS )_StarExprParentRulec                s   |j jdkr| j|j dd n fdd  ||j rdd |jD }dd |D }t|d	krxd
}| j|d	 |d n0|r||d }|dkrd}| j|d |d d S )Ndel_stmtz!can't use starred expression here)rX   c                sD   |d krdS |j }|dkrdS |dkr8| j|jd jk S  | |jS )NFrM   r9   r   )r   rW   r   rJ   )r?   Zancestorr\   )ra   r   r   ra     s    z3_StarExprParentRule.is_issue.<locals>.is_definitionc             S   s   g | ]}|d kr|qS )r   r   )r%   r   r   r   r   r'     s    z0_StarExprParentRule.is_issue.<locals>.<listcomp>c             S   s   g | ]}|j d kr|qS )r   )r   )r%   r   r   r   r   r'     s    r   z%two starred expressions in assignmentr      z1too many expressions in star-unpacking assignment)rJ   r   r   r   r-   r   )rG   r?   ro   ZstarredrX   countr   )ra   r   r     s    z_StarExprParentRule.is_issueN)rg   rh   ri   r   r   r   r   r   r     s   r   r^   c               @   s    e Zd ZdZdd Zdd ZdS )_AnnotatorRulezillegal target for annotationc             C   s   |j S )N)rJ   )rG   r?   r   r   r   r     s    z_AnnotatorRule.get_nodec             C   s   d }|j jd }t|}y
|j}W n tk
r6   Y nHX d|ksV|jdkr\|d dkr\d}n|jdkrv|d dkrvd}|d }|d kr|jd	ks|jd
kr|jdkr|jd dksdS nd}| j|j || d d S )Nr   r   r    r+   tupler   r<   r   rP   )	atom_exprpowerrM   Tz,only single target (not %s) can be annotated)rX   )rJ   r   r.   r,   r   r   )rG   r?   r\   Zlhsr   rM   rX   r   r   r   r     s(    



z_AnnotatorRule.is_issueN)rg   rh   ri   rX   r   r   r   r   r   r   r     s   r   argumentc               @   s   e Zd Zdd ZdS )_ArgumentRulec             C   sH   |j d }|j d dkrD|jdkrD|jdkr2d}nd}| j||d d S )	Nr   r   =rP   lambdefz lambda cannot contain assignmentzkeyword can't be an expression)rX   )r   r   r   )rG   r?   r!   rX   r   r   r   r     s    

z_ArgumentRule.is_issueN)rg   rh   ri   r   r   r   r   r   r     s   r   rN   c               @   s   e Zd ZdZdd ZdS )_NonlocalModuleLevelRulez0nonlocal declaration not allowed at module levelc             C   s   | j jjd kS )N)r   rt   rA   )rG   r?   r   r   r   r     s    z!_NonlocalModuleLevelRule.is_issueN)rg   rh   ri   rX   r   r   r   r   r   r     s   r   Zarglistc               @   s    e Zd Zedd Zdd ZdS )_ArglistRulec             C   s   | j jdk rdS dS d S )N)r*      z?Generator expression must be parenthesized if not sole argumentz*Generator expression must be parenthesized)r   rn   )rG   r   r   r   rX     s    z_ArglistRule.messagec       
      C   s"  |j d }|jdkr2|j d jdkr2t|j dkS t }d}d}d}x|j D ]}|dkrZqL|dkrhd	}qL|rrd}qL|jdkr|j d }|dkr|d
kr|rd}	| j||	d qd	}n4d	}|jdkr|j|kr| j|dd n||j qL|rd}	| j||	d qL|rLd}	| j||	d qLW d S )Nr   r   r   r   r   Fr   )r   z**Tr   z>iterable argument unpacking follows keyword argument unpacking)rX   rP   zkeyword argument repeatedz6positional argument follows keyword argument unpackingz,positional argument follows keyword argument)r   r   r-   setr   r$   add)
rG   r?   Z	first_argZarg_setZkw_onlyZkw_unpacking_onlyZis_old_starredr   r!   rX   r   r   r   r     sH    





z_ArglistRule.is_issueN)rg   rh   ri   propertyrX   r   r   r   r   r   r     s   r   r   r   c               @   s   e Zd ZdZdd ZdS )_ParameterRulez-non-default argument follows default argumentc             C   st   t  }d}xdt|D ]X}|jj|kr@d}| j|j||jj d ||jj |jd krh|jsh|rldS qd}qW d S )NFz.duplicate argument '%s' in function definition)rX   T)r   r1   rP   r$   r   r   defaultr   )rG   r?   Zparam_namesZdefault_onlyprX   r   r   r   r   2  s    z_ParameterRule.is_issueN)rg   rh   ri   rX   r   r   r   r   r   r   ,  s   r   r   c               @   s   e Zd ZdZdd ZdS )_TryStmtRulezdefault 'except:' must be lastc             C   sR   d }xH|j dd d D ]4}|dkr$P |dkr2|}q|d k	r| j|| jd qW d S )Nr*   )elser   except)rX   )r   r   rX   )rG   r   Zdefault_exceptZexcept_clauser   r   r   r   F  s    z_TryStmtRule.is_issueN)rg   rh   ri   rX   r   r   r   r   r   r   B  s   r   r   c               @   s:   e Zd ZdZdZdZdd Zdd Zdd	 ZdddZ	dS )_FStringRuleNz'f-string: expressions nested too deeplyzAf-string: invalid conversion character: expected 's', 'r', or 'a'c             C   s   |  |jdd  | d S )Nr   )_check_fstring_contentsr   )rG   format_specdepthr   r   r   _check_format_specW  s    z_FStringRule._check_format_specc             C   sx   |dkr| j || jd |jd }|jdkrP|jd }|jdkrP| j || jd |jd }|jdkrt| ||d  d S )Nr   )rX   Zfstring_conversionr   )sr   ar6   Zfstring_format_spec)r   message_nestedr   r   r$   message_conversionr   )rG   fstring_exprr   Z
conversionrP   r   r   r   r   _check_fstring_exprZ  s    





z _FStringRule._check_fstring_exprc             C   s   |  |jdd  d S )Nr   r   )r   r   )rG   r   r   r   r   r   h  s    z_FStringRule.is_issuer   c             C   s(   x"|D ]}|j dkr| || qW d S )Nr  )r   r  )rG   r   r   Zfstring_contentr   r   r   r   k  s    

z$_FStringRule._check_fstring_contents)r   )
rg   rh   ri   Z_fstring_grammarr  r  r   r  r   r   r   r   r   r   r   Q  s   r   c               @   s   e Zd ZdddZdS )_CheckAssignmentRuleFc       
      C   s  d }|j }|dkrd}n|dkr|jd d \}}t|}|d kr|j dkrTd}nV|dkr|j dkrld	}n>|j d
krx2|jd d d D ]}| || qW n| || n<|dkrd}n,|dkr|jdkrd}n|dkrd}n|dkrd}n|dkrd}| j||d n|dkr$d}n|dkr|jd dkrDd}nD|jd dkrZd}n.|jd }	|	j dkstt|	jd dkrd}n`|dkrxT|jd d d D ]}| || qW n,d |kr|d!ksd"|ks|d#krd}|d k	rd$|r d%nd&|f }| j||d d S )'Nr   lambdar    r   r   literal)r+   r   Z
yield_exprzyield expressionr   keywordoperatorz...EllipsisZ
comparison)r2   Znumberr   z+assignment to yield expression not possible)rX   Ztestzconditional expression)r   r   r   r   zawait expressionr6   z**r   rM   r+   zfunction call)r   r   r7   r5   r   Z_test)ZtermZfactorzcan't %s %sdeletez	assign to)r   r   r#   _check_assignmentr$   r   AssertionError)
rG   r?   is_deletionerrorr\   r!   r"   r   rX   rM   r   r   r   r  r  sd    











z&_CheckAssignmentRule._check_assignmentN)F)rg   rh   ri   r  r   r   r   r   r  q  s   r  r   c               @   s   e Zd ZdZdd ZdS )_CompForRulez>asynchronous comprehension outside of an asynchronous functionc             C   sL   |j dt|j d dk  }|jdkr0| | |j d dkoJ| jj  S )Nr   r   async	expr_list)r   intr   r  r   rt   rK   )rG   r?   r  r   r   r   r     s
    

z_CompForRule.is_issueN)rg   rh   ri   rX   r   r   r   r   r   r    s   r  r9   c               @   s   e Zd ZdZdd ZdS )_ExprStmtRulez+illegal expression for augmented assignmentc             C   sT   x"|j d dd D ]}| | qW |j d }|dkrP|jdkrP|j d jdkS d S )Nr6   r   r   r   r^   r   )r   r    r7   )r   r  r   )rG   r?   Zbefore_equalZ	augassignr   r   r   r     s
    
z_ExprStmtRule.is_issueN)rg   rh   ri   rX   r   r   r   r   r   r    s   r  	with_itemc               @   s   e Zd Zdd ZdS )_WithItemRulec             C   s   |  |jd  d S )Nr   )r  r   )rG   r  r   r   r   r     s    z_WithItemRule.is_issueN)rg   rh   ri   r   r   r   r   r   r    s   r  r   c               @   s   e Zd Zdd ZdS )_DelStmtRulec             C   s&   |j d }|jdkr"| j|dd d S )Nr   r  T)r  )r   r   r  )rG   r   r   r   r   r   r     s    

z_DelStmtRule.is_issueN)rg   rh   ri   r   r   r   r   r   r    s   r  r  c               @   s   e Zd Zdd ZdS )_ExprListRulec             C   s(   x"|j d d d D ]}| | qW d S )Nr   )r   r  )rG   r  r5   r   r   r   r     s    z_ExprListRule.is_issueN)rg   rh   ri   r   r   r   r   r   r    s   r  r
   c               @   s   e Zd Zdd ZdS )_ForStmtRulec             C   s"   |j d }|jdkr| | d S )Nr   r  )r   r   r  )rG   r
   r  r   r   r   r     s    

z_ForStmtRule.is_issueN)rg   rh   ri   r   r   r   r   r   r    s   r  )Br   r   r   
contextlibr   Zparso.normalizerr   r   r   r   Zparso.python.treer   Zparso.parserr   r{   r   r|   r}   r   r   r#   r)   r.   r1   r3   r4   r;   r=   objectr>   rj   r   Zregister_ruler   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r  r  r  r   r   r   r   <module>   s   	
|n&

	$>

=