o
    Nip                     @   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   sV   d }| j D ]#}t|trq|rt|j|j  d  d S | r$|}|  qd S Nz% makes remaining patterns unreachable)	r   
isinstancer   r   pospatternirrefutable_messageis_irrefutablevalidate_irrefutable)selffound_irrefutable_casecase r   R/home/ubuntu/.local/lib/python3.10/site-packages/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                   @   s0   e Zd ZdZg d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      t | jtrd S | j  d S N)r
   r   r   get_targetsr   r   r   r   validate_targets5      zMatchCaseNode.validate_targetsc                 C   r    r!   )r
   r   r   r   r   r   r   r   r   :   r$   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|vrg |d< t t| j|fi | 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   r0   other_targetsr.   r   r   r   update_targets_with_targetsZ   s   z'PatternNode.update_targets_with_targetsc                 C   s*   ||v rt | jd| d || d S r2   )r   r   addr/   r   r   r   r-   _   s   z!PatternNode.add_target_to_targetsc                 C   s   t r!   )NotImplementedErrorr   r   r   r   r,   d   s   z$PatternNode.get_main_pattern_targetsc                 C   s4   | j D ]}t| |}|d u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"   r6   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   is_is_checkr,   r   r   r   r   r=   o   s
    r=   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
    NFr1   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 )Nzname capture '%s'wildcard)r1   r.   r   r   r   r   r      s   z-MatchAndAssignPatternNode.irrefutable_messagec                 C   s   | j r| j jhS t S r!   )r1   r.   r?   r   r   r   r   r,      s   
z2MatchAndAssignPatternNode.get_main_pattern_targets)r   r   r   r   r1   rB   r%   r   
child_attsr   r   r,   r   r   r   r   rA   |   s    rA   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!   )rF   r   )r   alternativer   r   r   get_first_irrefutable   s
   
z#OrPatternNode.get_first_irrefutablec                 C   s   |   d uS r!   )rH   r   r   r   r   r         zOrPatternNode.is_irrefutablec                 C   s   |    S r!   )rH   r   r   r   r   r   r      rI   z!OrPatternNode.irrefutable_messagec                 C   s<   d }| j D ]}| }|d ur||krt| jd |}q|S )Nz)alternative patterns bind different names)rF   r"   r   r   )r   child_targetsrG   alternative_targetsr   r   r   r,      s   
z&OrPatternNode.get_main_pattern_targetsc                    sV   t t|   d }| jD ]}|rt|j|  d  d S | r$|}|  qd S r	   )r'   rE   r   rF   r   r   r   r   )r   r   rG   r*   r   r   r      s   

z"OrPatternNode.validate_irrefutable)r   r   r   r   r%   r   rH   r   r   r,   r   r<   r   r   r*   r   rE      s    	rE   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?   rM   r6   r"   r   r0   r   r   r   r   r,      s   
z1MatchSequencePatternNode.get_main_pattern_targetsN)r   r   r   r   r%   r   r,   r   r   r   r   rL      s    rL   c                   @   s2   e Zd ZdZg Zg ZdZejg d 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r| || jj |S r!   )r?   rQ   r6   r"   rR   r-   r.   rN   r   r   r   r,      s   
z0MatchMappingPatternNode.get_main_pattern_targets)
r   r   r   r   rP   rQ   rR   r%   r   r,   r   r   r   r   rO      s    rO   c                   @   s6   e Zd ZdZdZg Zg Zg Zej	g d 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?   rU   rW   r6   r"   rN   r   r   r   r,      s   z)ClassPatternNode.get_main_pattern_targets)r   r   r   r   rT   rU   rV   rW   r%   r   r,   r   r   r   r   rS      s    rS   N)Nodesr   r   r   Errorsr   r   r   r%   r=   rA   rE   rL   rO   rS   r   r   r   r   <module>   s   /+