o
    uJAf˫                     @  s  d dl mZ ddlmZmZmZmZmZmZ d dl	m
Z
m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mZmZmZmZ d dlZd dlZd dlZd dl Z d dl!Z"e"j#rcdd	lm$Z$ G d
d de
Z%dNddZ&G dd dZ'dOddZ(G dd dZ)G dd de)Z*G dd de)Z+G dd de)Z,G dd de)Z-G d d! d!e-Z.G d"d# d#e-Z/e0dd$d%gfe1i dfd&e0ddfe0ddfe0dg d'fe1i dfd(e0ddfe0dg d)fe2g dfe0d*dfe0d+g d,fd-d.Z3e*e*e+e*e+e+e.e.d/e+e*e/e+e/e+e+e+e*e*e+d0e.e*e.e*e*d1d2Z4G d3d4 d4Z5d5d6d7d8d9d:d;d<Z6dPd@dAZ7dQdCdDZ8dQdEdFZ9dQdGdHZ:dQdIdJZ;e8e8e9e:e:e;e;dKZ<dLdM Z=dS )R    )annotations   )IntrospectionInterpreterBUILD_TARGET_FUNCTIONSAstConditionLevelAstIDGeneratorAstIndentationGenerator
AstPrinter)MesonExceptionsetup_vsenv)mlogenvironmentwraps)Token	ArrayNodeArgumentNodeAssignmentNodeBaseStringNodeBooleanNodeElementaryNodeIdNodeFunctionNode
StringNode
SymbolNodeN)BaseNodec                   @  s   e Zd ZdS )RewriterExceptionN)__name__
__module____qualname__ r    r    8/usr/lib/python3.10/site-packages/mesonbuild/rewriter.pyr   %   s    r   c                 C  s  | j ddtdddd | j ddd	d
dd | j dddd	d
dd | jdddd}|jddgd|d}|j dddddd |j dd td d! d" d#d$d% |j dd&d' |j d(g d)d*d+ |j d,d-d.d/ |jd0d1|d2}|j d(td0 d( d" d*d+ |j d3tt d4d+ |j d5d6d' |j d0d-d7d/ |jd8d9gd:|d}|j d(td; d( d" d*d+ |j d<d-d=d/ |jd>d?gd@|d}|j dAdBd' d S )CNz-sz--sourcedir.ZSRCDIRzPath to source directory.)typedefaultmetavarhelpz-Vz	--verbose
store_trueFzEnable verbose output)actionr$   r&   z-Sz--skip-errorsskipzSkip errors instead of aborting)destr(   r$   r&   r#   zRewriter commandszRewrite command to execute)r*   titledescriptiontargettgtzModify a target)aliasesr&   formatter_classz--subdir subdirzASubdirectory of the new target (only for the "add_target" action))r$   r*   r&   z--typetgt_typetarget_type   
executablez<Type of the target to add (only for the "add_target" action))r*   choicesr$   r&   zName or ID of the target)r&   	operationaddrm
add_targetZ	rm_targetZadd_extra_filesZrm_extra_filesinfozAction to execute)r7   r&   sources*zSources to add/remove)nargsr&   kwargszModify keyword arguments)r&   r0   functionzFunction type to modifyidz<ID of the function to modify (can be anything for "project")zPairs of keyword and valuedefault-optionsdefz"Modify the project default optionsdefault_optionsoptionsz(Key, value pairs of configuration optioncommandcmdz Execute a JSON array of commandsjsonzJSON string or file to execute)add_argumentstradd_subparsers
add_parserrewriter_keyslistrewriter_func_kwargskeys)parser	formatter
subparsersZ
tgt_parserZ	kw_parserZ
def_parserZ
cmd_parserr    r    r!   add_arguments*   s<   rV   c                   @  s   e Zd Zdd Zdd ZdS )RequiredKeysc                 C  s
   || _ d S N)rR   )selfrR   r    r    r!   __init__N      
