o
    uJAf6{                  	   @  s  d dl mZ ddlmZmZmZ ddlmZmZm	Z	m
Z
mZmZmZ ddlmZmZmZmZmZmZ ddlmZ ddlmZmZ dd	lmZmZmZmZ dd
lm Z  ddl!m!Z! d dl"Z"d dl#Z#d dl$Z$d dl%Z%d dl&Z'd dl(Z(e'j)rddlm*Z*m+Z+m,Z,m-Z- ddl.m/Z/ e'j0e'j1e'j2ej3 e'j2e4 e'j2e5 e'j2e6 e'j2e7 e'j2e8 f e'j9e*dge
e* f f Z:e'j0e6e'j9ej;e'j<e- e'j0e6e-f ge-f f Z=G dd deZ>G dd dZ?dS )    )annotations   )environmentmparsermesonlib   )InterpreterObjectMesonInterpreterObjectMutableInterpreterObjectObjectHolderIterableObjectContextManagerObjectHoldableTypes)BreakRequestContinueRequestInterpreterExceptionInvalidArgumentsInvalidCodeSubdirDoneRequest)
FeatureNew)Disableris_disabled)default_resolve_keyflattenresolve_second_level_holdersstringifyUserArguments)MesonOperator	_unholderN)InterpreterObjectTypeVar
SubProjectTYPE_kwargsTYPE_var)Interpreterr#   c                      s   e Zd Zd fddZ  ZS )InvalidCodeOnVoidop_typestrreturnNonec                   s   t  d|d d S )NzCannot perform z operation on void statement.)super__init__)selfr%   	__class__ O/usr/lib/python3.10/site-packages/mesonbuild/interpreterbase/interpreterbase.pyr*   L   s   zInvalidCodeOnVoid.__init__)r%   r&   r'   r(   )__name__
__module____qualname__r*   __classcell__r.   r.   r,   r/   r$   J   s    r$   c                   @  s  e Zd ZdddZddddZdddZdddZdddZdddZdddd Z	dd$d%Z
dd(d)Zed*d+dd-d.Zdd0d1Zdd4d5Zdd7d8Zdd:d;Zdd=d>Zdd@dAZddCdDZddFdGZddIdJZedKdLddNdOZedPdQddSdTZddVdWZddYdZZdd\d]Zdd_d`ZddbdcZddfdgZddmdnZddpdqZ e!dfddxdyZ"dd{d|Z#dd~dZ$dddddZ%dddZ&dddZ'dS )InterpreterBasesource_rootr&   subdir
subproject'SubProject'c                 C  sR   || _ i | _i | _i | _i | _|| _|| _|| _i | _d| _	d| _
d | _d | _d S )Nr   )r5   funcsbuiltin
holder_mapbound_holder_mapr6   Zroot_subdirr7   	variablesargument_depthcurrent_linenocurrent_nodetmp_meson_version)r+   r5   r6   r7   r.   r.   r/   r*   Q   s   
zInterpreterBase.__init__Tstrictboolr'   r(   c                 C  s   d S Nr.   )r+   rC   r.   r.   r/   handle_meson_version_from_astg   s   z-InterpreterBase.handle_meson_version_from_astc              
   C  s   t j| j| jtj}t j|std| t	|dd}|
 }W d    n1 s-w   Y  | r:tdt|tsAJ zt|| | _|   W d S  tjyk } z||_|j| _|   |d }~ww )NzMissing Meson file in utf-8encodingzBuilder file is empty.)ospathjoinr5   r6   r   build_filenameisfiler   openreadisspacer   
isinstancer&   r   ParserparseastrF   ParseExceptionfile)r+   Z	mesonfileZmfcodemer.   r.   r/   load_root_meson_filek   s&   
z$InterpreterBase.load_root_meson_filec                 C  s   | j | jdd dS )z
        Parses project() and initializes languages, compilers etc. Do this
        early because we need this before we parse the rest of the AST.
        r   )endN)evaluate_codeblockrU   r+   r.   r.   r/   parse_project   s   zInterpreterBase.parse_projectc           	   	   C  s   ddd}|| j srt| j }|}|jD ]B}|d  rYt|d dd	}| }W d    n1 s6w   Y  z
t	
|d
 }W n
 t	jyO   Y qw ||rX|} nq d}||krktd| d| dtd| d S )NrU   mparser.CodeBlockNoder'   objectc                 S  sD   t | tjs
td| jstd| jd }t |tjo!|jjdkS )Nz5AST is of invalid type. Possibly a bug in the parser.zNo statements in code.r   project)rR   r   CodeBlockNoder   linesFunctionNode	func_namevalue)rU   firstr.   r.   r/   _is_project   s   
z5InterpreterBase.sanity_check_ast.<locals>._is_projectzmeson.buildrG   rH   emptyz+first statement must be a call to project()zNot the project root: z1

Did you mean to run meson from the directory: "z"?zInvalid source tree: )rU   r_   r'   r`   )rU   pathlibPathr5   resolveparentsis_filerO   rP   r   rS   rT   rV   r   )	r+   rh   pfoundparentfrX   rU   errorr.   r.   r/   sanity_check_ast   s0   



