o
    uJAfI                  	   @  s  U d dl mZ d dlmZmZ d dlZd dlZd dlZd dlZ	ddl
mZ ddlmZ e	jrAd dlmZ ddlmZ e	jd	d
dZedejejB Zd{ddZG dd deZG dd deZe	deeeZeddG dd de	j e Z!G dd dZ"eG dd
 d
Z#edd G d!d" d"e#Z$edd G d#d$ d$e	j e e#Z%G d%d& d&e%e Z&G d'd( d(e%e Z'edd G d)d* d*e%e Z(G d+d, d,e%e Z)edd G d-d. d.e)Z*G d/d0 d0e*Z+edd G d1d2 d2e)Z,G d3d4 d4e,Z-G d5d6 d6e%Z.G d7d8 d8e%Z/G d9d: d:e%e Z0edd G d;d< d<e#Z1edd G d=d> d>e#Z2edd G d?d@ d@e#Z3G dAdB dBe#Z4edd G dCdD dDe#Z5G dEdF dFe5Z6G dGdH dHe5Z7edd G dIdJ dJe5Z8edd G dKdL dLe5Z9edd G dMdN dNe#Z:G dOdP dPe:Z;G dQdR dRe:Z<edd G dSdT dTe#Z=edd G dUdV dVe#Z>edd G dWdX dXe#Z?edd G dYdZ dZe#Z@edd G d[d\ d\e#ZAG d]d^ d^eAZBedd G d_d` d`e#ZCedd G dadb dbe#ZDedd G dcdd dde#ZEedd G dedf dfe#ZFedd G dgdh dhe#ZGedd G didj dje#ZHedd G dkdl dle#ZIe	jrFedm ZJdndodpdqdrdsdtdudvZKdweLdx< G dydz dzZMdS )|    )annotations)	dataclassfieldN   )MesonException)mlog)Literal)
AstVisitor	BaseNodeTBaseNode)bounda,  
    ( \\U[A-Fa-f0-9]{8}   # 8-digit hex escapes
    | \\u[A-Fa-f0-9]{4}   # 4-digit hex escapes
    | \\x[A-Fa-f0-9]{2}   # 2-digit hex escapes
    | \\[0-7]{1,3}        # Octal escapes
    | \\N\{[^}]+\}        # Unicode characters by name
    | \\[\\'abfnrtv]      # Single-character escapes
    )matchT.Match[str]returnstrc                 C  s   t | d dS )Nr   unicode_escape)codecsdecodegroupencode)r    r   7/usr/lib/python3.10/site-packages/mesonbuild/mparser.pydecode_match*   s   r   c                      s,   e Zd ZU dZded< d fddZ  ZS )ParseExceptionNzT.Optional[CodeBlockNode]asttextr   linelinenointcolnor   Nonec                   s&   t  t||| || _|| _d S N)super__init__r   	code_liner   r   )selfr   r   r   r   	__class__r   r   r#   1   s   
zParseException.__init__)
r   r   r   r   r   r   r   r   r   r    )__name__
__module____qualname__r   __annotations__r#   __classcell__r   r   r&   r   r   -   s   
 r   c                   @  s   e Zd ZdddZdS )BlockParseExceptionr   r   r   r   r   r   
start_linestart_linenostart_colnor   r    c                 C  sv   ||krt | d||dd| d|| d   nt | d||dd|  |||dd|  f  || _|| _d S )Nz{}
{}
{}z{}^{}^ _r   z0%s
%s
%s
For a block that started at %d,%d
%s
%sz%s^)r   r#   formatr   r   )r%   r   r   r   r   r.   r/   r0   r   r   r   r#   8   s
   0.	
zBlockParseException.__init__N)r   r   r   r   r   r   r   r   r.   r   r/   r   r0   r   r   r    )r(   r)   r*   r#   r   r   r   r   r-   7   s    r-   TV_TokenTypesF)eqc                   @  sP   e Zd ZU ded< ded< ded< ded< ded< ded	< d
ed< dddZdS )Tokenr   tidfilenamer   
line_startr   r   T.Tuple[int, int]bytespanr4   valueotherobjectr   boolc                 C  s.   t |tr
| j|kS t |tr| j|jkS tS r!   )
isinstancer   r7   r6   NotImplemented)r%   r=   r   r   r   __eq__d   s
   


