o
    ld                     @  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 d dlZd dlZd dlZd dlZd dlZ e j!r_dd	lm"Z" G d
d de
Z#dIddZ$G dd 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,e-dddgfe.i dfd e-ddfe-ddfe-dg d!fe.i dfd"e-ddfe-dg d#fe/g dfe-d$dfe-d%g d&fd'd(Z0e'e'e(e'e(e(e+e+d)e(e'e,e(e,e(e(e(e'e'e(d*e+e'e+e'e'd+d,Z1G d-d. d.Z2d/d0d1d2d3d4d5d6Z3dJd;d<Z4dKd>d?Z5dKd@dAZ6dKdBdCZ7dKdDdEZ8e5e5e6e7e7e8e8dFZ9dGdH Z:dS )L    )annotations   )IntrospectionInterpreterBUILD_TARGET_FUNCTIONSAstConditionLevelAstIDGeneratorAstIndentationGenerator
AstPrinter)MesonExceptionsetup_vsenv)mlogenvironmentwraps)	Token	ArrayNodeArgumentNodeAssignmentNodeBooleanNodeElementaryNodeIdNodeFunctionNode
StringNodeN)BaseNodec                   @  s   e Zd ZdS )RewriterExceptionN)__name__
__module____qualname__ r   r   rhome/ych/rk3568/buildroot/output/rockchip_rk3568_recovery/host/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rmZ
add_targetZ	rm_targetZadd_extra_filesZrm_extra_filesinfozAction to execute)r5   r$   sources*zSources to add/remove)nargsr$   kwargszModify keyword arguments)r$   r.   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strZadd_subparsersZ
add_parserrewriter_keyslistrewriter_func_kwargskeys)parser	formatterZ
subparsersZ
tgt_parserZ	kw_parserZ
def_parserZ
cmd_parserr   r   r   add_arguments)   s<   rP   c                   @  s   e Zd Zdd Zdd ZdS )RequiredKeysc                 C  s
   || _ d S N)rM   )selfrM   r   r   r   __init__M      
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 )Nr3   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 "{}")	lenrM   itemsr   formatr   
isinstancer!   rK   )Zwrapped_argsZwrapped_kwargsrF   keyvaltypr"   r5   frS   r   r   wrappedQ   s0   