z InterpreterBase.sanity_check_astc                 C  s,   z| j | jdd W d S  ty   Y d S w )Nr   )start)r\   rU   r   r]   r.   r.   r/   run   s
   zInterpreterBase.runr   Nnoder_   ru   intr[   T.Optional[int]c              
   C  s   |d u rd S t |tjstd}|j|_|j|_||j|| }d}|t|k rq|| }z|j| _| 	| W n, t
yd } z t|dd d u r^| jj|_| jj|_tj| j| jtj|_|d }~ww |d7 }|t|k s)d S d S )Nz?Tried to execute a non-codeblock. Possibly a bug in the parser.r   linenor   )rR   r   rb   r   rz   colnorc   lenr@   evaluate_statement	ExceptiongetattrrA   rJ   rK   rL   r5   r6   r   rM   rW   )r+   rw   ru   r[   eZ
statementsicurr.   r.   r/   r\      s0   

z"InterpreterBase.evaluate_codeblockr   mparser.BaseNodeT.Optional[InterpreterObject]c                 C  s`  || _ t|tjr| |S t|tjr| | d S t|tjr(| | d S t|tj	r3| 
|S t|tjrUt|tjrD| |S t|tjrO| |S | |jS t|tjra| |jS t|tjrl| |S t|tjrx| |jS t|tjr| |S t|tjr| |S t|tjr| |S t|tjr| |jS t|tjr| |S t|tj r| !|S t|tj"r| #|S t|tj$r| %|S t|tj&r| '|S t|tj(r| )| d S t|tj*r| +|S t|tj,r| -|S t|tj.r	t/ t|tj0rt1 t|tj2r | 3|j4S t|tj5r,| 6|S t7d)NzUnknown statement.)8rA   rR   r   rd   function_callPlusAssignmentNodeevaluate_plusassignAssignmentNode
assignment
MethodNodemethod_callBaseStringNodeMultilineFormatStringNodeevaluate_multiline_fstringFormatStringNodeevaluate_fstring
_holderifyrf   BooleanNodeIfClauseNodeevaluate_ifIdNodeget_variableComparisonNodeevaluate_comparison	ArrayNodeevaluate_arraystatementDictNodeevaluate_dictstatement
NumberNodeAndNodeevaluate_andstatementOrNodeevaluate_orstatementNotNodeevaluate_notstatement
UMinusNodeevaluate_uminusstatementArithmeticNodeevaluate_arithmeticstatementForeachClauseNodeevaluate_foreach	IndexNodeevaluate_indexingTernaryNodeevaluate_ternaryContinueNoder   	BreakNoder   ParenthesizedNoder}   innerTestCaseClauseNodeevaluate_testcaser   )r+   r   r.   r.   r/   r}      sr   

4
2















