o
    uJAf.                     @  s  d dl mZ d dlZd dlZd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mZmZmZmZ dd	lmZmZ ejrdd
l
mZmZ ddl
mZ d dlmZmZ ejeeejeef eje f Z edeeeej!eje  e"ej!e# ej!e# e 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*G dd dej+Z,e-dZ.G dd dZ/dS )     )annotationsN   )coredata)mesonlib)mparser)mlog)
FeatureNewFeatureDeprecatedtyped_pos_argstyped_kwargsContainerTypeInfo	KwargInfo)NoneTypein_set_validator)TYPE_varTYPE_kwargs)
SubProject)	TypedDictLiteralFuncOptionArgs)typedescriptionyieldchoicesvalueminmax
deprecatedc                   @     e Zd ZU ded< dS )
StringArgsstrr   N__name__
__module____qualname____annotations__ r&   r&   >/usr/lib/python3.10/site-packages/mesonbuild/optinterpreter.pyr   ,      
 r   c                   @  r   )BooleanArgsboolr   Nr!   r&   r&   r&   r'   r)   /   r(   r)   c                   @     e Zd ZU ded< ded< dS )	ComboArgsr    r   T.List[str]r   Nr!   r&   r&   r&   r'   r,   2      
 r,   c                   @  s&   e Zd ZU ded< ded< ded< dS )IntegerArgsintr   zT.Optional[int]r   r   Nr!   r&   r&   r&   r'   r/   6   s   
 r/   c                   @  r+   )StringArrayArgsz%T.Optional[T.Union[str, T.List[str]]]r   r-   r   Nr!   r&   r&   r&   r'   r1   ;   r.   r1   c                   @  r+   )FeatureArgsz&Literal['enabled', 'disabled', 'auto']r   r-   r   Nr!   r&   r&   r&   r'   r2   ?   r.   r2   c                   @  s   e Zd ZdS )OptionExceptionN)r"   r#   r$   r&   r&   r&   r'   r3   D   s    r3   z[^a-zA-Z0-9_-]c                   @  s  e Zd ZdYddZdZd	d
