o
    eT                     @  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m	Z	 ddl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mZmZmZmZmZmZmZ dd
lmZ ddlmZ ddlmZm Z  ddl!m"Z" ej#rd dl$m%Z% ddlm&Z& ddl'm(Z( ddl)m*Z* ddlm+Z+m,Z, e-dZ.G dd de%Z/d+ddZ0dZ1e2eeefZ3G dd de"Z4G dd  d Z5G d!d" d"ed# Z6G d$d# d#eZ7G d%d& d&eZ8d,d)d*Z9dS )-    )annotationsN   )ExtensionModuleModuleReturnValue
ModuleInfo   )buildmesonlibmlog)CustomTargetCustomTargetIndex)
DependencyInternalDependency)InvalidArguments	noPosargsnoKwargstyped_kwargsFeatureDeprecatedContainerTypeInfo	KwargInfotyped_pos_args)_CustomTargetHolder)NoneType)FileMesonException)ExternalProgram)	TypedDict)ModuleState)Environment)Interpreter)TYPE_kwargsTYPE_var_Tc                   @  sn   e Zd ZU ded< ded< ded< ded< ded	< d
ed< ded< ded< ded< ded< ded< ded< dS )GenerateDocKwargs3T.Union[str, File, CustomTarget, CustomTargetIndex]sitemapindexstrproject_versionT.Optional[str]html_extra_themeT.List[str]include_pathsfT.List[T.Union[Dependency, build.StaticLibrary, build.SharedLibrary, CustomTarget, CustomTargetIndex]]dependenciesz0T.List[T.Union[CustomTarget, CustomTargetIndex]]dependsgi_c_source_rootsextra_assetsextra_extension_pathsT.List['HotdocTarget']subprojectsboolinstallN)__name__
__module____qualname____annotations__ r;   r;   >/usr/lib/python3.10/site-packages/mesonbuild/modules/hotdoc.pyr#   ,   s   
 r#   valueT.Union[_T, T.List[_T]]return
T.List[_T]c                 C  s   t | ts| gS | S N)
isinstancelist)r=   r;   r;   r<   ensure_list:   s   
rD   z0.8.100c                   @  s   e Zd ZdddZdS )	HotdocExternalProgramcmdr+   r?   intc                 C  s   t j|  | t jdjS )N)stdout)
subprocessrunget_commandDEVNULL
returncode)selfrF   r;   r;   r<   
run_hotdocF   s   z HotdocExternalProgram.run_hotdocN)rF   r+   r?   rG   )r7   r8   r9   rO   r;   r;   r;   r<   rE   E   s    rE   c                   @  s   e Zd ZdBd	d
ZdCdDddZdEddZdFddZdGddZ		dHdd ZdId#d$Z	dJd&d'Z
dGd(d)ZdKd-d.ZdGd/d0ZdGd1d2ZdLd3d4ZdGd5d6ZdMd9d:ZdNd;d<ZdGd=d>ZdOd@dAZdS )PHotdocTargetBuildernamer'   stater   hotdocrE   interpreterr   c                 C  s   || _ |dd| _|| _|| _|| _|| _t | _	|j
 | _|j
 | _|j| _|j
 | _dd|ddtj| j| j| jd g| _t | _t | _g | _g | _d S )Nbuild_by_defaultFconfz--project-namez--disable-incremental-buildz--output-doc)rS   poprU   kwargsrQ   rR   rT   r	   
OrderedSetr,   environmentget_build_dirbuilddirget_source_dir	sourcedirsubdirZget_build_commandbuild_commandospathjoinrF   set_extra_extension_pathsr1   extra_depends_subprojects)rN   rQ   rR   rS   rT   rY   r;   r;   r<   __init__L   s$   

zHotdocTargetBuilder.__init__Noptionargnamer)   value_processorT.Optional[T.Callable]r?   Nonec                 C  sF   |s| ddd}| j|}|d ur|r||}| || d S )N-_)stripreplacerY   rX   set_arg_value)rN   rj   rk   rl   r=   r;   r;   r<   process_known_argb   s   z%HotdocTargetBuilder.process_known_argr=   r!   c                 C  s   |d u rd S t |tr|r| j| d S d S t |trS|rQg }|D ]}t |tr6|dr6|d| g7 }q"||g7 }q"|rI| j|g|  d S | j| d S d S t |trf| j| d| g d S | j||g d S )Nro   z %s=)rB   r5   rF   appendrC   r'   
startswithextend)rN   rj   r=   Zescaped_valueer;   r;   r<   rs   l   s(   


z!HotdocTargetBuilder.set_arg_valueargc                 C  sd   t |tr|D ]}| || qd S ttttjtt	tj
f}t ||s0td||dd |D d S )Nz'Argument "{}={}" should be of type: {}.c                 S  s   g | ]}|j qS r;   )r7   ).0tr;   r;   r<   
<listcomp>   s    z<HotdocTargetBuilder.check_extra_arg_type.<locals>.<listcomp>)rB   rC   check_extra_arg_typer'   r5   r   r   IncludeDirsr   r   BuildTargetr   format)rN   rz   r=   vZvalid_typesr;   r;   r<   r~      s   

