
 YMc                 @   s1  d  d l  m Z m Z m Z d  d l  m Z m Z d d l Z d d l Z d d l Z d d l	 m
 Z
 d d d  Z d	 d
   Z d d   Z d d   Z Gd d   d  Z Gd d   d e j  Z Gd d   d e  Z Gd d   d e  Z Gd d   d  Z Gd d   d e  Z Gd d   d  Z d S)   )mparsermesonlibmlog)environmentdependencies    N)wrapszArguments must be strings.c             C   sv   t  |  t  s4 t j d t |    t d   n  t d d   |  D  sr t j d t |    t |   n  d  S)NzNot a list:zArgument not a list.c             s   s   |  ] } t  | t  Vq d  S)N)
isinstancestr).0s r   V/mnt/raid6/a/bak/reczko/tools/protein/utils/meson-0.42.1/mesonbuild/interpreterbase.py	<genexpr>   s    z#check_stringlist.<locals>.<genexpr>zElement not a string:)r	   listr   debugr
   InvalidArgumentsall)amsgr   r   r   check_stringlist   s    r   c                s"   t       f d d    } | S)Nc                s(   | r t  d   n    |  | | |  S)Nz,Function does not take positional arguments.)r   )selfnodeargskwargs)fr   r   wrapped#   s    znoPosargs.<locals>.wrapped)r   )r   r   r   )r   r   	noPosargs"   s    r   c                s"   t       f d d    } | S)Nc                s(   | r t  d   n    |  | | |  S)Nz)Function does not take keyword arguments.)r   )r   r   r   r   )r   r   r   r   +   s    znoKwargs.<locals>.wrapped)r   )r   r   r   )r   r   noKwargs*   s    r   c                s"   t       f d d    } | S)Nc                s2   t  | t  s t  t |    |  | | |  S)N)r	   r   AssertionErrorr   )r   r   r   r   )r   r   r   r   3   s    
