
    =(                         d Z ddlZddlZddlmZ ddlmZmZmZ ddl	m
Z
 ddlmZmZmZmZ  ej                   dej"                        Z ej                   dej"                        Zd	Zd
Z edd      Z G d de      Zy)zHA Lark Transformer for transforming a Lark parse tree into a Python dict    N)
namedtuple)ListDictAny)Meta)TransformerDiscard_DiscardTypev_argsz(<<([a-zA-Z][a-zA-Z0-9._-]+)\n([\s\S]*)\1z)<<-([a-zA-Z][a-zA-Z0-9._-]+)\n([\s\S]*)\1__start_line____end_line__	Attribute)keyvaluec                       e Zd ZU dZeed<   d/def fdZdedefdZ	dede
fdZdedefdZdedefd	Zdedefd
ZdedefdZdedefdZdedefdZdedefdZdedefdZdedefdZdedefdZdedefdZdedefdZdedefdZdedefdZdedefdZ ed      de dedefd       Z!dede"fdZ#dedefdZ$dedefdZ%dedefdZ&dedefdZ'dedeeef   fd Z(dedefd!Z)dedefd"Z*dedefd#Z+dedefd$Z,dedefd%Z-dedefd&Z.dedefd'Z/dedefd(Z0dedefd)Z1dedefd*Z2d+edefd,Z3d+edefd-Z4d+edefd.Z5 xZ6S )0DictTransformerzQTakes a syntax tree generated by the parser and
    transforms it to a dict.
    	with_metac                 0    || _         t        | 	          y)z
        :param with_meta: If set to true then adds `__start_line__` and `__end_line__`
        parameters to the output dict. Default to false.
        N)r   super__init__)selfr   	__class__s     #lib/third_party/hcl2/transformer.pyr   zDictTransformer.__init__   s    
 #    argsreturnc           
      n    t        dj                  |D cg c]  }t        |       c}            S c c}w N )floatjoinstrr   r   args      r   	float_litzDictTransformer.float_lit&   s,    RWW$7$3c#h$78997   2c           
      n    t        dj                  |D cg c]  }t        |       c}            S c c}w r   )intr!   r"   r#   s      r   int_litzDictTransformer.int_lit)   s,    2775CH56775r&   c                 ~    | j                  |      }|d   dk(  ry|d   dk(  ry|d   dk(  ry |d   dk(  r|d   S |d   S )	Nr   trueTfalseFnull(   strip_new_line_tokensr   r   s     r   	expr_termzDictTransformer.expr_term,   s`    ))$/ 7f7g7f 7c>7NAwr   c                 <    | j                  |      }|d    |d    S Nr   r/   r0   r2   s     r   index_expr_termzDictTransformer.index_expr_term=   s)    ))$/q'47)$$r   c                 6    | j                  |      }d|d    dS )N[r   ]r0   r2   s     r   indexzDictTransformer.indexA   s$    ))$/47)1~r   c                     |d    |d    S r5    r2   s     r   get_attr_expr_termz"DictTransformer.get_attr_expr_termE       q'47)$$r   c                     d|d    S )N.r   r<   r2   s     r   get_attrzDictTransformer.get_attrH   s    47)}r   c                     |d    |d    S r5   r<   r2   s     r   attr_splat_expr_termz$DictTransformer.attr_splat_expr_termK   r>   r   c                 <    dj                  d |D              }d| S )Nr   c              3   2   K   | ]  }t        |        y wNr"   .0r$   s     r   	<genexpr>z-DictTransformer.attr_splat.<locals>.<genexpr>O        4t3s8t   z.*r!   r   r   args_strs      r   
