o
    2g.                     @   s8  d dl mZ d dlmZmZmZmZ d dlmZm	Z	m
Z
 d dlmZmZmZmZmZmZmZmZmZ d dlmZ d dlmZmZmZ d dlmZmZ d dlmZ d d	l m!Z! d d
l"m#Z#m$Z$m%Z%m&Z& d dl'm(Z( d dl)m*Z*m+Z+m,Z, d dl-m.Z.m/Z/ h dZ0G dd deZ1dedeee2 ee	 ee f fddZ3dS )    )contextmanager)	GeneratorListOptionalTuple)	MatchStmtNameExprTypeInfo)		AsPatternClassPatternMappingPattern	OrPatternPatternSequencePatternSingletonPatternStarredPatternValuePattern)TraverserVisitor)Instance	TupleTypeget_proper_type)
BasicBlockValue)object_rprimitive)	IRBuilder)	dict_copydict_del_itemmapping_has_keysupports_mapping_protocol)generic_ssize_t_len_op)sequence_get_itemsequence_get_slicesupports_sequence_protocol)fast_isinstance_opslow_isinstance_op>   builtins.intbuiltins.setbuiltins.strbuiltins.boolbuiltins.dictbuiltins.listbuiltins.bytesbuiltins.floatbuiltins.tuplebuiltins.bytearraybuiltins.frozensetc                   @   s8  e Zd ZU eed< eed< eed< eed< eed< eed< dZe	e
 ed< ded	ed
dfddZded
dfddZded
dfddZded
dfddZded
dfddZded
dfddZde
d
dfddZded
dfddZded
dfddZd ed
dfd!d"Zd+d$ed%ed
dfd&d'Zeded
ed( fd)d*Z dS ),MatchVisitorbuilder
code_block
next_blockfinal_blocksubjectmatchN
as_pattern
match_nodereturnc                 C   s6   || _ t | _t | _t | _|| _||j| _d S N)r1   r   r2   r3   r4   r6   acceptr5   )selfr1   r8    r=   K/home/garg/my-data/venv/lib/python3.10/site-packages/mypyc/irbuild/match.py__init__=   s   zMatchVisitor.__init__indexc                 C   sz   | j | j | jj| }|r*t | _| j |}| j || j| j | j | j | j | jj	|  | j 
| j d S r:   )r1   activate_blockr2   r6   guardsr   r;   add_bool_branchr3   bodiesgotor4   )r<   r@   guardcondr=   r=   r>   build_match_bodyG   s   zMatchVisitor.build_match_bodymc                 C   sX   t |jD ]\}}t | _t | _||  | | | j| j q| j	| j
 d S r:   )	enumeratepatternsr   r2   r3   r;   rH   r1   rA   goto_and_activater4   )r<   rI   ipatternr=   r=   r>   visit_match_stmtW   s   

zMatchVisitor.visit_match_stmtrN   c                 C   sH   | j |j}| j | j|d|jj}| | | j || j| j	 d S )N==)
r1   r;   expr	binary_opr5   linebind_as_patternrC   r2   r3   )r<   rN   valuerG   r=   r=   r>   visit_value_patternc   s   
z MatchVisitor.visit_value_patternc                 C   s^   | j }t | _ |jD ]}| j}||  || _| j| j  t | _ q
|| _ | j| j  d S r:   )r3   r   rK   r7   r;   r1   rA   rE   )r<   rN   backup_blockpbackupr=   r=   r>   visit_or_patternl   s   


zMatchVisitor.visit_or_patternc              	   C   s  | j |jr	tnt}| j || j| j |jg|j}| j 	|| j
| j | j| jdd |jr|jjtv rL| j | j
 t | _
|jd |  d S |jj}t|tsWJ |jd}|saJ t|j}t|tsmJ g }|jD ] }t|}	t|	tr|	jsJ |	jj}
t|
tsJ ||
 qrt |jD ]5\}}| j | j
 t | _
| j !| j|| |j}| "| ||  W d    n1 sw   Y  qt#|j$|j%D ]4\}}| j | j
 t | _
| j !| j||j}| "| ||  W d    n	1 sw   Y  qd S )NT)	new_blockr   __match_args__)&r1   is_builtin_ref_expr	class_refr#   r$   call_cr5   r;   rS   rC   r2   r3   rT   positionalsfullnameMATCHABLE_BUILTINSrA   r   node
isinstancer	   namesgetr   typer   itemsr   last_known_valuerU   strappendrJ   py_get_attrenter_subpatternzipkeyword_keyskeyword_values)r<   rN   isinstance_oprG   rc   tymatch_args_type
match_argsitemproper_item	match_argrM   rQ   
positionalkeyrU   attrr=   r=   r>   visit_class_pattern}   sZ   

