o
    ٷi>                     @   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r:ddlmZ zd dlmZ d d	lmZ d d
lmZ W n eyc   ede jd e d Y nw 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deeeee  ged f dedef deee  de	eef f fddZ
d	ee d
edee fddZdee fddZdejdefddZdejdefddZdejdefddZdejde	eef fddZdejdefddZdejdefddZdejded fddZdejdefdd Zdejde eef fd!d"Z!dej"dee fd#d$Z#dej$defd%d&Z%dej&defd'd(Z'dej(defd)d*Z)dej*de+ed+d+f fd,d-Z,dej-defd.d/Z.dej/defd0d1Z0de1ej$ejf defd2d3Z2d4ee1e3ejf  defd5d6Z4  Z5S )7GrammarVisitornode_interpolation_callbackr   resolver_interpolation_callback.memokwc                    s(   t  jd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__r   M/home/ubuntu/.local/lib/python3.10/site-packages/omegaconf/grammar_visitor.pyr   (   s   
zGrammarVisitor.__init__	aggregate
nextResultreturnc                 C      t NNotImplementedError)r   r!   r"   r   r   r    aggregateResultF   s   zGrammarVisitor.aggregateResultc                 C   r$   r%   r&   )r   r   r   r    defaultResultI   s   zGrammarVisitor.defaultResultctxc              	   C   s   ddl m} | dksJ |d}t|tjr;|| |}t|ts9t	d| dt
| d|d  |S t|trGt|jjtsIJ |jj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       |  dksJ | |dS N   r   r.   visitr/   r   r*   r   r   r    visitConfigValueb      zGrammarVisitor.visitConfigValuec                 C   
   |  |S r%   _createPrimitiver@   r   r   r    visitDictKeyg      
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   rK   r    visitDictContainerj   s   z!GrammarVisitor.visitDictContainerc                 C   r;   Nr   r   r>   r@   r   r   r    visitElementt   rB   zGrammarVisitor.visitElementc                 C   r;   rP   r>   r@   r   r   r    r2   y   s   z!GrammarVisitor.visitInterpolationc                 C   s   |  dksJ g }| D ]8}t|tr6|j}|jtjtjtj	fv r*|
|j q|jtjtjfv s5J qt|tjs>J |
| | qd|}| || jS )N    )r.   getChildrenr0   r   r6   r4   r   DOTBRACKET_OPENBRACKET_CLOSEappendr7   
INTER_OPENINTER_CLOSEr   ConfigKeyContextr:   joinr   r   )r   r*   inter_key_tokensr8   s	inter_keyr   r   r    visitInterpolationNode   s&   	

z%GrammarVisitor.visitInterpolationNodec                 C   s   d|    krdksJ  J | |d}|d}g }g }t|tr0|jjtjks/J nt|t	j
s8J | |D ]\}}|| || q=| j|t|t|dS )N      r   rR   )nameargsargs_str)r.   r?   r/   r0   r   r6   r4   r   BRACE_CLOSEr   SequenceContextvisitSequencerX   r   tuple)r   r*   resolver_name	maybe_seqrd   re   valtxtr   r   r    visitInterpolationResolver   s     


z)GrammarVisitor.visitInterpolationResolverc                 C   sn   ddl m} | dksJ | |d}|d}t|tr'|jjt	j
ks)J || |d}||fS )Nr   r+   rR   r   r=   )r-   r,   r.   r?   r/   r0   r   r6   r4   r   COLONrQ   )r   r*   r,   keycolonvaluer   r   r    rH      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=   rR   r=   r   c                 s   s    | ]\}}|V  qd S r%   r   )rI   rl   _r   r   r    rL      s    z4GrammarVisitor.visitListContainer.<locals>.<genexpr>)r.   r/   r0   r   rg   listrh   )r   r*   sequencer   r   r    visitListContainer   s   
z!GrammarVisitor.visitListContainerc                 C   rC   r%   rD   r@   r   r   r    visitPrimitive   rG   zGrammarVisitor.visitPrimitivec                 C   s4   |  }|dv s
J |dkrt| |dS dS )Nrs   rR   r   rS   )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 ]B}t|tr3|jjt	j
ks+J ||jj qt|tjs;J || |}t|tsXtd|  d| dt| || qd|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.   ru   rT   r0   r   r6   r4   r   IDrX   r7   r   r1   r2   r3   r   r5   r\   )r   r*   r,   itemsr8   itemr   r   r    visitResolverName   s*   


z GrammarVisitor.visitResolverNameNc                 #   s    ddl m}   dksJ d	 fdd}d}  D ]0}t|tjr3|| || fV  d}qt|t	r?|j
jtjksAJ |rJ|  dV  qd}q|rW|  dV  d S 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)rm   r*   r   r    empty_str_warning   s
   

z7GrammarVisitor.visitSequence.<locals>.empty_str_warningTF)rS   rS   )r#   N)r-   r,   r.   rT   r0   r   ElementContextrQ   r5   r   r6   r4   r   COMMA)r   r*   r,   r   is_previous_commar8   r   r   r    rh      s(   	
zGrammarVisitor.visitSequencec                 C   r;   r<   r>   r@   r   r   r    visitSingleElement  s   z!GrammarVisitor.visitSingleElementc                 C   s>   |  dkr|d}t|tjr| |S | t| S rP   )	r.   r/   r0   r   r1   r2   	_unescaperu   rT   )r   r*   cr   r   r    	visitText#  s
   

zGrammarVisitor.visitTextc                 C   s   |  dkrt|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r6d S |jt	jkrAt|jS |jt	jkrLt|jS |jt	jkrY|j dkS |jt	jkre| |gS |jt	jkrotdJ |j| t| S )Nr   r   truezWS should never be reached)r.   r/   r0   r   r1   r2   r   r6   r4   r   r|   UNQUOTED_CHARro   r7   NULLINTintFLOATfloatBOOLlowerESCr   WSAssertionErrorru   rT   )r   r*   r8   r6   r   r   r    rE   /  s4   




zGrammarVisitor._createPrimitiveseqc                 C   s   g }t ||dd D ]e\}}t|tr\|j}|jtjkr-|jt|jd d  d }n>|jtj	ksO|jtj
kr?t|tjsO|jtjkrX|du sOt|tjrX|jddd }n|j}nt|tjsdJ 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=   rS   )r   r0   r   r6   r4   r   	ESC_INTERr7   lenr   TOP_ESCr   r1   
QUOTED_ESCr3   r2   rX   r\   )r   r   chrsnode	next_noder^   r7   r   r   r    r   U  s0   
 
zGrammarVisitor._unescape)6__name__
__module____qualname__r   r3   r	   r
   r   r   r   r   r   r(   r)   r   r[   r:   ConfigValueContextrA   DictKeyContextrF   DictContainerContextrO   r   rQ   r1   r2   InterpolationNodeContextr`   InterpolationResolverContextrn   DictKeyValuePairContextr   rH   ListContainerContextrw   PrimitiveContextrx   QuotedValueContextrz   ResolverNameContextr   rg   r   rh   SingleElementContextr   TextContextr   r   rE   r   r   __classcell__r   r   r   r    r   '   s    







!




*

&r   ) sysr   	itertoolsr   typingr   r   r   r   r   r   r	   r
   r   r   antlr4r   errorsr   baser   +omegaconf.grammar.gen.OmegaConfGrammarLexerr   ,omegaconf.grammar.gen.OmegaConfGrammarParserr   3omegaconf.grammar.gen.OmegaConfGrammarParserVisitorr   ModuleNotFoundErrorprintstderrexitr   r   r   r   r    <module>   s(    0