zToken.__eq__N)r=   r>   r   r?   )r(   r)   r*   r+   rB   r   r   r   r   r6   Z   s   
 r6   c                   @  s*   e Zd ZdddZddd	ZdddZdS )Lexercoder   c                 C  s(  || _ h d| _dh| _dtjv | _| jr| jddh g dtdfdtd	tj	fd
tdfdtdfdtdfdtdfdtdfdtdtj	fdtdfdtdfdtdfdtdfdtdfd td!fd"td#fd$td%fd&td'fd(td)fd*td+fd,td-fd.td/fd0td1fd2td3fd4td5fd6td7fd8td9fd:td;fd<td=fd>td?fd@tdAfdBtdCfdDtdEfdFtdGfdHtdIf| _
d S )JN>   trueand
endforeachendifinelsecontinuenotforeachfalseeliforifbreakr   MESON_RUNNING_IN_PROJECT_TESTStestcaseendtestcase
whitespacez[ \t]+multiline_fstringzf'''(.|\n)*?'''fstringzf'([^'\\]|(\\.))*'idz[_a-zA-Z][_0-9a-zA-Z]*numberz30[bB][01]+|0[oO][0-7]+|0[xX][0-9a-fA-F]+|0|[1-9]\d*eol_contz\\[ \t]*(#.*)?\neolz\nmultiline_stringz'''(.|\n)*?'''commentz#.*lparenz\(rparenz\)lbracketz\[rbracketz\]lcurlz\{rcurlz\}dblquote"stringz'([^'\\]|(\\.))*'comma,
plusassignz\+=dotz\.plusz\+dash-starz\*percent%fslash/colon:equal==nequal!=assign=le<=lt<ge>=gt>questionmarkz\?)rD   keywordsfuture_keywordsosenvironin_unit_testupdaterecompileMtoken_specification)r%   rD   r   r   r   r#   l   s   
	
 !"#
zLexer.__init__r9   r   r   c                 C  s   | j || j d| S )N
)rD   find)r%   r9   r   r   r   getline   s   zLexer.getliner8   T.Generator[Token, None, None]c              	   c  s   d}d}d}d}d}d}d}|t | jk rYd}	d}
| jD ]#\}}|| j|}|rB|}|}| | }d}	|}| }|}||f}| }
|dkrR|d7 }n|dkr[|d8 }n|dkrd|d7 }n|d	krm|d8 }n|d
krv|d7 }n|dkr|d8 }n|dkrtd| ||||dv r|
	ddkrd}t
jt
|| ||t|||d |
|dkrdndd }
n{|dv r|
|dkrdndd }
|
d}t |dkr|t |d 7 }| t |d  }nM|dkr|d7 }|}d}n@|dkr|d7 }|}|dks|dks|dkrd}n#|dkr5|
| jv r |
}n|
| jv r5t
jd|
 dt|||d t|||||||
V   nq|	sPtd | ||||t | jk sd S d S )!Nr   r   F Tr_   r`   ra   rb   rc   rd   re   z3Double quotes are not supported. Use single quotes.>   rX   rg   r   zNewline character in a string detected, use ''' (three single quotes) for multiline strings instead.
This will become a hard error in a future Meson release.locationrX      >   rW   r]   rW         r[   rV   r\   rY   zIdentifier 'zG' will become a reserved keyword in a future release. Please rename it.lexer)lenrD   r   r   startendr   r   r   r   r   warningr$   r   splitr   r   r6   )r%   r8   r9   r   locZ	par_countZbracket_countZ
curl_countcolZmatchedr<   r7   ZregmocurlineZcurline_startZ
span_startZspan_endr;   msglinesr   r   r   lex   s   





&



7z	Lexer.lexN)rD   r   )r9   r   r   r   )r8   r   r   r   )r(   r)   r*   r#   r   r   r   r   r   r   rC   k   s    

/rC   c                   @  s   e Zd ZU ded< ded< eddZded< eddZded< eddZded	< eddZd
ed< 	ddddZ	dddZ
dddZdS )r   r   r   r   Fhashr   r8   
end_lineno	end_colnoT.Optional[WhitespaceNode]whitespacesNT.Optional[int]r   r    c                 C  sR   || _ || _|| _|d ur|n|| _|d ur|n|| _d | _d| _d| _d| _d S )Nr   r   )	r   r   r8   r   r   r   levelZast_idZcondition_level)r%   r   r   r8   r   r   r   r   r   r#      s   
zBaseNode.__init__visitor'AstVisitor'c                 C  s@   d t| j}t||rt||}t|r||  d S d S d S )Nzvisit_{})r3   typer(   hasattrgetattrcallable)r%   r   fnamefuncr   r   r   accept   s   

zBaseNode.accepttokenr6   c                 C  s(   | j d u rt|| _ d S | j | d S r!   )r   WhitespaceNodeappendr%   r   r   r   r   append_whitespaces  s   
zBaseNode.append_whitespaces)NN)r   r   r   r   r8   r   r   r   r   r   r   r    )r   r   r   r    r   r6   r   r    )r(   r)   r*   r+   r   r8   r   r   r   r#   r   r   r   r   r   r   r      s   
 
