
    e%                       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                  rddl
mZ  ej                   d      Z ej                   d      Zd	Zd
ZdZdZ ej                   eej.                        Z ej                   eej.                        Z ej                   eej.                        Z G d d      ZddZy)    )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                  D    e Zd Zd	dZd
dZd
dZd
dZddZddZddZ	y)DependencyScannerc                    t        |d      5 }t        j                  |      | _        d d d        || _        || _        i | _        i | _        i | _        g | _	        y # 1 sw Y   4xY w)Nrb)
openpickleloadtarget_dataoutfilesourcesprovided_byexportsneedssources_with_exports)selfpickle_filer   r   pfs        </usr/lib/python3/dist-packages/mesonbuild/scripts/depscan.py__init__zDependencyScanner.__init__+   sc    +t$ 	L<BKKOD	L-/)+/1
13!	L 	Ls   AA$c                   t         j                  j                  |      d   dd  }|dk7  r|j                         }|t        d   v r| j                  |       y |t        d   v r| j                  |       y t        j                  d| d       y )N   Cfortrancppz Can not scan files with suffix ..)	ospathsplitextlowerr   scan_fortran_filescan_cpp_filesysexit)r   fnamesuffixs      r   	scan_filezDependencyScanner.scan_file5   s    !!%(+AB/S=\\^F]9--""5)}U++u%HH7xqAB    c                   t        j                  |      }t               }|j                  dd      j	                  d      D ]  }t
        j                  |      }t        j                  |      }t        j                  |      }|r`|j                  d      j                         }||vr=|| j                  v r| j                  |   j                  |       n|g| j                  |<   |r|j                  d      j                         }	|	|vsJ |j                  |	       |	| j                  v rt        d|	 d      | j                   j                  |       || j                  |	<   |	| j"                  |<   |s7|j                  d      j                         }
|
j	                  d      d	   }|j                  d
      j                         }| d| }| j                   j                  |       || j                  |<   || j"                  |<   || j                  v r | j                  |   j                  |
       |
g| j                  |<   	 y )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)   fpathmodules_in_this_filelineimport_matchexport_matchsubmodule_export_matchneededexported_moduleparent_module_name_fullparent_module_namesubmodule_nameconcat_names                 r   r%   z#DependencyScanner.scan_fortran_file@   s'   U#"uOOWXOFLLTR .	BD)//5L,2248L%6%<%<T%B"%++A.446 !55

*

5)008-3H

5)"."4"4Q"7"="="?&.BBBB$((9"d&6&66&)GGXXY'Z[[))00749  1&5U#% +A*F*Fq*I*O*O*Q'%<%B%B3%G%J"!7!=!=a!@!F!F!H!3 4An5EF))00705  -&1U# DJJ&JJu%,,-DE)@(ADJJu%].	Br,   c                D   t        j                  |      }|j                  dd      j                  d      D ]  }t        j                  |      }t        j                  |      }|rN|j                  d      }|| j                  v r| j                  |   j                  |       n|g| j                  |<   |s|j                  d      }|| j                  v rt        d| d      | j                  j                  |       || j                  |<   || j                  |<    y )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   rE   rF   rG   rI   rJ   s           r   r&   zDependencyScanner.scan_cpp_files   s   U#OOWXOFLLTR 	6D(..t4L(..t4L%++A.DJJ&JJu%,,V4)/DJJu%"."4"4Q"7"d&6&66&)GGXXY'Z[[))00749  1&5U#	6r,   c                \    | j                   j                  |   }t        |t              sJ |S )N)r   source2object
isinstancestr)r   srcobjnames      r   objname_forzDependencyScanner.objname_for   s-    ""005'3'''r,   c                   t         j                  j                  |      d   dd  j                         }|t        d   v rc| j
                  |   }|j                  dd      }d|v rd}nd}t         j                  j                  | j                  j                  | d|       S |t        d   v rd	j                  | j
                  |         S t        d
      )Nr   r   r5   @smodmodr    r   z{}.ifczUnreachable code.)r!   r"   r#   r$   r   r   replacejoinr   private_dirformatrB   )r   rV   r*   exportednamebase	extensions         r   module_name_forz!DependencyScanner.module_name_for   s    !!#&q)!"-335]9--||C(H  ''S1Hh"	!	77<< 0 0 < <
!I;>WXX}U++??4<<#455233r,   c           	        | j                   D ]  }| j                  |        t        | j                  dd      5 }|j	                  d       | j                   D ]_  }| j                  |      }g }g }g }|| j                  v r |j                  | j                  |             || j                  v r4| j                  |   D ]"  }|| j                  vr|j                  |       $ |D ]9  }| j                  |   }	| j                  |	      }
|	|k7  s)|j                  |
       ; t        |d      }|D cg c]  }t        |d       }}|D cg c]  }t        |d       }}|rddj                  |      z   }nd}|rddj                  |      z   }nd}d	j                  |||      }|j	                  |d
z          b 	 d d d        yc c}w c c}w # 1 sw Y   yxY w)Nwr.   r1   zninja_dyndep_version = 1
Tz|   zbuild {} {}: dyndep {}r3   r   )r   r+   r   r   writerX   r   r@   rd   r   r   r   r^   r`   )r   sofilerV   objfilenamemods_and_submods_neededmodule_files_generatedmodule_files_neededmodnameprovider_srcprovider_modfilequoted_objfilenamexquoted_module_files_generatedquoted_module_files_neededmod_genmod_dep
build_lines                     r   scanzDependencyScanner.scan   s    	ANN1	$,,g6 (	/%KK45|| &/"..s3*,')+&&(#$333*11$2F2Fs2KL$**$#'::c? D"$*:*:: !3::7CD  7 EG#'#3#3G#<L'+';';L'I$#s*+223CDE &1d%C"Oe0f!Q1E0f-0fL_-`qk!T.B-`*-`0"SXX.K%LLG G-"SXX.H%IIG G5<<=O=D=DF
 J-.M&/(	/R  1g-`9(	/R s1   CG#G2GGGAG
GGN)r   rU   r   rU   r   T.List[str])r)   rU   returnNone)rV   rU   r}   rU   )r}   int)
__name__
__module____qualname__r   r+   r%   r&   rX   rd   r{    r,   r   r	   r	   *   s(    4	C1Bf6&
4",r,   r	   c                    t        |       dk(  sJ d       | \  }}}t        |d      5 }t        j                  |      }d d d        t	        ||      }|j                         S # 1 sw Y   &xY w)N   zgot wrong number of arguments!r.   rg   )lenr   jsonr   r	   r{   )argsr   r   jsonfilefr   scanners          r   runr      sl    t9>;;;>%)"K(	h	) Q))A,Wg>G<<> s   A$$A-)r   r|   r}   r   )
__future__r   r   r!   r6   r   rer'   typingTbackend.ninjabackendr   compilers.compilersr   TYPE_CHECKINGr   compilerP   rQ   FORTRAN_INCLUDE_PATFORTRAN_MODULE_PATFORTRAN_SUBMOD_PATFORTRAN_USE_PAT
IGNORECASEr=   r>   r;   r	   r   r   r,   r   <module>r      s    #  	   	 
  . /??B

78

>?; ; B EBJJ12==A BJJ12==A OR]];^ ^@r,   