zRequiredKeys.__init__c                   s   t   fdd}|S )Nc               	     s   t | dksJ | d }j D ]X\}}|d }|d }|d }||vr7|d ur.|||< n	td| jt|| |sMtd||jt|| j|d urit|tsXJ || |vritd|||| q | i |S )Nr5   r   r   z$Key "{}" is missing in object for {}z8Invalid type of "{}". Required is {} but provided was {}zCInvalid value of "{}": Possible values are {} but provided was "{}")	lenrR   itemsr   formatr   
isinstancer#   rP   )wrapped_argswrapped_kwargsrI   keyvaltypr$   r7   frY   r    r!   wrappedR   s0   

z&RequiredKeys.__call__.<locals>.wrappedr   )rY   rf   rg   r    re   r!   __call__Q   s   zRequiredKeys.__call__N)r   r   r   rZ   rh   r    r    r    r!   rW   M   s    rW   rc   rL   returnr   c              	   C  s   t tdddddd| S )Nr1   r   r   r   )r   r   )rc   r    r    r!   _symboll      rk   c                   @  sX   e Zd ZddddZdd Zdd	 Zd
d Zdd Zdd Zdd Z	dd Z
dd ZdS )	MTypeBaseNnodeT.Optional[BaseNode]c                 C  sD   |d u r
|   | _n|| _d | _|  D ]}t| j|r|| _qd S rX   )	_new_nodern   	node_typesupported_nodesr_   )rY   rn   ir    r    r!   rZ   p   s   zMTypeBase.__init__c                 C     t d)Nz1Internal error: _new_node of MTypeBase was calledr   rY   r    r    r!   rp   z      zMTypeBase._new_nodec                 C  s
   | j d uS rX   )rq   rv   r    r    r!   
can_modify~   r[   zMTypeBase.can_modifyc                 C  s   | j S rX   )rn   rv   r    r    r!   get_node      zMTypeBase.get_nodec                 C     g S rX   r    rv   r    r    r!   rr         zMTypeBase.supported_nodesc                 C     t dt t| jd d S )NzCannot set the value of type--> skippingr   warningboldr#   r   rY   valuer    r    r!   	set_value      zMTypeBase.set_valuec                 C  r}   )NzCannot add a value of typer~   r   r   r    r    r!   	add_value   r   zMTypeBase.add_valuec                 C  r}   )NzCannot remove a value of typer~   r   r   r    r    r!   remove_value   r   zMTypeBase.remove_valuec                 C  r}   )NzCannot remove a regex in typer~   r   r   r    r    r!   remove_regex   r   zMTypeBase.remove_regexrX   rn   ro   )r   r   r   rZ   rp   rx   ry   rr   r   r   r   r   r    r    r    r!   rm   o   s    
rm   c                      8   e Zd Zdd fddZdd Zdd	 Zd
d Z  ZS )MTypeStrNrn   ro   c                      t  | d S rX   superrZ   rY   rn   	__class__r    r!   rZ         zMTypeStr.__init__c              	   C     t tdddddd dS Nr1   r   r   r   rv   r    r    r!   rp      rl   zMTypeStr._new_nodec                 C     t gS rX   r   rv   r    r    r!   rr      rz   zMTypeStr.supported_nodesc                 C     t || j_d S rX   rL   rn   r   r   r    r    r!   r      r   zMTypeStr.set_valuerX   r   r   r   r   rZ   rp   rr   r   __classcell__r    r    r   r!   r      
    r   c                      r   )	MTypeBoolNrn   ro   c                   r   rX   r   r   r   r    r!   rZ      r   zMTypeBool.__init__c              	   C  s   t tdddddd dS )Nr1   r   F)r   r   rv   r    r    r!   rp      rl   zMTypeBool._new_nodec                 C  r   rX   )r   rv   r    r    r!   rr      rz   zMTypeBool.supported_nodesc                 C  r   rX   )boolrn   r   r   r    r    r!   r      r   zMTypeBool.set_valuerX   r   r   r    r    r   r!   r      r   r   c                      r   )MTypeIDNrn   ro   c                   r   rX   r   r   r   r    r!   rZ      r   zMTypeID.__init__c              	   C  r   r   r   r   rv   r    r    r!   rp      rl   zMTypeID._new_nodec                 C  r   rX   r   rv   r    r    r!   rr      rz   zMTypeID.supported_nodesc                 C  r   rX   r   r   r    r    r!   r      r   zMTypeID.set_valuerX   r   r   r    r    r   r!   r      r   r   c                      s   e Zd Zd$d% fddZdd Zdd	 Zd