T)unsafe_hashc                      s2   e Zd ZU ded< d fddZdd	d
Z  ZS )r   r   r<   r   
Token[str]c                   s*   t  |j|j|j d| _| | d S Nr   )r"   r#   r   r   r8   r<   r   r   r&   r   r   r#     s   zWhitespaceNode.__init__r   r    c                 C  s   |  j |j 7  _ d S r!   )r<   r   r   r   r   r     s   zWhitespaceNode.appendr   r   )r   r   r   r    )r(   r)   r*   r+   r#   r   r,   r   r   r&   r   r   
  s   
 r   c                      s:   e Zd ZU ded< eddZded< d fd	d
Z  ZS )ElementaryNoder4   r<   Fr   r:   r;   r   Token[TV_TokenTypes]c                   s*   t  |j|j|j |j| _|j| _d S r!   )r"   r#   r   r   r8   r<   r;   r   r&   r   r   r#     s   zElementaryNode.__init__r   r   )r(   r)   r*   r+   r   r;   r#   r,   r   r   r&   r   r     s   
 r   c                   @     e Zd ZdS )BooleanNodeNr(   r)   r*   r   r   r   r   r   "      r   c                   @  r   )IdNodeNr   r   r   r   r   r   %  r   r   c                   @  s*   e Zd ZU eddZded< d
ddZd	S )
NumberNodeFr   r   	raw_valuer   r   c                 C  s:   t | |j|j|j |j| _t|jdd| _|j| _d S )Nr   )base)	r   r#   r   r   r8   r<   r   r   r;   r   r   r   r   r#   -  s   zNumberNode.__init__Nr   )r(   r)   r*   r   r   r+   r#   r   r   r   r   r   (  s   
 r   c                   @  r   )BaseStringNodeNr   r   r   r   r   r   3  r   r   c                      s4   e Zd ZU eddZded< dd fd
dZ  ZS )
StringNodeFr   r   r   Tr   r   escaper?   c                   s2   t  | |rtt|jn|j| _|j| _d S r!   )r"   r#   ESCAPE_SEQUENCE_SINGLE_REsubr   r<   r   )r%   r   r   r&   r   r   r#   ;  s   zStringNode.__init__)T)r   r   r   r?   )r(   r)   r*   r   r   r+   r#   r,   r   r   r&   r   r   6  s   
 r   c                   @  r   )FormatStringNodeNr   r   r   r   r   r   @  r   r   c                      s   e Zd Zd fddZ  ZS )MultilineStringNoder   r   c                   s   t  | |j| _d S r!   )r"   r#   r<   r   r&   r   r   r#   F  s   zMultilineStringNode.__init__r   )r(   r)   r*   r#   r,   r   r   r&   r   r   C  s    r   c                   @  r   )MultilineFormatStringNodeNr   r   r   r   r   r   J  r   r   c                   @  r   )ContinueNodeNr   r   r   r   r   r   M  r   r   c                   @  r   )	BreakNodeNr   r   r   r   r   r   P  r   r   c                   @  r   )
SymbolNodeNr   r   r   r   r   r   S  r   r   c                      s   e Zd ZU eddZded< eddZded< eddZded< eddZded	< d' fddZ	d(ddZ
d(ddZd)ddZd*ddZd+ddZd+d d!Zd,d#d$Zd+d%d&Z  ZS )-ArgumentNodeFr   T.List[BaseNode]	argumentsT.List[SymbolNode]commascolumnszT.Dict[BaseNode, BaseNode]kwargsr   r   c                   s8   t  |j|j|j g | _g | _g | _i | _d| _	d S )NF)
r"   r#   r   r   r8   r   r   r   r   order_errorr   r&   r   r   r#   ^     
zArgumentNode.__init__	statementr   r   r    c                 C  s2   |   dkr	d| _t|ts|g| j | _d S d S Nr   T
num_kwargsr   r@   	EmptyNoder   r%   r   r   r   r   prependf  s
   
zArgumentNode.prependc                 C  s4   |   dkr	d| _t|ts|  j|g7  _d S d S r   r   r   r   r   r   r   l  s
   