z&RequiredKeys.__call__.<locals>.wrappedr   )rS   r^   r_   r   r]   r   __call__P   s   zRequiredKeys.__call__N)r   r   r   rT   r`   r   r   r   r   rQ   L   s    rQ   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 rR   )	_new_noderb   	node_typesupported_nodesrY   )rS   rb   ir   r   r   rT   l   s   zMTypeBase.__init__c                 C     t d)Nz1Internal error: _new_node of MTypeBase was calledr   rS   r   r   r   rd   v      zMTypeBase._new_nodec                 C  s
   | j d uS rR   )re   rj   r   r   r   
can_modifyz   rU   zMTypeBase.can_modifyc                 C  s   | j S rR   )rb   rj   r   r   r   get_node}      zMTypeBase.get_nodec                 C     g S rR   r   rj   r   r   r   rf         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   rS   valuer   r   r   	set_value      zMTypeBase.set_valuec                 C  rq   )NzCannot add a value of typerr   rs   rv   r   r   r   	add_value   ry   zMTypeBase.add_valuec                 C  rq   )NzCannot remove a value of typerr   rs   rv   r   r   r   remove_value   ry   zMTypeBase.remove_valuec                 C  rq   )NzCannot remove a regex in typerr   rs   rv   r   r   r   remove_regex   ry   zMTypeBase.remove_regexrR   rb   rc   )r   r   r   rT   rd   rl   rm   rf   rx   rz   r{   r|   r   r   r   r   ra   k   s    
ra   c                      8   e Zd Zdd fddZdd Zdd	 Zd
d Z  ZS )MTypeStrNrb   rc   c                      t  | d S rR   superrT   rS   rb   	__class__r   r   rT         zMTypeStr.__init__c              	   C     t tdddddd dS Nr/   r   r   r   rj   r   r   r   rd         zMTypeStr._new_nodec                 C     t gS rR   r   rj   r   r   r   rf      rn   zMTypeStr.supported_nodesc                 C     t || j_d S rR   rI   rb   rw   rv   r   r   r   rx      r   zMTypeStr.set_valuerR   r}   r   r   r   rT   rd   rf   rx   __classcell__r   r   r   r   r      
    r   c                      r~   )	MTypeBoolNrb   rc   c                   r   rR   r   r   r   r   r   rT      r   zMTypeBool.__init__c              	   C  s   t tdddddd dS )Nr/   r   F)r   r   rj   r   r   r   rd      r   zMTypeBool._new_nodec                 C  r   rR   )r   rj   r   r   r   rf      rn   zMTypeBool.supported_nodesc                 C  r   rR   )boolrb   rw   rv   r   r   r   rx      r   zMTypeBool.set_valuerR   r}   r   r   r   r   r   r      r   r   c                      r~   )MTypeIDNrb   rc   c                   r   rR   r   r   r   r   r   rT      r   zMTypeID.__init__c              	   C  r   r   r   r   rj   r   r   r   rd      r   zMTypeID._new_nodec                 C  r   rR   r   rj   r   r   r   rf      rn   zMTypeID.supported_nodesc                 C  r   rR   r   rv   r   r   r   rx      r   zMTypeID.set_valuerR   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 ))	MTypeListNrb   rc   c                   r   rR   r   r   r   r   r   rT      r   zMTypeList.__init__c              
   C  s$   t ttdddddd dddddS r   )r   r   r   rj   r   r   r   rd      s   $zMTypeList._new_nodec                 C  rh   )Nz9Internal error: _new_element_node of MTypeList was calledri   rv   r   r   r   _new_element_node   rk   zMTypeList._new_element_nodec                 C  s8   t | jts| j}|  | _| jj j|g7  _d S d S rR   )rY   rb   r   rd   args	arguments)rS   tmpr   r   r   _ensure_array_node   s
   
zMTypeList._ensure_array_nodereturnr   c                 C     dS NFr   rS   rb   rw   r   r   r   _check_is_equal   rp   zMTypeList._check_is_equalregexrI   c                 C  r   r   r   rS   rb   r   r   r   r   _check_regex_matches   rp   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   )rY   rb   r   rV   r   r   rj   r   r   r   rm      s   zMTypeList.get_nodec                 C  ro   rR   r   rj   r   r   r   supported_element_nodes   rp   z!MTypeList.supported_element_nodesc                 C  s   t g|   S rR   )r   r   rj   r   r   r   rf      s   zMTypeList.supported_nodesc                 C  sJ   t |ts|g}|   g | jj_|D ]}| jj j| |g7  _qd S rR   rY   rK   r   rb   r   r   r   rS   rw   rg   r   r   r   rx      s   

zMTypeList.set_valuec                 C  s@   t |ts|g}|   |D ]}| jj j| |g7  _qd S rR   r   r   r   r   r   rz      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   )rb   j
equal_funcrg   rw   r   r   check_remove_node   s
   
z3MTypeList._remove_helper.<locals>.check_remove_node)rY   rK   r   rb   r   r   )rS   rw   r   r   Zremoved_listr   r   r   _remove_helper   s   

zMTypeList._remove_helperc                 C     |  || j d S rR   )r   r   rv   r   r   r   r{         zMTypeList.remove_valuec                 C  r   rR   )r   r   )rS   r   r   r   r   r|     r   zMTypeList.remove_regexrR   r}   r   r   r   rI   r   r   )r   rI   )r   r   r   rT   rd   r   r   r   r   rm   r   rf   rx   rz   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 )MTypeStrListNrb   rc   c                   r   rR   r   r   r   r   r   rT     r   zMTypeStrList.__init__c              
   C     t tdddddd t|S r   )r   r   rI   rv   r   r   r   r   
     zMTypeStrList._new_element_noder   r   c                 C     t |tr
|j|kS dS r   rY   r   rw   r   r   r   r   r        

zMTypeStrList._check_is_equalr   rI   c                 C      t |trt||jd uS dS r   rY   r   rematchrw   r   r   r   r   r        
z!MTypeStrList._check_regex_matchesc                 C  r   rR   r   rj   r   r   r   r     rn   z$MTypeStrList.supported_element_nodesrR   r}   r   r   	r   r   r   rT   r   r   r   r   r   r   r   r   r   r         

r   c                      r   )MTypeIDListNrb   rc   c                   r   rR   r   r   r   r   r   rT     r   zMTypeIDList.__init__c              
   C  r   r   )r   r   rI   rv   r   r   r   r     r   zMTypeIDList._new_element_noder   r   c                 C  r   r   rY   r   rw   r   r   r   r   r   !  r   zMTypeIDList._check_is_equalr   rI   c                 C  r   r   r   r   r   r   r   r   &  r   z MTypeIDList._check_regex_matchesc                 C  r   rR   r   rj   r   r   r   r   +  rn   z#MTypeIDList.supported_element_nodesrR   r}   r   r   r   r   r   r   r   r     r   r   setdelete)r6   rD   )r   r   r8   remover|   r:   r?   r@   r6   r>   )src_addsrc_rm	target_rm
target_addextra_files_addextra_files_rmr:   r/   r4   )both_librariesr4   jarlibraryshared_libraryshared_modulestatic_library)r+   r6   r;   r0   r2   rC   r>   r+   )languagemethodZnativeZnot_found_messagerequiredstaticversionmodules)Zbuild_by_defaultZbuild_rpathdependenciesZgui_appZ	link_withZexport_dynamicZimplibinstallinstall_dirZinstall_rpathZpie)rC   Zmeson_versionlicenseZ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	sourcedirrI   	generatorskip_errorsr   c                 C  sZ   || _ t|d|t t t gd| _|| _g | _g | _g | _	| j
| j| jd| _d | _d S )Nr/   )Z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)rS   r   r   r   r   r   r   rT   d  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:Zdescriptive_namez  -- Version:r   )r   logru   ospathjoinr   r   build_filenamer   ZanalyzeZproject_datacyanrj   r   r   r   analyze_mesonr  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 rR   )r   )rS   r   r   r   r   r   r   add_infox  s
   


zRewriter.add_infoc                 C  s*   | j d u rd S tjtj| j dd d S )Nr3   )indent)r   sysstderrwriterG   dumpsrj   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redrj   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
   rj   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 rf jj| }t|t	rf|j
dv rf jj| }|S )NnamerI   r   T.List[BaseNode]c                   s4   g } j jD ]}| |d |d hv r||g7 }q|S )Nr  r@   )r   targets)r  resultrg   rj   r   r   
check_list  s   
z(Rewriter.find_target.<locals>.check_listr   r   z#There are multiple targets matchingz  -- Target namezwith IDr@   z1Please try again with the unique ID of the target>   r   r   r4   r   r   r   r   )r  rI   r   r  )rV   r   errorru   r   r  r   assignmentsrY   r   	func_nameZassign_vals)rS   r+   r  r  rg   r,   rb   r   rj   r   find_target  s$   &

zRewriter.find_targetr   c                   sl   d fdd}||}|d ur|S | j jv r4 j j| }t|tr4|jdkr4 j |jd }||}|S )Nr  rI   c                   s&    j jD ]}| |d kr|  S qd S )Nr  )r   r   )r  rg   rj   r   r   r    s
   z,Rewriter.find_dependency.<locals>.check_listr   r   )r  rI   )r   r  rY   r   r	  Zflatten_argsr   )rS   r   r  deprb   r  r   rj   r   find_dependency  s   

zRewriter.find_dependencyrC   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|   rC   c                 S  s   g | ]}| d qS )z=.*r   .0xr   r   r   
<listcomp>      z4Rewriter.process_default_options.<locals>.<listcomp>rD   r   r6   r   r8   r>   c                 S     i | ]	\}}t ||qS r   rI   r  kvr   r   r   
<dictcomp>      z4Rewriter.process_default_options.<locals>.<dictcomp>c                 S  r  r   r  r  r   r   r   r    r  c                 S  r  r   r  r  r   r   r   r    r  c                 S  r  r   r  r  r   r   r   r    r  c                 S  r  r   r  r  r   r   r   r    r  zUnknown optionszUnable to set=)rM   r   r   ZcoredatarD   rW   sortedr   r  ru   r   r  Zvalidate_valuer
   r   rI   )rS   rF   Z
kwargs_cmdZcdatarD   rZ   r[   er   r   r   r     sL   
*"z Rewriter.process_default_optionsr>   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 typer?   zwith id'r@   zUnknown function typer   r  z//z>The ID for the function type project must be "/" or "//" not ""r+   rb   r   z Unable to find the function nodec                 S  s   i | ]\}}|j |qS r   rw   r  r   r   r   r        z+Rewriter.process_kwargs.<locals>.<dictcomp>r6   r:   r>   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tor8   z  -- Addingr   z  -- Removingfromr|   z!  -- Removing all values matchingc                 S  s*   i | ]\}}t td d dddd||qS )r/   r   Nr   r  r   r   r   r  T  s   * )$r   r   ru   r   rL   r  r   r  
isdisjointr   Zproject_noder   r
  r  rY   r   r   r>   rW   r  r   rw   r   r   r   rX   rl   rI   r   rx   rz   r{   r|   rm   levelr   )rS   rF   Z
kwargs_defrb   arg_noder   Z	info_datarZ   r[   Z	data_listrg   elementZnum_changedmodifierZval_strr  r  r   r   r   r     s   ,"








zRewriter.process_kwargsrb   r   r   r   c                 C  s&   |j r|j | jjv r| jj|j  S d S rR   )Zast_idr   Zreverse_assignmentr   r   r   r   find_assignment_nodeZ  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 dJ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 ng ty   ztd#d$ |jj D }|jj| }W nB ty   tttd%|jdddd d&|j|j |j|j }||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sDt jd(t |d d)g R    S g }d" D ]}|D ]}t|t	r^||j
g7 }qPqJg }tt|d D ];}||v rt d*t |d qlt d+t |dt |j d|j  td|jdddd |}|t	|g7 }ql|j}	|	 j|7  _|	|vr||	g7 }|r|jvr͈ j|g7  _n|d d,kr:fd-d}
|d D ]V}|
|\}}|d u rt d.t |d q|j}	t d/t |dt |j d|j  |	j| |	|vr(t|ts(||	g7 }|jvr6 j|g7  _qnd|d dkrd ur\t jd0t |d d1g R    S t$%d2d3|d }|d4 d5krp|d6 nd7}|d8 }t&j'(|d9 t)j*ttddddd d%}t|dddd}ttddddd d%}tddddd:|}t+dd||}fd;d|d D |_|g|_ttddddd d%}tdddd|d4 |}t+dd||}t	tddddd |d t!tddddd |g|_|,t-  |,t-   j.||g7  _.n|d d<krJ/d }|d u r*d } j0|g7  _0t d=t |d dt |j d|j  nT|d d>krg }d D ]}|D ]}t|t	rk||j
g7 }q]qWg }d" D ]}|D ]}t|t	r||j
g7 }q{qud? ||d@}1ddA | |D ]2}dBdC fdDdC  fdEdCdFd |jD }dGd |jD }t|fdHdCdI}|| |_qd S )KNzProcessing targetr+   r6   r   zUnknown targetsrcrI   r   c                   s\   t jt j jd }t j| rt j| |S t j| s#| S t jt j| |S )Nr0   )r   r   abspathr   r   isabsrelpathexists)r)  r0   )rS   r+   r   r   
rel_sourceh  s   z+Rewriter.process_target.<locals>.rel_sourcec                      g | ]} |qS r   r   r  )r.  r   r   r  r      z+Rewriter.process_target.<locals>.<listcomp>r;   c                 S  s\   g }t | trt| jj}| jtv r|d |S t | tr$| jj}|S t | t	r,| j}|S )Nr   )
rY   r   rK   r   r   r	  r   popr   r   )nr   r   r   r   arg_list_from_nodeu  s   




z3Rewriter.process_target.<locals>.arg_list_from_noder   r   rb   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   r)  rg   r   r3  r+   r   r   	find_node     

z*Rewriter.process_target.<locals>.find_nodez  -- Unable to find sourcezin the targetz  -- Removing sourcer"  r   Textra_filesc                 s  s(    | ]}t |tr|jd kr|V  qdS )r=  Nr   )r  r  r   r   r   	<genexpr>  s   & z*Rewriter.process_target.<locals>.<genexpr>r/   z[]FTargetz#extra_files argument must be a listz  -- Extra filez  -- Adding extra filer   c                   r7  )Nr=  r8  r   r9  r:  r   r   r;    r<  z  -- Unable to find extra filez  -- Removing extra filezCan not add targetzbecause it already existsz[- ]_r2   r4   Z_exeZ_libZ_sourcesr0   filesc                   s$   g | ]}t td  dddd|qS )r6  r   Nr   r  )filenamer   r   r  3  s   $ r   z  -- Removing targetr:   r  )r  r;   r=  r@   c                 S  s   |   rt| S |  S rR   )isdigitintlower)textr   r   r   <lambda>`  r   z)Rewriter.process_target.<locals>.<lambda>c                   s    fddt d| D S )Nc                   r/  r   r   )r  cconvertr   r   r  a  r0  =Rewriter.process_target.<locals>.<lambda>.<locals>.<listcomp>z([0-9]+))r   splitrZ   rI  r   r   rG  a  r  c                   s    fddt  dD S )Nc                   s&   g | ]\}} d |k |fqS )r  )count)r  idxr  )alphanum_keyrZ   r   r   r  b  s   & rK  r  )	enumeraterL  rM  )rP  rM  r   rG  b  s    c                 S  s   g | ]	}t |ts|qS r   rY   r   r  r   r   r   r  d  r  c                 S  s   g | ]	}t |tr|qS r   rR  r  r   r   r   r  e  r  c                   s
    | j S rR   r  r  )path_sorterr   r   rG  f  s   
 rM  )r)  rI   r   rI   )2r   r   ru   r   r
  r  r   r  rY   r   rw   r  r   Zgreenr   rB  linenor   r   r   r   r   r   r   rt   r   