Zd[ddZd\ddZd]ddZede	de
deh dde	de
dd e	d!ee
eee
eee
fd"d#e
d$id%e	d&eejd'd(dd)ede
d^d-d.Zed/e	d0e
dd d_d4d5Zed6e	d0ee
fdd7d8 e
d9id:d`d<d=Zed>e	d0e
efe	d?eee
d"d@ddAdadCdDZedEe	d0ee
fde
dFiedGe	dHeefe	dIeefdbdKdLZedMe	d0eee
e
efe	d?eee
g d dcdOdPZedQe	d0e
dReh dSdTdddVdWZdXS )eOptionInterpreter
subproject'SubProject'returnNonec                 C  s0   i | _ || _| j| j| j| j| j| jd| _d S )N)stringbooleancombointegerarrayfeature)	optionsr5   string_parserboolean_parsercombo_parserinteger_parserstring_array_parserfeature_parseroption_types)selfr5   r&   r&   r'   __init__L   s   zOptionInterpreter.__init__option_filer    c                 C  s  z"t |dd}t| | }W d    n1 sw   Y  W n tjy4 } z||_|d }~ww t|tj	sIt
d}| |_||_||jD ]>}z
|| _| | W qL tjyr } z|j|_|j|_||_|d }~w ty } ztjt||j|j|dd }~ww d S )Nzutf-8)encodingzOption file is malformed.)linenocolnofile)openr   Parserreadparser   MesonExceptionrM   
isinstanceCodeBlockNoder3   rK   linescurrent_nodeevaluate_statementrL   	Exceptionr    )rG   rI   fastmeecurr&   r&   r'   processX   s@   

zOptionInterpreter.processargT.Union[str, mparser.BaseNode]
'TYPE_var'c                   s  t |tr|S t |tjr |jS t |tjtjtjfr!|j	S t |tj
r2 fdd|jjD S t |tjrYi }|jj D ]\}}t |tjsNtd |||j	< q@|S t |tjr{ |j	}t |ttfsptdtdd j | S t |tjr |j	}t |tstdtdd j | S t |tjr̈ |j} |j}|jd	krt |trt |tstd
tdd j || S td)Nc                      g | ]}  |qS r&   reduce_single).0ZcurargrG   r&   r'   
<listcomp>z       z3OptionInterpreter.reduce_single.<locals>.<listcomp>z(Dictionary keys must be a string literalzToken after "-" is not a numberz%negative numbers in meson_options.txtz0.54.1z$Token after "not" is not a a booleanz%negation ("not") in meson_options.txtaddz:Only string concatenation with the "+" operator is allowedz)string concatenation in meson_options.txtz0.55.0z;Arguments may only be string, int, bool, or array of those.)rS   r    r   ParenthesizedNoderd   innerBaseStringNodeBooleanNode
NumberNoder   	ArrayNodeargs	argumentsDictNodekwargsitemsr3   
UMinusNoder0   floatr   
single_user5   NotNoder*   ArithmeticNodeleftright	operation)rG   r_   dkvreslrr&   rf   r'   rd   q   sJ   

zOptionInterpreter.reduce_singlerp   mparser.ArgumentNode"T.Tuple['TYPE_var', 'TYPE_kwargs']c                   sn   |  rtd fdd|jD }i }|j D ]}t|tjs%td|j| } |||j	< q||fS )Nz9All keyword arguments must be after positional arguments.c                   rb   r&   rc   )re   r_   rf   r&   r'   rg      rh   z6OptionInterpreter.reduce_arguments.<locals>.<listcomp>z&Keyword argument name is not a string.)
incorrect_orderr3   rq   rs   keysrS   r   IdNoderd   r   )rG   rp   reduced_pos
reduced_kwkeyar&   rf   r'   reduce_arguments   s   
z"OptionInterpreter.reduce_argumentsnodemparser.BaseNodec                 C  sL   t |tjs
td|jj}|dkrtd| |j\}}| || d S )Nz/Option file may only contain option definitionsoptionz3Only calls to option() are allowed in option files.)	rS   r   FunctionNoder3   	func_namer   r   rp   func_option)rG   r   r   posargsrs   r&   r&   r'   rW      s   z$OptionInterpreter.evaluate_statementr   r   T>   r=   r:   r9   r>   r;   r<   )required	validatorr    )defaultr   Fz0.60.0z0.63.0)r   sincesince_valuesr   z0.45.0)r   r   )allow_unknownT.Tuple[str]rs   'FuncOptionArgs'c           
      C  s   |d }t |d urtdtj|j| jd}| s$td| |d }| j	| }|d p2|}dd |
 D }|||d	 |d
 f|}	|| jv rVtd| d |	| j|< d S )Nr   z9Option names can only contain letters, numbers or dashes.)r5   zOption name %s is reserved.r   r   c                 S  s   i | ]\}}|d vr||qS )>   r   r   r   r   r&   )re   r~   r   r&   r&   r'   
<dictcomp>   s    z1OptionInterpreter.func_option.<locals>.<dictcomp>r   r   zOption z already exists.)optname_regexsearchr3   r   	OptionKeyfrom_stringevolver5   
is_projectrF   rt   r?   r   deprecation)
rG   rp   rs   Zopt_namer   opt_typeparserr   Zn_kwargsoptr&   r&   r'   r      s   

zOptionInterpreter.func_optionzstring optionr   T.Tuple[bool, _DEPRECATED_ARGS]r   coredata.UserOptionc                 C     t j||d g|R  S Nr   )r   UserStringOptionrG   r   rp   rs   r&   r&   r'   r@         zOptionInterpreter.string_parserzboolean optionc                 C  s   t | ts	| dv rd S dS )N>   truefalsez(boolean options must have boolean values)rS   r*   )xr&   r&   r'   <lambda>   s    zOptionInterpreter.<lambda>)1.1.0zuse a boolean, not a string)r   r   deprecated_valuesr)   c                 C  r   r   )r   UserBooleanOptionr   r&   r&   r'   rA      s   z OptionInterpreter.boolean_parserzcombo optionr   )allow_empty)r   r,   c                 C  s:   |d }|d }|d u r|d d }t j|||g|R  S )Nr   r   r   )r   UserComboOptionrG   r   rp   rs   r   r   r&   r&   r'   rB      s
   zOptionInterpreter.combo_parserzinteger option)r   zuse an integer, not a string)r   r   	convertorr   r   r/   c                 C  s.   |d }|d |d |f}t j||g|R  S )Nr   r   r   )r   UserIntegerOption)rG   r   rp   rs   r   Zinttupler&   r&   r'   rC      s   z OptionInterpreter.integer_parserzstring array optionr1   c                 C  sr   |d }|d d ur|d n|}t |tr+|dr$tdd| j ntd| tj	||||d |d d	S )
Nr   r   [zString value for array optionz1.3.0z Value does not define an array: r   r   )r   yieldingr   )
rS   r    
startswithr	   user5   r   rR   r   UserArrayOptionr   r&   r&   r'   rD     s   

z%OptionInterpreter.string_array_parserzfeature optionauto>   disabledr   enabled)r   r   r2   c                 C  r   r   )r   UserFeatureOptionr   r&   r&   r'   rE     r   z OptionInterpreter.feature_parserN)r5   r6   r7   r8   )rI   r    r7   r8   )r_   r`   r7   ra   )rp   r   r7   r   )r   r   r7   r8   )rp   r   rs   r   r7   r8   )r   r    rp   r   rs   r   r7   r   )r   r    rp   r   rs   r)   r7   r   )r   r    rp   r   rs   r,   r7   r   )r   r    rp   r   rs   r/   r7   r   )r   r    rp   r   rs   r1   r7   r   )r   r    rp   r   rs   r2   r7   r   )r"   r#   r$   rH   r^   rd   r   rW   r   r   r    r   r*   r   dictlistr   DEFAULT_YIELDINGr
   r   r@   rA   r   rB   r0   rC   rD   rE   r&   r&   r&   r'   r4   K   s    



'
	

r4   )0
__future__r   retypingTr   r   r   r   r   interpreterbaser   r	   r
   r   r   r   Zinterpreter.type_checkingr   r   TYPE_CHECKINGr   r   r   Ztyping_extensionsr   r   Unionr*   r    DictListZ_DEPRECATED_ARGSOptionalobjectr0   r   r   r)   r,   r/   r1   r2   rR   r3   compiler   r4   r&   r&   r&   r'   <module>   sB    "