zArgumentNode.appendnamer   r<   c                   sH   t  fdd| jD rtjd j d| d td || j < d S )Nc                 3  s&    | ]}t |to j|jkV  qd S r!   )r@   r   r<   ).0xr   r   r   	<genexpr>s  s   $ z)ArgumentNode.set_kwarg.<locals>.<genexpr>zKeyword argument "z" defined multiple times.r   z/This will be an error in future Meson releases.)anyr   r   r   r<   r%   r   r<   r   r   r   	set_kwargr  s   
zArgumentNode.set_kwargc                 C  s   || j |< d S r!   )r   r   r   r   r   set_kwarg_no_checkx  s   zArgumentNode.set_kwarg_no_checkr   c                 C  
   t | jS r!   )r   r   r%   r   r   r   num_args{     
zArgumentNode.num_argsc                 C  r   r!   )r   r   r   r   r   r   r   ~  r   zArgumentNode.num_kwargsr?   c                 C  s   | j S r!   )r   r   r   r   r   incorrect_order  s   zArgumentNode.incorrect_orderc                 C     |   S r!   )r   r   r   r   r   __len__     zArgumentNode.__len__r   )r   r   r   r    )r   r   r<   r   r   r    )r   r   r<   r   r   r    )r   r   )r   r?   )r(   r)   r*   r   r   r+   r   r   r   r#   r   r   r   r   r   r   r   r   r,   r   r   r&   r   r   V  s   
 






r   c                      8   e Zd ZU ded< ded< ded< d fddZ  ZS )		ArrayNoder   ra   r   argsrb   c                   :   t  j|j|j|j|j|jd d || _|| _|| _d S Nr   )r   r   )r"   r#   r   r   r8   ra   r   rb   )r%   ra   r   rb   r&   r   r   r#        $
zArrayNode.__init__)ra   r   r   r   rb   r   r(   r)   r*   r+   r#   r,   r   r   r&   r   r     
   
 r   c                      r   )	DictNoder   rc   r   r   rd   c                   r   r   )r"   r#   r   r   r8   rc   r   rd   )r%   rc   r   rd   r&   r   r   r#     r   zDictNode.__init__)rc   r   r   r   rd   r   r   r   r   r&   r   r    r  r  c                   @  r   )r   Nr   r   r   r   r   r     r   r   c                      r   )	BinaryOperatorNoder   leftr   operatorrightc                   ,   t  |j|j|j || _|| _|| _d S r!   )r"   r#   r   r   r8   r  r  r  )r%   r  r  r  r&   r   r   r#        
zBinaryOperatorNode.__init__)r  r   r  r   r  r   r   r   r   r&   r   r    r  r  c                   @  r   )OrNodeNr   r   r   r   r   r	    r   r	  c                   @  r   )AndNodeNr   r   r   r   r   r
    r   r
  c                      (   e Zd ZU ded< d
 fdd	Z  ZS )ComparisonNodeCOMPARISONSctyper  r   r  r   r  c                      t  ||| || _d S r!   )r"   r#   r  )r%   r  r  r  r  r&   r   r   r#        
zComparisonNode.__init__)r  r  r  r   r  r   r  r   r   r   r   r&   r   r    s   
 r  c                      r  )ArithmeticNoder   	operationr  r   r  r   r  c                   r  r!   )r"   r#   r  )r%   r  r  r  r  r&   r   r   r#     r  zArithmeticNode.__init__)r  r   r  r   r  r   r  r   r   r   r   r&   r   r    s   
 r  c                      s0   e Zd ZU ded< ded< d	 fddZ  ZS )
UnaryOperatorNoder   r  r   r<   r   r   c                   s&   t  |j|j|j || _|| _d S r!   )r"   r#   r   r   r8   r  r<   )r%   r   r  r<   r&   r   r   r#        
zUnaryOperatorNode.__init__)r   r   r  r   r<   r   r   r   r   r&   r   r       
 r  c                   @  r   )NotNodeNr   r   r   r   r   r    r   r  c                   @  r   )
UMinusNodeNr   r   r   r   r   r    r   r  c                      sN   e Zd ZU eddZded< eddZded< d fd	d
ZdddZ  Z	S )CodeBlockNodeFr   r   pre_whitespacesr   r   r   r   c                   s&   t  |j|j|j d | _g | _d S r!   )r"   r#   r   r   r8   r  r   r   r&   r   r   r#     r  zCodeBlockNode.__init__r6   r   r    c                 C  sB   | j r| j d | d S | jd u rt|| _d S | j| d S )Nr   )r   r   r  r   r   r   r   r   r   r     s
   
z CodeBlockNode.append_whitespacesr   r   )
r(   r)   r*   r   r  r+   r   r#   r   r,   r   r   r&   r   r    s
   
 r  c                      s@   e Zd ZU ded< ded< ded< ded< d	 fddZ  ZS )
	IndexNoder   iobjectr   ra   indexrb   c                   s2   t  |j|j|j || _|| _|| _|| _d S r!   )	r"   r#   r   r   r8   r  ra   r  rb   )r%   r  ra   r  rb   r&   r   r   r#     
   
