o
    DDi                     @   s  U d dl Z d dlmZ d dlmZmZ d dl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mZ d d
lmZ e dZe
e ed< eeddG dd deZG dd dee ZeeddG dd deZG dd dee ZdS )    N)contextmanager)	dataclassfield)IteratorListOptionalPattern)	add_slots)CSTNode)CodegenState)Module)CodePosition	CodeRange)BaseMetadataProviderz\r\n?|\n
NEWLINE_REF)frozenc                   @   s   e Zd ZU eed< eed< ee ed< eedZ	e
e ed< eedZe
e ed< dZeed< d	Zeed
< ededZe
e ed< dddZdeddfddZdeddfddZdddZdddZdS )0WhitespaceInclusivePositionProvidingCodegenStatedefault_indentdefault_newlineprovider)default_factoryindent_tokenstokens   liner   columnF)initr   _stackreturnNc                 C   s(   | j | j | jD ]}| | q
d S N)r   extendr   _update_position)selftoken r$   Z/var/www/Datamplify/venv/lib/python3.10/site-packages/libcst/metadata/position_provider.pyadd_indent_tokens%   s   
zBWhitespaceInclusivePositionProvidingCodegenState.add_indent_tokensvaluec                 C   s   | j | | | d S r   )r   appendr!   )r"   r'   r$   r$   r%   	add_token*   s   z:WhitespaceInclusivePositionProvidingCodegenState.add_tokenc                 C   sT   t |}t|dkr|  jt|7  _dS |  jt|d 7  _t|d | _dS )zU
        Computes new line and column numbers from adding the token [value].
        r   N)r   splitlenr   r   )r"   r'   segmentsr$   r$   r%   r!   .   s
   
zAWhitespaceInclusivePositionProvidingCodegenState._update_positionnoder
   c                 C   s   | j t| j| j d S r   )r   r(   r   r   r   )r"   r.   r$   r$   r%   before_codegen;   s   z?WhitespaceInclusivePositionProvidingCodegenState.before_codegenc                 C   sB   | j  }|| jjvrt| j| j}t||}|| jj|< d S d S r   )r   popr   	_computedr   r   r   r   )r"   r.   	start_posend_pos
node_ranger$   r$   r%   after_codegen>   s   

z>WhitespaceInclusivePositionProvidingCodegenState.after_codegen)r   N)r.   r
   r   N)__name__
__module____qualname__str__annotations__r   r   r   listr   r   r   r   intr   r   r   r&   r)   r!   r/   r5   r$   r$   r$   r%   r      s   
 

r   c                   @   "   e Zd ZdZdeddfddZdS )#WhitespaceInclusivePositionProviderz
    Generates line and column metadata.

    The start and ending bounds of the positions produced by this provider include all
    whitespace owned by the node.
    moduler   Nc                 C       t |j|j| d}|| d S N)r   r   r   )r   r   r   _codegenr"   r?   stater$   r$   r%   	_gen_implR      z-WhitespaceInclusivePositionProvider._gen_implr6   r7   r8   __doc__r   rE   r$   r$   r$   r%   r>   J   s    r>   c                   @   s>   e Zd Zeddddedee dee ded fddZdS )	PositionProvidingCodegenStateN)
start_nodeend_noder.   rJ   rK   r   c             	   c   s    t | j| j}z0d V  W t | j| j}|d ur| jj| jn|}|d ur,| jj| jn|}t||| jj|< d S t | j| j}|d urK| jj| jn|}|d urX| jj| jn|}t||| jj|< w r   )r   r   r   r   r1   startendr   )r"   r.   rJ   rK   rL   rM   r$   r$   r%   record_syntactic_position^   s$   z7PositionProvidingCodegenState.record_syntactic_position)r6   r7   r8   r   r
   r   r   rN   r$   r$   r$   r%   rI   [   s    rI   c                   @   r=   )PositionProvidera  
    Generates line and column metadata.

    These positions are defined by the start and ending bounds of a node ignoring most
    instances of leading and trailing whitespace when it is not syntactically
    significant.

    The positions provided by this provider should eventually match the positions used
    by `Pyre <https://github.com/facebook/pyre-check>`__ for equivalent nodes.
    r?   r   Nc                 C   r@   rA   )rI   r   r   rB   rC   r$   r$   r%   rE      rF   zPositionProvider._gen_implrG   r$   r$   r$   r%   rO   w   s    rO   ) re
contextlibr   dataclassesr   r   typingr   r   r   r   libcst._add_slotsr	   libcst._nodes.baser
   libcst._nodes.internalr   libcst._nodes.moduler   libcst._positionr   r   libcst.metadata.base_providerr   compiler   r9   r:   r   r>   rI   rO   r$   r$   r$   r%   <module>   s&   
2