o
    ºùŠe¶%  ã                   @  sØ   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d dlZ	ddl
mZ ddlmZ e	jr7ddl
mZ e d¡Ze d¡Zd	Zd
ZdZdZe eej¡Ze eej¡Ze eej¡ZG dd„ dƒZddd„ZdS )é    )ÚannotationsNé   ©Úninja_quote)Úlang_suffixes)ÚTargetDependencyScannerInfoz\w*import ([a-zA-Z0-9]+);z \w*export module ([a-zA-Z0-9]+);z"^\s*include\s*['\"](\w+\.\w+)['\"]z#^\s*\bmodule\b\s+(\w+)\s*(?:!+.*)*$z*^\s*\bsubmodule\b\s*\((\w+:?\w+)\)\s*(\w+)z0^\s*use,?\s*(?:non_intrinsic)?\s*(?:::)?\s*(\w+)c                   @  sR   e Zd Zddd„Zddd„Zddd„Zddd„Zddd„Zddd„Zddd„Z	dS )ÚDependencyScannerÚpickle_fileÚstrÚoutfileÚsourcesúT.List[str]c                 C  s^   t |dƒ}t |¡| _W d   ƒ n1 sw   Y  || _|| _i | _i | _i | _g | _	d S )NÚrb)
ÚopenÚpickleÚloadÚtarget_datar   r   Úprovided_byÚexportsÚneedsÚsources_with_exports)Úselfr	   r   r   Úpf© r   ú?/usr/lib/python3.10/site-packages/mesonbuild/scripts/depscan.pyÚ__init__+   s   ÿ
zDependencyScanner.__init__ÚfnameÚreturnÚNonec                 C  sr   t j |¡d dd … }|dkr| ¡ }|td v r!|  |¡ d S |td v r.|  |¡ d S t d|› d¡ d S )Né   ÚCÚfortranÚcppz Can not scan files with suffix .Ú.)	ÚosÚpathÚsplitextÚlowerr   Úscan_fortran_fileÚscan_cpp_fileÚsysÚexit)r   r   Úsuffixr   r   r   Ú	scan_file5   s   zDependencyScanner.scan_filec                 C  st  t  |¡}tƒ }|jddd d¡D ]¥}t |¡}t |¡}t |¡}|rD| 	d¡ 
¡ }||vrD|| jv r>| j|  |¡ n|g| j|< |ru| 	d¡ 
¡ }	|	|vsSJ ‚| |	¡ |	| jv retd|	› dƒ‚| j |¡ || j|	< |	| j|< |r·| 	d¡ 
¡ }
|
 d¡d	 }| 	d
¡ 
¡ }|› d|› }| j |¡ || j|< || j|< || jv r±| j|  |
¡ q|
g| j|< qd S )Núutf-8Úignore©ÚencodingÚerrorsÚ
r   úMultiple files provide module r#   ú:r   r   )ÚpathlibÚPathÚsetÚ	read_textÚsplitÚFORTRAN_USE_REÚmatchÚFORTRAN_MODULE_REÚFORTRAN_SUBMOD_REÚgroupr'   r   ÚappendÚaddr   ÚRuntimeErrorr   r   )r   r   ÚfpathZmodules_in_this_fileÚlineÚimport_matchÚexport_matchZsubmodule_export_matchÚneededÚexported_moduleZparent_module_name_fullÚparent_module_nameZsubmodule_nameZconcat_namer   r   r   r(   @   sD   











€Òz#DependencyScanner.scan_fortran_filec                 C  sº   t  |¡}|jddd d¡D ]K}t |¡}t |¡}|r6| d¡}|| jv r0| j|  	|¡ n|g| j|< |rZ| d¡}|| j
v rJtd|› dƒ‚| j 	|¡ || j
|< || j|< qd S )Nr.   r/   r0   r3   r   r4   r#   )r6   r7   r9   r:   ÚCPP_IMPORT_REr<   ÚCPP_EXPORT_REr?   r   r@   r   rB   r   r   )r   r   rC   rD   rE   rF   rG   rH   r   r   r   r)   s   s$   








€ñzDependencyScanner.scan_cpp_fileÚsrcc                 C  s   | j j| }t|tƒsJ ‚|S )N)r   Zsource2objectÚ
isinstancer
   )r   rL   Zobjnamer   r   r   Úobjname_for†   s   zDependencyScanner.objname_forc                 C  s   t j |¡d dd …  ¡ }|td v r6| j| }| dd¡}d|v r&d}nd}t j | jj	|› d|› ¡S |td v rDd	 
| j| ¡S td
ƒ‚)Nr   r!   r5   ú@ÚsmodÚmodr#   r"   z{}.ifczUnreachable code.)r$   r%   r&   r'   r   r   ÚreplaceÚjoinr   Zprivate_dirÚformatrB   )r   rL   r,   ZexportedZnamebaseÚ	extensionr   r   r   Úmodule_name_for‹   s   
z!DependencyScanner.module_name_forÚintc                 C  sd  | j D ]}|  |¡ qt| jddd•}| d¡ | j D ]ƒ}|  |¡}g }g }g }|| jv r6| |  |¡¡ || j	v rN| j	| D ]}|| j
vrHq@| |¡ q@|D ]}| j
| }	|  |	¡}
|	|kre| |
¡ qPt|dƒ}dd„ |D ƒ}dd„ |D ƒ}|rƒd	d
 |¡ }nd}|rd	d
 |¡ }nd}d |||¡}| |d ¡ qW d   ƒ dS 1 s«w   Y  dS )NÚwr.   ©r1   zninja_dyndep_version = 1
Tc                 S  ó   g | ]}t |d ƒ‘qS ©Tr   ©Ú.0Úxr   r   r   Ú
<listcomp>º   ó    z*DependencyScanner.scan.<locals>.<listcomp>c                 S  rZ   r[   r   r\   r   r   r   r_   »   r`   z| ú Ú zbuild {} {}: dyndep {}r3   r   )r   r-   r   r   ÚwriterN   r   r@   rV   r   r   r   rS   rT   )r   ÚsZofilerL   ZobjfilenameZmods_and_submods_neededZmodule_files_generatedZmodule_files_neededÚmodnameZprovider_srcZprovider_modfileZquoted_objfilenameZquoted_module_files_generatedZquoted_module_files_neededZmod_genZmod_depZ
build_liner   r   r   Úscanœ   sR   









€
þÚ
þ)×)zDependencyScanner.scanN)r	   r
   r   r
   r   r   )r   r
   r   r   )rL   r
   r   r
   )r   rW   )
Ú__name__Ú
__module__Ú__qualname__r   r-   r(   r)   rN   rV   rf   r   r   r   r   r   *   s    




3

r   Úargsr   r   rW   c                 C  sh   t | ƒdks
J dƒ‚| \}}}t|dd}t |¡}W d   ƒ n1 s%w   Y  t|||ƒ}| ¡ S )Né   zgot wrong number of arguments!r.   rY   )Úlenr   Újsonr   r   rf   )rj   r	   r   ZjsonfileÚfr   Úscannerr   r   r   ÚrunÊ   s   
ÿrp   )rj   r   r   rW   )Ú
__future__r   rm   r$   r6   r   Úrer*   ÚtypingÚTZbackend.ninjabackendr   Zcompilers.compilersr   ÚTYPE_CHECKINGr   ÚcompilerJ   rK   ZFORTRAN_INCLUDE_PATZFORTRAN_MODULE_PATZFORTRAN_SUBMOD_PATZFORTRAN_USE_PATÚ
IGNORECASEr=   r>   r;   r   rp   r   r   r   r   Ú<module>   s0   

 !