z(HotdocTargetBuilder.check_extra_arg_typec                 C  s@   | j  D ]\}}d|dd }| || | || qd S )Nz--rp   ro   )rY   itemsrr   r~   rs   )rN   rz   r=   rj   r;   r;   r<   process_extra_args   s
   z&HotdocTargetBuilder.process_extra_argsFc           
      C  s   t |ts|g}z:| j| }}|r||}|D ]}	t ||	r6|r/t |ts/|g|f  W S ||f  W S qt| d| d|  ty_   |rRt| d|d ur\||f Y S Y dS w )Nz field value z is not valid, valid types are z mandatory field not foundNN)rB   rC   rY   rX   r   KeyError)
rN   typesrk   defaultrl   	mandatoryZ
force_listZuvaluer=   r|   r;   r;   r<   	get_value   s.   

zHotdocTargetBuilder.get_valuepaths T.Union[T.List[str], T.Set[str]]c                 C  s6   |D ]}|| j v r
q| j | | jd|g qd S )Nz--extra-extension-path)rf   addrF   rx   )rN   r   rc   r;   r;   r<   add_extension_paths   s   
z'HotdocTargetBuilder.add_extension_pathsstringc                 C  s   | d| j d| jS )Nz@SOURCE_ROOT@z@BUILD_ROOT@)rr   r_   r]   )rN   r   r;   r;   r<   replace_dirs_in_string   s   z*HotdocTargetBuilder.replace_dirs_in_stringc                 C  sh   | j dgdkrd S | jd}|tj| j| j	j
tj| j| j	j
g |  jdg| 7  _d S )Nz--has-extension=gi-extensionr   r0   z--gi-c-source-roots)rS   rO   rY   rX   rx   rb   rc   rd   r_   rR   Zroot_subdirr]   rF   rN   r=   r;   r;   r<   process_gi_c_source_roots   s   z-HotdocTargetBuilder.process_gi_c_source_rootsdepsr-   r+   c                   s  t  }tt|D ]}t|tr@ j|j}|	 fdd|D  |	 
|j |	 
|j |	 
|j q
t|trM|	|  q
t|tjtjfrk j| | D ]	}|	|  q`q
t|tr 
|   j|j  
|j  jtj  j!|j"j#   j$dd |j%D 7  _$ &|j' q
t|t(tj)fr j| q
t|t*r j|j+ q
dd |D S )Nc                   s   g | ]}  |qS r;   )r   r{   xrN   r;   r<   r}      s    z<HotdocTargetBuilder.process_dependencies.<locals>.<listcomp>c                 S  s   g | ]}d | qS )z--extra-assets=r;   )r{   pr;   r;   r<   r}      s    c                 S  s   g | ]}| d qS )z-I)rq   )r{   fr;   r;   r<   r}          ),re   r	   listifyrD   rB   r   rR   Zget_include_argsZinclude_directoriesupdateprocess_dependencies	librariessourcesZext_depsr   Zget_compile_argsr   StaticLibrarySharedLibraryrg   rv   Zget_include_dirsget_incdirsHotdocTargetZget_target_dependenciesrh   rx   r4   r,   r   rb   rc   rd   r]   hotdoc_confr`   rF   r1   r   r2   r   r   r   target)rN   r   cflagsdepZinc_argsZincdr;   r   r<   r      s<   



z(HotdocTargetBuilder.process_dependenciesc                 C  s.   | j d| _| jD ]
}| jd|g q
d S )Nr1   z--extra-assets)rY   rX   _extra_assetsrF   rx   )rN   Zassets_pathr;   r;   r<   process_extra_assets   s   
z(HotdocTargetBuilder.process_extra_assetsc                 C  s&   | j d}| | | j| d S Nr4   )rY   rX   r   rh   rx   r   r;   r;   r<   process_subprojects   s   
z'HotdocTargetBuilder.process_subprojectsc              	   C  s   g }t j| jddD ]n}t|tr || jj | jj	 }nSt|t
jrJ| D ]}|tj| j| | |tj| j| | q*q
t|t
jtfr`| j| | jj|}nt|trs| j|j | jj|}|| q
|S )NT)flatten)r	   r   rF   rB   r   absolute_pathrR   r[   r^   r\   r   r   r   rv   rb   rc   rd   r_   Z
get_curdirr]   r   r   rg   rT   backendZget_target_filename_absr   r   )rN   rF   rz   inc_dirr;   r;   r<   flatten_config_command   s&   


z*HotdocTargetBuilder.flatten_config_commandc                 C  sh   t jt j}t j| j| j}tdt	| j
 t | | j|  dkr-tdt | d S )Nz%Generating Hotdoc configuration for: r   zhotdoc failed to configure)rb   rc   abspathcurdirrd   r_   r`   r
   logZboldrQ   chdirrS   rO   r   r   )rN   cwdZncwdr;   r;   r<   generate_hotdoc_config  s   
