o
    ?iT(                     @   s8   d dl mZ d dlmZ d dlmZ G dd deZdS )    )StringIO)Token)CommonTokenStreamc                       s>  e Zd ZdZdZdZdZ fddZdd Zd	d
 Z	efddZ
efddZefddZdd ZefddZdd Zdd Zdd Zdd ZefddZdd  Zd!d" Zd#d$ Zd%d& Zefd'd(Zd)d* Zd+d, Zd-d. Zd/ed0efd1d2Zd3d4 ZG d5d6 d6eZ G d7d8 d8e Z!G d9d: d:e!Z"G d;d< d<e Z#  Z$S )=TokenStreamRewriter)tokensprogramslastRewriteTokenIndexesdefaultd   r   c                    s*   t t|   || _| jg i| _i | _dS )zw
        :type  tokens: antlr4.BufferedTokenStream.BufferedTokenStream
        :param tokens:
        :return:
        N)superr   __init__r   DEFAULT_PROGRAM_NAMEr   r   )selfr   	__class__ W/home/ubuntu/veenaModal/venv/lib/python3.10/site-packages/antlr4/TokenStreamRewriter.pyr      s   
zTokenStreamRewriter.__init__c                 C      | j S N)r   r   r   r   r   getTokenStream   s   z"TokenStreamRewriter.getTokenStreamc                 C   s.   | j |d }|r|| j| | j |< d S d S r   )r   getMIN_TOKEN_INDEX)r   instruction_indexprogram_nameinsr   r   r   rollback"   s   zTokenStreamRewriter.rollbackc                 C   s   |  | j| d S r   )r   r   r   r   r   r   r   deleteProgram'   s   z!TokenStreamRewriter.deleteProgramc                 C   s   |  |j|| d S r   )insertAfter
tokenIndexr   tokentextr   r   r   r   insertAfterToken*      z$TokenStreamRewriter.insertAfterTokenc                 C   s6   |  | j|d |}| |}t||_|| d S N   )InsertAfterOpr   
getProgramleninstructionIndexappend)r   indexr#   r   oprewritesr   r   r   r   -   s   

zTokenStreamRewriter.insertAfterc                 C   s   |  | j|| d S r   )insertBeforer   r   r-   r#   r   r   r   insertBeforeIndex3   r%   z%TokenStreamRewriter.insertBeforeIndexc                 C   s   |  ||j| d S r   )r0   r    r!   r   r   r   insertBeforeToken6   r%   z%TokenStreamRewriter.insertBeforeTokenc                 C   s2   |  | j||}| |}t||_|| d S r   )InsertBeforeOpr   r)   r*   r+   r,   )r   r   r-   r#   r.   r/   r   r   r   r0   9   s   

z TokenStreamRewriter.insertBeforec                 C   s   |  | j||| d S r   replacer   r1   r   r   r   replaceIndex?      z TokenStreamRewriter.replaceIndexc                 C   s   |  | j||| d S r   r5   )r   from_idxto_idxr#   r   r   r   replaceRangeB   r8   z TokenStreamRewriter.replaceRangec                 C   s   |  | j|j|j| d S r   )r6   r   r    )r   r"   r#   r   r   r   replaceSingleTokenE      z&TokenStreamRewriter.replaceSingleTokenc                 C   s   |  ||j|j| d S r   )r6   r    )r   
from_tokento_tokenr#   r   r   r   r   replaceRangeTokensH   s   z&TokenStreamRewriter.replaceRangeTokensc                 C   sv   t ||k|dk |dk |t| jjkfr!td||t| jj| ||| j|}| |}t||_|| d S )Nr   z'replace: range invalid: {}..{}(size={}))	anyr*   r   
ValueErrorformat	ReplaceOpr)   r+   r,   )r   r   r9   r:   r#   r.   r/   r   r   r   r6   K   s   (

zTokenStreamRewriter.replacec                 C      |  | j|| d S r   deleter   )r   r"   r   r   r   deleteTokenT   r%   zTokenStreamRewriter.deleteTokenc                 C   rE   r   rF   )r   r-   r   r   r   deleteIndexW   r%   zTokenStreamRewriter.deleteIndexc                 C   s6   t |tr| ||j|jd d S | |||d d S )N )
isinstancer   r6   r    )r   r   r9   r:   r   r   r   rG   Z   s   
zTokenStreamRewriter.deletec                 C   s   | j |dS )N)r   r   r   r   r   r   lastRewriteTokenIndex`      z)TokenStreamRewriter.lastRewriteTokenIndexc                 C   s   || j |< d S r   )r   )r   r   ir   r   r   setLastRewriteTokenIndexc   rN   z,TokenStreamRewriter.setLastRewriteTokenIndexc                 C   s   | j |g S r   )r   
setdefaultr   r   r   r   r)   f   rN   zTokenStreamRewriter.getProgramc                 C   s   |  | jdt| jjd S )Nr   r'   )getTextr   r*   r   r   r   r   r   getDefaultTexti   s   z"TokenStreamRewriter.getDefaultTextstartstopc           
      C   s2  | j |}|t| jjd krt| jjd }|dk rd}|s'| j||S t }| |}|}t||k|t| jjk frs||d}| j|}	|du r`|	j	t
