o
    DDi                     @   s  d dl mZ d dlmZ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 d dlmZ d dlmZ erLd d	lmZ d d
lmZ eeddG dd dZdddededddef
ddZdddede	e ddde	e f
ddZdddedeeef dddeeef f
ddZdddedee dddee f
ddZ dddede
e ddde
e f
dd Z!dddede
e dddee f
d!d"Z"dddede
e ddde
e f
d#d$Z#d%S )&    )contextmanager)	dataclassfield)IterableIteratorListOptionalSequenceTYPE_CHECKINGUnion)	add_slots)FlattenSentinel)MaybeSentinel)RemovalSentinel)CSTNodeT)CSTNode)CSTVisitorTF)frozenc                   @   s   e Zd ZU eed< eed< dZeed< eedZ	e
e ed< eedZe
e ed< ded	dfd
dZdddZdddZded	dfddZd ddZd ddZdddZedddddded ded d	ed fddZdS )!CodegenStatedefault_indentdefault_newlineNprovider)default_factoryindent_tokenstokensvaluereturnc                 C      | j | d S N)r   appendselfr    r"   O/var/www/Datamplify/venv/lib/python3.10/site-packages/libcst/_nodes/internal.pyincrease_indent"      zCodegenState.increase_indentc                 C   s   | j   d S r   )r   popr!   r"   r"   r#   decrease_indent%   s   zCodegenState.decrease_indentc                 C   s   | j | j d S r   )r   extendr   r'   r"   r"   r#   add_indent_tokens(   s   zCodegenState.add_indent_tokensc                 C   r   r   )r   r   r    r"   r"   r#   	add_token+   r%   zCodegenState.add_tokennoder   c                 C      d S r   r"   r!   r,   r"   r"   r#   before_codegen.      zCodegenState.before_codegenc                 C   r-   r   r"   r.   r"   r"   r#   after_codegen1   r0   zCodegenState.after_codegenc                 C   s    t | jdkr| j  dS dS )z
        Called by :meth:`libcst.Module._codegen_impl` at the end of the file to remove
        the last token (a trailing newline), assuming the file isn't empty.
        r   N)lenr   r&   r'   r"   r"   r#   pop_trailing_newline4   s   z!CodegenState.pop_trailing_newline)
start_nodeend_noder4   r5   c                c   s    d V  d S r   r"   )r!   r,   r4   r5   r"   r"   r#   record_syntactic_position>   s   
z&CodegenState.record_syntactic_position)r   N)r,   r   r   N)__name__
__module____qualname__str__annotations__r   objectr   listr   r   r   r$   r(   r*   r+   r/   r1   r3   r   r   r   r6   r"   r"   r"   r#   r      s2   
 





r   parentr   	fieldnamer,   visitorr   r   c                 C   sr   | | | ||}t|trtdt|j dd t|tr1tdt|j dd d || | |S )z|
    Given a node, visits the node using `visitor`. If removal is attempted by the
    visitor, an exception is raised.
    z*We got a RemovalSentinel while visiting a . This z.node's parent does not allow it to be removed.*We got a FlattenSentinel while visiting a Cnode's parent does not allow for it to be it to be replaced with a 	sequence.)	on_visit_attributevisit
isinstancer   	TypeErrortyper7   r   on_leave_attributer>   r?   r,   r@   resultr"   r"   r#   visit_requiredI   s$   


rM   c                 C   s   |du r| | | || | dS | | | ||}t|tr1tdt|j dd d || | t|tr>dS |S )zx
    Given an optional node, visits the node if it exists with `visitor`. If the node is
    removed, returns None.
    NrB   rA   rC   rD   )	rE   rJ   rF   rG   r   rH   rI   r7   r   rK   r"   r"   r#   visit_optionalb   s    

rN   c                 C   s   t |tr|| | || | tjS || | ||}t |tr3tdt|j	 dd d || | t |t
rAtjS |S )z
    Given a node that can be a real value or a sentinel value, visits the node if it
    is real with `visitor`. If the node is removed, returns MaybeSentinel.
    rB   rA   rC   rD   )rG   r   rE   rJ   DEFAULTrF   r   rH   rI   r7   r   rK   r"   r"   r#   visit_sentinely   s    



rP   childrenc                 c   sX    | | | |D ]}||}t|tr|E dH  q	t|ts#|V  q	|| | dS )z
    Given an iterable of children, visits each child with `visitor`, and yields the new
    children with any `RemovalSentinel` values removed.
    N)rE   rF   rG   r   r   rJ   )r>   r?   rQ   r@   child	new_childr"   r"   r#   visit_iterable   s   



rT   c                 C      t t| |||S )zh
    A convenience wrapper for `visit_iterable` that returns a sequence instead of an
    iterable.
    )tuplerT   r>   r?   rQ   r@   r"   r"   r#   visit_sequence      
rX   c                 c   s    | | | |D ]0}||}t|trq	t|tr-|D ]}| s(| r(q|V  qq	| s6| r6q	|V  q	|| | dS )z
    Similar to visit_iterable above, but capable of discarding empty SimpleStatementLine
    nodes in order to preserve correct pass insertion behavior.
    N)rE   rF   rG   r   r   _is_removablerJ   )r>   r?   rQ   r@   rR   rS   child_r"   r"   r#   visit_body_iterable   s    


r\   c                 C   rU   )zm
    A convenience wrapper for `visit_body_iterable` that returns a sequence
    instead of an iterable.
    )rV   r\   rW   r"   r"   r#   visit_body_sequence   rY   r]   N)$
contextlibr   dataclassesr   r   typingr   r   r   r   r	   r
   r   libcst._add_slotsr   libcst._flatten_sentinelr   libcst._maybe_sentinelr   libcst._removal_sentinelr   libcst._typesr   libcst._nodes.baser   libcst._visitorsr   r   r:   rM   rN   rP   rT   rX   r\   r]   r"   r"   r"   r#   <module>   s   $0







%