o
    uJAfH                     @  s  d dl mZ d dlZd dlZd dlZddlmZmZ ddl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 ddlmZmZmZmZmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$ ej%rd	d
l&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.m/Z/m0Z0m1Z1 G dd deZ2G dd deZ3G dd deZ4G dd deZ5G dd deZ6G dd deZ7d Z8d	Z9e:dZ;e:dZ<G dd deZ=dS )    )annotationsN   )mparsermesonlib)environment)MesonInterpreterObjectInterpreterBaseInvalidArgumentsBreakRequestContinueRequestDisablerdefault_resolve_key)StringHolderBooleanHolderIntegerHolderArrayHolder
DictHolder)ArgumentNodeArithmeticNode	ArrayNodeAssignmentNodeBaseNodeElementaryNode	EmptyNodeIdNode
MethodNodeNotNodePlusAssignmentNodeTernaryNodeTestCaseClauseNode   )
AstVisitor)Interpreter)TYPE_nkwargs	TYPE_nvar)AndNodeComparisonNodeForeachClauseNodeIfClauseNode	IndexNodeOrNode
UMinusNodec                   @     e Zd ZdS )DontCareObjectN__name__
__module____qualname__ r2   r2   ?/usr/lib/python3.10/site-packages/mesonbuild/ast/interpreter.pyr-   J       r-   c                   @  r,   )MockExecutableNr.   r2   r2   r2   r3   r5   M   r4   r5   c                   @  r,   )MockStaticLibraryNr.   r2   r2   r2   r3   r6   P   r4   r6   c                   @  r,   )MockSharedLibraryNr.   r2   r2   r2   r3   r7   S   r4   r7   c                   @  r,   )MockCustomTargetNr.   r2   r2   r2   r3   r8   V   r4   r8   c                   @  r,   )MockRunTargetNr.   r2   r2   r2   r3   r9   Y   r4   r9   _T_Vc                      sH  e Zd Zdsdt fdd	ZduddZdvddZdwddZdx fddZdydd Zdzd!d"Z	d{d$d%Z
d|d)d*Zd}d-d.Zd~d0d1Zdd3d4Zdd7d8Zdd:d;Zdd=d>Zdd@dAZedfddHdIZddKdLZddNdOZddQdRZddTdUZddWdXZddZd[Zdd]d^Zdd`daZdddgdhZdddkdlZdddmdnZddqdrZ   Z!S )AstInterpreterNsource_rootstrsubdir
subprojectvisitorsT.Optional[T.List[AstVisitor]]c                   s  t  ||| |d ur|ng | _t | _i | _i | _i | _| j	i d| j
d| j
d| j
d| j
d| j
d| j
d| j
d| j
d	| j
d
| j
d| j
d| j
d| j
d| j
d| j
d| j
d| j
i d| j
d| j
d| j
d| j
d| j
d| j
d| j
d| j
d| j
d| j
d| j
d| j
d| j
d| j
d | j
d!| j
d"| j
i d#| j
d$| j
d%| j
d&| j
d'| j
d(| j
d)| jd*| j
d+| j
d,| j
d-| j
d.| j
d/| j
d0| j
d1| j
d2| j
d3| j
| j
| j
| j
| j
| j
| j
| j
| j
d4 d S )5Nprojecttest	benchmarkZinstall_headersZinstall_manZinstall_datainstall_subdirZinstall_symlinkZinstall_emptydirZconfiguration_dataZconfigure_fileZfind_programinclude_directoriesZadd_global_argumentsZadd_global_link_argumentsZadd_project_argumentsZadd_project_dependenciesZadd_project_link_argumentsmessage	generatorerrorZrun_commandassertr@   Z
dependency
get_optionZ
join_pathsr   importZvcs_tagZadd_languagesZdeclare_dependencyfiles
executableZstatic_libraryZshared_librarylibraryZbuild_targetZcustom_targetZ
run_targetr?   set_variableget_variableunset_variableis_disablerZis_variabledisablerjarwarningZshared_moduleoption)Zboth_librariesZadd_test_setupZsubdir_doneZalias_targetZsummaryrangestructured_sourcesdebug)super__init__rA   setprocessed_buildfilesassignmentsassign_valsreverse_assignmentfuncsupdatefunc_do_nothingfunc_subdir)selfr=   r?   r@   rA   	__class__r2   r3   r]   c   s   	
 !"#$%&'()*+,-./0123zAstInterpreter.__init__argsr:   kwargsr;   returnT.Tuple[_T, _V]c                 C  s   ||fS Nr2   )rg   rj   rk   r2   r2   r3   _unholder_args   s   zAstInterpreter._unholder_argsresc                 C  s   |S rn   r2   )rg   rp   r2   r2   r3   
_holderify      zAstInterpreter._holderifynoder   T.List[TYPE_nvar]T.Dict[str, TYPE_nvar]boolc                 C     dS NTr2   )rg   rs   rj   rk   r2   r2   r3   re      rr   zAstInterpreter.func_do_nothingNonec                   s&   t    | jD ]}| j| qd S rn   )r\   load_root_meson_filerA   astaccept)rg   irh   r2   r3   rz      s   

z#AstInterpreter.load_root_meson_filec              
   C  s  |  |}t|dkst|d tstjd| d d S | j}tj	
||d }tj	
| j|}tj	
|tj}tj	
| j|}tj	|}	tj	
|	d}
|
| jv ratjd|d  d S | j|
 tj	|sytjd| d d S t|d	d
}| }W d    n1 sw   Y  t|tsJ z
t|| }W n tjy } z||_|d }~ww || _| jD ]}|| q| | || _d S )Nr    r   zUnable to evaluate subdir(z!) in AstInterpreter --> Skipping
zmeson.buildz?Trying to enter {} which has already been visited --> Skipping
zUnable to find build file z --> Skipping
zutf-8)encoding)flatten_argslen
isinstancer>   sysstderrwriter?   ospathjoinr=   r   build_filenamerealpathr_   formataddisfileopenreadr   Parserparser   MesonExceptionfilerA   r|   evaluate_codeblock)rg   rs   rj   rk   Zprev_subdirr?   absdirZbuildfilenameZabsnameZsymlinkless_dirZ
build_filefcode	codeblockmer}   r2   r2   r3   rf      sD   





zAstInterpreter.func_subdirc                 C  rw   rx   r2   rg   rs   r2   r2   r3   method_call   rr   zAstInterpreter.method_callmparser.FormatStringNodec                 C  s   t |tjsJ |jS rn   )r   r   FormatStringNodevaluer   r2   r2   r3   evaluate_fstring   s   zAstInterpreter.evaluate_fstringcurmparser.ArrayNoder$   c                 C  s   |  |jd S Nr   )reduce_argumentsrj   rg   r   r2   r2   r3   evaluate_arraystatement   s   z&AstInterpreter.evaluate_arraystatementr   intc                 C     |  |j |  |j dS r   evaluate_statementleftrightr   r2   r2   r3   evaluate_arithmeticstatement      z+AstInterpreter.evaluate_arithmeticstatementr+   c                 C     |  |j dS r   r   r   r   r2   r2   r3   evaluate_uminusstatement      z'AstInterpreter.evaluate_uminusstatementr   c                 C  s6   t |tsJ | |j | |j | |j d S rn   )r   r   r   	condition	trueblock
falseblockr   r2   r2   r3   evaluate_ternary   s   zAstInterpreter.evaluate_ternarymparser.DictNoder#   c                 C  sl   d	dd}| j |j|d\}}|rJ |  jd7  _| D ]\}}t|tr,| | q|  jd8  _i S )
Nrs   mparser.BaseNoderl   r>   c                 S  s   t | tjr	| jS dS )NZ__AST_UNKNOWN__)r   r   BaseStringNoder   )rs   r2   r2   r3   resolve_key   s   z:AstInterpreter.evaluate_dictstatement.<locals>.resolve_key)key_resolverr    )rs   r   rl   r>   )r   rj   argument_depthitemsr   r   r   )rg   rs   r   	argumentsrk   keyr   r2   r2   r3   evaluate_dictstatement   s   


z%AstInterpreter.evaluate_dictstatementr   c                 C  N   t |tsJ |j| j|jj< |jjr|| j|jj< | |j| j|jj< d S rn   )	r   r   r   r`   var_nameast_idrb   r   ra   r   r2   r2   r3   evaluate_plusassign   s
   z"AstInterpreter.evaluate_plusassignr)   c                 C  rw   r   r2   r   r2   r2   r3   evaluate_indexing  rr   z AstInterpreter.evaluate_indexing	func_namec                 C  s   d S rn   r2   )rg   r   r2   r2   r3   unknown_function_called  rr   z&AstInterpreter.unknown_function_calledmparser.ArgumentNoder   #T.Callable[[mparser.BaseNode], str]duplicate_key_errorT.Optional[str](T.Tuple[T.List[TYPE_nvar], TYPE_nkwargs]c                 C  s\   t |tr'i }|j D ]
