o
    tdfY                     @   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rNd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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rdIdJ 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   ^/var/www/html/software/conda/envs/catlas/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   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 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#   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)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 ],}|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   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      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+   r:   )r   
open_bracer$   r,   r.   beforer   r   r   handle_comp   s   zMarkTokens.handle_comp)      c                 C      |  d|||S Nr   rV   rQ   r   r   r   visit_listcomp      zMarkTokens.visit_listcompc                 C   rY   Nr   r[   rQ   r   r   r   visit_setcomp   r]   zMarkTokens.visit_setcompc                 C   rY   r^   r[   rQ   r   r   r   visit_dictcomp   r]   zMarkTokens.visit_dictcompc                 C      | 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vr| j|}|j dvs||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   rf   r+   r:   r=   r   rS   rg   )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   rf   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r|}|S r   )
nextr   r   r   r   rf   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   rt   )rz   r   r8   r+   r:   r   r=   rQ   r   r   r   
visit_call  s   zMarkTokens.visit_callc                 C      |  ||d}||fS )Nr   rz   rQ   r   r   r   visit_matchclass  s   zMarkTokens.visit_matchclassc                 C   r|   rZ   r}   rQ   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)NTrG   )r   r>   rm   r=   )r   r$   r,   r.   rw   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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.   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J |js||fS | |||S r   )r   r   r   r   r   r   rQ   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   )r-   r   r>   r=   r   r8   r+   r:   )r   r,   r.   Zinclude_allrw   ry   r   r   r   r   T  s   
 
zMarkTokens._gobble_parensc                 C      |  ||S r   
handle_strrQ   r   r   r   	visit_strb     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)rW      TZFSTRING_STARTr
   r   ZFSTRING_END)
sysversion_infor   r   r8   r&   r+   r   r=   rv   )r   r$   r,   r.   r5   countr   r   r   visit_joinedstrf  s*   

zMarkTokens.visit_joinedstrc                 C   r   r   r   rQ   r   r   r   visit_bytes  r   zMarkTokens.visit_bytesc                 C   s@   | j |}t|tjr|}| j |}t|tjs||fS r   )r   r=   r   r8   r+   rv   )r   r,   r.   r5   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   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   NumnrQ   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   ncZConstr   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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'   =Trc   )r   r   keywordr   Keywordargr&   r   rf   r+   r:   r>   r   rS   rg   )r   r$   r,   r.   equalsrq   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   r8   r+   r:   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exceptrG   )r   r8   r+   rg   r   rf   r:   r>   )r   r$   r,   r.   colonr   r   r   visit_assignname  s   zMarkTokens.visit_assignnamec                 C   ra   )NwithTrc   re   rh   r   r   r   
visit_with  s   zMarkTokens.visit_withc                 C   s   |j dks| j|}||fS )Nasyncrl   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+   rg   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   rV   r   r   r\   r   PY2r_   r`   ri   rn   rr   Zvisit_attributeZvisit_assignattrZvisit_delattrrx   Zvisit_classdefr   rz   r{   r~   r   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   /   sh    *	)

	


#			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>   s,   $