o
    ãË·eS  ã                   @   s0  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 zd dlmZ W n eyQ   dZY nw erZd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)Ú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r:d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 ejdkrrd+d,„ Z!nd-d,„ Z!d.d/„ Z"dNd1d2„Z#d3d4„ Z$d5d6„ Z%d7d8„ Z&d9d:„ Z'd;d<„ Z(d=d>„ Z)d?d@„ Z*e*Z+dAdB„ Z,dCdD„ Z-dEdF„ Z.ejr°dGdH„ Z/dIdJ„ Z0e0Z1e0Z2dKdL„ Z3dMS )OÚ
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   ÚNodeMethodsÚ_methodsÚ_iter_children)ÚselfÚcode© r   úL/var/www/ideatree/venv/lib/python3.10/site-packages/asttokens/mark_tokens.pyÚ__init__9   s   

zMarkTokens.__init__c                 C   s"   t  |¡| _t  || j| j¡ d S r   )r   Ú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 ur| j |j|¡nd }|s"t |¡r"| j dd¡}|p%||fS )NÚ
col_offsetr
   r   )Úgetattrr   Úget_token_from_utf8Úlinenor   Ú	is_moduleÚ	get_token)r   r$   Úparent_tokenÚcolÚtokenr   r   r   r"   D   s
   z!MarkTokens._visit_before_childrenc           	      C   sê   |}d }t t| jƒ|ƒD ]}|r|jj|jk r|j}|r#|jj|jkr&|j}q|p*|}|p.|}t |¡r=|  t tj	|ƒ¡}|  
