a
    þdT(  ã                   @   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eed/œd0d1„Zd2d3„ ZG d4d5„ d5eƒZ G d6d7„ d7e ƒZ!G d8d9„ d9e!ƒ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__© úc/var/www/html/stable-diffusion-webui/venv/lib/python3.9/site-packages/antlr4/TokenStreamRewriter.pyr      s    zTokenStreamRewriter.__init__c                 C   s   | j S ©N)r   ©r   r   r   r   ÚgetTokenStream   s    z"TokenStreamRewriter.getTokenStreamc                 C   s*   | j  |d ¡}|r&|| j|… | j |< d S r   )r   ÚgetÚMIN_TOKEN_INDEX)r   Z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*   s    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   s    z%TokenStreamRewriter.insertBeforeIndexc                 C   s   |   ||j|¡ d S r   )r,   r   r   r   r   r   ÚinsertBeforeToken6   s    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   r-   r   r   r   ÚreplaceIndex?   s    z TokenStreamRewriter.replaceIndexc                 C   s   |   | j|||¡ d S r   r1   )r   Úfrom_idxÚto_idxr    r   r   r   ÚreplaceRangeB   s    z TokenStreamRewriter.replaceRangec                 C   s   |   | j|j|j|¡ d S r   )r2   r   r   )r   r   r    r   r   r   ÚreplaceSingleTokenE   s    z&TokenStreamRewriter.replaceSingleTokenc                 C   s   |   ||j|j|¡ d S r   )r2   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ƒrBtd ||t| jjƒ¡ƒ‚|  ||| j|¡}|  |¡}t|ƒ|_| |¡ d S )Nr   z'replace: range invalid: {}..{}(size={}))	Úanyr&   r   Ú
ValueErrorÚformatÚ	ReplaceOpr%   r'   r(   )r   r   r4   r5   r    r*   r+   r   r   r   r2   K   s    (ÿ

zTokenStreamRewriter.replacec                 C   s   |   | j||¡ d S r   ©Údeleter   )r   r   r   r   r   ÚdeleteTokenT   s    zTokenStreamRewriter.deleteTokenc                 C   s   |   | j||¡ d S r   r=   )r   r)   r   r   r   ÚdeleteIndexW   s    zTokenStreamRewriter.deleteIndexc                 C   s4   t |tƒr |  ||j|jd¡ n|  |||d¡ d S )NÚ )Ú
isinstancer   r2   r   )r   r   r4   r5   r   r   r   r>   Z   s    
zTokenStreamRewriter.deletec                 C   s   | j  |d¡S )Néÿÿÿÿ)r   r   r   r   r   r   ÚlastRewriteTokenIndex`   s    z)TokenStreamRewriter.lastRewriteTokenIndexc                 C   s   || j |< d S r   )r   )r   r   Úir   r   r   ÚsetLastRewriteTokenIndexc   s    z,TokenStreamRewriter.setLastRewriteTokenIndexc                 C   s   | j  |g ¡S r   )r   Ú
setdefaultr   r   r   r   r%   f   s    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   s  | j  |¡}|t| jjƒd kr0t| jjƒd }|dk r<d}|sN| j ||¡S tƒ }|  |¡}|}t||k|t| jjƒk fƒrÌ| |d¡}| j |¡}	|du rÀ|	j	t
jkr¶| |	j¡ |d7 }qb| |¡}qb|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   rH   r   Ú _reduceToSingleOperationPerIndexÚallÚpopÚtyper   ÚEOFÚwriter    ÚexecuteÚvaluesr)   Úgetvalue)
r   r   rJ   rK   r+   ÚbufZ	indexToOprE   r*   r   r   r   r   rH   l   s(    

$zTokenStreamRewriter.getTextc                 C   sþ  t |ƒD ]d\}}t|d u t|tjƒ fƒr.qdd„ |d |… D ƒ}|D ]T}|j|jkrvd ||j< d |j|j¡|_qHt	|j|jk|j|j
kfƒrHd ||j< qHdd„ |d |… D ƒ}|D ]´}t	|j|jk|j
|j
kfƒräd ||j< q¸t|j
|jk |j|j
kfƒ}t	|jd u |jd u | fƒrXd ||j< t|j|jƒ|_t|j
|j
ƒ|_
td |¡ƒ q¸|s¸td ||¡ƒ‚q¸qt |ƒD ]8\}}t|d u t|tjƒ fƒr¢qxdd„ |d |… D ƒ}	t |	ƒD ]v\}
}|j|jkr t|ƒtju r | j|j7  _d ||
< n4|j|jkrÀt|ƒtju rÀ|j|j |_d ||
< qÀdd„ |d |… D ƒ}|D ]\}|j|jkr~|j|j |_d ||< qRt	|j|jk|j|j
kfƒrRtd	 ||¡ƒ‚qRqxi }t |ƒD ]8\}}|d u rÖqÀ| |j¡rìtd
ƒ‚|||j< qÀ|S )Nc                 S   s   g | ]}t |tjƒr|‘qS r   ©rB   r   r0   ©Ú.0r*   r   r   r   Ú
<listcomp>’   ó    zHTokenStreamRewriter._reduceToSingleOperationPerIndex.<locals>.<listcomp>z{}{}c                 S   s   g | ]}t |tjƒr|‘qS r   ©rB   r   r<   rW   r   r   r   rY   ›   rZ   z
New rop {}z4replace op boundaries of {} overlap with previous {}c                 S   s   g | ]}t |tjƒr|‘qS r   rV   rW   r   r   r   rY   ­   rZ   c                 S   s   g | ]}t |tjƒr|‘qS r   r[   rW   r   r   r   rY   ¶   rZ   z-insert op {} within boundaries of previous {}zshould be only one op per index)Ú	enumerater9   rB   r   r<   r)   r'   r;   r    rM   Ú
last_indexÚminÚprintr:   r0   rO   r$   r   )r   r+   rE   ZropÚinsertsZiopZprevReplacesZprevRopZ
isDisjointZprevInsertsZ
prev_indexZprevIopZreducedr*   r   r   r   rL   Œ   s`    



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'   rA   c                 C   s   || _ || _|| _d| _dS )zœ
            :type tokens: CommonTokenStream
            :param tokens:
            :param index:
            :param text:
            :return:
            r   Nra   ©r   r   r)   r    r   r   r   r   Ê   s    z-TokenStreamRewriter.RewriteOperation.__init__c                 C   s   | j S )zc
            :type buf: StringIO.StringIO
            :param buf:
            :return:
            )r)   ©r   rU   r   r   r   rR   ×   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)rA   )rd   Ú
