o
    ldx                  	   @  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mZ ddlmZ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 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- 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InterpreterObjectTypeVarObjectHolderIterableObjectContextManagerObjectHoldableTypes)BreakRequestContinueRequestInterpreterExceptionInvalidArgumentsInvalidCodeMesonExceptionSubdirDoneRequest)
FeatureNew)Disableris_disabled)default_resolve_keyflattenresolve_second_level_holders)MesonOperator	_unholderN)
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__ home/ych/rk3568/buildroot/output/rockchip_rk3568_recovery/host/lib/python3.10/site-packages/mesonbuild/interpreterbase/interpreterbase.pyr*   N   s   zInvalidCodeOnVoid.__init__)r%   r&   r'   r(   )__name__
__module____qualname__r*   __classcell__r.   r.   r,   r/   r$   L   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*   S   s   
zInterpreterBase.__init__Tstrictboolr'   r(   c                 C  s   d S Nr.   )r+   rC   r.   r.   r/   handle_meson_version_from_asti   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	mesonfilemfcodemer.   r.   r/   load_root_meson_filem   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   t | jtjstd| jjstd| jjd }t |tjr$|jdkr}t	| j
 }|}|jD ]3}|d  rdt|d dd}| drT|}	 W d     nW d    n1 s^w   Y  q1 d	}||krvtd
| d| dtd| d S )Nz5AST is of invalid type. Possibly a bug in the parser.zNo statements in code.r   projectzmeson.buildrG   rH   zproject(z+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: )rR   rU   r   CodeBlockNoder   linesFunctionNode	func_namepathlibPathr5   resolveparentsis_filerO   readline
startswith)r+   firstpfoundparentf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nodemparser.CodeBlockNoders   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   ra   r   ry   colnorb   lenr@   evaluate_statement	ExceptiongetattrrA   rJ   rK   rL   r5   r6   r   rM   rW   )r+   ru   rs   r\   eZ
statementsicurr.   r.   r/   r]      s0   