attr_splatzDictTransformer.attr_splatN   s"    774t44H:r   c                     |d    |d    S r5   r<   r2   s     r   full_splat_expr_termz$DictTransformer.full_splat_expr_termR   r>   r   c                 <    dj                  d |D              }d| S )Nr   c              3   2   K   | ]  }t        |        y wrF   rG   rH   s     r   rJ   z-DictTransformer.full_splat.<locals>.<genexpr>V   rK   rL   z[*]rM   rN   s      r   
full_splatzDictTransformer.full_splatU   s#    774t44XJr   c                 h    | j                  |      D cg c]  }| j                  |       c}S c c}w rF   )r1   to_string_dollarr#   s      r   tuplezDictTransformer.tupleY   s3    6:6P6PQU6VW6Vs%%c*6VWWWs   /c                 Z    | j                  |d         }| j                  |d         }||iS r5   )strip_quotesrW   r   r   r   r   s       r   object_elemzDictTransformer.object_elem\   s6     Q(%%d1g.U|r   c                 \    | j                  |      }i }|D ]  }|j                  |        |S rF   )r1   update)r   r   resultr$   s       r   objectzDictTransformer.objectd   s2    ))$/!#CMM# r   c                     | j                  |      }d}t        |      dkD  r4dj                  |d   D cg c]  }|t        ust	        |       c}      }|d    d| dS c c}w )Nr   r/   z, r   r.   ))r1   lenr!   r	   r"   )r   r   rO   r$   s       r   function_callzDictTransformer.function_callk   sk    ))$/t9q=yyd1g!TgsGAS#c(g!TUHq'!H:Q'' "Us   A!A!c                     |S rF   r<   r2   s     r   	argumentszDictTransformer.argumentsr   s    r   c                     t         S rF   r	   r2   s     r   new_line_and_or_commaz%DictTransformer.new_line_and_or_commau       r   T)metark   c                     |^ }}|}| j                   r1|j                  t        |j                  t        |j
                  i       t        |      D ]  }| j                  |      }||i} |S rF   )r   r^   
START_LINElineEND_LINEend_linereversedrZ   )r   rk   r   block_labels
block_bodyr_   label	label_strs           r   blockzDictTransformer.blockx   sm    $(!z!+>>MM		dmm l+E))%0I(F , r   c                     t        |d         }|j                  d      r|j                  d      r|dd }| j                  |d         }t	        ||      S )Nr   "r/   )r"   
startswithendswithrW   r   r[   s       r   	attributezDictTransformer.attribute   sR    $q'l>>#3<<#4a)C%%d1g.e$$r   c                 J    | j                  |      }|d    d|d    d|d    S )Nr   z ? r/   z :    r0   r2   s     r   conditionalzDictTransformer.conditional   s5    ))$/q'#d1gYc$q'33r   c                 \    dj                  |D cg c]  }t        |       c}      S c c}w N r!   r"   r#   s      r   	binary_opzDictTransformer.binary_op   s'    xxT2TcST2332   )c                 \    dj                  |D cg c]  }t        |       c}      S c c}w r   r   r#   s      r   unary_opzDictTransformer.unary_op   s'    wwD1DSCD1221r   c                 ~    | j                  |      }dj                  |D cg c]  }t        |       c}      S c c}w r   r1   r!   r"   r#   s      r   binary_termzDictTransformer.binary_term   7    ))$/xxT2TcST2332   :c                    | j                  |      }t               }i }|D ]  }t        |t              r[|j                  |v rt        |j                   d      |j                  ||j                  <   |j                  |j                         n|j                         D ]A  \  }}t        |      }||v r'||v rt        | d      ||   j                  |       <|g||<   C  |S )Nz already defined)r1   set
isinstancer   r   RuntimeErrorr   additemsr"   append)r   r   
attributesr_   r$   r   r   s          r   bodyzDictTransformer.body   s    " ))$/U
!#C#y)77f$&#''2B'CDD"%))swwsww' #&))+JCc(Cf}*,".#6F/G"HHs**51',gs #. " r   c                 .    | j                  |      }|d   S Nr   r0   r2   s     r   startzDictTransformer.start   s    ))$/Awr   c                     t        |d         S r   rG   r2   s     r   binary_operatorzDictTransformer.binary_operator   s    47|r   c                     t         j                  t        |d               }|st        d|d          d}d|j	                  d      j                  |       dS )Nr   Invalid Heredoc token: 
	 rx   r~   )HEREDOC_PATTERNmatchr"   r   grouprstrip)r   r   r   