t tj	|ƒt tj	|ƒ|¡\}}| j | |j¡|||ƒ\}}||f||fkrm|  
|||¡\}}||_||_d S r   )r   r   r   Úfirst_tokenÚindexÚ
last_tokenr   Úis_stmtÚ_find_last_in_stmtÚTokenÚ_expand_to_matching_pairsr   ÚgetÚ	__class__)	r   r$   r+   r-   ÚfirstÚlastÚchildÚnfirstÚnlastr   r   r   r#   Q   s$   €
"
z MarkTokens._visit_after_childrenc                 C   st   |}t  |tj¡s4t  |tjd¡s4t |j¡s4| jj|dd}t  |tj¡s4t  |tjd¡s4t |j¡r| j 	|¡S )Nú;T)Úinclude_extra)
r   Úmatch_tokenr-   ÚNEWLINEÚOPÚISEOFÚtyper   Ú
next_tokenÚ
prev_token)r   Ústart_tokenÚtr   r   r   r2   x   s   ÿ
þýÿ
þzMarkTokens._find_last_in_stmtc           
         s  g }g }| j  ||¡D ],}|dd… }|r ||d kr | ¡  q|tv r,| t| ¡ q|tv r7| t| ¡ qt|ƒD ]/}| j  |¡‰ t‡ fdd„dD ƒƒr`| j  ˆ ¡‰ t‡ fdd„dD ƒƒsOt	j
ˆ g|¢R Ž rkˆ }q<|D ]}| j  |¡}	t	j
|	g|¢R Ž r|	}qn||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   r>   r-   r@   )Ú.0Úx©r8   r   r   Ú	<genexpr>˜   s   € z7MarkTokens._expand_to_matching_pairs.<locals>.<genexpr>)ú,ú:)r   Útoken_rangeÚpopÚ_matching_pairs_leftÚappendÚ_matching_pairs_rightÚreversedrC   Úanyr   r>   rD   )
r   r.   r0   r$   Úto_match_rightÚto_match_leftÚtokÚtok_infoÚmatchr7   r   rK   r   r4      s2   
€ÿ€€z$MarkTokens._expand_to_matching_pairsc                 C   s   ||fS r   r   ©r   r$   r.   r0   r   r   r   Úvisit_defaultª   s   zMarkTokens.visit_defaultc                 C   s$   | j  |¡}t |tj|¡ ||fS r   )r   rD   r   Úexpect_tokenr-   r@   )r   Ú
open_bracer$   r.   r0   Úbeforer   r   r   Úhandle_comp°   s   zMarkTokens.handle_comp)é   é   c                 C   ó   |   d|||¡S ©Nr   ©r`   r[   r   r   r   Úvisit_listcomp»   ó   zMarkTokens.visit_listcompc                 C   rc   ©Nr   re   r[   r   r   r   Úvisit_setcompÁ   rg   zMarkTokens.visit_setcompc                 C   rc   rh   re   r[   r   r   r   Úvisit_dictcompÅ   rg   zMarkTokens.visit_dictcompc                 C   ó   | j j|tjddd}||fS )NÚforT©Úreverse©r   Ú
find_tokenr-   ÚNAME©r   r$   r.   r0   r7   r   r   r   Úvisit_comprehensionÉ   s   zMarkTokens.visit_comprehensionc                 C   s(   |j dvr| j |¡}|j dvs||fS )N)ÚifÚelif©Ústringr   rD   r[   r   r   r   Úvisit_ifÔ   s   

ÿzMarkTokens.visit_ifc                 C   s4   | j  |tjd¡}| j  |¡}t |tj¡ ||fS )NÚ.)r   rp   r-   r@   rC   r   r]   rq   )r   r$   r.   r0   ÚdotÚnamer   r   r   Úhandle_attrÚ   s   zMarkTokens.handle_attrc                 C   sT   |j st|dd ƒr| j |tj¡}|jdkr&| j |¡}t 	|tj
d¡r&|}||fS )NÚdocr   ú@)Úbodyr&   r   rp   r-   ÚSTRINGr/   rD   r   r>   r@   )r   r$   r.   r0   Úprevr   r   r   Ú
handle_defæ   s   
zMarkTokens.handle_defc                 C   s<   t tt| jƒ|ƒƒ}| j |jtj|¡}|j	|j	kr|}|S r   )
Únextr   r   r   r   rp   r0   r-   r@   r/   )r   r$   r0   Úopening_bracketÚfirst_childÚ
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   r~   )r‡   r   r>   r-   r@   r   rC   r[   r   r   r   Ú
visit_call  s   zMarkTokens.visit_callc                 C   s   |   ||d¡}||fS rd   )r‡   r[   r   r   r   Úvisit_subscript  s   zMarkTokens.visit_subscriptc                 C   sH   	 | j  |¡}|jdkrn|}q	 | j  |¡}|jdkr!	 ||fS |}q)NTrN   )r   rD   rw   rC   )r   r$   r.   r0   r   Únext_r   r   r   Úvisit_slice  s   
ü
ÿüzMarkTokens.visit_slicec                 C   s(   | j  |¡}t |tjd¡r|}||fS )NrM   )r   rC   r   r>   r-   r@   )r   r$   r.   r0   Úmaybe_commar   r   r   Úhandle_bare_tuple,  s   zMarkTokens.handle_bare_tuplec                 C   sh   t |tjƒst |tjƒsJ ‚|jd }trtt|ƒ}|  	|j
|jd¡\}}||kr0|  |||¡S ||fS )Nr   T)Ú
isinstanceÚastr   ÚncÚ_BaseContainerÚeltsr	   r   r   Ú_gobble_parensr.   r0   r   )r   r$   r.   r0   r9   Úchild_firstÚ
child_lastr   r   r   Úhandle_tuple_nonempty6  s   

z MarkTokens.handle_tuple_nonemptyc                 C   s    |   |||¡\}}|  ||d¡S )NF)r   r“   r[   r   r   r   r–   D  s   c                 C   s8   t |tjƒst |tjƒsJ ‚|js||fS |  |||¡S r   )rŽ   r   r   r   r‘   r’   r–   r[   r   r   r   Úvisit_tupleI  s   zMarkTokens.visit_tupleFc                 C   sd   |j dkr.| j |¡}| j |¡}t |tjd¡r)t |tjd¡r)||}}|r)q 	 ||fS ||fS )Nr   r   r   )r/   r   rD   rC   r   r>   r-   r@   )r   r.   r0   Úinclude_allr   rƒ   r   r   r   r“   Q  s   
 