z"InterpreterBase.evaluate_statementmparser.ArrayNoder   c                 C  s8   |  |j\}}t|dkrtd| dd |D S )Nr   z4Keyword arguments are invalid in array construction.c                 S     g | ]}t |qS r.   r   .0xr.   r.   r/   
<listcomp>      z;InterpreterBase.evaluate_arraystatement.<locals>.<listcomp>)reduce_argumentsargsr|   r   r   )r+   r   	argumentskwargsr.   r.   r/   r     s   z'InterpreterBase.evaluate_arraystatementdictz0.47.0mparser.DictNodec                   sD   d fdd} j |j|dd\}}|rJ  d	d
 | D S )Nkeyr   r'   r&   c                   sT   t | tjstdd j  | }|d u rtdt|}t |t	s(td|S )Nz&Dictionary entry using non literal keyz0.53.0zKey cannot be void.zKey must be a string)
rR   r   r   r   
single_user7   r}   r   r   r&   )r   Z
key_holderZstr_keyr]   r.   r/   resolve_key  s   

z;InterpreterBase.evaluate_dictstatement.<locals>.resolve_keyzDuplicate dictionary key: {})key_resolverduplicate_key_errorc                 S     i | ]	\}}|t |qS r.   r   r   kvr.   r.   r/   
<dictcomp>      z:InterpreterBase.evaluate_dictstatement.<locals>.<dictcomp>)r   r   r'   r&   )r   r   r   items)r+   r   r   r   r   r.   r]   r/   r   
  s   
z&InterpreterBase.evaluate_dictstatementmparser.NotNodec                 C  s>   |  |j}|d u rtdt|tr|S | |tjd S )Nnot)	r}   rf   r$   rR   r   r   operator_callr   NOTr+   r   r   r.   r.   r/   r     s   
z%InterpreterBase.evaluate_notstatementmparser.IfClauseNodeT.Optional[Disabler]c              
   C  s  t |tjsJ |jD ]n}d | _| |j}|d u rtdt |tr'|  S t |t	s;t
d| dt|j d|tjd }t |tsOtd|d|ryt
j| j }| jra| jt
j| j< z| |j W |t
j| j<  d S |t
j| j< w qt |jtjs| |jj d S )NifzArgument to if (z") is not an InterpreterObject but .z
If clause z$ does not evaluate to true or false.)rR   r   r   ifsrB   r}   	conditionr$   r   r   r   MesonBugExceptiontyper0   r   r   BOOLrD   r   project_meson_versionsr7   r\   block	elseblock	EmptyNode)r+   rw   r   resultresZprev_meson_versionr.   r.   r/   r   "  s4   



	zInterpreterBase.evaluate_ifmparser.TestCaseClauseNodec                 C  sj   |  |j}t|tr|S t|tstd|d| | |j W d    d S 1 s.w   Y  d S )Nztestcase clause z( does not evaluate to a context manager.)r}   r   rR   r   r   r   r\   r   )r+   rw   r   r.   r.   r/   r   ?  s   


z!InterpreterBase.evaluate_testcasemparser.ComparisonNodec              	   C  s   |  |j}|d u rtdt|tr|S |  |j}|d u r%tdt|tr,|S tjtj	tj
tjtjtjtjtjd|j }|tjtj	fv rO||}}||_| ||t|S )N5Cannot compare a void statement on the left-hand side6Cannot compare a void statement on the right-hand side)innotinz==z!=><z>=z<=)r}   leftr   MesonExceptionrR   r   rightr   INNOT_INEQUALS
NOT_EQUALSGREATERLESSGREATER_EQUALSLESS_EQUALSctyperA   r   r   r   )r+   rw   Zval1Zval2operatorr.   r.   r/   r   I  s2   



	
z#InterpreterBase.evaluate_comparisonmparser.AndNodec                 C  s   |  |j}|d u rtdt|tr|S |tjd }|s$| 	|S |  |j
}|d u r3tdt|tr:|S | 	|tjd S Nr   r   r}   r   r   r   rR   r   r   r   r   r   r   r+   r   lZl_boolrr.   r.   r/   r   h     




