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	 d dl
mZmZ d dlmZ d dlmZ eddG d	d
 d
ZeddG dd deZdedefddZG dd dee ZdS )    )contextmanager)	dataclassfield)CallableIteratorListOptional)CSTNodeModule)CodegenState)BaseMetadataProviderT)frozenc                   @   s"   e Zd ZU dZeed< eed< dS )CodeSpanz
    Represents the position of a piece of code by its starting position and length.

    Note: This class does not specify the unit of distance - it can be bytes,
    Unicode characters, or something else entirely.
    startlengthN)__name__
__module____qualname____doc__int__annotations__ r   r   V/var/www/Datamplify/venv/lib/python3.10/site-packages/libcst/metadata/span_provider.pyr      s   
 r   Fc                       s   e Zd ZU ee ed< dZeee	ge
f  ed< dZe
ed< eedZee
 ed< d fd	d
Zde	ddf fddZde	ddfddZdeddfddZdeddfddZeddddedee dee ded fddZ  ZS )SpanProvidingCodegenStateproviderN
get_lengthr   position)default_factory_stackreturnc                    s$   t    | jD ]}| | qd S N)superadd_indent_tokensindent_tokens_update_position)selftoken	__class__r   r   r"   &   s   

z+SpanProvidingCodegenState.add_indent_tokensvaluec                    s   t  | | | d S r    )r!   	add_tokenr$   )r%   r)   r'   r   r   r*   +   s   z#SpanProvidingCodegenState.add_tokenc                 C   s    | j pt}|  j||7  _d S r    )r   lenr   )r%   r)   r   r   r   r   r$   /   s   
z*SpanProvidingCodegenState._update_positionnodec                 C   s   | j | j d S r    )r   appendr   )r%   r,   r   r   r   before_codegen3   s   z(SpanProvidingCodegenState.before_codegenc                 C   s<   | j  }|| jjvr| j}t||| d| jj|< d S d S N)r   )r   popr   	_computedr   r   )r%   r,   r   endr   r   r   after_codegen6   s
   
z'SpanProvidingCodegenState.after_codegen)
start_nodeend_noder4   r5   c             
   c   s    | j }z7d V  W | j }|d ur| jj| jn|}|d ur,| jj| }|j|j | }n|| }t||d| jj|< d S | j }|d urJ| jj| jn|}|d ur_| jj| }|j|j | }n|| }t||d| jj|< w r/   )r   r   r1   r   r   r   )r%   r,   r4   r5   r   r2   end_spanr   r   r   r   record_syntactic_position=   s0   z3SpanProvidingCodegenState.record_syntactic_position)r   N)r   r   r   r   r   r   r   r   r   strr   r   r   listr   r   r"   r*   r$   r	   r.   r3   r   r   r7   __classcell__r   r   r'   r   r      s,   
 r   r)   r   c                 C   s   t | dS )Nutf8)r+   encode)r)   r   r   r   byte_length_in_utf8W   s   r=   c                   @   s"   e Zd ZdZdeddfddZdS )ByteSpanPositionProvidera  
    Generates offset and length metadata for nodes' positions.

    For each :class:`CSTNode` this provider generates a :class:`CodeSpan` that
    contains the byte-offset of the node from the start of the file, and its
    length (also in bytes). The whitespace owned by the node is not included in
    this length.

    Note: offset and length measure bytes, not characters (which is significant for
    example in the case of Unicode characters encoded in more than one byte)
    moduler   Nc                 C   s"   t |j|j| td}|| d S )N)default_indentdefault_newliner   r   )r   r@   rA   r=   _codegen)r%   r?   stater   r   r   	_gen_implh   s   z"ByteSpanPositionProvider._gen_impl)r   r   r   r   r
   rD   r   r   r   r   r>   [   s    r>   N)
contextlibr   dataclassesr   r   typingr   r   r   r   libcstr	   r
   libcst._nodes.internalr   libcst.metadata.base_providerr   r   r   r8   r   r=   r>   r   r   r   r   <module>   s   7