
    e.                       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j6                  eeej<                  eef   ej>                  e   f   Z  edeeeejB                  ej>                  e      e"ejB                  e#   ejB                  e#   e d      Z$ G d de      Z% G d de      Z& G d de      Z' G d de      Z( G d de      Z) G d de      Z* G d dejV                        Z, ejZ                  d      Z. G d d      Z/y)     )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<   y)
StringArgsstrr   N__name__
__module____qualname____annotations__     ;/usr/lib/python3/dist-packages/mesonbuild/optinterpreter.pyr    r    ,   s    
r(   r    c                      e Zd ZU ded<   y)BooleanArgsboolr   Nr"   r'   r(   r)   r+   r+   /   s    r(   r+   c                  "    e Zd ZU ded<   ded<   y)	ComboArgsr!   r   T.List[str]r   Nr"   r'   r(   r)   r.   r.   2   s    
r(   r.   c                  ,    e Zd ZU ded<   ded<   ded<   y)IntegerArgsintr   zT.Optional[int]r   r   Nr"   r'   r(   r)   r1   r1   6   s    
r(   r1   c                  "    e Zd ZU ded<   ded<   y)StringArrayArgsz%T.Optional[T.Union[str, T.List[str]]]r   r/   r   Nr"   r'   r(   r)   r4   r4   ;   s    44r(   r4   c                  "    e Zd ZU ded<   ded<   y)FeatureArgsz&Literal['enabled', 'disabled', 'auto']r   r/   r   Nr"   r'   r(   r)   r6   r6   ?   s    55r(   r6   c                      e Zd Zy)OptionExceptionN)r#   r$   r%   r'   r(   r)   r8   r8   D   s    r(   r8   z[^a-zA-Z0-9_-]c                     e Zd Zd3dZd4dZd5dZd6dZd7dZ ed e	de
d eh d	      
       e	de
d       e	dee
 eee
       eee
      fdde
di       e	deej"                  d      d       ede
      d8d              Z ed e	de
d            d9d       Z ed e	dee
fdd e
di            d:d       Z ed  e	de
ef       e	d! eee
d"      d#            d;d$       Z ed% e	dee
fde
d&ie'       e	d(eef       e	d)eef            d<d*       Z ed+ e	d eee
      e
ef       e	d! eee
      g             d=d,       Z ed- e	de
d. eh d/      0            d>d1       Zy2)?OptionInterpreterc                    i | _         || _        | j                  | j                  | j                  | j
                  | j                  | j                  d| _        y )N)stringbooleancombointegerarrayfeature)	options
subprojectstring_parserboolean_parsercombo_parserinteger_parserstring_array_parserfeature_parseroption_types)selfrC   s     r)   __init__zOptionInterpreter.__init__L   sQ    >@$((**&&**--**P
r(   c                   	 t        |d      5 }t        j                  |j                         |      j	                         }d d d        t        t        j                        s)t        d      }|j                         |_        ||_        ||j                  D ]  }	 || _        | j                  |        y # 1 sw Y   wxY w# t
        j                  $ r}||_        |d }~ww xY w# t
        j                  $ r0}|j                  |_        |j                  |_        ||_        |d }~wt         $ r;}t        j                  t#        |      |j                  |j                  |      d }~ww xY w)Nzutf-8)encodingzOption file is malformed.)linenocolnofile)openr   Parserreadparser   MesonExceptionrQ   
isinstanceCodeBlockNoder8   rO   linescurrent_nodeevaluate_statementrP   	Exceptionr!   )rK   option_filefastmeecurs          r)   processzOptionInterpreter.processX   sA   	kG4 DnnQVVX{;AACD
 #w445 ;<Azz|AH AFG99 	RC
R$'!'',	RD D&& 	!BGH	 ** ::))$ R--F3::SYY[R RRsR   C 3B8C C(8C=C C%	C  C%(E-;+D&&E-26E((E-c                *   t        |t              r|S t        |t        j                        r| j	                  |j
                        S t        |t        j                  t        j                  t        j                  f      r|j                  S t        |t        j                        r3|j                  j                  D cg c]  }| j	                  |       c}S t        |t        j                        rsi }|j                  j                  j                         D ]H  \  }}t        |t        j                        st!        d      | j	                  |      ||j                  <   J |S t        |t        j"                        r`| j	                  |j                        }t        |t$        t&        f      st!        d      t)        j*                  dd| j,                         | S t        |t        j.                        rZ| j	                  |j                        }t        |t0              st!        d      t)        j*                  dd| j,                         | S t        |t        j2                        r| j	                  |j4                        }| j	                  |j6                        }|j8                  dk(  r t        |t              rt        |t              st!        d      t)        j*                  d	d