zstringArgs.<locals>.wrapped)r   )r   r   r   )r   r   
stringArgs2   s    r    c               @   s(   e  Z d  Z d d   Z d d   Z d S)permittedKwargsc             C   s   | |  _  d  S)N)	permitted)r   r"   r   r   r   __init__<   s    zpermittedKwargs.__init__c                s%   t        f d d    } | S)Nc                s   t  |  d  r$ |  j } |  j } n$ t  | d  rH | j } | j } n  xR | D]J } |  j k rO t j j | t j  } t	 j
 d | | | f  qO qO W  |  | | |  S)Nsubdirz`Passed invalid keyword argument "%s" in %s line %d.
This will become a hard error in the future.)hasattrr$   current_linenor"   ospathjoinr   build_filenamer   warning)r   Znode_or_stater   r   r$   linenokfname)r   r   r   r   r   @   s    		z)permittedKwargs.__call__.<locals>.wrapped)r   )r   r   r   r   )r   r   r   __call__?   s    !zpermittedKwargs.__call__N)__name__
__module____qualname__r#   r/   r   r   r   r   r!   :   s   r!   c               @   s   e  Z d  Z d S)InterpreterExceptionN)r0   r1   r2   r   r   r   r   r3   Q   s   r3   c               @   s   e  Z d  Z d S)InvalidCodeN)r0   r1   r2   r   r   r   r   r4   T   s   r4   c               @   s   e  Z d  Z d S)r   N)r0   r1   r2   r   r   r   r   r   W   s   r   c               @   s(   e  Z d  Z d d   Z d d   Z d S)InterpreterObjectc             C   s   i  |  _  d  S)N)methods)r   r   r   r   r#   [   s    zInterpreterObject.__init__c             C   s7   | |  j  k r# |  j  | | |  St d |   d  S)NzUnknown method "%s" in object.)r6   r4   )r   method_namer   r   r   r   r   method_call^   s    zInterpreterObject.method_callN)r0   r1   r2   r#   r8   r   r   r   r   r5   Z   s   r5   c                   s"   e  Z d  Z   f d d   Z   S)MutableInterpreterObjectc                s   t    j   d  S)N)superr#   )r   )	__class__r   r   r#   d   s    z!MutableInterpreterObject.__init__)r0   r1   r2   r#   r   r   )r;   r   r9   c   s   r9   c               @   s  e  Z d  Z d d   Z d d   Z d d   Z d d   Z d	 d
   Z d d d d  Z d d   Z	 d d   Z
 d d   Z d d   Z d d   Z d d   Z d d   Z d d   Z d d    Z d! d"   Z d# d$   Z d% d&   Z d' d(   Z d) d*   Z d+ d,   Z d- d.   Z d/ d0   Z d1 d2   Z d3 d4   Z d5 d6   Z d7 d8   Z d9 d:   Z d; d<   Z d= d>   Z  d? d@   Z! dA dB   Z" dC dD   Z# d S)EInterpreterBasec             C   sC   | |  _  i  |  _ i  |  _ | |  _ i  |  _ d |  _ d |  _ d  S)Nr   r   )source_rootfuncsbuiltinr$   	variablesargument_depthr&   )r   r>   r$   r   r   r   r#   i   s    						zInterpreterBase.__init__c             C   s   t  j j |  j |  j t j  } t  j j |  sF t d |   n  t	 | d d  } | j
   } Wd  QX| j   r t d   n  t | t  s t  y" t j | |  j  j   |  _ Wn: t j k
 r } z t j | _ |  WYd  d  } ~ Xn Xd  S)NzMissing Meson file in %sencodingutf8zBuilder file is empty.)r'   r(   r)   r>   r$   r   r*   isfiler   openreadisspacer4   r	   r
   r   r   Parserparseastr   MesonExceptionfile)r   Z	mesonfileZmfcodemer   r   r   load_root_meson_filer   s    !"z$InterpreterBase.load_root_meson_filec             C   s   |  j  |  j d d d S)z
        Parses project() and initializes languages, compilers etc. Do this
        early because we need this before we parse the rest of the AST.
        endr   N)evaluate_codeblockrK   )r   r   r   r   parse_project   s    zInterpreterBase.parse_projectc             C   s   t  |  j t j  s$ t d   n  |  j j s? t d   n  |  j j d } t  | t j  sq | j d k r t d   n  d  S)Nz5AST is of invalid type. Possibly a bug in the parser.zNo statements in code.r   projectz)First statement must be a call to project)r	   rK   r   CodeBlockNoder4   linesFunctionNode	func_name)r   firstr   r   r   sanity_check_ast   s    "z InterpreterBase.sanity_check_astc             C   s   |  j  |  j d d d  S)Nstartr   )rR   rK   )r   r   r   r   run   s    zInterpreterBase.runr   Nc             C   s)  | d  k r d  St  | t j  sO t d  } | j | _ | j | _ |  n  | j | |  } d } x | t |  k  r$| | } y | j |  _ |  j	 |  Wnp t
 k
 r} zP t | d  s | j | _ | j | _ t j j |  j d  | _ n  |  WYd  d  } ~ Xn X| d 7} qk Wd  S)Nz?Tried to execute a non-codeblock. Possibly a bug in the parser.r   r,   zmeson.buildr   )r	   r   rU   r4   r,   colnorV   lenr&   evaluate_statement	Exceptionr%   r'   r(   r)   r$   rM   )r   r   r[   rQ   eZ
statementsicurr   r   r   rR      s*    	
z"InterpreterBase.evaluate_codeblockc             C   sa  t  | t j  r |  j |  St  | t j  r> |  j |  St  | t j  r] |  j |  St  | t j  rv | j	 St  | t j
  r | j	 St  | t j  r |  j |  St  | t j  r |  j | j	  St  | t j  r |  j |  St  | t j  r|  j |  St  | t j  r'| j	 St  | t j  rF|  j |  St  | t j  re|  j |  St  | t j  r|  j |  St  | t j  r|  j |  St  | t j  r|  j |  St  | t j  r|  j |  St  | t j   r |  j! |  St  | t j"  r|  j# |  St  | t j$  r>|  j% |  S|  j& |  rQ| St' d   d  S)NzUnknown statement.)(r	   r   rW   function_callAssignmentNode
assignment
MethodNoder8   
StringNodevalueBooleanNodeIfClauseNodeevaluate_ifIdNodeget_variableComparisonNodeevaluate_comparison	ArrayNodeevaluate_arraystatement
NumberNodeAndNodeevaluate_andstatementOrNodeevaluate_orstatementNotNodeevaluate_notstatement
UMinusNodeevaluate_uminusstatementArithmeticNodeevaluate_arithmeticstatementForeachClauseNodeevaluate_foreachPlusAssignmentNodeevaluate_plusassign	IndexNodeevaluate_indexingTernaryNodeevaluate_ternaryis_elementary_typer4   )r   rc   r   r   r   r_      sR    z"InterpreterBase.evaluate_statementc             C   s=   |  j  | j  \ } } t |  d k r9 t d   n  | S)Nr   z4Keyword arguments are invalid in array construction.)reduce_argumentsr   r^   r4   )r   rc   	argumentsr   r   r   r   rr      s    z'InterpreterBase.evaluate_arraystatementc             C   s5   |  j  | j  } t | t  s0 t d   n  | S)Nz#Argument to "not" is not a boolean.)r_   ri   r	   boolr3   )r   rc   vr   r   r   ry      s    z%InterpreterBase.evaluate_notstatementc             C   s   t  | t j  s t  xd | j D]Y } |  j | j  } t  | t  sa t d j	 |    n  | r" |  j
 | j  d  Sq" Wt  | j t j  s |  j
 | j  n  d  S)Nz2If clause {!r} does not evaluate to true or false.)r	   r   rk   r   ifsr_   	conditionr   r4   formatrR   block	elseblock	EmptyNode)r   r   rb   resultr   r   r   rl      s    zInterpreterBase.evaluate_ifc             C   sl  |  j  | j  } |  j  | j  } | j d k r= | | k S| j d k rV | | k St | t |   s t d j t |  j t |  j | j    n |  j	 |  s t d j | j j
    n |  j	 |  s t d j | j j
    np | j d k r| | k  S| j d k r*| | k S| j d k rC| | k S| j d k r\| | k St d	   d  S)
Nz==z!=z?Values of different types ({}, {}) cannot be compared using {}.z%{} can only be compared for equality.<z<=>z>=zYou broke my compare eval.)r_   leftrightctyper	   typer3   r   r0   r   ri   r4   )r   r   Zval1Zval2r   r   r   rp      s0    





z#InterpreterBase.evaluate_comparisonc             C   sn   |  j  | j  } t | t  s0 t d   n  | s: d S|  j  | j  } t | t  sj t d   n  | S)Nz)First argument to "and" is not a boolean.Fz*Second argument to "and" is not a boolean.)r_   r   r	   r   r3   r   )r   rc   lrr   r   r   ru     s    z%InterpreterBase.evaluate_andstatementc             C   sn   |  j  | j  } t | t  s0 t d   n  | r: d S|  j  | j  } t | t  sj t d   n  | S)Nz(First argument to "or" is not a boolean.Tz)Second argument to "or" is not a boolean.)r_   r   r	   r   r3   r   )r   rc   r   r   r   r   r   rw     s    z$InterpreterBase.evaluate_orstatementc             C   s5   |  j  | j  } t | t  s0 t d   n  | S)Nz'Argument to negation is not an integer.)r_   ri   r	   intr3   )r   rc   r   r   r   r   r{   "  s    z(InterpreterBase.evaluate_uminusstatementc             C   s  |  j  | j  } |  j  | j  } | j d k r y | | SWqt k
 r| } z t d t |    WYd  d  } ~ XqXn$| j d k r t | t  s t | t  r t d   n  | | S| j d k rt | t  s t | t  rt d   n  | | S| j d k rRt | t  s;t | t  rJt d   n  | | S| j d	 k rt | t  st | t  rt d
   n  | | St d   d  S)NaddzInvalid use of addition: subz%Subtraction works only with integers.mulz(Multiplication works only with integers.divz"Division works only with integers.modz Modulo works only with integers.zYou broke me.)	r_   r   r   	operationr`   r4   r
   r	   r   )r   rc   r   r   ra   r   r   r   r}   (  s0    ,    z,InterpreterBase.evaluate_arithmeticstatementc             C   sr   t  | t j  s t  |  j | j  } t  | t  sH t d   n  | r^ |  j | j  S|  j | j	  Sd  S)Nz!Ternary condition is not boolean.)