z*HotdocTargetBuilder.generate_hotdoc_configr$   .T.Union[File, CustomTarget, CustomTargetIndex]c                 C  sL   t |trg }|D ]
}|| | q	|S t |tr$t| j| j|S |S rA   )	rB   rC   rv   ensure_filer'   r   Zfrom_source_filer_   r`   )rN   r=   resvalr;   r;   r<   r     s   

zHotdocTargetBuilder.ensure_filec                 C  s^   t j|r	|}n
t j| j| j|}t j|s!td| dt j|t j| j	| jS )N"z" is not a directory.)
rb   rc   isabsrd   r_   r`   isdirr   relpathr]   )rN   r=   Z_dirr;   r;   r<   
ensure_dir%  s   zHotdocTargetBuilder.ensure_dirc                 C  s(   dD ]}|| j v rtd| dqd S )N)Z	conf_filez
Argument "z" is forbidden.)rY   r   )rN   rz   r;   r;   r<   check_forbidden_args0  s
   
z(HotdocTargetBuilder.check_forbidden_args7T.Tuple[HotdocTarget, mesonlib.ExecutableSerialisation]c                   sb       jd jd  d  jd jd  jd jd  j fdd jdD   jd	d
 jd  	   
    jd     j jd  jd}    jd }|d }tj j j|}t|ddd}|d W d    n1 sw   Y    jd|g7  _ jtj j j  jtj j j tj j j jd }  jd|g7  _ jD ]
} jd|g qψ jjjtj d jj!dr j"d  #   j$ddg  j%&  dd|g dtj j jg }t'| j jj! jjt() j| j* j+ j,| j|gg tj-| j.d }	d }
|rtj jd! jd"} j/d#d$}t0|t1sat23d%d& jj! d$}|rstj|d'}tj|d'}ntj|d(}tj|d) jd(} jj45 j$ddd*|d+|d, jdtj j jg
  j%&  dd|g }
d)|
_6|	|
fS )-Nz--index)rl   z--project-versionz	--sitemapz--html-extra-themec                 3  s    | ]}  |V  qd S rA   )r   )r{   r   r   r;   r<   	<genexpr>;  s    z3HotdocTargetBuilder.make_targets.<locals>.<genexpr>r,   z--c-include-directoriesr.   )rk   rl   r2   r/   r6   rW   z.jsonwzutf-8)encodingz{}z--conf-filez.depsz--deps-file-destz--include-pathZwerror)
subprojectz--fatal-warningsz
--internalrS   rJ   z
--builddir)r`   r   r[   r   r2   r1   r4   commandrg   outputsr   depfilerU   prefixdatadirZdevhelp_activateFz6hotdoc.generate_doc() devhelp_activate must be booleanz1.1.0devhelphtmldocz	--installz--docdirz--name)7r   rt   r   r   r,   r   rY   rX   r   r   r   r   r   rg   rx   r   rQ   rb   rc   rd   r]   r`   openwriterF   r   r_   rR   r[   ZcoredataZ
get_optionr	   Z	OptionKeyr   rv   r   ra   rS   rK   r   r   Zfrom_built_filerf   r   rh   basenamerU   getrB   r5   r   
single_user   Zget_executable_serialisationtag)rN   r6   fullnameZhotdoc_config_nameZhotdoc_config_pathr   r   rc   Z
target_cmdr   install_scriptr   r   Zinstall_fromZ
install_tor;   r   r<   make_targets5  s   
"



z HotdocTargetBuilder.make_targets)rQ   r'   rR   r   rS   rE   rT   r   r   )rj   r'   rk   r)   rl   rm   r?   rn   )rj   r'   r=   r!   r?   rn   )rz   r'   r=   r!   r?   rn   )r?   rn   )NNFF)r   r   r?   rn   )r   r'   r?   r'   )r   r-   r?   r+   )r?   r+   )r=   r$   r?   r   )r=   r'   r?   r'   )r?   r   )r7   r8   r9   ri   rt   rs   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r;   r;   r;   r<   rP   J   s*    



!










	

rP   c                      s0   e Zd Zd fddZeedddZ  ZS )HotdocTargetHolderr   r   interpr   c                   s$   t  || | jd| ji d S )NZconfig_path)superri   methodsr   config_path_method)rN   r   r   	__class__r;   r<   ri     s   zHotdocTargetHolder.__init__argsT.AnyrY   r?   r'   c                 O  s    | j j| jjj| jjj}|S rA   )Zheld_objectr   r   rT   r[   
source_dir	build_dir)rN   r   rY   rV   r;   r;   r<   r     s   z%HotdocTargetHolder.config_path_method)r   r   r   r   )r   r   rY   r   r?   r'   )r7   r8   r9   ri   r   r   r   __classcell__r;   r;   r   r<   r     s
    r   r   c                      s(   e Zd Zd fddZdddZ  ZS )r   rQ   r'   r`   r   r   r   r2   