trim_charss       r   heredoc_templatez DictTransformer.heredoc_template   s\    %%c$q'l3!8a	BCC
5;;q>((45Q77r   c                    t         j                  t        |d               }|st        d|d          d}|j	                  d      j                  |      }|j                  d      }t        j                  }|D ]4  }t        |      t        |j                  d            z
  }t        ||      }6 |D cg c]  }||d  	 }}ddj                  |      z  S c c}w )Nr   r   r   r~   
r   z"%s")HEREDOC_TRIM_PATTERNr   r"   r   r   r   splitsysmaxsizerc   lstripminr!   )	r   r   r   r   textlines
min_spacesrn   leading_spacess	            r   heredoc_template_trimz%DictTransformer.heredoc_template_trim   s    
 %**3tAw<8!8a	BCC
{{1~$$Z0

4  [[
D YT[[-=)>>NZ8J 
 055utjk"u5		%((( 6s   5Cc                     t         S rF   rh   r2   s     r   new_line_or_commentz#DictTransformer.new_line_or_comment   rj   r   c                     | j                  |      }dj                  |dd D cg c]  }t        |       c}      }d| dS c c}w )Nr   r/   ry   r8   r9   r   r   r   r$   for_exprs       r   for_tuple_exprzDictTransformer.for_tuple_expr   sL    ))$/88a<#SX<=8*A =   Ac                 ~    | j                  |      }dj                  |D cg c]  }t        |       c}      S c c}w r   r   r#   s      r   	for_introzDictTransformer.for_intro   r   r   c                 ~    | j                  |      }dj                  |D cg c]  }t        |       c}      S c c}w r   r   r#   s      r   for_condzDictTransformer.for_cond   r   r   c                     | j                  |      }dj                  |dd D cg c]  }t        |       c}      }d| dS c c}w )Nr   r/   ry   {}r   r   s       r   for_object_exprzDictTransformer.for_object_expr   sO    ))$/88a<#SX<= H:R  	 =r   c                 J    |D cg c]  }|dk7  s	|t         us| c}S c c}w )z
        Remove new line and Discard tokens.
        The parser will sometimes include these in the tree so we need to strip them out here
        r   rh   r#   s      r   r1   z%DictTransformer.strip_new_line_tokens  s)    
  $Jtsd{s'7ItJJJs   
   r   c                     t        |t              r6|j                  d      r|j                  d      rt        |      dd S d| dS |S )zWrap a string in ${ and }rx   r/   ry   z${r   r   r"   rz   r{   r   r   s     r   rW   z DictTransformer.to_string_dollar  sI    eS!$)<5z!B''r?"r   c                     t        |t              r0|j                  d      r|j                  d      rt        |      dd S |S )z:Remove quote characters from the start and end of a stringrx   r/   ry   r   r   s     r   rZ   zDictTransformer.strip_quotes  s;    eS!$)<5z!B''r   c                     t        |d         S r   rG   r   s     r   
identifierzDictTransformer.identifier  s    
 58}r   )F)7__name__
__module____qualname____doc__bool__annotations__r   r   r    r%   r(   r)   r   r3   r"   r6   r:   r=   rA   rC   rP   rR   rU   rX   r   r\   r`   rd   rf   r
   ri   r   r   rv   r   r|   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r1   rW   rZ   r   __classcell__)r   s   @r   r   r      s    O$ :d :u :8D 8S 8d s "%D %S %$ 3 %t % %T c % %# %t  % %# % t    X$ X4 X  4 D ($ (3 (d t $ <  $ d t  $%d %y %4 4 44d 4s 43T 3c 34 4 4% %$sDy/ %N$ 4 D S 8T 8c 8)$ )3 )0  4 C 
4d 4s 44T 4c 4!D !S !K$ K4 Kc c # #   r   r   )r   rer   collectionsr   typingr   r   r   	lark.treer   lark.visitorsr   r	   r
   r   compileSr   r   rm   ro   r   r   r<   r   r   <module>r      s}    N 	 
 " " "  D D "**H"$$O!rzz"NPRPTPTU  
 {$45	Jk Jr   