| j,                         ||z   S t!        d      c c}w )Nz(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.)rW   r!   r   ParenthesizedNodereduce_singleinnerBaseStringNodeBooleanNode
NumberNoder   	ArrayNodeargs	argumentsDictNodekwargsitemsr8   
UMinusNoder2   floatr	   
single_userC   NotNoder,   ArithmeticNodeleftright	operation)	rK   argcurargdkvreslrs	            r)   rg   zOptionInterpreter.reduce_singleq   sc   c3Jc7445%%cii00g44g6I6I%002 399W../=@XX=O=OP6D&&v.PPW--.A--/ 31!!W%;%;<)*TUU!//2!''
3 HW//0$$SYY/CcC<0%&GHH!!"I8UYUdUde4KW__-$$SYY/Cc4(%&LMM!!"I8UYUdUde7NW334""388,A""399-AMMU*z!S/AjQRTWFX%&bcc!!"MxY]YhYhiq5L!"_``9 Qs   ?Lc                   |j                         rt        d      |j                  D cg c]  }| j                  |       }}i }|j                  j                         D ]T  }t        |t        j                        st        d      |j                  |   }| j                  |      ||j                  <   V ||fS c c}w )Nz9All keyword arguments must be after positional arguments.z&Keyword argument name is not a string.)
incorrect_orderr8   rn   rg   rp   keysrW   r   IdNoder   )rK   rm   rz   reduced_pos
reduced_kwkeyas          r)   reduce_argumentsz"OptionInterpreter.reduce_arguments   s    !!"]^^:>..I3t))#.II
;;##% 	:Cc7>>2%&NOOC A$($6$6q$9Jsyy!		:
 J&& Js   B;c                    t        |t        j                        st        d      |j                  j
                  }|dk7  rt        d      | j                  |j                        \  }}| j                  ||       y )Nz/Option file may only contain option definitionsoptionz3Only calls to option() are allowed in option files.)	rW   r   FunctionNoder8   	func_namer   r   rm   func_option)rK   noder   posargsrp   s        r)   r[   z$OptionInterpreter.evaluate_statement   sj    $ 4 45!"STTNN((	 !"WXX 11$))<&&)r(   r   r   T>   r@   r>   r<   r=   rA   r?   )required	validatorr    )defaultr   Fz0.60.0z0.63.0)r   sincesince_valuesr   z0.45.0)r   r   )allow_unknownc                    |d   }t         j                  |      t        d      t        j                  j                  |      j                  | j                        }|j                         st        d|z        |d   }| j                  |   }|d   xs |}|j                         D 	ci c]  \  }}	|dvr||	 }
}}	 |||d   |d	   f|
      }|| j                  v rt        j                  d
| d       || j                  |<   y c c}	}w )Nr   z9Option names can only contain letters, numbers or dashes.)rC   zOption name %s is reserved.r   r   >   r   r   r   r   r   r   zOption z already exists.)optname_regexsearchr8   r   	OptionKeyfrom_stringevolverC   
is_projectrJ   rq   rB   r   deprecation)rK   rm   rp   opt_namer   opt_typeparserr   r}   r~   n_kwargsopts               r)   r   zOptionInterpreter.func_option   s#   * 7)5!"]^^  ,,X6===Y~~!"?("JKK&>""8,]+7x &,\\^ PTQ NN qD P P [6'?F<4H"I8T$,,wxj0@ABSPs   -D
zstring optionr   c                6    t        j                  ||d   g| S Nr   )r   UserStringOptionrK   r   rm   rp   s       r)   rD   zOptionInterpreter.string_parser   s     
 ((fWoMMMr(   zboolean optionc                2    t        | t              s| dv rd S dS )N>   truefalsez(boolean options must have boolean values)rW   r,   )xs    r)   <lambda>zOptionInterpreter.<lambda>   s     