T.Set[str]r1   r+   r4   r3   r[   r   rY   r   c	           
        s>   t  j||||fi |	ddi || _|| _|| _|| _d S )NZabsolute_pathsT)r   ri   r   r2   r1   r4   )
rN   rQ   r`   r   r   r2   r1   r4   r[   rY   r   r;   r<   ri     s
   "
zHotdocTarget.__init__r?   dictc                 C  s   | j  }g |d< |S r   )__dict__copy)rN   r   r;   r;   r<   __getstate__  s   
zHotdocTarget.__getstate__)rQ   r'   r`   r'   r   r'   r   r   r2   r   r1   r+   r4   r3   r[   r   rY   r   )r?   r   )r7   r8   r9   ri   r   r   r;   r;   r   r<   r     s    	c                      s@  e Zd ZeddZd. fddZeededd	d/ddZ	edee
dededdededdededdedeefedeeedg dedeeeejejeefdg dedeeeefdg dd ed!eeedg ded"eeedg ded#eeedg ded$eeedg ded%ed&d'dd(d0d,d-Z  ZS )1HotDocModulerS   z0.48.0rT   r   c                   sp   t  | td| _| j std| j|}t|dt	 s+tdt	 d| j
| j| jd d S )NrS   zhotdoc executable not foundz>=zhotdoc z required but not found.))has_extensionsgenerate_doc)r   ri   rE   rS   foundr   get_versionr	   Zversion_compareMIN_HOTDOC_VERSIONr   r   r   r   )rN   rT   versionr   r;   r<   ri     s   

zHotDocModule.__init__zhotdoc.has_extensionsr   )varargsZmin_varargsrR   r   r   T.Tuple[T.List[str]]rY   r    r?   r5   c                 C  s   | j dd |d D dkS )Nc                 S  s   g | ]}d | qS )z--has-extension=r;   )r{   	extensionr;   r;   r<   r}     r   z/HotDocModule.has_extensions.<locals>.<listcomp>r   )rS   rO   )rN   rR   r   rY   r;   r;   r<   r     s   zHotDocModule.has_extensionszhotdoc.generate_docr%   T)requiredr&   r(   r*   r,   )r   r   r.   r/   0.64.1)r   r   Zsincer0   r1   r2   r4   r6   F)r   )Zallow_unknownT.Tuple[str]r#   r   c           	      C  sr   |d }t dd |d D rtdd|jd|j t||| j| j|}| \}}|g}|r4|	| t
||S )Nr   c                 s  s    | ]
}t |ttfV  qd S rA   )rB   r   r   r   r;   r;   r<   r     s    z,HotDocModule.generate_doc.<locals>.<genexpr>r.   z<hotdoc.generate_doc dependencies argument with custom_targetr   zuse `depends`)anyr   r   r   Zcurrent_noderP   rS   rT   r   rv   r   )	rN   rR   r   rY   project_namebuilderr   r   targetsr;   r;   r<   r     s   

zHotDocModule.generate_doc)rT   r   )rR   r   r   r   rY   r    r?   r5   )rR   r   r   r   rY   r#   r?   r   )r7   r8   r9   r   INFOri   r   r   r'   r   r   r   
file_typesr   r   rC   r   r   r   r   r   r   r   r5   r   r   r;   r;   r   r<   r     sJ    
r   rT   r   c                 C  s   t | }|jtt |S rA   )r   rT   Zappend_holder_mapr   r   )rT   modr;   r;   r<   
initialize  s   r   )r=   r>   r?   r@   )rT   r   r?   r   ):
__future__r   rb   rI   typingT r   r   r   r   r	   r
   r   r   r.   r   r   Zinterpreterbaser   r   r   r   r   r   r   r   Zinterpreter.interpreterobjectsr   Zinterpreter.type_checkingr   r   r   Zprogramsr   TYPE_CHECKINGtyping_extensionsr   r   r[   r   rT   r   r    r!   TypeVarr"   r#   rD   r   r'   r   rE   rP   r   r   r   r   r;   r;   r;   r<   <module>   s@   (

  BC