
    *e1              
         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<   dKd#Z/dLd%Z0dMd(Z1dNd,Z2dOd/Z3dPd2Z4dQd5Z5 ed6e6e7ee6d7f                   Z8dRd;Z9dSd=Z:dTd?Z;dUdAZ<dVdDZ= G dE dFe&          Z>dVdGZ? G dH dIe&          Z@dJS )WzQUtilities 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.   r0   r/   r2   r1   
reverse_opsr   optionsr   returnNonec                   t          t          | j                            D ]}t          | j        |         |          }|t          t
          fv rt          | j        |                    H|t          t          fv r{|t          k    rt          | j        |                    | j        |dz   d          D ]}t          |           | j        st          g           | _        t          | j                    d S d S Nr"   )rangelenexprinfer_condition_valuer'   r)   mark_block_unreachablebodyr#   r%   mark_block_mypy_only	else_bodyr
   )r4   r5   iresultr?   s        1lib/python3.11/site-packages/mypy/reachability.py"infer_reachability_of_if_statementrE   5   s    3qv;;  &qvay'::lJ///"16!9----Y/// "" %QVAY///q1uww - -&t,,,, ; (#Bii"1;///EE# 0     r   c                   t          | j                  D ]\  }}t          | j        |                   }|t	          ||          }nt
          }|t          t          fv s|t          t          fv rt          | j	        |                    nD|t          t          fv r4|t
          t          fv r$| j	        |dz   d          D ]}t          |           |t          k    rt          | j	        |                    d S r9   )	enumerateguardsinfer_pattern_valuepatternsr=   r#   r'   r)   r>   bodiesr%   r@   )r4   r5   rB   guardpattern_valueguard_valuer?   s          rD   %infer_reachability_of_match_statementrP   O   s   ah'' . .5+AJqM::/w??KK%K\:666+J
 ;
 ;

 #18A;////|Y777KL
 =
 =
 Q) - -&t,,,,)## !!---1. .rF   r	   boolc                H    t          | j        |          t          t          fv S N)r=   r<   r'   r)   )r4   r5   s     rD   assert_will_always_failrT   k   s     11lJ5OOOrF   r<   r   intc                *   |j         }d}d}| }t          |t                    r|j        dk    r	|j        } d}t
          }t          | t                    r| j        }nt          | t                    r| j        }nt          | t                    rk| j        dv rbt          | j        |          }|t          t          fv r| j        dk    s|t          t          fv r | j        dk    rt          | j        |          S |S t#          | |          }|t
          k    rt%          | |j                  }|t
          k    rQ|dk    rt          }nC|d	k    rt          }n5|d
k    s|dk    rt          }n!||j        v rt          }n||j        v rt          }|rt,          |         }|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orrY   rZ   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<   r5   	pyversionrb   negatedaliasrC   rc   s           rD   r=   r=   o   s    &IDGE%## 8u:DG F$!! Cy	D*	%	% Cy	D&	!	! Cdg&>&>$TY88[),,,E1A1A\:...47d?? )W=== K*4;;(((*41ABBF$$$5==!FFU]] FFV^^t66FFW((( FFW)))!F 0'/MrF   patternr    c                    t          | t                    r| j        t          S t          | t                    r%t          d | j        D                       rt          S t          S )Nc              3  F   K   | ]}t          |          t          k    V  d S rS   )rJ   r#   ).0ps     rD   	<genexpr>z&infer_pattern_value.<locals>.<genexpr>   sA       0 023A+-0 0 0 0 0 0rF   )r`   r   rm   r#   r   anyrK   r+   )rm   s    rD   rJ   rJ      sq    '9%% #'/*A	GY	'	' #C 0 07>7G0 0 0 - - # ""rF   rj   tuple[int, ...]c                   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                   }||At          | j        d                   }t          | j        d                   }t          |         }t          |t                    rCt          |t                    r.d|cxk    rdk    rn nt          ||         ||          S t          S t          |t                    rt          |t                    r|\  }}|d}|d}d|cxk    r|cxk     rdk    rbn n_|||         }t          |          t          |          k    s$t          |          t          |          k    r|dvrt          |||          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.   r2   r1   r0   r/   Nr$   r-   r.   )r`   r   r+   r;   	operatorscontains_sys_version_infooperandscontains_int_or_tuple_of_intsr3   rU   fixed_comparisontuple)r<   rj   ra   indexthinglohivals           rD   re   re      s    dN++ #""
4>Q""		B	333""%dmA&677E)$-*:;;E})$-*:;;-dmA.>??^% 8*UC"8"8 8?????????#Ie$4b%@@@&&	E5	!	! 	8j&>&> 	8B:B:BR1BrE"C3xx3u::%%SCJJ)>)>2\CYCY'R777rF   rg   strc                *   t          | t                    rt          | 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                    rt          | j        t                    st          S t          | j                  dk    s t          | j        d         t                    st          S t          | j        j        d          st          S | j        j        dk    rt          S |                    | j        d         j	                  rt"          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   rv   rg   
startswith)r`   r   r;   rw   r+   is_sys_attrry   r   r{   valuer   calleer   argsr<   rb   r   r#   r'   )r<   rg   ra   rd   s       rD   rf   rf      sc    $'' #t~""&&^A\!!&&4=+Z88 	'&&a %)) 	'&&"ek:::	D(	#	# #$+z22 	'&&ty>>Qj1w&G&G&&4;+Z88 	'&&;|++&&ty|122 	 ""rF   Targ.rc   ra   rd   c                   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    r|| |k              S |dk    r|| |k             S t          S )N)FTr-   r.   r2   r1   r0   r/   )r'   r#   r+   )rc   ra   rd   rmaps       rD   r{   r{     s    {33D	TzzDEM""	TzzDEM""	TzzDEM""	TzzDEM""	SyyD5L!!	SyyD5L!!rF   None | int | tuple[int, ...]c                2   t          | t                    r| j        S t          | t                    ret	          |           t
          k    rMg }| j        D ]4}t          |t                    s d S |                    |j                   5t          |          S d S rS   )	r`   r   r   r   r   r   itemsappendr|   )r<   r~   xs      rD   rz   rz     s    $   z$	""  4==K''EZ & &!!W--  44QW%%%%<<4rF   *None | int | tuple[int | None, int | None]c                    t          | d          rdS t          | t                    rt          | j        d          r| j        }t          |t
                    r|j        S t          |t                    r|j        ,t          |j        t
                    r|j        j        dk    rd S d x}}|j	        (t          |j	        t
                    sd S |j	        j        }|j
        (t          |j
        t
                    sd S |j
        j        }||fS d S )Nversion_info)NNr"   )r   r`   r   baser}   r   r   r   stridebegin_index	end_index)r<   r}   beginends       rD   rx   rx   #  s   4(( |$	""  {49n'M'M  