z%InterpreterBase.evaluate_andstatementmparser.OrNodec                 C  s   |  |j}|d u rtdt|tr|S |tjd }|r$| 	|S |  |j
}|d u r3tdt|tr:|S | 	|tjd S r   r   r   r.   r.   r/   r   x  r   z$InterpreterBase.evaluate_orstatementmparser.UMinusNodec                 C  sD   |  |j}|d u rtdt|tr|S ||_| |tj	d S )Nzunary minus)
r}   rf   r$   rR   r   rA   r   r   r   UMINUSr   r.   r.   r/   r     s   
z(InterpreterBase.evaluate_uminusstatementmparser.ArithmeticNodec                 C  s   |  |j}t|tr|S |  |j}t|tr|S |d u s"|d u r't|jtjtj	tj
tjtjd}||_|||j t|}| |S )N)addsubmuldivmod)r}   r   rR   r   r   r$   	operationr   PLUSMINUSTIMESDIVMODrA   r   r   r   )r+   r   r   r   mappingr   r.   r.   r/   r     s"   



z,InterpreterBase.evaluate_arithmeticstatementmparser.TernaryNodec                 C  sl   t |tjsJ | |j}|d u rtdt |tr|S ||_|	t
jd }|r0| |jS | |jS )Nz>Cannot use a void statement as condition for ternary operator.)rR   r   r   r}   r   r   r   r   rA   r   r   r   	trueblock
falseblock)r+   rw   r   Zresult_boolr.   r.   r/   r     s   

z InterpreterBase.evaluate_ternaryzmultiline format stringsz0.63.0!mparser.MultilineFormatStringNodec                 C  s
   |  |S rE   )r   )r+   rw   r.   r.   r/   r     s   
z*InterpreterBase.evaluate_multiline_fstringzformat stringsz0.58.0DT.Union[mparser.FormatStringNode, mparser.MultilineFormatStringNode]c                   s(   d fdd}t d||j} |S )	NmatchT.Match[str]r'   r&   c              
     s   t | d}z7t j| }t|ttfr!tjdd j	 j
d zt| j	W W S  ty> } z	tdt | d }~ww  tyM   td| dw )Nr   zList or dictionary in f-stringz1.3.0)locationz
f-string: zIdentifier "z" does not name a variable.)r&   groupr   r>   rR   listr   r   r   r7   rA   r   r   KeyErrorr   )r  varvalr   r]   r.   r/   replace  s   z1InterpreterBase.evaluate_fstring.<locals>.replacez@([_a-zA-Z][_0-9a-zA-Z]*)@)r  r  r'   r&   )rer  rf   r   )r+   rw   r  r   r.   r]   r/   r     s   
z InterpreterBase.evaluate_fstringmparser.ForeachClauseNodec              	   C  sZ  t |tjsJ | |j}t |tstd| }t|j	|p"dkr2td|p)d d|
  | D ]t}|d u rXt |trJtd| d| |j	d j| | n7t |tshtd| d| t||krytd| d| t|D ]}| |j	| j| ||  q}z| |j W q6 ty   Y q6 ty   Y  d S w d S )	Nz.Items of foreach loop do not support iteratingr   zForeach expects exactly z. variables for iterating over objects of type zIteration of z7 returned a tuple even though iter_tuple_size() is Noner   z9 did not return a tuple even though iter_tuple_size() is )rR   r   r   r}   r   r   r   iter_tuple_sizer|   varnamesdisplay_name	iter_selftupler   r   set_variablerf   r   ranger\   r   r   r   )r+   rw   r   Ztsizer   jr.   r.   r/   r     s4   


 z InterpreterBase.evaluate_foreachmparser.PlusAssignmentNodec                 C  sl   t |tjsJ |jj}| |j}|d u rtd| |}||_| 	|
tjt|}| || d S )Nzplus assign)rR   r   r   var_namerf   r}   r$   r   rA   r   r   r   r  r   r"  )r+   rw   varnameZadditionZold_variableZ	new_valuer.   r.   r/   r     s   
z#InterpreterBase.evaluate_plusassignmparser.IndexNodec                 C  sx   t |tjsJ | |j}|d u rtdt |tr|S | |j}|d u r+tdt	|}||_
| |tj|S )Nz#Tried to evaluate indexing on void.z#Cannot use void statement as index.)rR   r   r   r}   iobjectr   r   indexr   r   rA   r   r   r   INDEX)r+   rw   r)  Zindex_holderr*  r.   r.   r/   r     s   
z!InterpreterBase.evaluate_indexingmparser.FunctionNodec           
      C  s   |j j}| |j\}}| ||\}}t||r |dvr t S || jv rW| j| }|}t|dds6t	|}t|ddsCt
