a
    d>                     @   s   d dl Z d dlZd dlmZ d dlmZmZmZmZm	Z	m
Z
mZmZmZmZ d dlmZ ddlmZ ertddlmZ z(d dlmZ d d	lmZ d d
lmZ W n* ey   ede jd e d Y n0 G dd deZdS )    N)zip_longest)
TYPE_CHECKINGAnyCallableDict	GeneratorListOptionalSetTupleUnion)TerminalNode   )InterpolationResolutionError)Node)OmegaConfGrammarLexer)OmegaConfGrammarParser)OmegaConfGrammarParserVisitorzYError importing OmegaConf's generated parsers, run `python setup.py antlr` to regenerate.)filec                       s   e Zd Zeeeee  ged f edef eee  e	eef d fddZ
ee eee dddZee d	d
dZejedddZejedddZejedddZeje	eef dddZejedddZejedddZejed dddZejedddZeje eef dddZ!ej"ee ddd Z#ej$edd!d"Z%ej&edd#d$Z'ej(edd%d&Z)ej*e+ed'd'f dd(d)Z,ej-edd*d+Z.ej/edd,d-Z0e1ej$ejf edd.d/Z2ee1e3ejf  ed0d1d2Z4  Z5S )3GrammarVisitorr   .)node_interpolation_callbackresolver_interpolation_callbackmemokwc                    s(   t  jf i | || _|| _|| _dS )a  
        Constructor.

        :param node_interpolation_callback: Callback function that is called when
            needing to resolve a node interpolation. This function should take a single
            string input which is the key's dot path (ex: `"foo.bar"`).

        :param resolver_interpolation_callback: Callback function that is called when
            needing to resolve a resolver interpolation. This function should accept
            three keyword arguments: `name` (str, the name of the resolver),
            `args` (tuple, the inputs to the resolver), and `args_str` (tuple,
            the string representation of the inputs to the resolver).

        :param kw: Additional keyword arguments to be forwarded to parent class.
        N)super__init__r   r   r   )selfr   r   r   r   	__class__ b/var/www/html/stable-diffusion-webui/venv/lib/python3.9/site-packages/omegaconf/grammar_visitor.pyr   (   s    zGrammarVisitor.__init__)	aggregate
nextResultreturnc                 C   s   t d S NNotImplementedError)r   r!   r"   r   r   r    aggregateResultF   s    zGrammarVisitor.aggregateResultr#   c                 C   s   t d S r$   r%   )r   r   r   r    defaultResultI   s    zGrammarVisitor.defaultResult)ctxr#   c              	   C   s   ddl m} | dksJ |d}t|tjrv|| |}t|tsrt	d| dt
| d|d  |S t|trt|jjtsJ |jjS d S )Nr   
_get_valuer   zrThe following interpolation is used to denote a config key and thus should return a string, but instead returned `z` of type `z`: )_utilsr,   getChildCountgetChild
isinstancer   InterpolationContextvisitInterpolationstrr   typegetTextr   symboltext)r   r*   r,   childresr   r   r    visitConfigKeyM   s(    

zGrammarVisitor.visitConfigKeyc                 C   s    |  dksJ | |dS N   r   r.   visitr/   r   r*   r   r   r    visitConfigValueb   s    zGrammarVisitor.visitConfigValuec                 C   s
   |  |S r$   _createPrimitiver?   r   r   r    visitDictKeyg   s    zGrammarVisitor.visitDictKeyc                    s8      dksJ t fddtd   d dD S )Nr<   c                 3   s   | ]}  |V  qd S r$   )visitDictKeyValuePairr/   ).0ir*   r   r   r    	<genexpr>o   s   z4GrammarVisitor.visitDictContainer.<locals>.<genexpr>r   )r.   dictranger?   r   rG   r    visitDictContainerj   s    z!GrammarVisitor.visitDictContainerc                 C   s    |  dksJ | |dS Nr   r   r=   r?   r   r   r    visitElementt   s    zGrammarVisitor.visitElementc                 C   s    |  dksJ | |dS rL   r=   r?   r   r   r    r2   y   s    z!GrammarVisitor.visitInterpolationc                 C   s   |  dksJ g }| D ]p}t|trl|j}|jtjtjtj	fv rT|
|j q|jtjtjfv sJ qt|tjs|J |
| | qd|}| || jS )N    )r.   getChildrenr0   r   r6   r4   r   DOTZBRACKET_OPENZBRACKET_CLOSEappendr7   Z
INTER_OPENZINTER_CLOSEr   ConfigKeyContextr:   joinr   r   )r   r*   Zinter_key_tokensr8   sZ	inter_keyr   r   r    visitInterpolationNode   s&    	