1d(;qDU?U   \F r(   )1.1.0zuse a boolean, not a string)r   r   deprecated_valuesc                6    t        j                  ||d   g| S r   )r   UserBooleanOptionr   s       r)   rE   z OptionInterpreter.boolean_parser   s      ))+vgNNNr(   zcombo optionr   )allow_empty)r   c                Z    |d   }|d   }||d   d   }t        j                  |||g| S )Nr   r   r   )r   UserComboOptionrK   r   rm   rp   r   r   s         r)   rF   zOptionInterpreter.combo_parser   sE     #w=9%a(E''WeKdKKr(   zinteger option)r   zuse an integer, not a string)r   r   	convertorr   r   c                P    |d   }|d   |d   |f}t        j                  ||g| S )Nr   r   r   )r   UserIntegerOption)rK   r   rm   rp   r   inttuples         r)   rG   z OptionInterpreter.integer_parser   s9     w5M6%=%8))+xG$GGr(   zstring array optionc                "   |d   }|d   |d   n|}t        |t              rO|j                  d      r&t        dd      j	                  | j
                         nt        j                  d|z         t        j                  ||||d   |d   	      S )
Nr   r   [zString value for array optionz1.3.0z Value does not define an array: r   r   )r   yieldingr   )
rW   r!   
startswithr
   userC   r   rV   r   UserArrayOptionr   s         r)   rH   z%OptionInterpreter.string_array_parser  s     ##)'?#>wGeS!$!"A7KOOPTP_P_`--.PSX.XYY''U0715a377< 	<r(   zfeature optionauto>   r   enableddisabled)r   r   c                6    t        j                  ||d   g| S r   )r   UserFeatureOptionr   s       r)   rI   z OptionInterpreter.feature_parser  s     
 ))+vgNNNr(   N)rC   z'SubProject'returnNone)r]   r!   r   r   )rz   zT.Union[str, mparser.BaseNode]r   z
'TYPE_var')rm   zmparser.ArgumentNoder   z"T.Tuple['TYPE_var', 'TYPE_kwargs'])r   zmparser.BaseNoder   r   )rm   zT.Tuple[str]rp   z'FuncOptionArgs'r   r   )r   r!   rm   T.Tuple[bool, _DEPRECATED_ARGS]rp   r    r   coredata.UserOption)r   r!   rm   r   rp   r+   r   r   )r   r!   rm   r   rp   r.   r   r   )r   r!   rm   r   rp   r1   r   r   )r   r!   rm   r   rp   r4   r   r   )r   r!   rm   r   rp   r6   r   r   )r#   r$   r%   rL   rc   rg   r   r[   r   r   r!   r   r,   r   dictlistr   DEFAULT_YIELDINGr   r   rD   rE   r   rF   r2   rG   rH   rI   r'   r(   r)   r:   r:   K   sH   

R2%aN
'* &'de		
 	-b13)$46Gc6RSx	
 	'4)B)B(S#& Hc"  #'( * '3+N	N 3K F"$LM	
	O	O 'C?+).tSeLW[\
L
L #J"$MN	
 	%#x)%#x)HH
 '-dC8#xHI).tS92F
<
< '3:JKj:klO	Or(   r:   )0
__future__r   retypingTr   r   r   r   r   interpreterbaser	   r
   r   r   r   r   interpreter.type_checkingr   r   TYPE_CHECKINGr   r   r   typing_extensionsr   r   Unionr,   r!   DictList_DEPRECATED_ARGSOptionalobjectr2   r   r    r+   r.   r1   r4   r6   rV   r8   compiler   r:   r'   r(   r)   <module>r      s(   # 	      v v A??6+4wwtS!&&c*:AFF3KGH/::affSk*zz#zz#&	2
 	NY i I i 
) i 
	h-- 	 

+,SO SOr(   