U
    {hp                     @   s   d dl mZmZmZ d dlm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ZG dd deZG dd deZdS )   )NodeStatNode	ErrorNode)errorc                   @   s(   e Zd ZdZddgZdd Zdd ZdS )		MatchNodezg
    subject  ExprNode    The expression to be matched
    cases    [MatchCaseNode]  list of cases
    subjectcasesc                 C   sT   d }| j D ]D}t|trq
|r:t|j|j  d  qP| rF|}|  q
d S Nz% makes remaining patterns unreachable)	r   
isinstancer   r   pospatternirrefutable_messageis_irrefutablevalidate_irrefutable)selffound_irrefutable_caseZcase r   B/tmp/pip-unpacked-wheel-fhl22ezh/Cython/Compiler/MatchCaseNodes.pyr      s    

zMatchNode.validate_irrefutablec                 C   s   t | jd | S )Nz/Structural pattern match is not yet implemented)r   r   )r   envr   r   r   analyse_expressions"   s    zMatchNode.analyse_expressionsN)__name__
__module____qualname____doc__child_attrsr   r   r   r   r   r   r   	   s   r   c                   @   s2   e Zd ZdZdddgZdd Zdd Zd	d
 ZdS )MatchCaseNodez\
    pattern    PatternNode
    body       StatListNode
    guard      ExprNode or None
    r   bodyguardc                 C   s"   t | jtrdS | j o | j S )NT)r
   r   r   r   r   r   r   r   r   r   0   s    zMatchCaseNode.is_irrefutablec                 C   s   t | jtrd S | j  d S N)r
   r   r   get_targetsr   r   r   r   validate_targets5   s    zMatchCaseNode.validate_targetsc                 C   s   t | jtrd S | j  d S r   )r
   r   r   r   r   r   r   r   r   :   s    z"MatchCaseNode.validate_irrefutableN)r   r   r   r   r   r   r!   r   r   r   r   r   r   '   s
   
r   c                       sV   e Zd ZdZdgZ fddZdd Zdd Zd	d
 Zdd Z	dd Z
dd Z  ZS )PatternNodez
    PatternNode is not an expression because
    it does several things (evaluating a boolean expression,
    assignment of targets), and they need to be done at different
    times.

    as_targets   [NameNode]    any target assign by "as"
    
as_targetsc                    s(   d|krg |d< t t| j|f| d S )Nr#   )superr"   __init__)r   r   kwds	__class__r   r   r%   L   s    zPatternNode.__init__c                 C   s   dS )NFr   r   r   r   r   r   Q   s    zPatternNode.is_irrefutablec                 C   s&   |   }| jD ]}| ||j q|S r   )get_main_pattern_targetsr#   add_target_to_targetsnamer   targetstargetr   r   r   r    T   s    
zPatternNode.get_targetsc                 C   s2   | |D ]}t| jd| d q
|| d S Nzmultiple assignments to name 'z' in pattern)intersectionr   r   update)r   r-   Zother_targetsr+   r   r   r   update_targets_with_targetsZ   s    z'PatternNode.update_targets_with_targetsc                 C   s*   ||krt | jd| d || d S r/   )r   r   addr,   r   r   r   r*   _   s    z!PatternNode.add_target_to_targetsc                 C   s   t d S r   )NotImplementedErrorr   r   r   r   r)   d   s    z$PatternNode.get_main_pattern_targetsc                 C   s4   | j D ](}t| |}|d k	rt|tr|  qd S r   )r   getattrr
   r"   r   )r   attrchildr   r   r   r   h   s    

z PatternNode.validate_irrefutable)r   r   r   r   r   r%   r   r    r2   r*   r)   r   __classcell__r   r   r'   r   r"   @   s   	r"   c                   @   s(   e Zd ZdZejdg ZdZdd ZdS )MatchValuePatternNodezq
    value   ExprNode        # todo be more specific
    is_is_check   bool     Picks "is" or equality check
    valueFc                 C   s   t  S r   )setr   r   r   r   r)   x   s    z.MatchValuePatternNode.get_main_pattern_targetsN)r   r   r   r   r"   r   Zis_is_checkr)   r   r   r   r   r9   o   s   r9   c                   @   s<   e Zd ZdZdZdZejdg Zdd Z	dd Z