||\}}|| _||||}	|	d urU| |	S d S | | d S )N>   Zis_disablerr   Zunset_variabler"  zno-args-flatteningFz!no-second-level-holder-flattening)re   rf   r   r   _unholder_argsr   r   r:   r   r   r   rA   r   unknown_function_called)
r+   rw   re   Z	h_posargsh_kwargsZposargsr   funcZ	func_argsr   r.   r.   r/   r     s"   


zInterpreterBase.function_callmparser.MethodNodec                 C  s  |j }t|tjrd|j d}| |j}n	|jj}| |}|j	j}| 
|j\}}| ||\}}	t||	r<t S t|tsHt| d|dkrjt|trX| |j nt|tsjtd| dt|j | |_| _||||	}
|
d ur| |
S d S )Nz
variable ""z is not callable.extract_objectsz'Invalid operation "extract_objects" on 	 of type )source_objectrR   r   r   rf   r   r-   r0   r}   namer   r   r-  r   r   r   r   r   validate_extractionheld_objectr   rA   r   r   )r+   rw   Z	invocableZobject_display_nameobjmethod_nameZh_argsr/  r   r   r   r.   r.   r/   r     s*   




zInterpreterBase.method_callr   $T.Union[TYPE_var, InterpreterObject]c                 C  s   t |trD| jt|d }|d ur||td| S | j D ]\}}t ||r4||td|   S q t	
d| dt|j dt |trXt	
d| dt|j dt |tr_|S t	
d| dt|j d)	Nr#   zObject r4  z9 is neither in self.holder_map nor self.bound_holder_map.zReturned object z is an object holder.zUnknown returned object z in the parameters.)rR   r   r<   getr   Tcastr=   r   r   r   r0   r   r	   )r+   r   clstypr.   r.   r/   r   2  s   



zInterpreterBase._holderifyr   T.List[InterpreterObject]r   T.Dict[str, InterpreterObject]&T.Tuple[T.List[TYPE_var], TYPE_kwargs]c                 C  s    dd |D dd |  D fS )Nc                 S  r   r.   r   r   r.   r.   r/   r   H  r   z2InterpreterBase._unholder_args.<locals>.<listcomp>c                 S  r   r.   r   r   r.   r.   r/   r   H  r   z2InterpreterBase._unholder_args.<locals>.<dictcomp>)r   )r+   r   r   r.   r.   r/   r-  E  s    zInterpreterBase._unholder_argsre   c                 C  s   t d| d)NzUnknown function "".)r   )r+   re   r.   r.   r/   r.  J  s   z'InterpreterBase.unknown_function_calledmparser.ArgumentNoder   #T.Callable[[mparser.BaseNode], str]r   T.Optional[str]BT.Tuple[T.List[InterpreterObject], T.Dict[str, InterpreterObject]]c                   s   t |tjsJ | rtd  jd7  _ fdd|jD }tdd |D r.tdi }|j	 D ]5\}}||}t |tj
sEJ  |}	|	d u rVtd| d	| _|rf||v rft|||	||< q5  jd8  _ |}
||
fS )
Nz9All keyword arguments must be after positional arguments.r   c                   s   g | ]}  |qS r.   )r}   )r   argr]   r.   r/   r   Z  s    z4InterpreterBase.reduce_arguments.<locals>.<listcomp>c                 s  s    | ]}|d u V  qd S rE   r.   r   r.   r.   r/   	<genexpr>[  s    z3InterpreterBase.reduce_arguments.<locals>.<genexpr>z,At least one value in the arguments is void.zValue of key z	 is void.)rR   r   ArgumentNodeincorrect_orderr   r?   r   anyr   r   BaseNoder}   rA   formatexpand_default_kwargs)r+   r   r   r   Zreduced_posZ
reduced_kwr   r  Zreduced_keyZreduced_valZfinal_kwr.   r]   r/   r   M  s*   	