d Zd&ddZd'ddZdd Z	dd Z
dd Zdd Zdd Zdd Zd d! Zd(d"d#Z  ZS ))	MTypeListNrn   ro   c                   r   rX   r   r   r   r    r!   rZ      r   zMTypeList.__init__c                 C  s(   t tdttdddddd dtdS )N[r1   r   ])r   rk   r   r   rv   r    r    r!   rp      s   (zMTypeList._new_nodec                 C  rt   )Nz9Internal error: _new_element_node of MTypeList was calledru   r   r    r    r!   _new_element_node   rw   zMTypeList._new_element_nodec                 C  s8   t | jts| j}|  | _| jj j|g7  _d S d S rX   )r_   rn   r   rp   args	arguments)rY   tmpr    r    r!   _ensure_array_node   s
   
zMTypeList._ensure_array_noderi   r   c                 C     dS NFr    rY   rn   r   r    r    r!   _check_is_equal   r|   zMTypeList._check_is_equalregexrL   c                 C  r   r   r    rY   rn   r   r    r    r!   _check_regex_matches   r|   zMTypeList._check_regex_matchesc                 C  s2   t | jtrt| jjjdkr| jjjd S | jS )Nr   r   )r_   rn   r   r\   r   r   rv   r    r    r!   ry      s   zMTypeList.get_nodec                 C  r{   rX   r    rv   r    r    r!   supported_element_nodes   r|   z!MTypeList.supported_element_nodesc                 C  s   t g|   S rX   )r   r   rv   r    r    r!   rr      s   zMTypeList.supported_nodesc                 C  sJ   t |ts|g}|   g | jj_|D ]}| jj j| |g7  _qd S rX   r_   rP   r   rn   r   r   r   rY   r   rs   r    r    r!   r      s   

zMTypeList.set_valuec                 C  s@   t |ts|g}|   |D ]}| jj j| |g7  _qd S rX   r   r   r    r    r!   r      s   
zMTypeList.add_valuec                   s\    fdd}t tsg|   g }| jjjD ]|s&|g7 }q|| jj_d S )Nc                   s   D ]
} |r dS qdS )NTFr    )rn   j
equal_funcrs   r   r    r!   check_remove_node   s
   
z3MTypeList._remove_helper.<locals>.check_remove_node)r_   rP   r   rn   r   r   )rY   r   r   r   Zremoved_listr    r   r!   _remove_helper   s   

zMTypeList._remove_helperc                 C     |  || j d S rX   )r   r   r   r    r    r!   r        zMTypeList.remove_valuec                 C  r   rX   )r   r   )rY   r   r    r    r!   r     r   zMTypeList.remove_regexrX   r   ri   r   r   rL   ri   r   )r   rL   )r   r   r   rZ   rp   r   r   r   r   ry   r   rr   r   r   r   r   r   r   r    r    r   r!   r      s    

r   c                      D   e Zd Zdd fddZdd Zdd
dZdddZdd Z  ZS )MTypeStrListNrn   ro   c                   r   rX   r   r   r   r    r!   rZ     r   zMTypeStrList.__init__c              
   C     t tdddddd t|S r   )r   r   rL   r   r    r    r!   r        zMTypeStrList._new_element_noderi   r   c                 C     t |tr
|j|kS dS r   r_   r   r   r   r    r    r!   r        

zMTypeStrList._check_is_equalr   rL   c                 C      t |trt||jd uS dS r   r_   r   rematchr   r   r    r    r!   r        
z!MTypeStrList._check_regex_matchesc                 C  r   rX   r   rv   r    r    r!   r     rz   z$MTypeStrList.supported_element_nodesrX   r   r   r   	r   r   r   rZ   r   r   r   r   r   r    r    r   r!   r   
      

r   c                      r   )MTypeIDListNrn   ro   c                   r   rX   r   r   r   r    r!   rZ     r   zMTypeIDList.__init__c              
   C  r   r   )r   r   rL   r   r    r    r!   r   "  r   zMTypeIDList._new_element_noderi   r   c                 C  r   r   r_   r   r   r   r    r    r!   r   %  r   zMTypeIDList._check_is_equalr   rL   c                 C  r   r   r   r   r    r    r!   r   *  r   z MTypeIDList._check_regex_matchesc                 C  r   rX   r   rv   r    r    r!   r   /  rz   z#MTypeIDList.supported_element_nodesrX   r   r   r   r   r    r    r   r!   r     r   r   setdelete)r8   rG   )r   r   r:   remover   r=   rB   rC   r8   rA   )src_addsrc_rm	target_rm