d	d
 ZdS )MatchAndAssignPatternNodez`
    target   NameNode or None  the target to assign to (None = wildcard)
    is_star  bool
    NFr.   c                 C   s   | j  S r   )is_starr   r   r   r   r      s    z(MatchAndAssignPatternNode.is_irrefutablec                 C   s   | j rd| j j S dS d S )Nzname capture '%s'Zwildcard)r.   r+   r   r   r   r   r      s    z-MatchAndAssignPatternNode.irrefutable_messagec                 C   s   | j r| j jhS t S d S r   )r.   r+   r;   r   r   r   r   r)      s    
z2MatchAndAssignPatternNode.get_main_pattern_targets)r   r   r   r   r.   r=   r"   r   Z
child_attsr   r   r)   r   r   r   r   r<   |   s   r<   c                       sL   e Zd ZdZejdg Zdd Zdd Zdd Zd	d
 Z	 fddZ
  ZS )OrPatternNodez-
    alternatives   list of PatternNodes
    alternativesc                 C   s    | j D ]}| r|  S qd S r   )r?   r   )r   alternativer   r   r   get_first_irrefutable   s    

z#OrPatternNode.get_first_irrefutablec                 C   s   |   d k	S r   )rA   r   r   r   r   r      s    zOrPatternNode.is_irrefutablec                 C   s   |    S r   )rA   r   r   r   r   r   r      s    z!OrPatternNode.irrefutable_messagec                 C   s<   d }| j D ],}| }|d k	r2||kr2t| jd |}q
|S )Nz)alternative patterns bind different names)r?   r    r   r   )r   Zchild_targetsr@   Zalternative_targetsr   r   r   r)      s    
z&OrPatternNode.get_main_pattern_targetsc                    sT   t t|   d }| jD ]6}|r:t|j|  d  qP| rF|}|  qd S r	   )r$   r>   r   r?   r   r   r   r   )r   r   r@   r'   r   r   r      s    
z"OrPatternNode.validate_irrefutable)r   r   r   r   r"   r   rA   r   r   r)   r   r8   r   r   r'   r   r>      s   	r>   c                   @   s$   e Zd ZdZejdg Zdd ZdS )MatchSequencePatternNodez)
    patterns   list of PatternNodes
    patternsc                 C   s&   t  }| jD ]}| ||  q|S r   )r;   rC   r2   r    r   r-   r   r   r   r   r)      s    
z1MatchSequencePatternNode.get_main_pattern_targetsN)r   r   r   r   r"   r   r)   r   r   r   r   rB      s   rB   c                   @   s4   e Zd ZdZg Zg ZdZejdddg Zdd Z	dS )MatchMappingPatternNodez
    keys   list of NameNodes
    value_patterns  list of PatternNodes of equal length to keys
    double_star_capture_target  NameNode or None
    Nkeysvalue_patternsdouble_star_capture_targetc                 C   s<   t  }| jD ]}| ||  q| jr8| || jj |S r   )r;   rG   r2   r    rH   r*   r+   rD   r   r   r   r)      s    
z0MatchMappingPatternNode.get_main_pattern_targets)
r   r   r   r   rF   rG   rH   r"   r   r)   r   r   r   r   rE      s   rE   c                   @   s:   e Zd ZdZdZg Zg Zg Zej	ddddg Z	dd Z
dS )	ClassPatternNodea  
    class_  NameNode or AttributeNode
    positional_patterns  list of PatternNodes
    keyword_pattern_names    list of NameNodes
    keyword_pattern_patterns    list of PatternNodes
                                (same length as keyword_pattern_names)
    Nclass_positional_patternskeyword_pattern_nameskeyword_pattern_patternsc                 C   s,   t  }| j| j D ]}| ||  q|S r   )r;   rK   rM   r2   r    rD   r   r   r   r)      s    z)ClassPatternNode.get_main_pattern_targets)r   r   r   r   rJ   rK   rL   rM   r"   r   r)   r   r   r   r   rI      s   rI   N)ZNodesr   r   r   ZErrorsr   r   r   r"   r9   r<   r>   rB   rE   rI   r   r   r   r   <module>   s   /+