z"InterpreterBase.evaluate_codeblockr   mparser.BaseNodeT.Optional[InterpreterObject]c                 C  sF  || _ t|tjr| |S t|tjr| | d S t|tjr&| |S t|tj	r2| 
|jS t|tjr>| 
|jS t|tjrI| |S t|tjrU| |jS t|tjr`| |S t|tjrk| |S t|tjrv| |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| %| d S t|tj&r| '|S t|tj(r| )|S t|tj*rt|tj+r| ,|S | -|S t|tj.r	t/ t|tj0rt1 t|tj2r| 3|S t4d)NzUnknown statement.)5rA   rR   r   rc   function_callAssignmentNode
assignmentZ
MethodNodemethod_call
StringNode
_holderifyvalueZBooleanNodeIfClauseNodeevaluate_ifIdNodeget_variableZComparisonNodeevaluate_comparisonZ	ArrayNodeevaluate_arraystatementZDictNodeevaluate_dictstatementZ
NumberNodeZAndNodeevaluate_andstatementZOrNodeevaluate_orstatementZNotNodeevaluate_notstatementZ
UMinusNodeevaluate_uminusstatementZArithmeticNodeevaluate_arithmeticstatementForeachClauseNodeevaluate_foreachPlusAssignmentNodeevaluate_plusassign	IndexNodeevaluate_indexingTernaryNodeevaluate_ternaryFormatStringNodeZMultilineFormatStringNodeevaluate_multiline_fstringevaluate_fstringZContinueNoder   Z	BreakNoder   ZTestCaseClauseNodeevaluate_testcaser   )r+   r   r.   r.   r/   r|      sn   

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   Z
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|   r   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 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   Zproject_meson_versionsr7   r]   blockZ	elseblockZ	EmptyNode)r+   ru   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+   ru   r   r.   r.   r/   r   5  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 rM||}}||_| ||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   rR   r   rightr   INZNOT_INZEQUALSZ
NOT_EQUALSGREATERLESSZGREATER_EQUALSZLESS_EQUALSctyperA   r   r   r   )r+   ru   Zval1Zval2operatorr.   r.   r/   r   ?  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 r1tdt|tr8|S | |tjd S Nr   r   
r|   r   r   rR   r   r   r   r   r   r   r+   r   lZl_boolrr.   r.   r/   r   ^     


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 r1tdt|tr8|S | |tjd S r   r   r   r.   r.   r/   r   n  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|   r   r$   rR   r   rA   r   r   r   Z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mulZdivmod)r|   r   rR   r   r   r$   Z	operationr   PLUSMINUSZTIMESZDIVZMODrA   r   r   r   )r+   r   r   r   mappingr   r.   r.   r/   r     s"   



z,InterpreterBase.evaluate_arithmeticstatementmparser.TernaryNodec                 C  sj   t |tjsJ | |j}|d u rtdt |tr|S ||_|t	j
d }|r/| |jS | |jS )Nz>Cannot use a void statement as condition for ternary operator.)rR   r   r   r|   r   r   r   rA   r   r   r   Z	trueblockZ
falseblock)r+   ru   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+   ru   r.   r.   r/   r     s   
z*InterpreterBase.evaluate_multiline_fstringzformat stringsz0.58.0mparser.FormatStringNodec                   s8   t |tjsJ d fdd}td||j} |S )	NmatchT.Match[str]r'   r&   c                   sl   t | d}zt j| }t|t tttfs"td| dd t |W S  t	y5   td| dw )Nr   zIdentifier "z'" does not name a formattable variable zG(has to be an integer, a string, a floating point number or a boolean).z" does not name a variable.)
r&   groupr   r>   rR   rw   floatrD   r   KeyError)r   varvalr^   r.   r/   replace  s   
z1InterpreterBase.evaluate_fstring.<locals>.replacez@([_a-zA-Z][_0-9a-zA-Z]*)@)r   r   r'   r&   )rR   r   r   rer   r   r   )r+   ru   r   r   r.   r^   r/   r     s   
z InterpreterBase.evaluate_fstringmparser.ForeachClauseNodec              	   C  sV  t |tjsJ | |j}t |tstd| }t|j	|p"dkr2td|p)d d|
  | D ]r}|d u rWt |trJtd| d| |j	d | | n6t |tsgtd| d| t||krxtd| d| t|D ]}| |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   Ziter_tuple_sizer{   varnamesdisplay_nameZ	iter_selftupler   r   set_variabler   ranger]   r   r   r   )r+   ru   r   Ztsizer   jr.   r.   r/   r     s4   


z InterpreterBase.evaluate_foreachmparser.PlusAssignmentNodec                 C  sj   t |tjsJ |j}| |j}|d u rtd| |}||_| 	|
tjt|}| || d S )Nzplus assign)rR   r   r   var_namer|   r   r$   r   rA   r   r   r   r   r   r   )r+   ru   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   ZINDEX)r+   ru   r  Zindex_holderr  r.   r.   r/   r     s   
z!InterpreterBase.evaluate_indexingmparser.FunctionNodec           
      C  s   |j }| |j\}}| ||\}}t||r|dvrt S || jv rV| j| }|}t|dds5t|}t|ddsBt	||\}}|| _
||||}	|	d urT| |	S d S | | d S )N>   r   r   Zis_disablerZunset_variablezno-args-flatteningFz!no-second-level-holder-flattening)rd   r   r   _unholder_argsr   r   r:   r~   r   r   rA   r   unknown_function_called)
r+   ru   rd   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\}}| ||\}}	t||	r;t S t|tsGt| d|dkrit|trW| |j nt|tsitd| dt|j | |_| _||||	}
|
d ur| |
S d S )Nz
variable ""z is not callable.Zextract_objectsz'Invalid operation "extract_objects" on 	 of type )Zsource_objectrR   r   r   r   r   r-   r0   r|   namer   r   r  r   r   r   r   r   validate_extractionZheld_objectr   rA   r   r   )r+   ru   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 r  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   )  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   ?  r   z2InterpreterBase._unholder_args.<locals>.<listcomp>c                 S  r   r.   r   r   r.   r.   r/   r   ?  r   z2InterpreterBase._unholder_args.<locals>.<dictcomp>)r   )r+   r   r   r.   r.   r/   r  <  s    zInterpreterBase._unholder_argsrd   c                 C  s   t d| d)NzUnknown function "".)r   )r+   rd   r.   r.   r/   r  A  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   Q  s    z4InterpreterBase.reduce_arguments.<locals>.<listcomp>c                 s  s    | ]}|d u V  qd S rE   r.   r   r.   r.   r/   	<genexpr>R  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   ZArgumentNodeZ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   D  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/   r$  c  s   
z%InterpreterBase.expand_default_kwargsmparser.AssignmentNodec                 C  sp   t |tjsJ | jdkrttd|j}t |ts td| 	|j
}t |tr0t|}| || 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   r&   r|   r   r
   copydeepcopyr   )r+   ru   r   r   r.   r.   r/   r   q  s   



zInterpreterBase.assignmentF)	holderifyr  variabler,  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 r  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 "r  )r   r   rR   r   r   r   r   r0   r&   r   r   r;   r>   )r+   r  r-  r,  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 "r  )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+   r.  r.   r.   r/   r    s   z#InterpreterBase.validate_extraction)r5   r&   r6   r&   r7   r8   )T)rC   rD   r'   r(   )r'   r(   )r   N)ru   rv   rs   rw   r\   rx   r'   r(   )r   r   r'   r   )r   r   r'   r   )r   r   r'   r   )r   r   r'   r   )ru   r   r'   r   )ru   r   r'   r   )ru   r   r'   r   )r   r   r'   r   )r   r   r'   r   )r   r   r'   r   )r   r   r'   r   )ru   r   r'   r   )ru   r   r'   r   )ru   r   r'   r   )ru   r   r'   r(   )ru   r   r'   r(   )ru   r  r'   r   )ru   r  r'   r   )ru   r
  r'   r   )r   r  r'   r   )r   r  r   r  r'   r  )rd   r&   r'   r(   )r   r  r   r  r   r  r'   r  )r   r%  r'   r%  )ru   r'  r'   r(   )r  r&   r-  r  r,  rD   r'   r(   )r  r&   r'   r   )r.  r/  r'   r(   )(r0   r1   r2   r*   rF   r[   r_   rr   rt   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/   r4   R   sR    






9








	











r4   )@
__future__r    r   r   r   Zbaseobjectsr   r	   r
   r   r   r   r   r   
exceptionsr   r   r   r   r   r   r   Z
decoratorsr   Zdisablerr   r   helpersr   r   r   r   r   r   rJ   r*  r   re   typingr  r(  TYPE_CHECKINGr    r!   r"   interpreterr#   DictUnionTypeZHoldableObjectrw   rD   r&   listr   CallableZHolderMapTyper"  ListFunctionTyper$   r4   r.   r.   r.   r/   <module>   sF   ($
 
	$