IndexErrornextr>   rM   StopIteration
end_lineno	end_colnor   r   r  r   subr   r   r   r   r   r   acceptr   r   r(  r   r   ) rS   rF   Zto_sort_nodesrb   Zsrc_listrg   r   Z	to_appendtokenr%  r;  rootZstring_nodeZtgt_functionZ
mark_arrayZextra_files_keyZextra_files_listZid_baseZ	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_removeZ	test_dataunknownr;   r   )rP  r3  rJ  rB  rT  r.  rS   r+   r   r   _  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   rX   rK   rM   )rS   rF   r   r   r   processi  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 rU  colnorB  Nhasattrr  r   r   r   r>  r     , z)Rewriter.apply_changes.<locals>.<genexpr>c                 s  rb  rc  re  r  r   r   r   r>  s  rg  c                 s  s    | ]
}t |ttfV  qd S rR   )rY   r   r   r  r   r   r   r>  t  s    c                 s  s     | ]}t |tttfV  qd S rR   )rY   r   r   r   r  r   r   r   r>  u  s    c                 S     g | ]}|d dqS )modifyrb   r&   r   r  r   r   r   r  w  r  z*Rewriter.apply_changes.<locals>.<listcomp>c                 S  rh  )r9   rj  r   r  r   r   r   r  x  r  c                 S  s   | d j | d jfS )Nrb   )rU  rd  rS  r   r   r   rG  y  r0  z(Rewriter.apply_changes.<locals>.<lambda>T)rZ   reversec                 S  rh  )r8   rj  r   r  r   r   r   r  z  r  r/   r&   ri  r8   rb   filerI   rb   r&   rm  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 )Nrm  rs  rr  rb   r   r&   r9   r/   rl  r  >    
	rI   )	rU  rd  rY   r   r   rY  rZ  r   rw   )rg   rs  rr  rb   linecolstartendrA  remove_noder   r   r|    s*   
