o
    2g1                  
   @  s  U d Z ddlmZ ddlmZmZmZ ddlmZ ddl	m
Z
mZmZmZmZmZmZmZmZmZmZmZ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& d	Z'd
e(d< dZ)d
e(d< dZ*d
e(d< dZ+d
e(d< dZ,d
e(d< e'e*e*e'e,e,e)e+e+e)iZ-d
e(d< dddddddZ.d
e(d< dXd#d$Z/dYd&d'Z0dZd*d+Z1d[d/d0Z2d\d3d4Z3d]d7d8Z4d^d;d<Z5ed=e6e7ee6d>f Z8d_dBdCZ9d`dEdFZ:dadHdIZ;dbdKdLZ<dcdOdPZ=G dQdR dRe&Z>dcdSdTZ?G dUdV dVe&Z@dWS )dzQUtilities related to determining the reachability of code (in semantic analysis).    )annotations)FinalTupleTypeVar)literal)LITERAL_YES
AssertStmtBlockCallExprComparisonExpr
ExpressionFuncDefIfStmtImport	ImportAll
ImportFrom	IndexExprIntExpr	MatchStmt
MemberExprNameExprOpExpr	SliceExprStrExpr	TupleExpr	UnaryExpr)Options)	AsPattern	OrPatternPattern)TraverserVisitor   r   ALWAYS_TRUE   	MYPY_TRUE   ALWAYS_FALSE   
MYPY_FALSE   TRUTH_VALUE_UNKNOWNinverted_truth_mapping==!=><>=<=)r,   r-   r/   r.   r1   r0   
reverse_opsr   optionsr   returnNonec                 C  s   t t| jD ]I}t| j| |}|ttfv rt| j|  q|tt	fv rP|t	kr0t
| j|  | j|d d  D ]}t| q9| jsHtg | _t| j  d S qd S Nr!   )rangelenexprinfer_condition_valuer&   r(   mark_block_unreachablebodyr"   r$   mark_block_mypy_only	else_bodyr	   )r3   r4   iresultr=    rB   I/home/garg/my-data/venv/lib/python3.10/site-packages/mypy/reachability.py"infer_reachability_of_if_statement5   s   


rD   r   c                 C  s   t | jD ]R\}}t| j| }|d urt||}nt}|ttfv s(|ttfv r0t| j	|  n|tt
fv rL|tt
fv rL| j	|d d  D ]}t| qE|t
krWt| j	|  qd S r7   )	enumerateguardsinfer_pattern_valuepatternsr;   r"   r&   r(   r<   bodiesr$   r>   )r3   r4   r@   guardpattern_valueguard_valuer=   rB   rB   rC   %infer_reachability_of_match_statementO   s(   
rM   r   boolc                 C  s   t | j|ttfv S N)r;   r:   r&   r(   )r3   r4   rB   rB   rC   assert_will_always_failk   s   rP   r:   r   intc                 C  s:  |j }d}d}| }t|tr|jdkr|j} d}t}t| tr#| j}nFt| tr,| j}n=t| t	rZ| jdv rZt
| j|}|ttfv rG| jdksR|ttfv rX| jdkrXt
| j|S |S t| |}|tkrit| |j}|tkr|dkrtt}n!|d	kr{t}n|d
ks|dkrt}n||jv rt}n||jv rt}|rt| }|S )a  Infer whether the given condition is always true/false.

    Return ALWAYS_TRUE if always true, ALWAYS_FALSE if always false,
    MYPY_TRUE if true under mypy and false at runtime, MYPY_FALSE if
    false under mypy and true at runtime, else TRUTH_VALUE_UNKNOWN.
     FnotT)andorrT   rU   PY2PY3MYPYTYPE_CHECKING)python_version
isinstancer   opr:   r*   r   namer   r   r;   leftr"   r$   r&   r(   rightconsider_sys_version_infoconsider_sys_platformplatformalways_truealways_falser+   )r:   r4   	pyversionr]   negatedaliasrA   r^   rB   rB   rC   r;   o   sH   