zIndexNode.__init__)r  r   ra   r   r  r   rb   r   r   r   r   r&   r   r       
 r  c                      sP   e Zd ZU ded< ded< ded< ded< ded	< ded
< d fddZ  ZS )
MethodNoder   source_objectr   rk   r   r   lparr   r   rparc                   sL   t  j|j|j|j|j|jd d || _|| _|| _|| _|| _	|| _
d S r   )r"   r#   r   r   r8   r   rk   r   r!  r   r"  )r%   r   rk   r   r!  r   r"  r&   r   r   r#     s   $
zMethodNode.__init__)r   r   rk   r   r   r   r!  r   r   r   r"  r   r   r   r   r&   r   r    s   
 r  c                      s@   e Zd ZU ded< ded< ded< ded< d
 fdd	Z  ZS )FunctionNoder   	func_namer   r!  r   r   r"  c                   s@   t  j|j|j|j|j|jd d || _|| _|| _	|| _
d S r   )r"   r#   r   r   r8   r   r   r$  r!  r   r"  )r%   r$  r!  r   r"  r&   r   r   r#     s
   $
zFunctionNode.__init__)r$  r   r!  r   r   r   r"  r   r   r   r   r&   r   r#    r  r#  c                      s8   e Zd ZU ded< ded< ded< d	 fddZ  ZS )
AssignmentNoder   var_namer   r  r   r<   c                   r  r!   )r"   r#   r   r   r8   r&  r  r<   )r%   r&  r  r<   r&   r   r   r#   &  r  zAssignmentNode.__init__)r&  r   r  r   r<   r   r   r   r   r&   r   r%    r  r%  c                   @  r   )PlusAssignmentNodeNr   r   r   r   r   r'  ,  r   r'  c                      s   e Zd ZU eddZded< eddZded< eddZded< eddZded	< d
ed< ded< eddZ	ded< d fddZ
  ZS )ForeachClauseNodeFr   r   foreach_T.List[IdNode]varnamesr   r   columnr   itemsr  blockrG   c                   sD   t  |j|j|j || _|| _|| _|| _|| _	|| _
|| _d S r!   )r"   r#   r   r   r8   r)  r+  r   r,  r-  r.  rG   r%   r)  r+  r   r,  r-  r.  rG   r&   r   r   r#   :  s   
zForeachClauseNode.__init__)r)  r   r+  r*  r   r   r,  r   r-  r   r.  r  rG   r   )r(   r)   r*   r   r)  r+   r+  r   r,  rG   r#   r,   r   r   r&   r   r(  /  s   
 r(  c                      s8   e Zd ZU ded< ded< ded< d fd	d
Z  ZS )IfNoder   if_r   	conditionr  r.  linenodeif_nodec                   s,   t  |j|j|j || _|| _|| _d S r!   )r"   r#   r   r   r8   r1  r2  r.  )r%   r3  r4  r2  r.  r&   r   r   r#   L  r  zIfNode.__init__)r3  r   r4  r   r2  r   r.  r  r   r   r   r&   r   r0  E  r  r0  c                      s0   e Zd ZU ded< ded< d fddZ  ZS )ElseNoder   else_r  r.  c                   s&   t  |j|j|j || _|| _d S r!   )r"   r#   r   r   r8   r6  r.  r%   r6  r.  r&   r   r   r#   X  r  zElseNode.__init__)r6  r   r.  r  r   r   r   r&   r   r5  R  r  r5  c                      sB   e Zd ZU eddZded< ded< ded< d fddZ  ZS )IfClauseNodeFr   zT.List[IfNode]ifszT.Union[EmptyNode, ElseNode]	elseblockr   rH   r3  r   c                   s:   t  |j|j|j g | _t|j|j|j| _d | _d S r!   )	r"   r#   r   r   r8   r9  r   r:  rH   )r%   r3  r&   r   r   r#   d  s   
zIfClauseNode.__init__)r3  r   )r(   r)   r*   r   r9  r+   r#   r,   r   r   r&   r   r8  ]  s
   
 r8  c                      s@   e Zd ZU ded< ded< ded< ded< d
 fdd	Z  ZS )TestCaseClauseNoder   rT   r   r2  r  r.  rU   c                   s2   t  |j|j|j || _|| _|| _|| _d S r!   )	r"   r#   r   r   r8   rT   r2  r.  rU   r%   rT   r2  r.  rU   r&   r   r   r#   r  r  zTestCaseClauseNode.__init__)rT   r   r2  r   r.  r  rU   r   r   r   r   r&   r   r;  j  r  r;  c                      sH   e Zd ZU ded< ded< ded< ded< ded< d
 fdd	Z  ZS )TernaryNoder   r2  r   r   	trueblockr,  