0z+Rewriter.apply_changes.<locals>.remove_node>   ri  r9   rr  rI   ru  Z	Rewritingr   )allr   r   r  r   r	   r\  Zpost_processr  striprB  r   r   realpathr   r   r-  openread
splitlinesrV   rW   r   r   r   r   )rS   Z
work_nodesZstr_listrg   Znew_dataprinterr   ZfpathZfdatafpZm_linesoffsetZline_offsetsr   rZ   r[   r   r{  r   apply_changesq  sv   



 zRewriter.apply_changesN)r   F)r   rI   r   rI   r   r   )r   rI   r   rI   r   r   )r+   rI   )r   rI   )rb   r   r   r   )r   r   r   rT   r   r   r   r   r  r
  r  rQ   rJ   r   r   r(  r   ra  r  r   r   r   r   r   c  s(    





-

j

  r   r   r   r   r   r   r   r:   r7   in_listT.List[str]r   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.)iterrW  rX  	TypeError)r  r  itrg   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+   r6   r;   r0   r2   )r+   target_operation_mapr6   r;   r0   r1   rD   r   r   r   generate_target  s   r  c                 C  s   d| j | j| jt| jdgS )Nr>   )r!   r?   r@   r6   r>   )r?   r@   r6   r  r>   r  r   r   r   generate_kwargs  s   r  c                 C  s   d| j t| jdgS )NrC   )r!   r6   rD   )r6   r  rD   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 )Nro  rp  )r   r   r-  rG   r  loadloads)rD   r  r   r   r   generate_cmd  s
   $r  )r+   r,   r>   rA   rB   rE   rF   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   Z	set_quietr   r   r   r'   r   r!   r  Zset_verbosecli_type_maprY   rK   r  objectra  r  r   	Exception)rD   Zrewritercommandsrg   r  r   r   r   run  s4   




r  rR   )r  r  r   r  )r   r  );
__future__r   astr   r   r   r   r   r	   Zmesonbuild.mesonlibr
   r   r/   r   r   	functoolsr   Zmparserr   r   r   r   r   r   r   r   r   rG   r   r   r   typingTTYPE_CHECKINGr   r   rP   rQ   ra   r   r   r   r   r   r   rI   r   rK   rJ   rL   r   r  r  r  r  r  r  r  r  r   r   r   r   <module>   s    , 
#)K!    p





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