r;   patternr   c                 C  s>   t | tr| jd u rtS t | trtdd | jD rtS tS )Nc                 s  s    | ]	}t |tkV  qd S rO   )rG   r"   ).0prB   rB   rC   	<genexpr>   s    
z&infer_pattern_value.<locals>.<genexpr>)r[   r   rh   r"   r   anyrH   r*   )rh   rB   rB   rC   rG      s   rG   re   tuple[int, ...]c                 C  sd  t | tstS t| jdkrtS | jd }|dvrtS t| jd }t| jd }|du s1|du rCt| jd }t| jd }t| }t |t	rdt |t	rdd|  krWdkrbn tS t
|| ||S tS t |trt |tr|\}}|du rxd}|du r~d}d|  kr|  k rdkrn tS ||| }t|t|kst|t|kr|dvrt
|||S tS )zConsider whether expr is a comparison involving sys.version_info.

    Return ALWAYS_TRUE, ALWAYS_FALSE, or TRUTH_VALUE_UNKNOWN.
    r!   r   )r,   r-   r1   r0   r/   r.   Nr#   r,   r-   )r[   r   r*   r9   	operatorscontains_sys_version_infooperandscontains_int_or_tuple_of_intsr2   rQ   fixed_comparisontuple)r:   re   r\   indexthinglohivalrB   rB   rC   r`      s<   


 (r`   rb   strc                 C  s   t | tr6t| jdkrtS | jd }|dvrtS t| jd ds#tS | jd }t |ts/tS t|||j	S t | t
rrt | jtsCtS t| jdksRt | jd tsTtS t| jjds]tS | jjdkretS || jd j	rptS tS tS )zConsider whether expr is a comparison involving sys.platform.

    Return ALWAYS_TRUE, ALWAYS_FALSE, or TRUTH_VALUE_UNKNOWN.
    r!   r   rn   rb   
startswith)r[   r   r9   ro   r*   is_sys_attrrq   r   rs   valuer
   calleer   argsr:   r]   r{   r"   r&   )r:   rb   r\   r_   rB   rB   rC   ra      s2   
	



ra   Targ.r^   r\   r_   c                 C  s   t td}|dkr|| |k S |dkr|| |k S |dkr#|| |k S |dkr-|| |k S |dkr7|| |k  S |dkrA|| |k S tS )N)FTr,   r-   r1   r0   r/   r.   )r&   r"   r*   )r^   r\   r_   rmaprB   rB   rC   rs     s   
rs   None | int | tuple[int, ...]c                 C  s^   t | tr| jS t | tr-t| tkr-g }| jD ]}t |ts" d S ||j qt|S d S rO   )	r[   r   r}   r   r   r   itemsappendrt   )r:   rv   xrB   rB   rC   rr     s   



rr   *None | int | tuple[int | None, int | None]c                 C  s   t | drdS t| tr_t | jdr_| j}t|tr|jS t|tr_|jd ur5t|jtr3|jjdkr5d S d  }}|j	d urJt|j	tsFd S |j	j}|j
d ur[t|j
tsWd S |j
j}||fS d S )Nversion_info)NNr!   )r|   r[   r   baseru   r   r}   r   stridebegin_index	end_index)r:   ru   beginendrB   rB   rC   rp   #  s*   





rp   r]   c                 C  s4   t | tr| j|krt | jtr| jjdkrdS dS )NsysTF)r[   r   r]   r:   r   )r:   r]   rB   rB   rC   r|   ;  s   r|   blockr	   c                 C  s   d| _ | t  d S NT)is_unreachableacceptMarkImportsUnreachableVisitorr   rB   rB   rC   r<   G  s   r<   c                   @  s.   e Zd ZdZdddZdd	d
ZdddZdS )r   zCVisitor that flags all imports nested within a node as unreachable.noder   r5   r6   c                 C  
   d|_ d S r   r   selfr   rB   rB   rC   visit_importO     
z*MarkImportsUnreachableVisitor.visit_importr   c                 C  r   r   r   r   rB   rB   rC   visit_import_fromR  r   z/MarkImportsUnreachableVisitor.visit_import_fromr   c                 C  r   r   r   r   rB   rB   rC   visit_import_allU  r   z.MarkImportsUnreachableVisitor.visit_import_allNr   r   r5   r6   r   r   r5   r6   r   r   r5   r6   )__name__
__module____qualname____doc__r   r   r   rB   rB   rB   rC   r   L  s
    

r   c                 C  s   |  t  d S rO   )r   MarkImportsMypyOnlyVisitorr   rB   rB   rC   r>   Y  s   r>   c                   @  s8   e Zd ZdZdddZdd	d
ZdddZdddZdS )r   z8Visitor that sets is_mypy_only (which affects priority).r   r   r5   r6   c                 C  r   r   is_mypy_onlyr   rB   rB   rC   r   `  r   z'MarkImportsMypyOnlyVisitor.visit_importr   c                 C  r   r   r   r   rB   rB   rC   r   c  r   z,MarkImportsMypyOnlyVisitor.visit_import_fromr   c                 C  r   r   r   r   rB   rB   rC   r   f  r   z+MarkImportsMypyOnlyVisitor.visit_import_allr   c                 C  r   r   r   r   rB   rB   rC   visit_func_defi  r   z)MarkImportsMypyOnlyVisitor.visit_func_defNr   r   r   )r   r   r5   r6   )r   r   r   r   r   r   r   r   rB   rB   rB   rC   r   ]  s    


r   N)r3   r   r4   r   r5   r6   )r3   r   r4   r   r5   r6   )r3   r   r4   r   r5   rN   )r:   r   r4   r   r5   rQ   )rh   r   r5   rQ   )r:   r   re   rm   r5   rQ   )r:   r   rb   rz   r5   rQ   )r^   r   r\   rz   r_   r   r5   rQ   )r:   r   r5   r   )r:   r   r5   r   )r:   r   r]   rz   r5   rN   )r   r	   r5   r6   )Ar   
__future__r   typingr   r   r   mypy.literalsr   
mypy.nodesr   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   mypy.optionsr   mypy.patternsr   r   r   mypy.traverserr    r"   __annotations__r$   r&   r(   r*   r+   r2   rD   rM   rP   r;   rG   r`   ra   rQ   rz   r   rs   rr   rp   r|   r<   r   r>   r   rB   rB   rB   rC   <module>   sH    \




4

,'