eW%% 	;eY'' 	 |'!%,88  EL<NRS<S<S4EC ,!%"3W==  4)/*!%/7;;  4o+3<4rF   rb   c                    t          | t                    r7| j        |k    r,t          | j        t                    r| j        j        dk    rdS dS )NsysTF)r`   r   rb   r<   r   )r<   rb   s     rD   r   r   ;  sP     $
## 	T(9(9di** 	ty~/F/F 45rF   blockr
   c                V    d| _         |                     t                                 d S NT)is_unreachableacceptMarkImportsUnreachableVisitorr   s    rD   r>   r>   G  s)    E	LL.0011111rF   c                  *    e Zd ZdZddZddZdd
ZdS )r   zCVisitor that flags all imports nested within a node as unreachable.noder   r6   r7   c                    d|_         d S r   r   selfr   s     rD   visit_importz*MarkImportsUnreachableVisitor.visit_importO      "rF   r   c                    d|_         d S r   r   r   s     rD   visit_import_fromz/MarkImportsUnreachableVisitor.visit_import_fromR  r   rF   r   c                    d|_         d S r   r   r   s     rD   visit_import_allz.MarkImportsUnreachableVisitor.visit_import_allU  r   rF   Nr   r   r6   r7   r   r   r6   r7   r   r   r6   r7   )__name__
__module____qualname____doc__r   r   r    rF   rD   r   r   L  sV        MM# # # ## # # ## # # # # #rF   r   c                H    |                      t                                 d S rS   )r   MarkImportsMypyOnlyVisitorr   s    rD   r@   r@   Y  s!    	LL+--.....rF   c                  2    e Zd ZdZddZddZdd
ZddZdS )r   z8Visitor that sets is_mypy_only (which affects priority).r   r   r6   r7   c                    d|_         d S r   is_mypy_onlyr   s     rD   r   z'MarkImportsMypyOnlyVisitor.visit_import`       rF   r   c                    d|_         d S r   r   r   s     rD   r   z,MarkImportsMypyOnlyVisitor.visit_import_fromc  r   rF   r   c                    d|_         d S r   r   r   s     rD   r   z+MarkImportsMypyOnlyVisitor.visit_import_allf  r   rF   r   c                    d|_         d S r   r   r   s     rD   visit_func_defz)MarkImportsMypyOnlyVisitor.visit_func_defi  r   rF   Nr   r   r   )r   r   r6   r7   )r   r   r   r   r   r   r   r   r   rF   rD   r   r   ]  sj        BB! ! ! !! ! ! !! ! ! !! ! ! ! ! !rF   r   N)r4   r   r5   r   r6   r7   )r4   r   r5   r   r6   r7   )r4   r	   r5   r   r6   rQ   )r<   r   r5   r   r6   rU   )rm   r    r6   rU   )r<   r   rj   rt   r6   rU   )r<   r   rg   r   r6   rU   )rc   r   ra   r   rd   r   r6   rU   )r<   r   r6   r   )r<   r   r6   r   )r<   r   rb   r   r6   rQ   )r   r
   r6   r7   )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,   r3   rE   rP   rT   r=   rJ   re   rf   rU   r   r   r{   rz   rx   r   r>   r   r@   r   r   rF   rD   <module>r      s   W W W " " " " " " ( ( ( ( ( ( ( ( ( ( ! ! ! ! ! !                                             . !           7 7 7 7 7 7 7 7 7 7 + + + + + +     	        
          +,z	!       t#CtSWXX
 X X X X   4. . . .8P P P P1 1 1 1h# # # #) ) ) )X$# $# $# $#N wvsCsCx11   "      0	 	 	 	2 2 2 2

# 
# 
# 
# 
#$4 
# 
# 
#/ / / /! ! ! ! !!1 ! ! ! ! !rF   