o
    MThR  ã                   @   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mZ ddlmZ ddlmZmZ erDd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ƒZdS )é    N)ÚModule)ÚCallableÚListÚUnionÚcastÚOptionalÚTupleÚTYPE_CHECKINGé   )Úutil)Ú	ASTTokens)Ú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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d&d'„ Zd(d)„ ZdFd+d,„Zd-d.„ Zd/d0„ Zd1d2„ Z d3d4„ Z!d5d6„ Z"d7d8„ Z#d9d:„ Z$e$Z%d;d<„ Z&d=d>„ Z'd?d@„ Z(dAdB„ Z)e)Z*e)Z+dCdD„ Z,dES )GÚ
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   úX/home/air/segue/gemini/backup/venv/lib/python3.10/site-packages/asttokens/mark_tokens.pyÚ__init__1   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"   7   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#   <   s
   z!MarkTokens._visit_before_childrenc           	      C   sö   |}d }t t| jƒ|ƒD ] }t |¡rq|r|jj|jk r |j}|r)|jj|jkr,|j}q|p0|}|p4|}t |¡rC|  	t tj
|ƒ¡}|  t tj
|ƒt tj
|ƒ|¡\}}| j | |j¡|||ƒ\}}||f||fkrs|  |||¡\}}||_||_d S r   )r   r   r   r   Úis_empty_astroid_sliceÚfirst_tokenÚindexÚ
last_tokenÚ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$   I   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   r4   s   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.   rB   )Ú.0Úx©r:   r   r   Ú	<genexpr>“   s   € z7MarkTokens._expand_to_matching_pairs.<locals>.<genexpr>)ú,ú:)r   Útoken_rangeÚpopÚ_matching_pairs_leftÚappendÚ_matching_pairs_rightÚreversedrE   Úanyr   r@   rF   )
r   r0   r2   r%   Úto_match_rightÚto_match_leftÚtokÚtok_infoÚmatchr9   r   rM   r   r6   |   s2   
€ÿ€€z$MarkTokens._expand_to_matching_pairsc                 C   s   ||fS r   r   ©r   r%   r0   r2   r   r   r   Úvisit_default¥   s   zMarkTokens.visit_defaultc                 C   s$   | j  |¡}t |tj|¡ ||fS r   )r   rF   r   Úexpect_tokenr.   rB   )r   Ú
open_bracer%   r0   r2   Úbeforer   r   r   Úhandle_comp«   s   zMarkTokens.handle_compc                 C   s   | j j|tjddd}||fS )NÚforT©Úreverse)r   Ú
find_tokenr.   ÚNAME)r   r%   r0   r2   r9   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   rF   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   rf   r.   rB   rE   r   r_   rg   )r   r%   r0   r2   Ú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r,| j |¡}t 	|tj
d¡r,|}||fS )NÚdoc_nodeÚdocr   ú@)Úbodyr'   r   rf   r.   ÚSTRINGr1   rF   r   r@   rB   )r   r%   r0   r2   Ú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   rf   r2   r.   rB   r1   )r   r%   r2   Ú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   rt   )r}   r   r@   r.   rB   r   rE   r]   r   r   r   Ú
visit_callî   s   zMarkTokens.visit_callc                 C   ó   |   ||d¡}||fS )Nr   ©r}   r]   r   r   r   Úvisit_matchclassù   s   zMarkTokens.visit_matchclassc                 C   r   )Nr   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)NTrP   )r   rF   rl   rE   )r   r%   r0   r2   rw   Únext_r   r   r   Úvisit_slice  s   
ü
ÿüzMarkTokens.visit_slicec                 C   s(   | j  |¡}t |tjd¡r|}||fS )NrO   )r   rE   r   r@   r.   rB   )r   r%   r0   r2   Úmaybe_commar   r   r   Úhandle_bare_tuple  s   zMarkTokens.handle_bare_tuplec                 C   sf   t |tjƒst |tƒsJ ‚|jd }trtt|ƒ}|  |j	|j
d¡\}}||kr/|  |||¡S ||fS )Nr   T)Ú
isinstanceÚastr   ÚAstroidBaseContainerÚeltsr	   r   r   Ú_gobble_parensr0   r2   r†   )r   r%   r0   r2   r;   Úchild_firstÚ
child_lastr   r   r   Úhandle_tuple_nonempty$  s   