target_addextra_files_addextra_files_rmr=   r1   r6   )both_librariesr6   jarlibraryshared_libraryshared_modulestatic_library)r-   r8   r>   r2   r4   rF   rA   r-   )languagemethodnativenot_found_messagerequiredstaticversionmodules)build_by_defaultbuild_rpathdependenciesgui_app	link_withexport_dynamicimplibinstallinstall_dirinstall_rpathpie)rF   meson_versionlicensesubproject_dirr   )
dependencyr-   projectc                   @  s   e Zd Zd1d2dd	Zd
d Zd3ddZdd Zdd Zdd Zd4ddZ	d5ddZ
eed dd  Zeed! d"d# Zd6d(d)Zeed d*d+ Zd,d- Zd.d/ Zd0S )7RewriterninjaF	sourcedirrL   	generatorskip_errorsr   c                 C  sZ   || _ t|d|t t t gd| _|| _g | _g | _g | _	| j
| j| jd| _d | _d S )Nr1   )visitorsr   )r   r   r   r   r   interpreterr   modified_nodesto_remove_nodesto_add_nodesprocess_default_optionsprocess_kwargsprocess_target	functions	info_dump)rY   r   r   r   r    r    r!   rZ   h  s   
zRewriter.__init__c              	   C  sb   t dt tj| jtj | j	
  t dt | j	jd  t dt | j	jd  d S )NzAnalyzing meson file:z  -- Project:descriptive_namez  -- Version:r   )r   logr   ospathjoinr   r   build_filenamer   analyzeproject_datacyanrv   r    r    r!   analyze_mesonv  s    
zRewriter.analyze_mesoncmd_typecmd_iddatadictc                 C  s6   | j d u ri | _ || j vri | j |< || j | |< d S rX   )r  )rY   r  r  r  r    r    r!   add_info|  s
   


zRewriter.add_infoc                 C  s*   | j d u rd S tjtj| j dd d S )Nr5   )indent)r  sysstderrwriterJ   dumpsrv   r    r    r!   
print_info  s   
zRewriter.print_infoc                 C  s.   | j rtdtdfS tdtdfS )Nz-->ZskippingZaborting)r   r   r  yellowredrv   r    r    r!   on_error  s   zRewriter.on_errorc                 C  s   | j rd S td)Nz Rewriting the meson.build failed)r   r
   rv   r    r    r!   handle_error  s   zRewriter.handle_errorr-   c              
     s   d fdd}||}|rHt |dkr|d S td	t| |D ]}td
t|d dt|d  q"tjdg  R      d S d }| jjv rg jj| }t|t	rg|j
jdv rg jj| }|S )NnamerL   ri   T.List[BaseNode]c                   s4   g } j jD ]}| |d |d hv r||g7 }q|S )Nr  rC   )r   targets)r  resultrs   rv   r    r!   
check_list  s   
z(Rewriter.find_target.<locals>.check_listr   r   z#There are multiple targets matchingz  -- Target namezwith IDrC   z1Please try again with the unique ID of the target>   r   r   r   r   r   r   r6   )r  rL   ri   r  )r\   r   errorr   r  r  r   assignmentsr_   r   	func_namer   assign_vals)rY   r-   r"  r   rs   r.   rn   r    rv   r!   find_target  s$   &
zRewriter.find_targetr   c                   sn   d fdd}||}|d ur|S | j jv r5 j j| }t|tr5|jjdkr5 j |jd }||}|S )Nr  rL   c                   s&    j jD ]}| |d kr|  S qd S )Nr  )r   r   )r  rs   rv   r    r!   r"    s
   z,Rewriter.find_dependency.<locals>.check_listr   r   )r  rL   )r   r$  r_   r   r%  r   flatten_argsr   )rY   r   r"  deprn   r  r    rv   r!   find_dependency  s   
