
Y/                 @   s  d  d l  m Z d  d l  m Z d  d l  m Z d d l Z d d l Z e j   Z d d d d	 d
 d d d d d d d h Z d d   Z	 Gd d   d e j
  Z e j d  Z d d   Z d d   Z d d   Z i e d 6e d 6e d 6Z Gd  d!   d!  Z d S)"   )mparser)coredata)mesonlib    NZc_Zcpp_Zd_Zrust_Zfortran_Zobjc_Zobjcpp_Zvala_Zcsharp_Zswift_Zb_Zbackend_c             C   s;   |  t  k r d S|  j d  d d } | t k r7 d Sd S)NT_r   F)forbidden_option_namessplitforbidden_prefixes)namepref r   U/mnt/raid6/a/bak/reczko/tools/protein/utils/meson-0.42.1/mesonbuild/optinterpreter.pyis_invalid_name#   s    r   c               @   s   e  Z d  Z d S)OptionExceptionN)__name__
__module____qualname__r   r   r   r   r   +   s   r   z[^a-zA-Z0-9_-]c             C   s.   t  j |  | | j d d  | j d g    S)Nvalue choices)r   UserStringOptionget)r
   descriptionkwargsr   r   r   StringParser0   s    r   c             C   s   t  j |  | | j d d   S)Nr   T)r   UserBooleanOptionr   )r
   r   r   r   r   r   BooleanParser4   s    r   c             C   s   d | k r t  d   n  | d } t | t  sC t  d   n  x, | D]$ } t | t  sJ t  d   qJ qJ Wt j |  | | | j d | d   S)Nr   z'Combo option missing "choices" keyword.zCombo choices must be an array.z&Combo choice elements must be strings.r   r   )r   
isinstanceliststrr   UserComboOptionr   )r
   r   r   r   ir   r   r   ComboParser7   s    
r"   stringZbooleanZcomboc               @   sL   e  Z d  Z d d   Z d d   Z d d   Z d d   Z d	 d
   Z d S)OptionInterpreterc             C   s   i  |  _  | |  _ | d |  _ i  |  _ x | D] } |  j d k r_ | j |  j  s_ q/ q_ n  y | j d d  \ } } Wn' t k
 r t d j |    Yn X|  j d k r d | k r q/ n  | |  j | <q/ Wd  S)N:r   =r   z7Option {!r} must have a value separated by equals sign.)	options
subprojectZsbprefixcmd_line_options
startswithr   
ValueErrorr   format)selfr(   Zcommand_line_optionsokeyr   r   r   r   __init__H   s    				zOptionInterpreter.__init__c             C   s4  y@ t  | d d d % } t j | j   d  j   } Wd  QXWn7 t j k
 ry } z | | _ |  WYd  d  } ~ Xn Xt | t j	  s t
 d  } | j   | _ |  n  x} | j D]r } y |  j |  Wq t k
 r+} z8 | j | _ | j | _ t j j d  | _ |  WYd  d  } ~ Xq Xq Wd  S)Nrencodingutf8r   zOption file is malformed.zmeson_options.txt)openr   Parserreadparser   MesonExceptionfiler   CodeBlockNoder   linenolinesevaluate_statement	Exceptioncolnoospathjoin)r-   option_filefastmeecurr   r   r   process[   s$    (		zOptionInterpreter.processc                sz   t  | t  r | St  | t j t j t j f  r; | j St  | t j  rj   f d d   | j j	 D St
 d   d  S)Nc                s   g  |  ] }   j  |   q Sr   )reduce_single).0Zcurarg)r-   r   r   
<listcomp>v   s   	 z3OptionInterpreter.reduce_single.<locals>.<listcomp>z;Arguments may only be string, int, bool, or array of those.)r   r   r   
StringNodeBooleanNode
NumberNoder   	ArrayNodeargs	argumentsr   )r-   argr   )r-   r   rJ   o   s    zOptionInterpreter.reduce_singlec                s   t  | t j  s t  | j   r3 t d   n    f d d   | j D } i  } xU | j j   D]D } t  | t	  s t d   n  | j | }   j
 |  | | <qe W| | f S)Nz9All keyword arguments must be after positional arguments.c                s   g  |  ] }   j  |   q Sr   )rJ   )rK   rS   )r-   r   r   rL   ~   s   	 z6OptionInterpreter.reduce_arguments.<locals>.<listcomp>z&Keyword argument name is not a string.)r   r   ArgumentNodeAssertionErrorincorrect_orderr   rR   r   keysr   rJ   )r-   rQ   Zreduced_posZ
reduced_kwr/   ar   )r-   r   reduce_argumentsz   s    z"OptionInterpreter.reduce_argumentsc             C   s  t  | t j  s! t d   n  | j } | d k rE t d   n  |  j | j  \ } } d | k rx t d   n  | d } | t k r t d |   n  t |  d k r t d   n  | d	 } t  | t	  s t d
   n  t
 j |  d  k	 rt d   n  t |  r-t d |   n  |  j d k rP|  j d | } n  t | | | j d d  |  } | j d k r| | _ n  | |  j k r| j | j |  j |   n  | |  j | <d  S)Nz/Option file may only contain option definitionsoptionz3Only calls to option() are allowed in option files.typez5Option call missing mandatory "type" keyword argumentzUnknown type %s.r   z9Option() must have one (and only one) positional argumentr   z%Positional argument must be a string.z9Option names can only contain letters, numbers or dashes.zOption name %s is reserved.r   r%   r   )r   r   FunctionNoder   	func_namerY   rQ   option_typeslenr   optname_regexsearchr   r(   r   r   r)   	set_valueparse_stringr'   )r-   noder]   posargsr   Zopt_typeZopt_nameoptr   r   r   r=      s8    	

" z$OptionInterpreter.evaluate_statementN)r   r   r   r0   rI   rJ   rY   r=   r   r   r   r   r$   G   s
   r$   )r   r   r   r   r@   reget_builtin_optionsr   r	   r   r8   r   compiler`   r   r   r"   r^   r$   r   r   r   r   <module>   s4   	