falseblockc                   s8   t  |j|j|j || _|| _|| _|| _|| _	d S r!   )
r"   r#   r   r   r8   r2  r   r>  r,  r?  )r%   r2  r   r>  r,  r?  r&   r   r   r#     r   zTernaryNode.__init__)
r2  r   r   r   r>  r   r,  r   r?  r   r   r   r   r&   r   r=  y  s   
 r=  c                      sL   e Zd ZU eddZded< ded< eddZded< d
 fdd	Z  ZS )ParenthesizedNodeFr   r   r!  r   innerr"  c                   r   r   )r"   r#   r   r   r8   r!  rA  r"  )r%   r!  rA  r"  r&   r   r   r#     r   zParenthesizedNode.__init__)r!  r   rA  r   r"  r   )	r(   r)   r*   r   r!  r+   r"  r#   r,   r   r   r&   r   r@    s
   
 r@  )rw   ry   r   r}   r   r   rI   notinrw   ry   r   r}   r   r   rI   rB  )rv   rx   r~   r|   r   r   rI   znot inzT.Mapping[str, COMPARISONS]comparison_mapc                   @  sL  e Zd Zd^ddZd_ddZd`ddZdaddZdbddZdcddZdbddZ	ddd d!Z
ded#d$Zdfd&d'Zdfd(d)Zdfd*d+Zdfd,d-Zdfd.d/Zdfd0d1Zdfd2d3Zdfd4d5Zdfd6d7Zdfd8d9Zdfd:d;Zdfd<d=Zdgd?d@ZdgdAdBZdhdEdFZdidHdIZdjdKdLZdkdNdOZdldQdRZdmdTdUZdndWdXZ dfdYdZZ!ded[d\Z"d]S )oParserrD   r   r8   c                 C  sN   t || _| j|| _tddddddd | _| j| _g | _|   d| _	d S )Neofr   r   r   r   F)
rC   r   r   streamr6   currentprevious
current_wsgetsym
in_ternary)r%   rD   r8   r   r   r   r#     s   

zParser.__init__	node_typeT.Type[BaseNodeT]r   T.Anyr   r   r
   c                 O  s.   ||i |}| j D ]}|| q
g | _ |S r!   )rJ  r   )r%   rM  r   r   nodews_tokenr   r   r   create_node  s
   
zParser.create_noder    c                 C  s   | j | _z.t| j| _ | j jdv r0| j| j  | j jdkr!W d S t| j| _ | j jdv sW d S W d S  tyY   tdd| j j	| j j
| j j| j jd  | j jd  dd | _ Y d S w )N>   r^   r\   rV   r\   rE  r   r   r   rF  )rH  rI  nextrG  r7   rJ  r   StopIterationr6   r9   r   r   r;   r   r   r   r   rK    s   @zParser.getsymc                 C  s   | j | jjS r!   )r   r   rH  r9   r   r   r   r   r     s   zParser.getlinesr?   c                 C  s   | j j|kr|   dS dS )NTFrH  r7   rK  r%   rU  r   r   r   r     s   zParser.accepttidsT.Tuple[str, ...]c                 C  s    | j j}||v r|   |S dS r   rV  )r%   rX  r7   r   r   r   
accept_any  s
   zParser.accept_anyc                 C  s:   |  |rdS td| d| jj d|  | jj| jjNTz
Expecting z got .)r   r   rH  r7   r   r   r   rW  r   r   r   expect  s   
,zParser.expectblock_startr6   c                 C  sN   |  |rdS td| d| jj d|  | jj| jj| j|j|j|jr[  )	r   r-   rH  r7   r   r   r   r   r9   )r%   rU  r^  r   r   r   block_expect  s   
@zParser.block_expectr  c              
   C  s:   |   }z| d W |S  ty } z||_ d }~ww )NrE  )	codeblockr]  r   r   )r%   r.  er   r   r   parse  s   zParser.parser   c                 C  r   r!   )e1r   r   r   r   r     r   zParser.statementc                 C  sH  |   }| dr4| t| j}|  }t|ts$td| 	 |j
|jt|jts,J | t|||S | drd| t| j}|  }t|tsTtd| 	 |j
|jt|jts\J | t|||S | dr| jrwtd| 	 |j
|j| t| j}d| _|  }| d | t| j}|  }d	| _| t|||||S |S )
Nrj   z$Plusassignment target must be an id.rz   z Assignment target must be an id.r   z)Nested ternary operators are not allowed.Trt   F)e2r   rR  r   rI  rc  r@   r   r   r   r   r   r<   r   r'  r%  rL  r]  r=  )r%   r  r  r<   Zqm_noder>  Zcolumn_noder?  r   r   r   rc    s>   





z	Parser.e1c                 C  b   |   }| dr/| t| j}t|tr td|  |j	|j
| t|||   }| ds	|S )NrP   zInvalid or clause.)e3r   rR  r   rI  r@   r   r   r   r   r   r	  r%   r  r  r   r   r   rd       


z	Parser.e2c                 C  re  )NrF   zInvalid and clause.)e4r   rR  r   rI  r@   r   r   r   r   r   r
  rg  r   r   r   rf  &  rh  z	Parser.e3c           
   	   C  s  |   }t D ]\}}| |r%| t| j}| t||||     S q| dr| j	 }| j}| dr| j}| jt
|d  | _t|j|j|j}|D ]}	||	 qP|jd |jd f|_| j|jj|j 7  _| t|}| td|||   S |S )NrL   rI   r   r   rB  )e5rC  r-  r   rR  r   rI  r  rJ  copyr   r   r   r   r8   r   r;   r<   r   )
r%   r  nodenameZoperator_typer  wsZ	not_tokenZin_tokenZ	temp_nodewr   r   r   ri  0  s(   



z	Parser.e4c                 C  r   r!   )e5addsubr   r   r   r   rj  F  r   z	Parser.e5c                 C  s\   ddd}|   }	 | t| }|r*| t| j}| t|| |||   }n	 |S q
)Naddr   )rl   rm   )e5muldivrZ  tuplekeysrR  r   rI  r  r%   Zop_mapr  opr  r   r   r   ro  I  s   zParser.e5addsubc                 C  s^   dddd}|   }	 | t| }|r+| t| j}| t|| |||   }n	 |S q)Nmodmuldiv)rp   ro   rr   )e6rZ  rr  rs  rR  r   rI  r  rt  r   r   r   rq  X  s   zParser.e5muldivc                 C  sd   |  dr| t| j}| t| j||  S |  dr.| t| j}| t| j||  S |  S )NrL   rm   )r   rR  r   rI  r  rH  e7r  )r%   r  r   r   r   ry  h  s   

z	Parser.e6c                 C  s   |   }| j}| drD| t|}|  }| d| | t| j}t|t	s3t
d|  |j|jt|jts;J | t||||}d}|rdd}| drVd}| |}| drbd}| |}|sH|S )Nr_   r`   z)Function call must be applied to plain idTFrk   ra   )e8rH  r   rR  r   r   r_  rI  r@   r   r   r   r   r   r<   r   r#  method_call
index_call)r%   r  r^  r!  r   r"  Zgo_againr   r   r   rz  q  s0   





