U
    nuf¬Y  ã                   @   s  d dl Z 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	m
Z
mZmZ d dlZddlmZ ddlmZ ddlmZ ddlmZmZ erœdd	lmZ ejd
fejdfejdfejdfejdfejdfiZejdfejd
fejdfejdfejdfejdfiZG dd„ deƒZdS )é    N)ÚModule)ÚCallableÚListÚUnionÚcastÚOptionalÚTupleÚTYPE_CHECKINGé   )Úutil)Ú	ASTTokens)ÚAstConstant)Úastroid_node_classesÚBaseContainer)ÚAstNodeú(ú)ú[ú]Ú{Ú}c                   @   s†  e 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ejdk r^dd„ Zejrtdd„ Zdd„ Zdd„ Zdd„ Zdd„ ZeZeZeZdd „ ZeZeZd!d"„ Zd#d$„ Zd%d&„ Zd'd(„ Zd)d*„ Z d+d,„ Z!ejdkrìd-d.„ Z"nd/d.„ Z"d0d1„ Z#dPd3d4„Z$d5d6„ Z%d7d8„ Z&d9d:„ Z'd;d<„ Z(d=d>„ Z)d?d@„ Z*dAdB„ Z+e+Z,dCdD„ Z-dEdF„ Z.dGdH„ Z/ejrjdIdJ„ Z0dKdL„ Z1e1Z2e1Z3dMdN„ Z4dOS )QÚ
MarkTokensz§
  Helper that visits all nodes in the AST tree and assigns .first_token and .last_token attributes
  to each of them. This is the heart of the token-marking logic.
  c                 C   s   || _ t ¡ | _d | _d S ©N)Ú_coder   ZNodeMethodsÚ_methodsÚ_iter_children)ÚselfÚcode© r   ú9/tmp/pip-unpacked-wheel-0ukdbujv/asttokens/mark_tokens.pyÚ__init__4   s    
zMarkTokens.__init__c                 C   s"   t  |¡| _t  || j| j¡ d S r   )r   Ziter_children_funcr   Ú
visit_treeÚ_visit_before_childrenÚ_visit_after_children)r   Únoder   r   r   r!   :   s    zMarkTokens.visit_treec                 C   sP   t |dd ƒ}|d k	r$| j |j|¡nd }|sDt |¡rD| j dd¡}|pJ||fS )NÚ
col_offsetr
   r   )Úgetattrr   Zget_token_from_utf8Úlinenor   Z	is_moduleÚ	get_token)r   r$   Úparent_tokenÚcolÚtokenr   r   r   r"   ?   s
    z!MarkTokens._visit_before_childrenc           	      C   sö   |}d }t t| jƒ|ƒD ]@}t |¡r(q|r:|jj|jk r@|j}|rR|jj|jkr|j}q|p`|}|ph|}t |¡r†|  	t tj
|ƒ¡}|  t tj
|ƒt tj
|ƒ|¡\}}| j | |j¡|||ƒ\}}||f||fkræ|  |||¡\}}||_||_d S r   )r   r   r   r   Zis_empty_astroid_sliceÚfirst_tokenÚindexÚ
last_tokenZis_stmtÚ_find_last_in_stmtÚTokenÚ_expand_to_matching_pairsr   ÚgetÚ	__class__)	r   r$   r)   r+   ÚfirstÚlastÚchildZnfirstZnlastr   r   r   r#   L   s&    

"z MarkTokens._visit_after_childrenc                 C   sL   |}t  |tj¡s@t  |tjd¡s@t |j¡s@| jj|dd}q| j 	|¡S )Nú;T)Zinclude_extra)
r   Úmatch_tokenr+   ÚNEWLINEÚOPÚISEOFÚtyper   Ú
next_tokenÚ
prev_token)r   Zstart_tokenÚtr   r   r   r/   v   s    ÿ
þzMarkTokens._find_last_in_stmtc           
         sô   g }g }| j  ||¡D ]X}|dd… }|r@||d kr@| ¡  q|tkrX| t| ¡ q|tkr| t| ¡ qt|ƒD ]H}| j  |¡‰ t‡ fdd„dD ƒƒr¬| j  ˆ ¡‰ qˆt	j
ˆ f|žŽ rxˆ }qx|D ]$}| j  |¡}	t	j
|	f|žŽ rÆ|	}qÆ||fS )z´
    Scan tokens in [first_token, last_token] range that are between node's children, and for any
    unmatched brackets, adjust first/last tokens to include the closing pair.
    Né   éÿÿÿÿc                 3   s   | ]}t  ˆ tj|¡V  qd S r   )r   r8   r+   r:   )Ú.0Úx©r5   r   r   Ú	<genexpr>–   s     z7MarkTokens._expand_to_matching_pairs.<locals>.<genexpr>)ú,ú:)r   Útoken_rangeÚpopÚ_matching_pairs_leftÚappendÚ_matching_pairs_rightÚreversedr=   Úanyr   r8   r>   )
r   r,   r.   r$   Zto_match_rightZto_match_leftÚtokZtok_infoÚmatchr4   r   rD   r   r1      s*    
z$MarkTokens._expand_to_matching_pairsc                 C   s   ||fS r   r   ©r   r$   r,   r.   r   r   r   Úvisit_default¨   s    zMarkTokens.visit_defaultc                 C   s$   | j  |¡}t |tj|¡ ||fS r   )r   r>   r   Úexpect_tokenr+   r:   )r   Z
open_bracer$   r,   r.   Úbeforer   r   r   Úhandle_comp®   s    zMarkTokens.handle_comp)é   é   c                 C   s   |   d|||¡S ©Nr   ©rU   rQ   r   r   r   Úvisit_listcomp¹   s    zMarkTokens.visit_listcompc                 C   s   |   d|||¡S ©Nr   rY   rQ   r   r   r   Úvisit_setcomp¿   s    zMarkTokens.visit_setcompc                 C   s   |   d|||¡S r[   rY   rQ   r   r   r   Úvisit_dictcompÃ   s    zMarkTokens.visit_dictcompc                 C   s   | j j|tjddd}||fS )NÚforT©Úreverse©r   Ú
find_tokenr+   ÚNAME©r   r$   r,   r.   r4   r   r   r   Úvisit_comprehensionÇ   s    zMarkTokens.visit_comprehensionc                 C   s    |j dkr| j |¡}q ||fS )N)ÚifÚelif©Ústringr   r>   rQ   r   r   r   Úvisit_ifÒ   s    
zMarkTokens.visit_ifc                 C   s4   | j  |tjd¡}| j  |¡}t |tj¡ ||fS )NÚ.)r   rb   r+   r:   r=   r   rS   rc   )r   r$   r,   r.   ÚdotÚnamer   r   r   Úhandle_attrØ   s    zMarkTokens.handle_attrc                 C   s`   |j s.t|dd ƒst|dd ƒr.| j |tj¡}|jdkrX| j |¡}t 	|tj
d¡rX|}||fS )NZdoc_nodeÚdocr   ú@)Úbodyr&   r   rb   r+   ÚSTRINGr-   r>   r   r8   r:   )r   r$   r,   r.   Úprevr   r   r   Ú
handle_defä   s    
zMarkTokens.handle_defc                 C   s<   t tt| jƒ|ƒƒ}| j |jtj|¡}|j	|j	kr8|}|S r   )
Únextr   r   r   r   rb   r.   r+   r:   r-   )r   r$   r.   Zopening_bracketZfirst_childZ
call_startr   r   r   Úhandle_following_bracketsõ   s
    z$MarkTokens.handle_following_bracketsc                 C   s2   |   ||d¡}t |tjd¡r*| j |¡}||fS )Nr   rp   )rv   r   r8   r+   r:   r   r=   rQ   r   r   r   Ú