zMarkTokens._gobble_parensc                 C   ó   |   ||¡S r   ©Ú
handle_strr[   r   r   r   Ú	visit_str_  ó   zMarkTokens.visit_strc                 C   r™   r   rš   r[   r   r   r   Úvisit_joinedstrc  s   zMarkTokens.visit_joinedstrc                 C   r™   r   rš   r[   r   r   r   Úvisit_bytesk  r   zMarkTokens.visit_bytesc                 C   s@   | j  |¡}t |tj¡r|}| j  |¡}t |tj¡s||fS r   )r   rC   r   r>   r-   r€   )r   r.   r0   r8   r   r   r   r›   o  s   þzMarkTokens.handle_strc                 C   s`   t  |tj¡r| j |¡}t  |tj¡st|tƒr|j}|dk r,|j	tj
kr,| j |¡}||fS )Nr   )r   r>   r-   r@   r   rC   rŽ   ÚcomplexÚimagrB   ÚNUMBERrD   )r   r$   Úvaluer.   r0   r   r   r   Ú
handle_numx  s   ÿ
zMarkTokens.handle_numc                 C   s   |   |ttj|ƒj||¡S r   )r¤   r   r   ÚNumÚnr[   r   r   r   Ú	visit_numŽ  s   zMarkTokens.visit_numc                 C   sd   t |tƒst |tjƒsJ ‚t |jtjƒr|  ||j||¡S t |jtj	tj
fƒr.|  |||¡S ||fS r   )rŽ   r   r   ÚConstr£   ÚnumbersÚNumberr¤   ÚsixÚ	text_typeÚbinary_typerœ   r[   r   r   r   Úvisit_const“  s   zMarkTokens.visit_constc                 C   sv   t |tjƒst |tjƒsJ ‚|jd ur7t|dd ƒd u r7| jj|t	j
ddd}| j |¡}t |t	j|j¡ |}||fS )Nr(   ú=Trm   )rŽ   r   Úkeywordr   ÚKeywordÚargr&   r   rp   r-   r@   rD   r   r]   rq   )r   r$   r.   r0   Úequalsr{   r   r   r   Úvisit_keyword¡  s   zMarkTokens.visit_keywordc                 C   s8   t  |tjd¡s| j |¡}t  |tjd¡r|}||fS )NÚ*)r   r>   r-   r@   r   rD   )r   r$   r.   r0   Ústarr   r   r   Úvisit_starred­  s
   zMarkTokens.visit_starredc                 C   s:   t  |tjd¡r| j |tjd¡}| j |¡ }}||fS )NÚexceptrN   )r   r>   r-   rq   r   rp   r@   rD   )r   r$   r.   r0   Úcolonr   r   r   Úvisit_assignname¶  s   zMarkTokens.visit_assignnamec                 C   rk   )NÚwithTrm   ro   rr   r   r   r   Ú
visit_withÀ  s   zMarkTokens.visit_withc                 C   s   |j dks| j |¡}||fS )NÚasyncrv   r[   r   r   r   Úhandle_asyncÉ  s   
zMarkTokens.handle_asyncc                 C   s*   t  |tjd¡r| j |¡}|  |||¡S )NÚdef)r   r>   r-   rq   r   rD   Úvisit_functiondefr[   r   r   r   Úvisit_asyncfunctiondefÒ  s   z!MarkTokens.visit_asyncfunctiondefN)F)4Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r!   r"   r#   r2   r4   r\   r`   ÚsysÚversion_inforf   r«   ÚPY2ri   rj   rs   rx   r|   Úvisit_attributeÚvisit_assignattrÚvisit_delattrr‚   Úvisit_classdefrÀ   r‡   rˆ   r‰   r‹   r   r–   r—   r“   rœ   rž   rŸ   r›   r¤   r§   r®   Úvisit_constantr´   r·   rº   r¼   r¾   Úvisit_asyncforÚvisit_asyncwithrÁ   r   r   r   r   r   4   sf    '	)

	


			r   )r   r©   rÆ   r-   r   Útypingr   r   r   r   r   r   r	   r«   Ú r   Ú	asttokensr   r   Úastroid.node_classesÚnode_classesr   Ú	Exceptionr   r@   rQ   rS   Úobjectr   r   r   r   r   Ú<module>   s4   $þýý