zRewriter.find_dependencyrF   c                 C  s  dddddd |d   D id}| | |d	 d
krd S d|d	< g |d d< | jj}i dd |j D dd |j D dd |j D dd |j D dd |j D }t|d  D ]a\}}||vrtjdt	|g| 
 R   |   qiz	|| |}W n+ ty } ztjdt	|tt|g| 
 R   |   W Y d }~qid }~ww |d d  | d| g7  < qi| | d S )Nr   /r   rF   c                 S  s   g | ]}| d qS )z=.*r    .0xr    r    r!   
<listcomp>      z4Rewriter.process_default_options.<locals>.<listcomp>rG   r   r8   r   r:   rA   c                 S     i | ]	\}}t ||qS r    rL   r-  kvr    r    r!   
<dictcomp>      z4Rewriter.process_default_options.<locals>.<dictcomp>c                 S  r1  r    r2  r3  r    r    r!   r6    r7  c                 S  r1  r    r2  r3  r    r    r!   r6    r7  c                 S  r1  r    r2  r3  r    r    r!   r6    r7  c                 S  r1  r    r2  r3  r    r    r!   r6    r7  zUnknown optionszUnable to set=)rR   r  r   coredatarG   r]   sortedr   r#  r   r  r  validate_valuer
   r  rL   )rY   rI   Z
kwargs_cmdcdatarG   rb   rc   er    r    r!   r     sL   
*"z Rewriter.process_default_optionsrA   c              
   C  s\  t dt |d dt d|d  d  |d tvr.t jd|d g|  R   |  S t|d  }d }d }|d dkredd	h|d hr]t jd
|d  d g|  R   |  S | j	j
}|j}n-|d dkr|| |d }|r{|d }|j}n|d dkr| |d }|r|d }|j}|st d t|tsJ t|tsJ dd |j D |_|d dkri }t|j D ]4\}}d ||< t|tr|j||< qt|trg }	|jjD ]}
d }t|
tr|
j}|	|g7 }	q|	||< q| dd|d |d | d S d}t|d  D ]\}}||vr0t jdt |g|  R   |   q|d dkr\||jv rPt dt |d |j|= |d7 }n
t dt |d q||jvrgd |j|< || |j| }| st dt |d t|}|d d krt d!t |d"t | || nP|d d#krt d$t |d"t | || n5|d d%krt d&t |d't | || n|d d(krt d)t |d't | | | |! |j|< |d7 }qd*d |j D |_|j D ]	\}}|j"|_"q|dkr*|| j#vr,|  j#|g7  _#d S d S d S )+NzProcessing function typerB   zwith id'rC   zUnknown function typer   r+  z//z>The ID for the function type project must be "/" or "//" not ""r-   rn   r   z Unable to find the function nodec                 S  s   i | ]\}}|j |qS r    r   r3  r    r    r!   r6        z+Rewriter.process_kwargs.<locals>.<dictcomp>r8   r=   rA   z{}#{}r   zCannot modify unknown kwargr   z  -- Deletingzfrom the kwargsr   z  -- Keyzis already deletedz  -- Skippingz"because it is to complex to modifyr   z  -- Settingtor:   z  -- Addingr   z  -- Removingfromr   z!  -- Removing all values matchingc                 S  s*   i | ]\}}t td d dddd||qS )r1   r   Nr   r3  r    r    r!   r6  X  s   * )$r   r  r   r  rQ   r#  r  r  
isdisjointr   project_noder   r'  r*  r_   r   r   rA   r]   r:  r   r   r   r   r  r^   rx   rL   r  r   r   r   r   ry   levelr   )rY   rI   Z
kwargs_defrn   arg_noder   	info_datarb   rc   	data_listrs   elementZnum_changedmodifierZval_strr4  r5  r    r    r!   r    s   ,"