visit_call  s    zMarkTokens.visit_callc                 C   s   |   ||d¡}||fS )Nr   ©rv   rQ   r   r   r   Úvisit_matchclass  s    zMarkTokens.visit_matchclassc                 C   s   |   ||d¡}||fS rX   rx   rQ   r   r   r   Úvisit_subscript  s    zMarkTokens.visit_subscriptc                 C   sD   | j  |¡}|jdkrq|}q | j  |¡}|jdkr6q<|}q||fS )NrG   )r   r>   ri   r=   )r   r$   r,   r.   rs   Znext_r   r   r   Úvisit_slice  s    	

zMarkTokens.visit_slicec                 C   s(   | j  |¡}t |tjd¡r |}||fS )NrF   )r   r=   r   r8   r+   r:   )r   r$   r,   r.   Zmaybe_commar   r   r   Úhandle_bare_tuple/  s    zMarkTokens.handle_bare_tuplec                 C   sf   t |tjƒst |tƒst‚|jd }tr2tt|ƒ}|  	|j
|jd¡\}}||kr^|  |||¡S ||fS )Nr   T)Ú
isinstanceÚastr   ÚAstroidBaseContainerÚAssertionErrorÚeltsr	   r   r   Ú_gobble_parensr,   r.   r|   )r   r$   r,   r.   r6   Zchild_firstZ
child_lastr   r   r   Úhandle_tuple_nonempty9  s    

z MarkTokens.handle_tuple_nonemptyc                 C   s    |   |||¡\}}|  ||d¡S )NF)r|   r‚   rQ   r   r   r   rƒ   G  s    c                 C   s6   t |tjƒst |tƒst‚|js(||fS |  |||¡S r   )r}   r~   r   r   r€   r   rƒ   rQ   r   r   r   Úvisit_tupleL  s    zMarkTokens.visit_tupleFc                 C   s^   |j dkrV| j |¡}| j |¡}t |tjd¡rVt |tjd¡rV|| }}|rVq qVq ||fS )Nr   r   r   )r-   r   r>   r=   r   r8   r+   r:   )r   r,   r.   Zinclude_allrs   ru   r   r   r   r‚   T  s    
 