z MarkTokens.handle_tuple_nonemptyc                 C   s6   t |tjƒst |tƒsJ ‚|js||fS |  |||¡S r   )r‡   rˆ   r   r‰   rŠ   rŽ   r]   r   r   r   Úvisit_tuple1  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   )r1   r   rF   rE   r   r@   r.   rB   )r   r0   r2   Úinclude_allrw   ry   r   r   r   r‹   9  s   
 
zMarkTokens._gobble_parensc                 C   ó   |   ||¡S r   ©Ú
handle_strr]   r   r   r   Ú	visit_strG  ó   zMarkTokens.visit_strc                 C   sÂ   t jdk r|  ||¡S |}	 t |ttdƒ¡rKd}|dkrB| j |¡}t |ttdƒ¡r1|d7 }nt |ttdƒ¡r>|d8 }|dks|}| j |¡}nt |tj	¡r[|}| j |¡}n	 ||fS q)N)é   é   TÚFSTRING_STARTr
   r   ÚFSTRING_END)
ÚsysÚversion_infor“   r   r@   r'   r.   r   rE   rv   )r   r%   r0   r2   r:   Úcountr   r   r   Úvisit_joinedstrK  s*   

úêzMarkTokens.visit_joinedstrc                 C   r‘   r   r’   r]   r   r   r   Úvisit_bytesn  r•   zMarkTokens.visit_bytesc                 C   s@   | j  |¡}t |tj¡r|}| j  |¡}t |tj¡s||fS r   )r   rE   r   r@   r.   rv   )r   r0   r2   r:   r   r   r   r“   r  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.   rB   r   rE   r‡   ÚcomplexÚimagrD   ÚNUMBERrF   )r   r%   Úvaluer0   r2   r   r   r   Ú
handle_num{  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   sb   t |tjƒst |tjƒsJ ‚t |jtjƒr|  ||j||¡S t |jt	t
fƒr-|  |||¡S ||fS r   )r‡   rˆ   ÚConstantÚncÚConstr¢   ÚnumbersÚNumberr£   ÚstrÚbytesr”   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)   ú=Trd   )r‡   rˆ   Úkeywordr¨   ÚKeywordÚargr'   r   rf   r.   rB   rF   r   r_   rg   )r   r%   r0   r2   Úequalsrp   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.   rB   r   rF   )r   r%   r0   r2   Ú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ÚexceptrP   )r   r@   r.   rg   r   rf   rB   rF   )r   r%   r0   r2   Úcolonr   r   r   Úvisit_assignnameµ  s   zMarkTokens.visit_assignnamec                 C   s   |j dks| j |¡}||fS )NÚasyncrk   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.   rg   r   rF   Úvisit_functiondefr]   r   r   r   Úvisit_asyncfunctiondefÊ  s   z!MarkTokens.visit_asyncfunctiondefN)F)-Ú__name__Ú
__module__Ú__qualname__Ú__doc__r    r"   r#   r$   r4   r6   r^   rb   rh   rm   rq   Úvisit_attributeÚvisit_assignattrÚvisit_delattrrx   Úvisit_classdefr¾   r}   r~   r   r‚   r„   r†   rŽ   r   r‹   r”   r   rž   r“   r£   r¦   r®   Úvisit_constantr´   r·   rº   r¼   Úvisit_asyncforÚvisit_asyncwithr¿   r   r   r   r   r   ,   sV    *	)		
#			r   )rˆ   rª   rš   r.   r   Útypingr   r   r   r   r   r   r	   Ú r   Ú	asttokensr   Úastroid_compatr   r¨   r   r‰   r   rB   rS   rU   r   r   r   r   r   Ú<module>   s(   $ýý