r	   r   r   r   r_   r   r   r3   	trueblock
falseblock)r   r   r   r   r   r   r   D  s    z InterpreterBase.evaluate_ternaryc             C   s   t  | t j  s t  | j j } |  j | j  } t  | t  sT t	 d   n  x. | D]& } |  j
 | |  |  j | j  q[ Wd  S)Nz%Items of foreach loop is not an array)r	   r   r~   r   varnameri   r_   itemsr   r   set_variablerR   r   )r   r   r   r   itemr   r   r   r   N  s    z InterpreterBase.evaluate_foreachc             C   s  t  | t j  s t  | j } |  j | j  } |  j |  } t  | t  r| t  | t  so t	 d   n  | | } n t  | t
  r t  | t
  s t	 d   n  | | } nG t  | t  s t	 d   n) t  | t  r | | } n | | g } |  j | |  d  S)Nz`The += operator requires a string on the right hand side if the variable on the left is a stringz\The += operator requires an int on the right hand side if the variable on the left is an intzBThe += operator currently only works with arrays, strings or ints )r	   r   r   r   var_namer_   ri   rn   r
   r   r   r   r   )r   r   r   ZadditionZold_variableZ	new_valuer   r   r   r   X  s$    	z#InterpreterBase.evaluate_plusassignc             C   s   t  | t j  s t  |  j | j  } t  | t  sH t d   n  |  j | j  } t  | t	  sx t d   n  | t
 |  k  s | t
 |  k r t d | t
 |  f   n  | | S)Nz"Tried to index a non-array object.zIndex value is not an integer.z+Index %d out of bounds of array of size %d.)r	   r   r   r   r_   iobjectr   r3   indexr   r^   )r   r   r   r   r   r   r   r   q  s    %z!InterpreterBase.evaluate_indexingc             C   sa   | j  } |  j | j  \ } } | |  j k rP |  j | | |  j |  |  S|  j |  d  S)N)rX   r   r   r?   flattenunknown_function_called)r   r   rX   posargsr   r   r   r   rd   }  s
    	 zInterpreterBase.function_callc             C   s  | j  } t | t j  r6 | j } |  j |  } n |  j |  } | j } | j } t | t	  ry |  j
 | | |  St | t  r |  j | | |  St | t  r |  j | | |  St | t  r |  j | | |  j |  d  St | t j  rt d |   n  t | t  s3t d |   n  |  j |  \ } } | d k rg|  j | j  n  | j | |  j |  |  S)Nr   z!File object "%s" is not callable.zVariable "%s" is not callable.extract_objects)source_objectr	   r   rm   ri   rn   r_   namer   r
   string_method_callr   bool_method_callr   int_method_callr   array_method_callr   r   Filer   r5   validate_extractionheld_objectr8   r   )r   r   Z	invokableZobject_nameobjr7   r   r   r   r   r   r8     s.    				 zInterpreterBase.method_callc             C   s   |  j  |  \ } } | d k r | s8 | r1 d Sd Sq t |  d k r t | d t  r t | d t  r | r~ | d S| d Sq t d   n- | d k r | r d Sd Sn t d	 |   d  S)
NZ	to_stringtruefalse   r   r   zbool.to_string() must have either no arguments or exactly two string arguments that signify what values to return for true and false.to_intz"Unknown method "%s" for a boolean.)r   r^   r	   r
   r3   )r   r   r7   r   r   _r   r   r   r     s     8z InterpreterBase.bool_method_callc             C   s   |  j  |  \ } } | d k rD | s5 | d d k St d   n? | d k rs | sd | d d k St d   n t d |   d  S)NZis_evenr   r   z%int.is_even() must have no arguments.Zis_oddz$int.is_odd() must have no arguments.z#Unknown method "%s" for an integer.)r   r3   )r   r   r7   r   r   r   r   r   r   r     s    zInterpreterBase.int_method_callc       	      C   s  |  j  |  \ } } | d k r+ | j   S| d k rG |  j | |  S| d k r] | j   S| d k rs | j   S| d k r t j d d |  S| d k rt |  d	 k r t d
   qt |  d	 k r| d } t	 | t
  s t d   n  | j |  S| j   Sn| d k s7| d k s7| d k r| d } t	 | t
  s_t d   n  | d k rx| j |  S| d k r| j |  d k S| j |  S| d k ry t |  SWqt k
 rt d j |    YqXn | d k r9t |  d	 k rt d   n  | d } t |  | j |  S| d k rt |  d	 k rft d   n  | d } t	 | t
  st d   n  t j | |  St d |   d  S)Nstripr   Zto_upperZto_lowerZunderscorifyz[^a-zA-Z0-9]r   splitr   z'Split() must have at most one argument.r   z!Split() argument must be a string
startswithcontainsendswithzArgument must be a string.r   z&String {!r} cannot be converted to intr)   z"Join() takes exactly one argument.version_comparez-Version_compare() takes exactly one argument.z,Version_compare() argument must be a string.z!Unknown method "%s" for a string.)r   r   format_stringupperlowerrer   r^   r3   r	   r
   r   r   findr   r   r`   r   r   r)   r   r   )	r   r   r7   r   r   r   r   ZstrlistZcmprr   r   r   r     s`    



$



z"InterpreterBase.string_method_callc             C   s   t  d |   d  S)NzUnknown function "%s".)r4   )r   rX   r   r   r   r     s    z'InterpreterBase.unknown_function_calledc             C   s5  | d k r |  j  | |  S| d k r2 t |  S| d k r| d } d  } t |  d k rm | d } n' t |  d k r d } t |   n  t | t  s t d   n  | t |  k  s | t |  k r| d  k r
d	 } t | j | t |     n  | S| | Sd
 } t | j |    d  S)Nr   lengthgetr   r   r   zuArray method 'get()' only takes two arguments: the index and an optional fallback value if the index is out of range.zArray index must be a number.z9Array index {!r} is out of bounds for array of size {!r}.z(Arrays do not have a method called {!r}.)check_containsr^   r   r	   r   r   r3   )r   r   r7   r   r   fallbackmr   r   r   r     s,    

%!z!InterpreterBase.array_method_callc                s   t  | t j  s t  | j   r3 t d   n    j d 7_   f d d   | j D } i  } xU | j j	   D]D } t  | t
  s t d   n  | j | }   j |  | | <qt W  j d 8_ | | f S)Nz9All keyword arguments must be after positional arguments.r   c                s   g  |  ] }   j  |   q Sr   )r_   )r   arg)r   r   r   
<listcomp>  s   	 z4InterpreterBase.reduce_arguments.<locals>.<listcomp>z&Keyword argument name is not a string.)r	   r   ArgumentNoder   incorrect_orderr   rB   r   r   keysr
   r_   )r   r   reduced_pos
reduced_kwkeyr   r   )r   r   r     s    z InterpreterBase.reduce_argumentsc             C   s   t  | t j  r | j St  | t t t j t f  r; | Sg  } xk | D]c } t  | t	  ry |  j
 |  } | | } qH t  | t j  r | j | j  qH | j |  qH W| S)N)r	   r   rh   ri   r   r
   r   r   r5   r   r   append)r   r   r   r   restr   r   r   r   $  s    zInterpreterBase.flattenc             C   s   t  | t j  s t  |  j d k r6 t d   n  | j } t  | t  s] t d   n  |  j | j	  } |  j
 |  s t d   n  t  | t  r t j |  } n  |  j | |  d  S)Nr   zbTried to assign values inside an argument list.
To specify a keyword argument, use : instead of =.z(Tried to assign value to a non-variable.z-Tried to assign an invalid value to variable.)r	   r   re   r   rB   r   r   r
   r_   ri   is_assignabler4   r9   copydeepcopyr   )r   r   r   ri   r   r   r   rf   4  s    	zInterpreterBase.assignmentc             C   s   | d  k r t  d   n  t | t  s9 t  d   n  |  j |  sW t  d   n  t j d |  d  k r t  d |   n  | |  j k r t  d |   n  | |  j | <d  S)Nz Can not assign None to variable.z0First argument to set_variable must be a string.z&Assigned value not of assignable type.z[_a-zA-Z][_0-9a-zA-Z]*$zInvalid variable name: z)Tried to overwrite internal variable "%s")r4   r	   r
   r   r   matchr@   rA   )r   r   variabler   r   r   r   E  s    zInterpreterBase.set_variablec             C   sH   | |  j  k r |  j  | S| |  j k r4 |  j | St d |   d  S)NzUnknown variable "%s".)r@   rA   r4   )r   r   r   r   r   rn   R  s
    zInterpreterBase.get_variablec             C   s%   t  | t t j t t t t j f  S)N)	r	   r5   r   
Dependencyr
   r   r   r   r   )r   ri   r   r   r   r   Y  s    zInterpreterBase.is_assignablec             C   s   t  | t t t t t f  S)N)r	   r   floatr
   r   r   )r   r   r   r   r   r   ]  s    z"InterpreterBase.is_elementary_type)$r0   r1   r2   r#   rP   rS   rZ   r\   rR   r_   rr   ry   rl   rp   ru   rw   r{   r}   r   r   r   r   rd   r8   r   r   r   r   r   r   r   rf   r   rn   r   r   r   r   r   r   r<   h   sB   		,

3r<   ) r   r   r   r   r   r'   r   r   	functoolsr   r   r   r   r    r!   rL   r3   r4   r   r5   r9   r<   r   r   r   r   <module>   s   $	