o
    9n0jT(  ã                   @   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__© úa/home/wildlama/miniconda3/envs/lam_a2e/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_nameZ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   )r/   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   r/   9   s   

z TokenStreamRewriter.insertBeforec                 C   s   |   | j|||¡ d S r   ©Úreplacer   r0   r   r   r   ÚreplaceIndex?   ó   z TokenStreamRewriter.replaceIndexc                 C   s   |   | j|||¡ d S r   r4   )r   Úfrom_idxÚto_idxr"   r   r   r   ÚreplaceRangeB   r7   z TokenStreamRewriter.replaceRangec                 C   s   |   | j|j|j|¡ d S r   )r5   r   r   )r   r!   r"   r   r   r   ÚreplaceSingleTokenE   ó   z&TokenStreamRewriter.replaceSingleTokenc                 C   s   |   ||j|j|¡ d S r   )r5   r   )r   Z
from_tokenZ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   r8   r9   r"   r-   r.   r   r   r   r5   K   s   (ÿ

zTokenStreamRewriter.replacec                 C   ó   |   | j||¡ d S r   ©Údeleter   )r   r!   r   r   r   ÚdeleteTokenT   r$   zTokenStreamRewriter.deleteTokenc                 C   rB   r   rC   )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   r5   r   )r   r   r8   r9   r   r   r   rD   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   rK   z,TokenStreamRewriter.setLastRewriteTokenIndexc                 C   s   | j  |g ¡S r   )r   Ú
setdefaultr   r   r   r   r(   f   rK   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   rO   r   Ú _reduceToSingleOperationPerIndexÚallÚpopÚtyper   ÚEOFÚwriter"   ÚexecuteÚvaluesr,   Úgetvalue)
r   r   rQ   rR   r.   ÚbufZ	indexToOprL   r-   r!   r   r   r   rO   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   ©rH   r   r3   ©Ú.0r-   r   r   r   Ú
<listcomp>’   ó    zHTokenStreamRewriter._reduceToSingleOperationPerIndex.<locals>.<listcomp>z{}{}c                 S   r]   r   ©rH   r   rA   r_   r   r   r   ra   ›   rb   z
New rop {}z4replace op boundaries of {} overlap with previous {}c                 S   r]   r   r^   r_   r   r   r   ra   ­   rb   c                 S   r]   r   rc   r_   r   r   r   ra   ¶   rb   z-insert op {} within boundaries of previous {}zshould be only one op per index)Ú	enumerater>   rH   r   rA   r,   r*   r@   r"   rT   Ú
last_indexÚminÚprintr?   r3   rV   r'   r   )r   r.   rL   ZropÚinsertsZiopZprevReplacesZprevRopZ
isDisjointZprevInsertsZ
prev_indexZprevIopZreducedr-   r   r   r   rS   Œ   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*   rG   c                 C   s   || _ || _|| _d| _dS )zœ
            :type tokens: CommonTokenStream
            :param tokens:
            :param index:
            :param text:
            :return:
            r   Nri   ©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   rY   ×   s   z,TokenStreamRewriter.RewriteOperation.executec                 C   s   d  | jj| j | j¡| j¡S )Nz<{}@{}:"{}">)r@   r   Ú__name__r   r   r,   r"   r   r   r   r   Ú__str__ß   s   z,TokenStreamRewriter.RewriteOperation.__str__N©rG   )rl   Ú
__module__Ú__qualname__Ú	__slots__r   rY   rm   r   r   r   r   ÚRewriteOperationÇ   s
    
rr   c                       s&   e Zd Zd‡ fdd„	Zdd„ Z‡  ZS )z"TokenStreamRewriter.InsertBeforeOprG   c                    s   t tj| ƒ |||¡ d S r   )r   r   r3   r   rj   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%   )rX   r"   r   r   r,   rV   r   rW   rk   r   r   r   rY   ç   s   
z*TokenStreamRewriter.InsertBeforeOp.executern   )rl   ro   rp   r   rY   Ú__classcell__r   r   r   r   r3   â   s    r3   c                   @   s   e Zd ZdS )z!TokenStreamRewriter.InsertAfterOpN)rl   ro   rp   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.ReplaceOpre   c                    s    t tj| ƒ |||¡ || _d S r   )r   r   rA   r   re   )r   r8   r9   r   r"   r   r   r   r   ó   s   
z&TokenStreamRewriter.ReplaceOp.__init__c                 C   s   | j r	| | j ¡ | jd S r%   )r"   rX   re   rk   r   r   r   rY   ÷   s   
z%TokenStreamRewriter.ReplaceOp.executec                 C   s.   | j rd | j | j¡| j | j¡| j ¡S d S )Nz<ReplaceOp@{}..{}:"{}">)r"   r@   r   r   r,   re   r   r   r   r   rm   ü   s
   ÿÿz%TokenStreamRewriter.ReplaceOp.__str__)rl   ro   rp   rq   r   rY   rm   rs   r   r   r   r   rA   ð   s
    rA   )%rl   ro   rp   rq   r   ZPROGRAM_INIT_SIZEr   r   r   r   r   r#   r   r1   r2   r/   r6   r:   r;   r=   r5   rE   rF   rD   rJ   rM   r(   rP   ÚintrO   rS   Úobjectrr   r3   r'   rA   rs   r   r   r   r   r      s@    	 ;r   N)Úior   Zantlr4.Tokenr   Zantlr4.CommonTokenStreamr   ru   r   r   r   r   r   Ú<module>   s   