__module__Ú__qualname__Ú	__slots__r   rR   re   r   r   r   r   ÚRewriteOperationÇ   s   
ri   c                       s&   e Zd Zd‡ fdd„	Zdd„ Z‡  ZS )z"TokenStreamRewriter.InsertBeforeOprA   c                    s   t tj| ƒ |||¡ d S r   )r   r   r0   r   rb   r   r   r   r   ä   s    z+TokenStreamRewriter.InsertBeforeOp.__init__c                 C   sB   |  | j¡ | j | j¡jtjkr8|  | j | j¡j¡ | jd S r"   )rQ   r    r   r   r)   rO   r   rP   rc   r   r   r   rR   ç   s    z*TokenStreamRewriter.InsertBeforeOp.execute)rA   )rd   rf   rg   r   rR   Ú__classcell__r   r   r   r   r0   â   s   r0   c                   @   s   e Zd ZdS )z!TokenStreamRewriter.InsertAfterOpN)rd   rf   rg   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.ReplaceOpr]   c                    s    t tj| ƒ |||¡ || _d S r   )r   r   r<   r   r]   )r   r4   r5   r   r    r   r   r   r   ó   s    z&TokenStreamRewriter.ReplaceOp.__init__c                 C   s   | j r| | j ¡ | jd S r"   )r    rQ   r]   rc   r   r   r   rR   ÷   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)   r]   r   r   r   r   re   ü   s    ÿz%TokenStreamRewriter.ReplaceOp.__str__)rd   rf   rg   rh   r   rR   re   rj   r   r   r   r   r<   ð   s   r<   )%rd   rf   rg   rh   r   ZPROGRAM_INIT_SIZEr   r   r   r   r   r!   r   r.   r/   r,   r3   r6   r7   r8   r2   r?   r@   r>   rD   rF   r%   rI   ÚintrH   rL   Úobjectri   r0   r$   r<   rj   r   r   r   r   r      s>   	 ;r   N)Úior   Zantlr4.Tokenr   Zantlr4.CommonTokenStreamr   rl   r   r   r   r   r   Ú<module>   s   