o
    ¹iÈT  ã                   @   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 erLd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)Ú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 d+d,„ Z!ejdkrvd-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r´dIdJ„ 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   ÚNodeMethodsÚ_methodsÚ_iter_children)ÚselfÚcode© r   úP/var/www/edux/Edux_v2/venv/lib/python3.10/site-packages/asttokens/mark_tokens.pyÚ__init__4   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#   ?   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$   L   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   v   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_comp)é   é   c                 C   ó   |   d|||¡S ©Nr   ©rb   r]   r   r   r   Úvisit_listcomp¹   ó   zMarkTokens.visit_listcompc                 C   re   ©Nr   rg   r]   r   r   r   Úvisit_setcomp¿   ri   zMarkTokens.visit_setcompc                 C   re   rj   rg   r]   r   r   r   Úvisit_dictcompÃ   ri   zMarkTokens.visit_dictcompc                 C   ó   | 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   rr   r.   rB   rE   r   r_   rs   )r   r%   r0   r2   Ú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   rr   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   rr   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   r€   )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‹   rf   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   ry   rE   )r   r%   r0   r2   rƒ   Ú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   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_parensr0   r2   r’   )r   r%   r0   r2   r;   Úchild_firstÚ
child_lastr   r   r   Úhandle_tuple_nonempty9  s   

z MarkTokens.handle_tuple_nonemptyc                 C   s    |   |||¡\}}|  ||d¡S )NF)r’   r˜   r]   r   r   r   r›   G  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_tupleL  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_allrƒ   r…   r   r   r   r˜   T  s   
 
zMarkTokens._gobble_parensc                 C   ó   |   ||¡S r   ©Ú
handle_strr]   r   r   r   Ú	visit_strb  ó   zMarkTokens.visit_strc                 C   rž   r   rŸ   r]   r   r   r   Úvisit_joinedstrf  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.   r‚   )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   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)   ú=Tro   )r“   r”   Úkeywordr•   ÚKeywordÚargr'   r   rr   r.   rB   rF   r   r_   rs   )r   r%   r0   r2   Ú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.   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.   rs   r   rr   rB   rF   )r   r%   r0   r2   Úcolonr   r   r   Úvisit_assignname¹  s   zMarkTokens.visit_assignnamec                 C   rm   )NÚwithTro   rq   rt   r   r   r   Ú
visit_withÃ  s   zMarkTokens.visit_withc                 C   s   |j dks| j |¡}||fS )NÚasyncrx   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.   rs   r   rF   Úvisit_functiondefr]   r   r   r   Úvisit_asyncfunctiondefÕ  s   z!MarkTokens.visit_asyncfunctiondefN)F)5Ú__name__Ú
__module__Ú__qualname__Ú__doc__r    r"   r#   r$   r4   r6   r^   rb   ÚsysÚversion_inforh   r°   ÚPY2rk   rl   ru   rz   r~   Úvisit_attributeÚvisit_assignattrÚvisit_delattrr„   Úvisit_classdefrÅ   r‰   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   /   sh    *	)

	


			r   )r”   r®   rË   r.   r   Útypingr   r   r   r   r   r   r	   r°   Ú r   Ú	asttokensr   r   Úastroid_compatr   r•   r   rB   rS   rU   Úobjectr   r   r   r   r   Ú<module>   s,   $ýý