z	Parser.e7c                 C  s   | j }| dr%| t|}|  }| d| | t| j}t|||S | drI| t|}|  }| d| | t| j}| t	|||S | drm| t|}| 
 }	| d| | t| j}
| t||	|
S |  S )Nr_   r`   ra   rb   rc   rd   )rH  r   rR  r   r   r_  rI  r@  r   r   
key_valuesr  e9)r%   r^  r!  ra  r"  ra   r   rb   rc   r~  rd   r   r   r   r{    s(   


z	Parser.e8c                 C  s   | j }| drd|_| t|S | drd|_| t|S | dr*| t|S | dr5| t|S | dr@| t|S | drK| t|S | d	rV| t	|S | d
ra| t
|S t| j j| j j| j jS )NrE   TrN   FrY   rZ   rg   rX   r]   rW   )rH  r   r<   rR  r   r   r   r   r   r   r   r   r   r   r8   )r%   tr   r   r   r    s(   







z	Parser.e9r   c                 C  s   |   }| t| j}t|tsO| dr;|j| t	| j
 |||    | ds/|S |j| t	| j
 ntd|  |j|j|   }t|tr|S )Nrt   rh   z4Only key:value pairs are valid in dict construction.)r   rR  r   rH  r@   r   r   r   r   r   rI  r   r   r   r   r   r   r%   rU  ar   r   r   r~    s   



zParser.key_valuesc                 C  s   |   }| t| j}t|tsq| dr&|j| t	| j
 || nB| dra|j| t	| j
 t|tsFtd|  |j|j|||    | dsU|S |j| t	| j
 n|| |S |   }t|tr|S )Nrh   rt   z*Dictionary key must be a plain identifier.)r   rR  r   rH  r@   r   r   r   r   r   rI  r   r   r   r   r   r   r   r  r   r   r   r     s*   






zParser.argsr   r  c              	   C  s   |  t| j}|  }t|ts2t|tr%t|tr%td|  |j	|j
td|  | jj	| jj
t|jts:J | d |  t| j}|  }|  t| j}| d |  t||||||}| drk| |S |S )Nz$meson does not support float numberszMethod name must be plain idr_   r`   rk   )rR  r   rI  r  r@   r   r   r   r   r   r   rH  r<   r   r]  r   r  r   r|  )r%   r   rk   Z
methodnamer!  r   r"  methodr   r   r   r|    s(   