jkr[||	j |d7 }n||}t||k|t| jjk fs?|t| jjd kr| D ]}|jt| jjd kr||j q| S )zK
        :return: the text in tokens[start, stop](closed interval)
        r'   r   N)r   r   r*   r   rR   r    _reduceToSingleOperationPerIndexallpoptyper   EOFwriter#   executevaluesr-   getvalue)
r   r   rT   rU   r/   buf	indexToOprO   r.   r"   r   r   r   rR   l   s,   


	"zTokenStreamRewriter.getTextc                 C   s  t |D ]\}}t|d u t|tj frqdd |d | D }|D ]*}|j|jkr:d ||j< d|j|j|_q#t	|j|jk|j|j
kfrMd ||j< q#dd |d | D }|D ]Y}t	|j|jk|j
|j
kfrqd ||j< q[t|j
|jk |j|j
kf}t	|jd u |jd u | frd ||j< t|j|j|_t|j
|j
|_
td| q[|std||q[qt |D ]\}}t|d u t|tj frqdd |d | D }	t |	D ]8\}
}|j|jkrt|tju r| j|j7  _d ||
< q|j|jkrt|tju r|j|j |_d ||
< qdd |d | D }|D ].}|j|jkr7|j|j |_d ||< q!t	|j|jk|j|j
kfrNtd	||q!qi }t |D ]\}}|d u rbqW||jrmtd
|||j< qW|S )Nc                 S      g | ]
}t |tjr|qS r   rK   r   r4   .0r.   r   r   r   
<listcomp>       zHTokenStreamRewriter._reduceToSingleOperationPerIndex.<locals>.<listcomp>z{}{}c                 S   ra   r   rK   r   rD   rc   r   r   r   re      rf   z
New rop {}z4replace op boundaries of {} overlap with previous {}c                 S   ra   r   rb   rc   r   r   r   re      rf   c                 S   ra   r   rg   rc   r   r   r   re      rf   z-insert op {} within boundaries of previous {}zshould be only one op per index)	enumeraterA   rK   r   rD   r-   r+   rC   r#   rW   
last_indexminprintrB   r4   rY   r(   r   )r   r/   rO   ropinsertsiopprevReplacesprevRop
isDisjointprevInserts
prev_indexprevIopreducedr.   r   r   r   rV      sl   




z4TokenStreamRewriter._reduceToSingleOperationPerIndexc                   @   s*   e Zd ZdZd
ddZdd Zdd Zd	S )z$TokenStreamRewriter.RewriteOperationr   r-   r#   r+   rJ   c                 C   s   || _ || _|| _d| _dS )z
            :type tokens: CommonTokenStream
            :param tokens:
            :param index:
            :param text:
            :return:
            r   Nrv   r   r   r-   r#   r   r   r   r      s   
z-TokenStreamRewriter.RewriteOperation.__init__c                 C   r   )zc
            :type buf: StringIO.StringIO
            :param buf:
            :return:
            )r-   r   r_   r   r   r   r\      s   z,TokenStreamRewriter.RewriteOperation.executec                 C   s   d | jj| j| j| jS )Nz<{}@{}:"{}">)rC   r   __name__r   r   r-   r#   r   r   r   r   __str__   s   z,TokenStreamRewriter.RewriteOperation.__str__NrJ   )ry   
__module____qualname__	__slots__r   r\   rz   r   r   r   r   RewriteOperation   s
    
r   c                       s&   e Zd Zd fdd	Zdd Z  ZS )z"TokenStreamRewriter.InsertBeforeOprJ   c                    s   t tj| ||| d S r   )r   r   r4   r   rw   r   r   r   r      r=   z+TokenStreamRewriter.InsertBeforeOp.__init__c                 C   sB   | | j | j| jjtjkr| | j| jj | jd S r&   )r[   r#   r   r   r-   rY   r   rZ   rx   r   r   r   r\      s   
z*TokenStreamRewriter.InsertBeforeOp.executer{   )ry   r|   r}   r   r\   __classcell__r   r   r   r   r4      s    r4   c                   @   s   e Zd ZdS )z!TokenStreamRewriter.InsertAfterOpN)ry   r|   r}   r   r   r   r   r(      s    r(   c                       s0   e Zd ZdZ fddZdd Zdd Z  ZS )zTokenStreamRewriter.ReplaceOpri   c                    s    t tj| ||| || _d S r   )r   r   rD   r   ri   )r   r9   r:   r   r#   r   r   r   r      s   
z&TokenStreamRewriter.ReplaceOp.__init__c                 C   s   | j r	|| j  | jd S r&   )r#   r[   ri   rx   r   r   r   r\      s   
z%TokenStreamRewriter.ReplaceOp.executec                 C   s.   | j rd| j| j| j| j| j S d S )Nz<ReplaceOp@{}..{}:"{}">)r#   rC   r   r   r-   ri   r   r   r   r   rz      s
   z%TokenStreamRewriter.ReplaceOp.__str__)ry   r|   r}   r~   r   r\   rz   r   r   r   r   r   rD      s
    rD   )%ry   r|   r}   r~   r   PROGRAM_INIT_SIZEr   r   r   r   r   r$   r   r2   r3   r0   r7   r;   r<   r@   r6   rH   rI   rG   rM   rP   r)   rS   intrR   rV   objectr   r4   r(   rD   r   r   r   r   r   r      s@    	 ;r   N)ior   antlr4.Tokenr   antlr4.CommonTokenStreamr   r   r   r   r   r   r   <module>   s   