
    %^g1              
         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<   d1dZ/d2dZ0d3dZ1d4d Z2d5d!Z3d6d"Z4d7d#Z5 ed$e6e7ee6d%f         Z8d8d&Z9d9d'Z:d:d(Z;d;d)Z<d<d*Z= G d+ d,e&      Z>d<d-Z? G d. d/e&      Z@y0)=zQUtilities 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_opc                   t        t        | j                              D ]  }t        | j                  |   |      }|t        t
        fv rt        | j                  |          C|t        t        fv sR|t        k(  rt        | j                  |          | j                  |dz   d  D ]  }t        |        | j                  st        g       | _        t        | j                          y  y Nr"   )rangelenexprinfer_condition_valuer'   r)   mark_block_unreachablebodyr#   r%   mark_block_mypy_only	else_bodyr
   )soptionsiresultr;   s        1lib/python3.12/site-packages/mypy/reachability.py"infer_reachability_of_if_statementrC   5   s    3qvv;&qvvay':lJ//"166!9-Y// " %QVVAY/q1uw&t, ( ;;#Bi"1;;/-      c                   t        | j                        D ]  \  }}t        | j                  |         }|t	        ||      }nt
        }|t        t        fv s|t        t        fv rt        | j                  |          n>|t        t        fv r0|t
        t        fv r"| j                  |dz   d  D ]  }t        |        |t        k(  st        | j                  |           y r5   )	enumerateguardsinfer_pattern_valuepatternsr9   r#   r'   r)   r:   bodiesr%   r<   )r>   r?   r@   guardpattern_valueguard_valuer;   s          rB   %infer_reachability_of_match_statementrN   O   s    ahh'5+AJJqM:/w?K%K\:66+J
 ;

 #188A;/|Y77KL
 =
 Q)&t, * )# !!-1 (rD   c                F    t        | j                  |      t        t        fv S N)r9   r8   r'   r)   )r>   r?   s     rB   assert_will_always_failrQ   k   s     1lJ5OOOrD   c                2   |j                   }d}d}| }t        |t              r|j                  dk(  r|j                  } d}t
        }t        | t              r| j                  }nt        | t              r| j                  }nt        | t              rv| j                  dv rht        | 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(  rR|dk(  rt        }nF|d	k(  rt        }n:|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orrU   rV   PY2PY3MYPYTYPE_CHECKING)python_version