zMarkTokens._gobble_parensc                 C   s   |   ||¡S r   ©Ú
handle_strrQ   r   r   r   Ú	visit_strb  s    zMarkTokens.visit_strc                 C   sº   t jdk r|  ||¡S |}t |ttdƒ¡rŽd}|dkr|| j |¡}t |ttdƒ¡r`|d7 }q0t |ttdƒ¡r0|d8 }q0|}| j |¡}qt |tj	¡r²|}| j |¡}qq²q||fS )N)rV   é   ZFSTRING_STARTr
   r   ZFSTRING_END)
ÚsysÚversion_infor†   r   r8   r&   r+   r   r=   rr   )r   r$   r,   r.   r5   Úcountr   r   r   Úvisit_joinedstrf  s$    


zMarkTokens.visit_joinedstrc                 C   s   |   ||¡S r   r…   rQ   r   r   r   Úvisit_bytes‰  s    zMarkTokens.visit_bytesc                 C   s4   | j  |¡}t |tj¡r,|}| j  |¡}q||fS r   )r   r=   r   r8   r+   rr   )r   r,   r.   r5   r   r   r   r†     s
    zMarkTokens.handle_strc                 C   sT   t  |tj¡r| j |¡}q t|tƒr,|j}|dk rL|j	tj
krL| j |¡}||fS )Nr   )r   r8   r+   r:   r   r=   r}   ÚcomplexÚimagr<   ÚNUMBERr>   )r   r$   Úvaluer,   r.   r   r   r   Ú
handle_num–  s    
zMarkTokens.handle_numc                 C   s   |   |ttj|ƒj||¡S r   )r’   r   r~   ZNumÚnrQ   r   r   r   Ú	visit_num¬  s    zMarkTokens.visit_numc                 C   sd   t |tƒst |tjƒst‚t |jtjƒr:|  ||j||¡S t |jt	j
t	jfƒr\|  |||¡S ||fS r   )r}   r   ÚncZConstr€   r‘   ÚnumbersÚNumberr’   ÚsixÚ	text_typeÚbinary_typer‡   rQ   r   r   r   Úvisit_const±  s    zMarkTokens.visit_constc                 C   sv   t |tjƒst |tjƒst‚|jd k	rnt|dd ƒd krn| jj	|t
jddd}| j |¡}t |t
j|j¡ |}||fS )Nr'   ú=Tr_   )r}   r~   Úkeywordr•   ÚKeywordr€   Úargr&   r   rb   r+   r:   r>   r   rS   rc   )r   r$   r,   r.   Úequalsrm   r   r   r   Úvisit_keyword¿  s    zMarkTokens.visit_keywordc                 C   s8   t  |tjd¡s0| j |¡}t  |tjd¡r0|}||fS )NÚ*)r   r8   r+   r:   r   r>   )r   r$   r,   r.   Zstarr   r   r   Úvisit_starredË  s
    zMarkTokens.visit_starredc                 C   s:   t  |tjd¡r2| j |tjd¡}| j |¡ }}||fS )NÚexceptrG   )r   r8   r+   rc   r   rb   r:   r>   )r   r$   r,   r.   Úcolonr   r   r   Úvisit_assignnameÔ  s    zMarkTokens.visit_assignnamec                 C   s   | j j|tjddd}||fS )NÚwithTr_   ra   rd   r   r   r   Ú
visit_withÞ  s    zMarkTokens.visit_withc                 C   s   |j dks| j |¡}||fS )NÚasyncrh   rQ   r   r   r   Úhandle_asyncç  s    
zMarkTokens.handle_asyncc                 C   s*   t  |tjd¡r| j |¡}|  |||¡S )NÚdef)r   r8   r+   rc   r   r>   Úvisit_functiondefrQ   r   r   r   Úvisit_asyncfunctiondefð  s    z!MarkTokens.visit_asyncfunctiondefN)F)5Ú__name__Ú
__module__Ú__qualname__Ú__doc__r    r!   r"   r#   r/   r1   rR   rU   r‰   rŠ   rZ   r˜   ÚPY2r\   r]   re   rj   rn   Zvisit_attributeZvisit_assignattrZvisit_delattrrt   Zvisit_classdefr¬   rv   rw   ry   rz   r{   r|   rƒ   r„   r‚   r‡   rŒ   r   r†   r’   r”   r›   Zvisit_constantr¡   r£   r¦   r¨   rª   Zvisit_asyncforZvisit_asyncwithr­   r   r   r   r   r   /   sf   *	)

	


#			r   )r~   r–   r‰   r+   r   Útypingr   r   r   r   r   r   r	   r˜   Ú r   Z	asttokensr   r   Zastroid_compatr   r•   r   r   r   r:   rJ   rL   Úobjectr   r   r   r   r   Ú<module>   s6   $   ý   ý