o
    <©Zh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   ZNodeMethodsÚ_methodsÚ_iter_children)ÚselfÚcode© r   úL/var/www/html/lang_env/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   Z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   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}|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   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"   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)Zinclude_extra)
r   Úmatch_tokenr*   ÚNEWLINEÚOPÚISEOFÚtyper   Ú
next_tokenÚ
prev_token)r   Zstart_tokenÚtr   r   r   r.   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   r7   r*   r9   )Ú.0Úx©r4   r   r   Ú	<genexpr>“   s   € z7MarkTokens._expand_to_matching_pairs.<locals>.<genexpr>)ú,ú:)r   Útoken_rangeÚpopÚ_matching_pairs_leftÚappendÚ_matching_pairs_rightÚreversedr<   Úanyr   r7   r=   )
r   r+   r-   r#   Zto_match_rightZto_match_leftÚtokZtok_infoÚmatchr3   r   rC   r   r0   |   s2   
€ÿ€€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*   r9   )r   Ú
open_bracer#   r+   r-   Ú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#   r+   r-   r3   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   r=   rP   r   r   r   Úvisit_if¾   s   

ÿzMarkTokens.visit_ifc                 C   s4   | j  |tjd¡}| j  |¡}t |tj¡ ||fS )NÚ.)r   rY   r*   r9   r<   r   rR   rZ   )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r,| j |¡}t 	|tj
d¡r,|}||fS )NZdoc_nodeÚdocr   ú@)Úbodyr%   r   rY   r*   ÚSTRINGr,   r=   r   r7   r9   )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r|}|S r   )
Únextr   r   r   r   rY   r-   r*   r9   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   rf   )rl   r   r7   r*   r9   r   r<   rP   r   r   r   Ú
visit_callî   s   zMarkTokens.visit_callc                 C   ó   |   ||d¡}||fS )Nr   ©rl   rP   r   r   r   Úvisit_matchclassù   s   zMarkTokens.visit_matchclassc                 C   rn   )Nr   ro   rP   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)NTrF   )r   r=   r_   r<   )r   r#   r+   r-   ri   Znext_r   r   r   Úvisit_slice  s   
ü
ÿüzMarkTokens.visit_slicec                 C   s(   | j  |¡}t |tjd¡r|}||fS )NrE   )r   r<   r   r7   r*   r9   )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J ‚|jd }trtt|ƒ}|  |j	|j
d¡\}}||kr/|  |||¡S ||fS )Nr   T)Ú
isinstanceÚastr   ÚAstroidBaseContainerÚeltsr	   r   r   Ú_gobble_parensr+   r-   rs   )r   r#   r+   r-   r5   Zchild_firstZ
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   )rt   ru   r   rv   rw   ry   rP   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   )r,   r   r=   r<   r   r7   r*   r9   )r   r+   r-   Zinclude_allri   rk   r   r   r   rx   9  s   
 
zMarkTokens._gobble_parensc                 C   ó   |   ||¡S r   ©Ú
handle_strrP   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)é   é   TZFSTRING_STARTr
   r   ZFSTRING_END)
ÚsysÚversion_infor}   r   r7   r%   r*   r   r<   rh   )r   r#   r+   r-   r4   Úcountr   r   r   Úvisit_joinedstrK  s*   

úêzMarkTokens.visit_joinedstrc                 C   r{   r   r|   rP   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   r<   r   r7   r*   rh   )r   r+   r-   r4   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   r7   r*   r9   r   r<   rt   Ú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   ru   ÚNumÚnrP   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   )rt   ru   ÚConstantÚncZConstrŠ   ÚnumbersÚNumberr‹   ÚstrÚbytesr~   rP   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&   ú=TrW   )rt   ru   Úkeywordr   ÚKeywordÚargr%   r   rY   r*   r9   r=   r   rR   rZ   )r   r#   r+   r-   Úequalsrc   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   r7   r*   r9   r   r=   )r   r#   r+   r-   Ú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ÚexceptrF   )r   r7   r*   rZ   r   rY   r9   r=   )r   r#   r+   r-   Úcolonr   r   r   Úvisit_assignnameµ  s   zMarkTokens.visit_assignnamec                 C   s   |j dks| j |¡}||fS )NÚasyncr^   rP   r   r   r   Úhandle_asyncÁ  s   
zMarkTokens.handle_asyncc                 C   s*   t  |tjd¡r| j |¡}|  |||¡S )NÚdef)r   r7   r*   rZ   r   r=   Úvisit_functiondefrP   r   r   r   Úvisit_asyncfunctiondefÊ  s   z!MarkTokens.visit_asyncfunctiondefN)F)-Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r    r!   r"   r.   r0   rQ   rU   r[   r`   rd   Zvisit_attributeZvisit_assignattrZvisit_delattrrj   Zvisit_classdefr¥   rl   rm   rp   rq   rr   rs   ry   rz   rx   r~   r…   r†   r}   r‹   rŽ   r•   Zvisit_constantr›   rž   r¡   r£   Zvisit_asyncforZvisit_asyncwithr¦   r   r   r   r   r   ,   sV    *	)		
#			r   )ru   r‘   r‚   r*   r   Útypingr   r   r   r   r   r   r	   Ú r   Z	asttokensr   Zastroid_compatr   r   r   rv   r   r9   rI   rK   r   r   r   r   r   Ú<module>   s(   $ýý