\}}||||< q| rtd| |j|fS | |i fS )Nz9All keyword arguments must be after positional arguments.)r   r   rk   r   incorrect_orderr	   r   r   )rg   rj   r   r   rk   r   valr2   r2   r3   r     s   
zAstInterpreter.reduce_argumentsr&   c                 C  r   NFr   r   r2   r2   r3   evaluate_comparison  r   z"AstInterpreter.evaluate_comparisonr%   c                 C  r   r   r   r   r2   r2   r3   evaluate_andstatement#  r   z$AstInterpreter.evaluate_andstatementr*   c                 C  r   r   r   r   r2   r2   r3   evaluate_orstatement(  r   z#AstInterpreter.evaluate_orstatementr   c                 C  r   r   r   r   r2   r2   r3   evaluate_notstatement-  r   z$AstInterpreter.evaluate_notstatementr'   c                 C  s:   z	|  |j W d S  ty   Y d S  ty   Y d S w rn   )r   blockr   r
   r   r2   r2   r3   evaluate_foreach1  s   zAstInterpreter.evaluate_foreachr(   c                 C  s:   |j D ]}| |j qt|jts| |jj d S d S rn   )ifsr   r   r   	elseblockr   )rg   rs   r}   r2   r2   r3   evaluate_if9  s
   
