o
    h                  	   @   s   d Z ddlZddlZddlmZ ddlmZmZmZm	Z	m
Z
mZ dedefddZG d	d
 d
eZde	eeee f  dee fddZdedefddZi fdedeeef deeef defddZdS )zPython module for generating .ninja files.

Note that this is emphatically not a required piece of Ninja; it's
just a helpful utility for build-file-generation systems that already
use Python.
    N)TextIOWrapper)DictListMatchOptionalTupleUnionwordreturnc                 C   s   |  dd dd ddS )Nz$ z$$  :z$:replace)r	    r   M/var/www/html/scripts/venv/lib/python3.10/site-packages/ninja/ninja_syntax.pyescape_path      r   c                   @   sJ  e Zd Zd=dededdfddZd>dd	Zd
eddfddZ	d?dede	e
eeeeee f  deddfddZdededdfddZ								d@dedede	e de	e dede	e dede	e de	e d e	e
eee f  ddfd!d"Z							dAd#e
eee f d$ed%e	e
eee f  d&e	e
eee f  d'e	e
eee f  d(e	e
eeee	e
eee f  f  eee	e
eee f  f f  d)e	e
eee f  de	e d*e	e dee fd+d,Zd-eddfd.d/Zd-eddfd0d1Zd2e
eee f ddfd3d4Zd5ed6edefd7d8Zd?d
ededdfd9d:Zd>d;d<ZdS )BWriterN   outputwidthr
   Nc                 C   s   || _ || _d S N)r   r   )selfr   r   r   r   r   __init__!   s   
zWriter.__init__c                 C   s   | j d d S )N
)r   writer   r   r   r   newline%   s   zWriter.newlinetextc                 C   s6   t j|| jd dddD ]}| jd| d  qd S )N   F)break_long_wordsbreak_on_hyphensz# r   )textwrapwrapr   r   r   )r   r   liner   r   r   comment(   s
   
zWriter.commentr   keyvalueindentc                 C   s>   |d u rd S t |trdtd |}| d||f | d S )Nr   z%s = %s)
isinstancelistjoinfilter_line)r   r&   r'   r(   r   r   r   variable-   s
   
zWriter.variablenamedepthc                 C   s"   |  d|  | jd|dd d S )Nzpool %sr0      r(   r-   r.   )r   r/   r0   r   r   r   pool9   s   zWriter.poolFcommanddescriptiondepfile	generatorr4   restatrspfilerspfile_contentdepsc                 C   s   |  d|  | jd|dd |r| jd|dd |r#| jd|dd |r-| jdddd |r7| jd	|dd |rA| jd
ddd |rK| jd|dd |	rU| jd|	dd |
ra| jd|
dd d S d S )Nzrule %sr5   r1   r2   r6   r7   r8   1r4   r9   r:   r;   r<   r3   )r   r/   r5   r6   r7   r8   r4   r9   r:   r;   r<   r   r   r   rule=   s&   zWriter.ruleoutputsr>   inputsimplicit
order_only	variablesimplicit_outputsdyndepc
                 C   s<  t |}dd |D }
dd t |D }|r)dd t |D }|d || |r>dd t |D }|d || |rSdd t |D }|
d |
| | d	d
|
d
|g| f  |d urp| d|  |	d ur{| d|	  |rt|trt| }nt|}|D ]\}}| j	||dd q|S )Nc                 S      g | ]}t |qS r   r   .0xr   r   r   
<listcomp>o       z Writer.build.<locals>.<listcomp>c                 S   rF   r   rG   rH   r   r   r   rK   p   rL   c                 S   rF   r   rG   rH   r   r   r   rK   s   rL   |c                 S   rF   r   rG   rH   r   r   r   rK   w   rL   z||c                 S   rF   r   rG   rH   r   r   r   rK   {   s    zbuild %s: %sr   z  pool = %sz  dyndep = %sr1   r2   )
as_listappendextendr-   r+   r)   dictiteritemsr.   )r   r?   r>   r@   rA   rB   rC   rD   r4   rE   out_outputs
all_inputsiteratorr&   valr   r   r   build]   s>   






zWriter.buildpathc                 C      |  d|  d S )Nz
include %sr-   r   rY   r   r   r   include      zWriter.includec                 C   rZ   )Nzsubninja %sr[   r\   r   r   r   subninja   r^   zWriter.subninjapathsc                 C   s   |  ddt|  d S )Nz
default %sr   )r-   r+   rN   )r   r`   r   r   r   default   r   zWriter.defaultsic                 C   sH   d}|d }|dkr"|| dkr"|d7 }|d8 }|dkr"|| dks|S )z<Returns the number of '$' characters right in front of s[i].r   r1   $r   )r   rb   rc   dollar_countdollar_indexr   r   r   _count_dollars_before_index   s   z"Writer._count_dollars_before_indexc                 C   s  d| }t |t | | jkr| jt | t d }|}	 |dd|}|dk s2| ||d dkr3nq|dk rU|d }	 |d|d }|dk sS| ||d dkrTnq=|dk rZn'| j||d|  d  ||d d	 }d|d  }t |t | | jks| j|| d
  d	S )z3Write 'text' word-wrapped at self.width characters.z  z $Tr   r   r   r1   z $
Nr   )lenr   rfindrg   findr   r   )r   r   r(   leading_spaceavailable_spacespacer   r   r   r-      s2   zWriter._linec                 C   s   | j   d S r   )r   closer   r   r   r   rn      s   zWriter.close)r   )r
   N)r   )NNFNFNNN)NNNNNNN)__name__
__module____qualname__r   intr   r   strr%   r   r   boolfloatr   r.   r4   r>   r   r   rX   r]   r_   ra   rg   r-   rn   r   r   r   r   r       s    
	
	

$
5	$r   inputc                 C   s    | d u rg S t | tr| S | gS r   )r)   r*   )rv   r   r   r   rN      s
   
rN   stringc                 C   s   d| vsJ d|  ddS )zbEscape a string such that it can be embedded into a Ninja file without
    further interpretation.r   z$Ninja syntax does not allow newlinesrd   z$$r   )rw   r   r   r   escape   s   rx   vars
local_varsc                    s*   dt t dtf fdd}td|| S )zExpand a string containing $vars as Ninja would.

    Note: doesn't handle the full Ninja variable syntax, but it's enough
    to make configure.py's use of it work.
    mr
   c                    s*   |  d}|dkrdS  ||dS )Nr1   rd    )groupget)r{   varrz   ry   r   r   exp   s   
zexpand.<locals>.expz
\$(\$|\w*))r   rs   resub)rw   ry   rz   r   r   r   r   expand   s   r   )__doc__r   r"   ior   typingr   r   r   r   r   r   rs   r   objectr   rN   rx   r   r   r   r   r   <module>   s     &-2