z InterpreterBase.reduce_arguments*T.Dict[str, T.Optional[InterpreterObject]]c                 C  sx   d|vr|S t |d}t|tstdd|v rtd| D ]\}}||v r2td| d| |||< q"|S )Nr   z%Value of "kwargs" must be dictionary.zWKwargs argument must not contain a "kwargs" entry. Points for thinking meta, though. :PzEntry "z<" defined both as a keyword argument and in a "kwarg" entry.)r   poprR   r   r   r   r   )r+   r   Z	to_expandr   r   r.   r.   r/   rP  l  s   
z%InterpreterBase.expand_default_kwargsmparser.AssignmentNodec                 C  sr   t |tjsJ | jdkrttd|jj}t |t	s!td| 
|j}t |tr1t|}| || d S )Nr   z                Tried to assign values inside an argument list.
                To specify a keyword argument, use : instead of =.
            z(Tried to assign value to a non-variable.)rR   r   r   r?   r   textwrapdedentr&  rf   r&   r}   r
   copydeepcopyr"  )r+   rw   r&  rf   r.   r.   r/   r   z  s   



zInterpreterBase.assignmentF)	holderifyr'  variablerX  c                C  s   |d u rt d|r| |}nt|ts#td| dt|j t|ts,t dt	
d|d u r:t d| || jv rGt d| d|| j|< d S )	Nz Can not assign void to variable.zDset_variable in InterpreterBase called with a non InterpreterObject r4  z0First argument to set_variable must be a string.z[_a-zA-Z][_0-9a-zA-Z]*$zInvalid variable name: z&Tried to overwrite internal variable "r2  )r   r   rR   r   r   r   r   r0   r&   r  r  r;   r>   )r+   r'  rY  rX  r.   r.   r/   r"    s   


zInterpreterBase.set_variablec                 C  s8   || j v r
| j | S || jv r| j| S td| d)NzUnknown variable "rD  )r;   r>   r   )r+   r'  r.   r.   r/   r     s
   



zInterpreterBase.get_variablebuildtargetmesonlib.HoldableObjectc                 C  s   t d)NzJvalidate_extraction is not implemented in this context (please file a bug))r   )r+   rZ  r.   r.   r/   r7    s   z#InterpreterBase.validate_extraction)r5   r&   r6   r&   r7   r8   )T)rC   rD   r'   r(   )r'   r(   )r   N)rw   r_   ru   rx   r[   ry   r'   r(   )r   r   r'   r   )r   r   r'   r   )r   r   r'   r   )r   r   r'   r   )rw   r   r'   r   )rw   r   r'   r   )rw   r   r'   r   )r   r   r'   r   )r   r   r'   r   )r   r   r'   r   )r   r   r'   r   )rw   r  r'   r   )rw   r  r'   r   )rw   r  r'   r   )rw   r  r'   r(   )rw   r%  r'   r(   )rw   r(  r'   r   )rw   r,  r'   r   )rw   r1  r'   r   )r   r;  r'   r   )r   rA  r   rB  r'   rC  )re   r&   r'   r(   )r   rE  r   rF  r   rG  r'   rH  )r   rQ  r'   rQ  )rw   rS  r'   r(   )r'  r&   rY  r;  rX  rD   r'   r(   )r'  r&   r'   r   )rZ  r[  r'   r(   )(r0   r1   r2   r*   rF   rZ   r^   rt   rv   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   rP  r   r"  r   r7  r.   r.   r.   r/   r4   P   sR    




"

;








	











r4   )@
__future__r    r   r   r   baseobjectsr   r	   r
   r   r   r   r   
exceptionsr   r   r   r   r   r   
decoratorsr   disablerr   r   helpersr   r   r   r   r   r   r   rJ   rV  r  rj   typingr=  rT  TYPE_CHECKINGr   r    r!   r"   interpreterr#   DictUnionTypeHoldableObjectrx   rD   r&   r  r   CallableZHolderMapTyperN  ListFunctionTyper$   r4   r.   r.   r.   r/   <module>   sF   $ 	 
	$