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Údefaultéd   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__© úP/home/ubuntu/vllm_env/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ƒrªd ||j< t|j|jƒ|_t|j
|j
ƒ|_
td |¡ƒ q[|s´td ||¡ƒ‚q[qt |ƒD ]–\}}t|d u t|tjƒ fƒrÌqºdd„ |d |… D ƒ}	t |	ƒD ]8\}
}|j|jkrùt|ƒtju rù| j|j7  _d ||
< qÛ|j|jkrt|ƒtju r|j|j |_d ||
< qÛdd„ |d |… D ƒ}|D ].}|j|jkr7|j|j |_d ||< q!t	|j|jk|j|j
kfƒrNtd	 ||¡ƒ‚q!qºi }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   