o
    pĎiR                     @   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   Q/home/jeff/fluffinator/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,   |j }t|tttjfsJ | ||||S r   )nr   r   intnumbersNumberr   )r   r%   r0   r2   r   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   r   r   r   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(   $