zRewriter.process_kwargsrn   r   ri   r   c                 C  s&   |j r|j | jjv r| jj|j  S d S rX   )ast_idr   reverse_assignmentr   r    r    r!   find_assignment_node^  s   zRewriter.find_assignment_nodec                    s	  t dt |d dt |d  |d d u r8|d dkr8t jdt |d g R    S dPfd	d
d urQfdd|d D |d< dd g }|d dkrd }d rkd d }nd }|d usuJ g }d D ]}|D ]}t|t	r||j
g7 }qq{g }tt|d D ]8}||v rt dt |d qt dt |dt |j d|j  td|jdddd |}|t|g7 }qd }	t|ttfr|j}	nt|tr|}	|	d usJ |	 j|7  _|	|vrt|ts||	g7 }|jvr j|g7  _n|d dkrfdd}
|d D ]p}|
|\}}|d u r?t dt |d q&d }	t|ttfrM|j}	nt|trU|}	|	d us\J t dt |dt |j d|j  |	j| |	|vrt|ts||	g7 }|jvr j|g7  _q&n/|d d kr͈d }d!}zd" d }W ne ty   ztd#d$ |jj D }|jj| }W n@ ty   tt d%ttd&|jdddd d't d(}||jjt!td|jdddd d"< d)}|jvr	 j|g7  _Y nw |gd"< Y nw t|t!r&j"j#|j
 }|gd"< t|tsBt jd*t |d d+g R    S g }d" D ]}|D ]}t|t	r\||j
g7 }qNqHg }tt|d D ];}||v r}t d,t |d qjt d-t |dt |j d|j  td|jdddd |}|t|g7 }qj|j}	|	 j|7  _|	|vr||	g7 }|r|jvrˈ j|g7  _n|d d.kr8fd/d}
|d D ]V}|
|\}}|d u rt d0t |d q|j}	t d1t |dt |j d|j  |	j| |	|vr&t|ts&||	g7 }|jvr4 j|g7  _qߐn|d dkr=d urZt jd2t |d d3g R    S t$%d4d5|d }|d6 d7krn|d8 nd9}|d: }t&j'(|d; t)j*ttddddd d&}tt d%|t d(}ttddddd d&}tt!td<dddd=d>t d?|t d@}t+t!td<dddd=|t dA|}fdBd|d D |_|g|_ttddddd d&}tt!td<dddd=|d6 t d?|t d@}t+t!td<dddd=|t dA|}ttddddd |d t!tddddd |g|_|,t-  |,t-   j.||g7  _.n|d dCkrt/d }|d u rTd } j0|g7  _0t dDt |d dt |j d|j  nT|d dEkrg }d D ]}|D ]}t|t	r||j
g7 }qqg }d" D ]}|D ]}t|t	r||j
g7 }qqdF ||dG}1dd< | |D ]2}dHdI fdJdI  fdKdIdLd |jD }dMd |jD }t|fdNdIdO}|| |_qd S )QNzProcessing targetr-   r8   r   zUnknown targetsrcrL   ri   c                   s\   t jt j jd }t j| rt j| |S t j| s#| S t jt j| |S )Nr2   )r  r  abspathr	  r   isabsrelpathexists)rO  r2   )rY   r-   r    r!   
rel_sourcel  s   z+Rewriter.process_target.<locals>.rel_sourcec                      g | ]} |qS r    r    r,  )rT  r    r!   r/  v      z+Rewriter.process_target.<locals>.<listcomp>r>   c                 S  s^   g }t | trt| jj}| jjtv r|d |S t | t	r%| jj}|S t | t
r-| j}|S )Nr   )r_   r   rP   r   r   r%  r   r   popr   r   )nr   r    r    r!   arg_list_from_nodey  s   



z3Rewriter.process_target.<locals>.arg_list_from_noder   r   rn   z  -- Sourcez.is already defined for the target --> skippingz  -- Adding sourceat:stringr   c                   D   d D ]} |D ]}t |tr|j| kr||f    S q
qdS )Nr>   NNr   rO  rs   r   rY  r-   r    r!   	find_node     