zAstInterpreter.evaluate_ifvarnamec                 C  rw   r   r2   )rg   r   r2   r2   r3   rR   ?  rr   zAstInterpreter.get_variabler   c                 C  r   rn   )	r   r   r   r`   r   r   rb   r   ra   r   r2   r2   r3   
assignmentB  s
   zAstInterpreter.assignmentFinclude_unknown_argsid_loop_detectT.Optional[T.List[str]]T.Optional[T.Any]c                   s  dd fdd |d u rg }d }t |tsd S |jsJ |j|v r$d S ||jg7 }t |tr4 |}nt |tr=|j}nt |trS|j||}t |trR| }nt |t	r_|j
j }nt |trj|j }nt |tr|jd	krvd S |j||}|j||}t |trt |tr|| }n|||||| }nt |tr2 |j}|j
j||}i }	|jj}
zgt |trt|td
|
||	}nQt |trt|td
|
||	}n=t |trt|td
|
||	}n)t |trt|td
|
||	}nt |t r$t!|td
|
||	}W n t"j#y1   Y d S w t |trA|||}|S t |trsg }|D ]%}t |trj|||}|d urh||||7 }qK||g7 }qK|}|S )Nnr   loop_detectr   rl   T.Anyc                   sp   |d u rg }t | tr.t | jtsJ | j|v s| jjvr g S  j| j || jg dS t | tr6| jS | S )N)r   )r   r   r   r>   r`   r   )r   r   quick_resolverg   r2   r3   r   J  s   

z2AstInterpreter.resolve_node.<locals>.quick_resolver   r"   rn   )r   r   r   r   rl   r   )$r   r   r   r   r   r   r   resolve_noderv   r   rj   r   copyr   r   	operationr   r   r>   r   r   source_objectnamer   Tcastr   r   r   r   listr   dictr   r   r   )rg   rs   r   r   resultlrsrcZmargsZmkwargsmethod_nameZnew_resr}   resolvedr2   r   r3   r   I  s   

















zAstInterpreter.resolve_nodeargs_raw)T.Union[TYPE_nvar, T.Sequence[TYPE_nvar]]c                 C  s   t |tr|}n|g}g }|D ]/}t |tr.| |||}|d ur-t |ts)|g}||7 }qt |ttttfs9|r>||g7 }q|S rn   )r   r   r   r   r>   rv   r   float)rg   r   r   r   rj   Zflattened_argsr}   r   r2   r2   r3   r     s    



zAstInterpreter.flatten_argsc                 C  s`   i }|  D ]'\}}t|tr| ||}|d ur|||< qt|ttttfs)|r-|||< q|S rn   )r   r   r   r   r>   rv   r   r   )rg   rk   r   Zflattened_kwargsr   r   r   r2   r2   r3   flatten_kwargs  s   
zAstInterpreter.flatten_kwargsr   Disabler | Nonec                 C  s   t | jdS )N)r@   )r   r@   r   r2   r2   r3   evaluate_testcase  s   z AstInterpreter.evaluate_testcasern   )r=   r>   r?   r>   r@   r>   rA   rB   )rj   r:   rk   r;   rl   rm   )rp   r:   rl   r:   )rs   r   rj   rt   rk   ru   rl   rv   )rl   ry   )rs   r   rj   rt   rk   ru   rl   ry   )rs   r   rl   rv   )rs   r   rl   r>   )r   r   rl   r$   )r   r   rl   r   )r   r+   rl   r   )rs   r   rl   ry   )rs   r   rl   r#   )rs   r   rl   ry   )rs   r)   rl   r   )r   r>   rl   ry   )rj   r   r   r   r   r   rl   r   )rs   r&   rl   rv   )r   r%   rl   rv   )r   r*   rl   rv   )r   r   rl   rv   )rs   r'   rl   ry   )rs   r(   rl   ry   )r   r>   rl   r   )rs   r   rl   ry   )FN)rs   r   r   rv   r   r   rl   r   )r   r   r   rv   r   r   rl   rt   )F)rk   ru   r   rv   rl   ru   )rs   r   rl   r   )"r/   r0   r1   r]   ro   rq   re   rz   rf   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rR   r   r   r   r   r   __classcell__r2   r2   rh   r3   r<   b   s@    
D



$
















Yr<   )>
__future__r   r   r   typingr    r   r   r   interpreterbaser   r   r	   r
   r   r   r   interpreterr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   TYPE_CHECKINGvisitorr!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r-   r5   r6   r7   r8   r9   Z
ADD_SOURCEZREMOVE_SOURCETypeVarr:   r;   r<   r2   r2   r2   r3   <module>   s2   $
<$