z MatchVisitor.visit_class_patternc                 C   s`   |j r| j}|| _|j |  || _n|jr'| j|j}| j|| j|j | j	| j
 d S r:   )rN   r7   r;   namer1   get_assignment_targetassignr5   rS   rE   r2   )r<   rN   old_patterntargetr=   r=   r>   visit_as_pattern   s   zMatchVisitor.visit_as_patternc                 C   sd   |j d u r| j }n|j du r| j }n| j }| j| j|d|j}| j|| j	| j
 d S )NTis)rU   r1   none_objecttruefalserR   r5   rS   rC   r2   r3   )r<   rN   objrG   r=   r=   r>   visit_singleton_pattern   s   


z$MatchVisitor.visit_singleton_patternc              	   C   s  | j t| jg|j}| j || j| j g }t|j	|j
D ]b\}}| j | j t | _| j |}|| | j t| j|g|j}| j || j| j | j | j t | _| j | jd|gt|j}| | ||  W d    n1 s{w   Y  q|jr| j | j t | _| j t| jg|jj}	| j |j}
| j |
|	|jj t|D ]\}}| j t|	|g|j	| j q| j | j d S d S )N__getitem__)r1   r_   r   r5   rS   rC   r2   r3   rn   keysvaluesrA   r   r;   rk   r   gen_method_callr   rm   restr   r}   r~   rJ   r   rE   )r<   rN   is_dictr   ry   rU   	key_valueexistsru   r   r   rM   key_namer=   r=   r>   visit_mapping_pattern   s:   
z"MatchVisitor.visit_mapping_patternseq_patternc              	   C   s  t |\}}}| jt| jg|j}| j|| j| j | j	| j t
 | _| jt| jg|j}t|}| j|| j||d u rEdnd|j}| j|| j| j t|D ]T\}	}
| j	| j t
 | _|d ur|	|kr| j|| j||	 d|
j}n| j|	}| jt| j|g|
j}| | |
|  W d    n1 sw   Y  qX|r|d ur| j	| j t
 | _| j|| j|| d|j}| jt| j| j||g|j}| j|}| j|||j | j| j d S d S d S )NrP   z>=-)prep_sequence_patternr1   r_   r"   r5   rS   rC   r2   r3   rA   r   r   lenrR   load_intrJ   r    rm   r;   r!   r}   r~   rE   )r<   r   
star_indexcapturerK   is_list
actual_lenmin_lenis_long_enoughrM   rN   currentru   capture_endr   r   r=   r=   r>   visit_sequence_pattern  sT   
z#MatchVisitor.visit_sequence_patternFrU   r[   c                 C   s   | j r9| j jr;| j jr=|r| j| j t | _| j| j j}| j||| j jj	 d | _ |r?| j
| j d S d S d S d S d S r:   )r7   rN   r|   r1   rA   r2   r   r}   r~   rS   rE   )r<   rU   r[   r   r=   r=   r>   rT   >  s   
zMatchVisitor.bind_as_pattern)NNNc                 c   s    | j }|| _ d V  || _ d S r:   )r5   )r<   r5   old_subjectr=   r=   r>   rm   L  s
   
zMatchVisitor.enter_subpattern)F)!__name__
__module____qualname__r   __annotations__r   r   r   r7   r   r
   r?   intrH   rO   r   rV   r   rZ   r   r{   r   r   r   r   r   r   r   boolrT   r   r   rm   r=   r=   r=   r>   r0   3   s*   
 
	C*:r0   r   r9   c                 C   sJ   d }d }g }t | jD ]\}}t|tr|}|j}q|| q|||fS r:   )rJ   rK   rd   r   r   rk   )r   r   r   rK   rM   rN   r=   r=   r>   r   T  s   

r   N)4
contextlibr   typingr   r   r   r   
mypy.nodesr   r   r	   mypy.patternsr
   r   r   r   r   r   r   r   r   mypy.traverserr   
mypy.typesr   r   r   mypyc.ir.opsr   r   mypyc.ir.rtypesr   mypyc.irbuild.builderr   mypyc.primitives.dict_opsr   r   r   r   mypyc.primitives.generic_opsr   mypyc.primitives.list_opsr    r!   r"   mypyc.primitives.misc_opsr#   r$   rb   r0   r   r   r=   r=   r=   r>   <module>   s,    ,  #