z*Rewriter.process_target.<locals>.find_nodez  -- Unable to find sourcezin the targetz  -- Removing sourcerC  r   Textra_filesc                 s  s(    | ]}t |tr|jd kr|V  qdS )rc  Nr   )r-  r4  r    r    r!   	<genexpr>  s   & z*Rewriter.process_target.<locals>.<genexpr>r   r1   z[]r   FTargetz#extra_files argument must be a listz  -- Extra filez  -- Adding extra filer   c                   r]  )Nrc  r^  r   r_  r`  r    r!   ra    rb  z  -- Unable to find extra filez  -- Removing extra filezCan not add targetzbecause it already existsz[- ]_r4   r6   Z_exeZ_libZ_sourcesr2   rC   rj   files()r8  c                   s$   g | ]}t td  dddd|qS )r\  r   Nr   r,  )filenamer    r!   r/  7  s   $ r   z  -- Removing targetr=   r  )r  r>   rc  c                 S  s   |   rt| S |  S rX   )isdigitintlower)textr    r    r!   <lambda>d  rA  z)Rewriter.process_target.<locals>.<lambda>c                   s    fddt d| D S )Nc                   rU  r    r    )r-  cconvertr    r!   r/  e  rV  =Rewriter.process_target.<locals>.<lambda>.<locals>.<listcomp>z([0-9]+))r   splitrb   rq  r    r!   ro  e  r7  c                   s    fddt  dD S )Nc                   s&   g | ]\}} d |k |fqS )r+  )count)r-  idxr.  )alphanum_keyrb   r    r!   r/  f  s   & rs  r+  )	enumeratert  ru  )rx  ru  r!   ro  f  s    c                 S  s   g | ]	}t |ts|qS r    r_   r   r,  r    r    r!   r/  h  r7  c                 S  s   g | ]	}t |tr|qS r    rz  r,  r    r    r!   r/  i  r7  c                   s
    | j S rX   r@  r.  )path_sorterr    r!   ro  j  s   
 ru  )rO  rL   ri   rL   )2r   r  r   r  r'  r#  r  r  r_   r   r   r:  r   greenr  rj  linenor   r   r   r   r   r   r   r   r   r   
IndexErrornextrA   rR   StopIterationrk   r   r   r$  r   subr  r  r	  r   r
  r   acceptr   r   rN  r   r  ) rY   rI   Zto_sort_nodesrn   Zsrc_listrs   r   Z	to_appendtokenrG  ra  rootZstring_nodeZtgt_functionZ
mark_arrayZextra_files_keyZextra_files_listZid_base	target_idZ	source_idZsrc_arg_nodeZsrc_arr_nodeZsrc_far_nodeZsrc_fun_nodeZsrc_ass_nodeZtgt_arg_nodeZtgt_fun_nodeZtgt_ass_node	to_remove	test_dataunknownr>   r    )rx  rY  rr  rj  r|  rT  rY   r-   r!   r  c  s  $"	




*"
$





$*$.$
zRewriter.process_targetc                 C  sR   d|vrt d|d | jvrt d|d t| j | j|d  | d S )Nr#   zCommand has no key "type"z0Unknown command "{}". Supported commands are: {})r   r  r^   rP   rR   )rY   rI   r    r    r!   processm  s   zRewriter.processc              	     s  t dd | jD sJ t dd | jD sJ t dd | jD s$J t dd | jD s0J dd | jD }|dd | jD 7 }t|d	d
 dd}|dd | jD 7 }g }|D ]6}d}|d dksi|d dkr|t }|d | |  |j	 }|d j
||d |d d}||g7 }qYi  |D ]s}|d  v rqtjtj| j|d }d}tj|st|ddd W d    n1 sw   Y  t|dd}	|	 }W d    n1 sw   Y  |d}
d}g }|
D ]}||g7 }|t|7 }q|||d |d < q fdd|D ]'}|d dv r | q|d dkr7 |d  d  |d d 7  < q  D ]/\}}td t| t|d! ddd}	|	|d  W d    n	1 sfw   Y  q=d S )"Nc                 s  .    | ]}t |d ot |dot |dV  qdS r~  colnorj  Nhasattrr,  r    r    r!   rd  v     , z)Rewriter.apply_changes.<locals>.<genexpr>c                 s  r  r  r  r,  r    r    r!   rd  w  r  c                 s  s    | ]
}t |ttfV  qd S rX   )r_   r   r   r,  r    r    r!   rd  x  s    c                 s  s     | ]}t |tttfV  qd S rX   )r_   r   r   r   r,  r    r    r!   rd  y  s    c                 S     g | ]}|d dqS )modifyrn   r(   r    r,  r    r    r!   r/  {  r0  z*Rewriter.apply_changes.<locals>.<listcomp>c                 S  r  )r;   r  r    r,  r    r    r!   r/  |  r0  c                 S  s   | d j | d jfS )Nrn   )r~  r  r{  r    r    r!   ro  }  rV  z(Rewriter.apply_changes.<locals>.<lambda>T)rb   reversec                 S  r  )r:   r  r    r,  r    r    r!   r/  ~  r0  r1   r(   r  r:   rn   filerL   rn   r(   r  wutf-8encodingr   )r  rawoffsetsc                   s2   | d  d } | d  d }| d }|j d }|j}|| | }|}t|ttfr6||jd  |j }nKt|tr| d dkrt|jttfr]| d d|jdd	  | d  d }|| d
krm|d7 }|| d
ksc|d7 }|| dv r|d7 }|| dv sw|d | | d  ||d    | d  d< d S )Nr  r  r  rn   r   r(   r;   r1   r  r8  >   
	 rL   )	r~  r  r_   r   r   