zParser.method_callr  c                 C  s@   |  t| j}|  }| d |  t| j}|  t||||S )Nrb   )rR  r   rI  r   r]  r  )r%   r   ra   Zindex_statementrb   r   r   r   r}    s
   
zParser.index_callr(  c              
   C  s   |  t| j}| d t| jjtsJ |  t| jg}g }| drF|	|  t| j | d t| jjts<J |	|  t| j | d |  t| j}| 
 }|  }|  t| j}|  t|||||||S )NrY   rh   rt   )rR  r   rI  r]  r@   r<   r   r   r   r   r   r`  rH  r(  r/  r   r   r   foreachblock  s    



zParser.foreachblockr8  c              	   C  sv   |  t| j}|  }|  t|}| d |  }|j|  t	|||| | 
| |  |_|  t| j|_|S Nr\   )rR  r   rI  r   r8  r]  r`  r9  r   r0  elseifblockr:  rH  rH   )r%   r4  r2  clauser.  r   r   r   ifblock  s   


zParser.ifblockr  c              	   C  s^   |  dr-| t| j}|  }| d |  }|j| t	|||| |  dsd S d S )NrO   r\   )
r   rR  r   rI  r   r]  r`  r9  r   r0  )r%   r  Zelif_rU  br   r   r   r    s   

zParser.elseifblockT.Union[ElseNode, EmptyNode]c                 C  sL   |  dr| t| j}| d |  }t||S t| jj	| jj
| jjS )NrJ   r\   )r   rR  r   rI  r]  r`  r5  r   rH  r   r   r8   r7  r   r   r   r:  !  s   


zParser.elseblockr;  c                 C  sD   |  t| j}|  }| d |  }t| j}|  t||||S r  )rR  r   rI  r   r]  r`  rH  r;  r<  r   r   r   testcaseblock)  s   

zParser.testcaseblockc                 C  s   | j }| j dkrt| j j| j j| j jS | dr%|  }| d| |S | dr6|  }| d| |S | drB| 	t
| j S | drN| 	t| j S | jjrc| drc|  }| d	| |S |  S )
Nr\   rQ   rH   rM   rG   rK   rR   rT   rU   )rH  r   r   r   r8   r   r  r_  r  rR  r   r   r   r   r  r   )r%   r^  r  Zforblockr.  r   r   r   r   1  s(   




zParser.linec              
   C  s   |  t| j}d}z(|r0| jD ]}|| qg | _|  }t|ts)|j	| | 
d}|sW n tyA } z||_ d }~ww | jD ]}|| qEg | _|S )NTr\   )rR  r  rH  rJ  r   r   r@   r   r   r   r   r   r   )r%   r.  ZcondrQ  r   ra  r   r   r   r`  G  s,   



zParser.codeblockN)rD   r   r8   r   )rM  rN  r   rO  r   rO  r   r
   )r   r    )r   r   )rU  r   r   r?   )rX  rY  r   r   )rU  r   r^  r6   r   r?   )r   r  )r   r   )r   r   )r   r   r   r  )r   r   r   r  )r   r(  )r   r8  )r  r8  r   r    )r   r  )r   r;  )#r(   r)   r*   r#   rR  rK  r   r   rZ  r]  r_  rb  r   rc  rd  rf  ri  rj  ro  rq  ry  rz  r{  r  r~  r   r|  r}  r  r  r  r:  r  r   r`  r   r   r   r   rD    sB    










	

 








	











rD  )r   r   r   r   )N
__future__r   dataclassesr   r   r   r   r   typingTmesonlibr   r   r   TYPE_CHECKINGtyping_extensionsr   r   r	   TypeVarr
   r   UNICODEVERBOSEr   r   r   r-   r   r   r?   r4   Genericr6   rC   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r   r  r	  r
  r  r  r  r  r  r  r  r  r#  r%  r'  r(  r0  r5  r8  r;  r=  r@  r  rC  r+   rD  r   r   r   r   <module>   s   

	
!z$

	0	

