o
    jp                     @   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   _/var/www/html/Deteccion_Ine/venv/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   Z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"   r5   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   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'Z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   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!   )rB   r   )r   alternativer   r   r   get_first_irrefutable   s
   
z#OrPatternNode.get_first_irrefutablec                 C   s   |   d uS r!   )rD   r   r   r   r   r         zOrPatternNode.is_irrefutablec                 C   s   |    S r!   )rD   r   r   r   r   r   r      rE   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)rB   r"   r   r   )r   Zchild_targetsrC   Z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'   rA   r   rB   r   r   r   r   )r   r   rC   r*   r   r   r      s   

z"OrPatternNode.validate_irrefutable)r   r   r   r   r%   r   rD   r   r   r,   r   r;   r   r   r*   r   rA      s    	rA   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>   rG   r5   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   rF      s    rF   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>   rK   r5   r"   rL   r-   r.   rH   r   r   r   r,      s   
z0MatchMappingPatternNode.get_main_pattern_targets)
r   r   r   r   rJ   rK   rL   r%   r   r,   r   r   r   r   rI      s    rI   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>   rO   rQ   r5   r"   rH   r   r   r   r,      s   z)ClassPatternNode.get_main_pattern_targets)r   r   r   r   rN   rO   rP   rQ   r%   r   r,   r   r   r   r   rM      s    rM   N)ZNodesr   r   r   ZErrorsr   r   r   r%   r<   r?   rA   rF   rI   rM   r   r   r   r   <module>   s   /+