end_lineno	end_colnor   r   )rs   r  r  rn   linecolstartendrg  remove_noder    r!   r    s*   
0z+Rewriter.apply_changes.<locals>.remove_node>   r  r;   r  rL   r  Z	Rewritingr  )allr   r   r:  r   r	   r  post_processr!  striprj  r  r  realpathr	  r   rS  openread
splitlinesr\   r]   r   r  r  r  )rY   Z
work_nodesZstr_listrs   Znew_dataprinterr  fpathZfdatafpZm_linesoffsetZline_offsetsr   rb   rc   r    r  r!   apply_changesu  sv   



 zRewriter.apply_changesN)r   F)r   rL   r   rL   r   r   )r  rL   r  rL   r  r  )r-   rL   )r   rL   )rn   r   ri   r   )r   r   r   rZ   r  r  r  r  r  r'  r*  rW   rO   r   r  rN  r  r  r  r    r    r    r!   r   g  s(    





-

j

  r   r   r   r   r   r   r   r=   r9   in_listT.List[str]T.Dict[str, str]c                 C  s@   i }t | }z|D ]}t|||< q	W |S  ty   tdw )Nz;in_list parameter of list_to_dict must have an even length.)iterr  r  	TypeError)r  r!  itrs   r    r    r!   list_to_dict  s   r  T.List[dict]c                 C  s"   d| j t| j | j| j| jdgS )Nr-   )r#   r-   r8   r>   r2   r4   )r-   target_operation_mapr8   r>   r2   r3   rG   r    r    r!   generate_target  s   r  c                 C  s   d| j | j| jt| jdgS )NrA   )r#   rB   rC   r8   rA   )rB   rC   r8   r  rA   r  r    r    r!   generate_kwargs  s   r  c                 C  s   d| j t| jdgS )NrF   )r#   r8   rG   )r8   r  rG   r  r    r    r!   generate_def_opts  s   r  c                 C  sV   t j| jr%t| jdd}t|W  d    S 1 sw   Y  d S t| jS )Nr  r  )r  r  rS  rJ   r  loadloads)rG   r  r    r    r!   generate_cmd  s
   $r  )r-   r.   rA   rD   rE   rH   rI   c              
   C  s   | j st  zczTt  t| j| jd}|  | jd u r*t	d W W t
  dS t| j | }t|ts:td|D ]}t|tsGtd|| q<|  |  W W t
  dS  tyj } z|d }~ww t
  w )N)r   zNo command specifiedr   zCommand is not a listzCommand is not an objectr   )verboser   	set_quietr   r   r   r)   r  r#   r#  set_verbosecli_type_mapr_   rP   r  objectr  r  r  	Exception)rG   rewritercommandsrs   r=  r    r    r!   run  s4   




r  rX   )rc   rL   ri   r   )r  r  ri   r  )ri   r  )>
__future__r   astr   r   r   r   r   r	   mesonbuild.mesonlibr
   r   r1   r   r   	functoolsr   mparserr   r   r   r   r   r   r   r   r   r   r   rJ   r  r   r  typingTTYPE_CHECKINGr   r   rV   rW   rk   rm   r   r   r   r   r   r   rL   r  rP   rO   rQ   r   r  r  r  r  r  r  r  r  r    r    r    r!   <module>   s    4 
#
)K!    p





	
	