z%GrammarVisitor.visitInterpolationNodec                 C   s   d|    krdksn J | |d}|d}g }g }t|tr^|jjtjksJ n8t|t	j
snJ | |D ]\}}|| || qx| j|t|t|dS )N      r   rN   )nameargsargs_str)r.   r>   r/   r0   r   r6   r4   r   ZBRACE_CLOSEr   SequenceContextvisitSequencerR   r   tuple)r   r*   Zresolver_nameZ	maybe_seqrZ   r[   valtxtr   r   r    visitInterpolationResolver   s     


z)GrammarVisitor.visitInterpolationResolverc                 C   sn   ddl m} | dksJ | |d}|d}t|trN|jjt	j
ksRJ || |d}||fS )Nr   r+   rN   r   r<   )r-   r,   r.   r>   r/   r0   r   r6   r4   r   COLONrM   )r   r*   r,   keycolonvaluer   r   r    rD      s    
z$GrammarVisitor.visitDictKeyValuePairc                 C   sR   |  dv sJ |  dkr g S |d}t|tjs:J tdd | |D S )Nr<   rN   r<   r   c                 s   s   | ]\}}|V  qd S r$   r   )rE   r_   _r   r   r    rH          z4GrammarVisitor.visitListContainer.<locals>.<genexpr>)r.   r/   r0   r   r\   listr]   )r   r*   sequencer   r   r    visitListContainer   s    
z!GrammarVisitor.visitListContainerc                 C   s
   |  |S r$   rA   r?   r   r   r    visitPrimitive   s    zGrammarVisitor.visitPrimitivec                 C   s4   |  }|dv sJ |dkr0t| |dS dS )Nrf   rN   r   rO   )r.   r3   r>   r/   )r   r*   nr   r   r    visitQuotedValue   s    zGrammarVisitor.visitQuotedValuec              	   C   s   ddl m} | dksJ g }t| d d d D ]}t|trf|jjt	j
ksVJ ||jj q6t|tjsvJ || |}t|tstd|  d| dt| || q6d|S )Nr   r+   r<   z?The name of a resolver must be a string, but the interpolation z resolved to `z` which is of type .)r-   r,   r.   ri   rP   r0   r   r6   r4   r   IDrR   r7   r   r1   r2   r3   r   r5   rT   )r   r*   r,   itemsr8   itemr   r   r    visitResolverName   s*    

z GrammarVisitor.visitResolverNameNc                 #   s   ddl m}   dksJ d d fdd}d}  D ]`}t|tjrh|| || fV  d}q:t|t	r|j
jtjksJ |r|  dV  q:d}q:|r|  dV  d S )	Nr   r+   r(   c                     s"      } tjd|  dtd d S )NzIn the sequence `z` some elements are missing: please replace them with empty quoted strings. See https://github.com/omry/omegaconf/issues/572 for details.)category)r5   warningswarnUserWarning)r`   r*   r   r    empty_str_warning   s
    
z7GrammarVisitor.visitSequence.<locals>.empty_str_warningTF)rO   rO   )r-   r,   r.   rP   r0   r   ElementContextrM   r5   r   r6   r4   r   COMMA)r   r*   r,   ry   Zis_previous_commar8   r   rx   r    r]      s&    	zGrammarVisitor.visitSequencec                 C   s    |  dksJ | |dS r;   r=   r?   r   r   r    visitSingleElement  s    z!GrammarVisitor.visitSingleElementc                 C   s>   |  dkr,|d}t|tjr,| |S | t| S rL   )	r.   r/   r0   r   r1   r2   	_unescaperi   rP   )r   r*   cr   r   r    	visitText#  s
    

zGrammarVisitor.visitTextc                 C   s   |  dkr|d}t|tjr,| |S t|ts:J |j}|jt	j
t	jt	jfv r\|jS |jt	jkrld S |jt	jkrt|jS |jt	jkrt|jS |jt	jkr|j dkS |jt	jkr| |gS |jt	jkrtddsJ |j| t| S )Nr   r   truezWS should never be reachedF)r.   r/   r0   r   r1   r2   r   r6   r4   r   rp   ZUNQUOTED_CHARrb   r7   ZNULLINTintFLOATfloatZBOOLlowerESCr}   ZWSAssertionErrorri   rP   )r   r*   r8   r6   r   r   r    rB   /  s4    



zGrammarVisitor._createPrimitive)seqr#   c                 C   s   g }t ||dd D ]\}}t|tr|j}|jtjkrZ|jt|jd d  d }q|jtj	ks|jtj
kr~t|tjs|jtjkr|du st|tjr|jddd }q|j}nt|tjsJ t| |}|| qd|S )a<  
        Concatenate all symbols / interpolations in `seq`, unescaping symbols as needed.

        Interpolations are resolved and cast to string *WITHOUT* escaping their result
        (it is assumed that whatever escaping is required was already handled during the
        resolving of the interpolation).
        r   Nr<   rO   )r   r0   r   r6   r4   r   Z	ESC_INTERr7   lenr   ZTOP_ESCr   r1   Z
QUOTED_ESCr3   r2   rR   rT   )r   r   ZchrsnodeZ	next_noderU   r7   r   r   r    r}   U  s8    
 


zGrammarVisitor._unescape)6__name__
__module____qualname__r   r3   r	   r
   r   r   r   r   r   r'   r)   r   rS   r:   ZConfigValueContextr@   ZDictKeyContextrC   ZDictContainerContextrK   rz   rM   r1   r2   ZInterpolationNodeContextrV   ZInterpolationResolverContextra   ZDictKeyValuePairContextr   rD   ZListContainerContextrk   ZPrimitiveContextrl   ZQuotedValueContextrn   ZResolverNameContextrs   r\   r   r]   ZSingleElementContextr|   ZTextContextr   r   rB   r   r}   __classcell__r   r   r   r    r   '   sj   




"
+(r   ) sysru   	itertoolsr   typingr   r   r   r   r   r   r	   r
   r   r   Zantlr4r   errorsr   baser   Z+omegaconf.grammar.gen.OmegaConfGrammarLexerr   Z,omegaconf.grammar.gen.OmegaConfGrammarParserr   Z3omegaconf.grammar.gen.OmegaConfGrammarParserVisitorr   ModuleNotFoundErrorprintstderrexitr   r   r   r   r    <module>   s$   0