isinstancer   opr8   r+   r   namer   r   r9   leftr#   r%   r'   r)   rightconsider_sys_version_infoconsider_sys_platformplatformalways_truealways_falser,   )r8   r?   	pyversionr^   negatedaliasrA   r_   s           rB   r9   r9   o   sn    &&IDGE%#88u::DG F$!yy	D*	%yy	D&	!dgg&>$TYY8[),,E1A\:..477d? )W== K*4;((*41A1ABF$$5=!FU] FV^t6FW((( FW)))!F'/MrD   c                    t        | t              r| j                  t        S t        | t              r"t        d | j                  D              rt        S t        S )Nc              3  @   K   | ]  }t        |      t        k(    y wrP   )rH   r#   ).0ps     rB   	<genexpr>z&infer_pattern_value.<locals>.<genexpr>   s       07G!A+-7Gs   )r\   r   patternr#   r   anyrI   r+   )rn   s    rB   rH   rH      sM    '9%'//*A	GY	'C 07>7G7G0 - ""rD   c                (   t        | t              st        S t        | j                        dkD  rt        S | j                  d   }|dvrt        S t        | j                  d         }t        | j                  d         }||9t        | j                  d         }t        | j                  d         }t        |   }t        |t              r9t        |t              r)d|cxk  rdk  rn t        S t        ||   ||      S t        S t        |t              rzt        |t              rj|\  }}|d}|d}d|cxk  r|cxk  rdk  rLn t        S ||| }t        |      t        |      k(  st        |      t        |      kD  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/   r$   r-   r.   )r\   r   r+   r7   	operatorscontains_sys_version_infooperandscontains_int_or_tuple_of_intsr3   intfixed_comparisontuple)r8   rf   r]   indexthinglohivals           rB   ra   ra      s{    dN+""
4>>Q""		B	33""%dmmA&67E)$--*:;E})$--*:;-dmmA.>?^%*UC"8?? '& $Ie$4b%@@&&	E5	!j&>B:B:BR1  Br"C3x3u:%SCJ)>2\CY'R77rD   c                   t        | t              rt        | j                        dkD  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k7  st        | j                  d   t              st        S t        | j                  j                  d      st        S | j                  j                  dk7  rt        S |j!                  | 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   rq   rc   
startswith)r\   r   r7   rr   r+   is_sys_attrrt   r   rw   valuer   calleer   argsr8   r^   r   r#   r'   )r8   rc   r]   r`   s       rB   rb   rb      s0    $'t~~"&&^^A\!&&4==+Z8&&a %)&&"ekk::	D(	#$++z2&&tyy>Qj1w&G&&4;;++Z8&&;;|+&&tyy|112""rD   Targ.c                    t         t        d}|dk(  r|| |k(     S |dk(  r|| |k7     S |dk(  r|| |k     S |dk(  r|| |k\     S |dk(  r|| |k     S |dk(  r|| |kD     S t        S )N)FTr-   r.   r2   r1   r0   r/   )r'   r#   r+   )r_   r]   r`   rmaps       rB   rw   rw     s    {3D	TzDEM""	TzDEM""	TzDEM""	TzDEM""	SyD5L!!	SyD5L!!rD   c                   t        | t              r| j                  S t        | t              r]t	        |       t
        k(  rKg }| j                  D ]/  }t        |t              s y |j                  |j                         1 t        |      S y rP   )	r\   r   r   r   r   r   itemsappendrx   )r8   rz   xs      rB   ru   ru     sk    $ zz$	"4=K'EZZ!!W-QWW%   <rD   c                `   t        | d      ryt        | t              rt        | j                  d      r| j                  }t        |t
              r|j                  S t        |t              r|j                  4t        |j                  t
              r|j                  j                  dk7  ry d x}}|j                  1t        |j                  t
              sy |j                  j                  }|j                  1t        |j                  t
              sy |j                  j                  }||fS y )Nversion_info)NNr"   )r   r\   r   basery   r   r   r   stridebegin_index	end_index)r8   ry   beginends       rB   rs   rs   #  s    4($	"{499n'M

eW%;;eY'||'!%,,8ELL<N<NRS<SEC  ,!%"3"3W=))//*!%//7;oo++3<rD   c                    t        | t              rC| j                  |k(  r4t        | j                  t              r| j                  j                  dk(  ryy)NsysTF)r\   r   r^   r8   r   )r8   r^   s     rB   r   r   ;  s>     $
#		T(9dii*tyy~~/F rD   c                D    d| _         | j                  t                      y NT)is_unreachableacceptMarkImportsUnreachableVisitorblocks    rB   r:   r:   G  s    E	LL.01rD   c                  (    e Zd ZdZddZddZddZy)	r   zCVisitor that flags all imports nested within a node as unreachable.c                    d|_         y r   r   selfnodes     rB   visit_importz*MarkImportsUnreachableVisitor.visit_importO  
    "rD   c                    d|_         y r   r   r   s     rB   visit_import_fromz/MarkImportsUnreachableVisitor.visit_import_fromR  r   rD   c                    d|_         y r   r   r   s     rB   visit_import_allz.MarkImportsUnreachableVisitor.visit_import_allU  r   rD   Nr   r   returnNoner   r   r   r   r   r   r   r   )__name__
__module____qualname____doc__r   r   r    rD   rB   r   r   L  s    M###rD   r   c                6    | j                  t                      y rP   )r   MarkImportsMypyOnlyVisitorr   s    rB   r<   r<   Y  s    	LL+-.rD   c                  0    e Zd ZdZddZddZd	dZd
dZy)r   z8Visitor that sets is_mypy_only (which affects priority).c                    d|_         y r   is_mypy_onlyr   s     rB   r   z'MarkImportsMypyOnlyVisitor.visit_import`  
     rD   c                    d|_         y r   r   r   s     rB   r   z,MarkImportsMypyOnlyVisitor.visit_import_fromc  r   rD   c                    d|_         y r   r   r   s     rB   r   z+MarkImportsMypyOnlyVisitor.visit_import_allf  r   rD   c                    d|_         y r   r   r   s     rB   visit_func_defz)MarkImportsMypyOnlyVisitor.visit_func_defi  r   rD   Nr   r   r   )r   r   r   r   )r   r   r   r   r   r   r   r   r   rD   rB   r   r   ]  s    B!!!!rD   r   N)r>   r   r?   r   r   r   )r>   r   r?   r   r   r   )r>   r	   r?   r   r   bool)r8   r   r?   r   r   rv   )rn   r    r   rv   )r8   r   rf   ztuple[int, ...]r   rv   )r8   r   rc   strr   rv   )r_   r   r]   r   r`   r   r   rv   )r8   r   r   zNone | int | tuple[int, ...])r8   r   r   z*None | int | tuple[int | None, int | None])r8   r   r^   r   r   r   )r   r
   r   r   )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   rC   rN   rQ   r9   rH   ra   rb   rv   r   r   rw   ru   rs   r   r:   r   r<   r   r   rD   rB   <module>r      s3   W " ( ( !     . ! 7 7 + U 	5 e 
E  U  +,z	!    t#CtSWX
E X4.8P1h#)X$#N vsCsCx1"0	2

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