
    *ec                       d dl mZ d dlmZ d dl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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/m0Z0 d dl1m2Z2m3Z3 d d	l4m5Z5 d d
l6m7Z7m8Z8  G d d          Z9 G d d          Z: G d de          Z; G d d          Z< G d d          Z= G d d          Z> G d de5          Z?dS )    )annotations)Enum)checker
errorcodes)MessageBuilder)"
AssertStmtAssignmentExprAssignmentStmt	BreakStmtClassDefContextContinueStmtDictionaryComprehension
ExpressionExpressionStmtForStmtFuncDefFuncItemGeneratorExpr
GlobalDeclIfStmtImport
ImportFrom
LambdaExprListExprLvalue	MatchStmtMypyFileNameExprNonlocalDecl	RaiseStmt
ReturnStmtStarExprSymbolTableTryStmt	TupleExpr	WhileStmtWithStmtimplicit_module_attrs)Options)	AsPatternStarredPattern)ALWAYS_TRUEinfer_pattern_value)ExtendedTraverserVisitor)TypeUninhabitedTypec                  *    e Zd ZdZ	 	 	 dddZddZdS )BranchStatea=  BranchState contains information about variable definition at the end of a branching statement.
    `if` and `match` are examples of branching statements.

    `may_be_defined` contains variables that were defined in only some branches.
    `must_be_defined` contains variables that were defined in all branches.
    NFmust_be_definedset[str] | Nonemay_be_definedskippedboolreturnNonec                    |t                      }|t                      }t          |          | _        t          |          | _        || _        d S N)setr6   r4   r7   )selfr4   r6   r7   s       6lib/python3.11/site-packages/mypy/partially_defined.py__init__zBranchState.__init__:   sM     ! UUN"!eeO!.11"?33    c                x    t          t          | j                  t          | j                  | j                  S )Nr4   r6   r7   )r3   r=   r4   r6   r7   r>   s    r?   copyzBranchState.copyI   s:     455t233L
 
 
 	
rA   )NNF)r4   r5   r6   r5   r7   r8   r9   r:   r9   r3   )__name__
__module____qualname____doc__r@   rE    rA   r?   r3   r3   2   sV          ,0*.	    
 
 
 
 
 
rA   r3   c                  h    e Zd ZdddZddZddZddZddZddZddZ	ddZ
ddZddZddZdS )BranchStatementNinitial_stateBranchState | Noner9   r:   c                    |t                      }|| _        t          | j        j        | j        j                  g| _        d S N)r4   r6   )r3   rN   r4   r6   branches)r>   rN   s     r?   r@   zBranchStatement.__init__R   sJ     'MMM* $ 2 B#1@  ,
rA   c                Z    t          | j                  }d | j        D             |_        |S )Nc                6    g | ]}|                                 S rK   rE   .0bs     r?   
<listcomp>z(BranchStatement.copy.<locals>.<listcomp>_   s     ;;;16688;;;rA   )rM   rN   rR   r>   results     r?   rE   zBranchStatement.copy]   s.     !344;;T];;;rA   c                    | j                             t          | j        j        | j        j                             d S rQ   )rR   appendr3   rN   r4   r6   rD   s    r?   next_branchzBranchStatement.next_branchb   sJ     $ 2 B#1@  	
 	
 	
 	
 	
rA   namestrc                    t          | j                  dk    sJ | j        d         j                            |           | j        d         j                            |           d S Nr   )lenrR   r4   addr6   discardr>   r_   s     r?   record_definitionz!BranchStatement.record_definitionj   s_    4=!!A%%%%b)--d333b(0066666rA   c                    t          | j                  dk    sJ | j        d         j                            |           | j        d         j                            |           d S rb   )rd   rR   r4   rf   r6   rg   s     r?   
delete_varzBranchStatement.delete_varo   s_    4=!!A%%%%b)11$777b(0066666rA   stater3   c                .   t          | j                  dk    sJ | j        d         }|j        r	d|_        d S |j                            |j                   |j                            |j                   |j                            |j                   d S )Nr   rc   T)rd   rR   r7   r4   updater6   difference_update)r>   rk   current_branchs      r?   record_nested_branchz$BranchStatement.record_nested_brancht   s    4=!!A%%%%r*= 	%)N"F&--e.CDDD%,,U-ABBB%778VWWWWWrA   c                ^    t          | j                  dk    sJ d| j        d         _        d S )Nr   Trc   )rd   rR   r7   rD   s    r?   skip_branchzBranchStatement.skip_branch~   s2    4=!!A%%%%$(b!!!rA   r8   c                ^    t          | j                  dk    sJ || j        d         j        v S rb   )rd   rR   r6   rg   s     r?   is_possibly_undefinedz%BranchStatement.is_possibly_undefined   s2    4=!!A%%%%t}R(777rA   c                t    t          | j                  dk    sJ | j        d         }||j        vo||j        vS rb   )rd   rR   r6   r4   )r>   r_   branchs      r?   is_undefinedzBranchStatement.is_undefined   sD    4=!!A%%%%r"600WTAW5WWrA   c                x    t          | j                  dk    sJ | j        D ]}||j        v s	||j        v r dS dS )Nr   TF)rd   rR   r4   r6   )r>   r_   rX   s      r?   is_defined_in_a_branchz&BranchStatement.is_defined_in_a_branch   s[    4=!!A%%%% 	 	Aq(((DA4D,D,Dtt -EurA   c                   t                      }| j        D ]6}|                    |j                   |                    |j                   7d | j        D             }|r5|d         j        }|dd          D ]}|                    |j                   nt                      }|                    |          }t          ||t          |          dk              S )Nc                     g | ]}|j         	|S rK   )r7   rV   s     r?   rY   z(BranchStatement.done.<locals>.<listcomp>   s    JJJa	JJJJrA   r      rC   )	r=   rR   rm   r6   r4   intersection_update
differencer3   rd   )r>   all_varsrX   non_skipped_branchesr4   r6   s         r?   donezBranchStatement.done   s     55 	/ 	/AOOA,---OOA-....JJ4=JJJ 	$215EO)!""- G G33A4EFFFFG "eeO ",,_==+),--2
 
 
 	
rA   r<   )rN   rO   r9   r:   )r9   rM   r9   r:   r_   r`   r9   r:   )rk   r3   r9   r:   r_   r`   r9   r8   rF   )rG   rH   rI   r@   rE   r^   rh   rj   rp   rr   rt   rw   ry   r   rK   rA   r?   rM   rM   Q   s        	
 	
 	
 	
 	
   

 
 
 
7 7 7 7
7 7 7 7
X X X X) ) ) )8 8 8 8X X X X
   
 
 
 
 
 
rA   rM   c                      e Zd ZdZdZdZdZdS )	ScopeTyper|            N)rG   rH   rI   GlobalClassFunc	GeneratorrK   rA   r?   r   r      s"        FEDIIIrA   r   c                  .    e Zd ZddZddZddZddZdS )Scopestmtslist[BranchStatement]
scope_typer   r9   r:   c                0    || _         || _        i | _        d S r<   )branch_stmtsr   undefined_refs)r>   r   r   s      r?   r@   zScope.__init__   s    38$8:rA   c                    t          d | j        D             | j                  }| j                                        |_        |S )Nc                6    g | ]}|                                 S rK   rU   rW   ss     r?   rY   zScope.copy.<locals>.<listcomp>   s     <<<Q<<<rA   )r   r   r   r   rE   rZ   s     r?   rE   z
Scope.copy   sA    <<$*;<<<doNN $ 3 8 8 : :rA   or   c                    |j         | j        vrt                      | j        |j         <   | j        |j                                      |           d S r<   )r_   r   r=   re   r>   r   s     r?   record_undefined_refzScope.record_undefined_ref   sI    6,,,*-%%D'AF#''*****rA   r_   r`   set[NameExpr]c                P    | j                             |t                                S r<   )r   popr=   rg   s     r?   pop_undefined_refzScope.pop_undefined_ref   s    "&&tSUU333rA   N)r   r   r   r   r9   r:   r9   r   r   r   r9   r:   r_   r`   r9   r   )rG   rH   rI   r@   rE   r   r   rK   rA   r?   r   r      sd        ; ; ; ;
   
+ + + +
4 4 4 4 4 4rA   r   c                      e Zd ZdZddZd dZd!dZd"d
ZddZd#dZ	ddZ
ddZddZddZd$dZd$dZd%dZd&dZd'dZd'dZd'dZdS )(DefinedVariableTrackerzUDefinedVariableTracker manages the state and scope for the UndefinedVariablesVisitor.r9   r:   c                n    t          t                      gt          j                  g| _        d| _        d S NF)r   rM   r   r   scopesdisable_branch_skiprD   s    r?   r@   zDefinedVariableTracker.__init__   s2    $)?+<+<*=y?O$P$P#Q $)   rA   c                f    t                      }d | j        D             |_        | j        |_        |S )Nc                6    g | ]}|                                 S rK   rU   r   s     r?   rY   z/DefinedVariableTracker.copy.<locals>.<listcomp>   s     777a777rA   )r   r   r   rZ   s     r?   rE   zDefinedVariableTracker.copy   s4    '))774;777%)%="rA   r   c                P    t          | j                  dk    sJ | j        d         S rb   )rd   r   rD   s    r?   _scopezDefinedVariableTracker._scope   s)    4;!####{2rA   r   r   c                B   t          |                                 j                  dk    sJ d }|t          j        k    r*|                                 j        d         j        d         }| j                            t          t          |          g|                     d S rb   )
rd   r   r   r   r   rR   r   r]   r   rM   )r>   r   rN   s      r?   enter_scopez"DefinedVariableTracker.enter_scope   s    4;;==-..2222,,, KKMM6r:CBGM5/-"@"@!A:NNOOOOOrA   c                8    | j                                          d S r<   )r   r   rD   s    r?   
exit_scopez!DefinedVariableTracker.exit_scope   s    rA   r8   c                <    |                                  j        |k    S r<   )r   r   )r>   r   s     r?   in_scopezDefinedVariableTracker.in_scope   s    {{}}':55rA   c                    t          |                                 j                  dk    sJ |                                 j                            t	          |                                 j        d         j        d                              d S rb   )rd   r   r   r]   rM   rR   rD   s    r?   start_branch_statementz-DefinedVariableTracker.start_branch_statement   sv    4;;==-..2222"))DKKMM6r:CBGHH	
 	
 	
 	
 	
rA   c                    t          |                                 j                  dk    sJ |                                 j        d                                          d S Nr|   rc   )rd   r   r   r^   rD   s    r?   r^   z"DefinedVariableTracker.next_branch   sN    4;;==-..2222"2&2244444rA   c                <   t          |                                 j                  dk    sJ |                                 j                                                                        }|                                 j        d                             |           d S r   )rd   r   r   r   r   rp   rZ   s     r?   end_branch_statementz+DefinedVariableTracker.end_branch_statement   sx    4;;==-..2222+//116688"2&;;FCCCCCrA   c                    t          |                                 j                  dk    r:| j        s5|                                 j        d                                          d S d S d S r   )rd   r   r   r   rr   rD   s    r?   rr   z"DefinedVariableTracker.skip_branch   s^    t{{}})**Q..t7O.KKMM&r*6688888 /...rA   r_   r`   c                    t          | j                  dk    sJ t          | j        d         j                  dk    sJ |                                 j        d                             |           d S rb   )rd   r   r   r   rh   rg   s     r?   rh   z(DefinedVariableTracker.record_definition   si    4;!####4;r?/0014444"2&88>>>>>rA   c                    t          | j                  dk    sJ t          | j        d         j                  dk    sJ |                                 j        d                             |           d S rb   )rd   r   r   r   rj   rg   s     r?   rj   z!DefinedVariableTracker.delete_var  si    4;!####4;r?/0014444"2&11$77777rA   r   r   c                    t          | j                  dk    sJ |                                                     |           dS )zURecords an undefined reference. These can later be retrieved via `pop_undefined_ref`.r   N)rd   r   r   r   r   s     r?   r   z+DefinedVariableTracker.record_undefined_ref  s?    4;!####**1-----rA   r   c                    t          | j                  dk    sJ |                                                     |          S )zaIf name has previously been reported as undefined, the NameExpr that was called will be returned.r   )rd   r   r   r   rg   s     r?   r   z(DefinedVariableTracker.pop_undefined_ref  s9    4;!####{{}}..t444rA   c                    t          |                                 j                  dk    sJ |                                 j        d                             |          S rb   )rd   r   r   rt   rg   s     r?   rt   z,DefinedVariableTracker.is_possibly_undefined  sJ    4;;==-..2222{{}})"-CCDIIIrA   c                2   t          |                                 j                  dk    sJ |                                 j        d         }|                    |          sdS |                                 j        D ]}|                    |          r dS dS )zYThis will return true if a variable is defined in a branch that's not the current branch.r   rc   FT)rd   r   r   rw   ry   )r>   r_   stmts      r?   is_defined_in_different_branchz5DefinedVariableTracker.is_defined_in_different_branch  s    4;;==-..2222{{}})"-  && 	5KKMM. 	 	D**400 tturA   c                    t          |                                 j                  dk    sJ |                                 j        d                             |          S rb   )rd   r   r   rw   rg   s     r?   rw   z#DefinedVariableTracker.is_undefined!  sJ    4;;==-..2222{{}})"-::4@@@rA   Nr   )r9   r   r   )r   r   r9   r:   )r   r   r9   r8   r   r   r   r   )rG   rH   rI   rJ   r@   rE   r   r   r   r   r   r^   r   rr   rh   rj   r   r   rt   r   rw   rK   rA   r?   r   r      s       __) ) ) )      P P P P   6 6 6 6
 
 
 
5 5 5 5D D D D
9 9 9 9
? ? ? ?
8 8 8 8
. . . .
5 5 5 5
J J J J
	 	 	 	A A A A A ArA   r   c                      e Zd ZddZdS )Loopr9   r:   c                    d| _         d S r   )	has_breakrD   s    r?   r@   zLoop.__init__'  s    rA   Nr   )rG   rH   rI   r@   rK   rA   r?   r   r   &  s(             rA   r   c                  p    e Zd ZdZdOdZdPdZdPdZdQdZdR fdZdS fdZ	dTdZ
dU fdZdVdZdWd!ZdXd#ZdY fd%ZdZ fd'Zd[ fd)Zd\ fd+Zd]d-Zd^ fd/Zd_ fd1Zd` fd3Zda fd5Zdb fd7Zdc fd9Zdd fd;Zded=Zded>Zdfd@Zdg fdBZdh fdDZdi fdFZ djdHZ!dk fdJZ"dl fdLZ#dm fdNZ$ xZ%S )n PossiblyUndefinedVariableVisitora  Detects the following cases:
    - A variable that's defined only part of the time.
    - If a variable is used before definition

    An example of a partial definition:
    if foo():
        x = 1
    print(x)  # Error: "x" may be undefined.

    Example of a used before definition:
    x = y
    y: int = 2

    Note that this code does not detect variables not defined in any of the branches -- that is
    handled by the semantic analyzer.
    msgr   type_mapdict[Expression, Type]optionsr*   namesr$   r9   r:   c                j   || _         || _        || _        t                      | _        |                    dd           }|r-t          |j        t                    sJ |j        j	        | _        g | _
        d| _        t                      | _        t          D ]}| j                            |           d S )N__builtins__r   )r   r   r   r$   builtinsget
isinstancenoder   r   loops	try_depthr   trackerr)   rh   )r>   r   r   r   r   builtins_modr_   s          r?   r@   z)PossiblyUndefinedVariableVisitor.__init__=  s      #yy66 	4l/:::::(-3DM!#
-//) 	1 	1DL**40000	1 	1rA   r_   r`   contextr   c                    | j         j                            t          j                  r| j                             ||           d S d S r<   )r   errorsis_error_code_enabledr   USED_BEFORE_DEFvar_used_before_defr>   r_   r   s      r?   r   z4PossiblyUndefinedVariableVisitor.var_used_before_defR  sG    8?001KLL 	8H((w77777	8 	8rA   c                    | j         j                            t          j                  r| j                             ||           d S d S r<   )r   r   r   r   POSSIBLY_UNDEFINEDvariable_may_be_undefinedr   s      r?   r   z:PossiblyUndefinedVariableVisitor.variable_may_be_undefinedV  sG    8?001NOO 	>H..tW=====	> 	>rA   c                ,   | j                             t          j                  sT| j                             |          }|D ]6}| j        r|                     ||            |                     ||           7n	 | j                             |           d S r<   )	r   r   r   r   r   r   r   r   rh   )r>   r_   refsrefs       r?   process_definitionz3PossiblyUndefinedVariableVisitor.process_definitionZ  s    |$$Y_55 		<11$77D 8 8: 8224====,,T37777	8 &&t,,,,,rA   r   r   c                    |j         D ]}|                     |           t                                          |           d S r<   )r   r   supervisit_global_declr>   r   r_   	__class__s      r?   r   z2PossiblyUndefinedVariableVisitor.visit_global_declh  sI    G 	* 	*D##D))))!!!$$$$$rA   r    c                    |j         D ]}|                     |           t                                          |           d S r<   )r   r   r   visit_nonlocal_declr   s      r?   r   z4PossiblyUndefinedVariableVisitor.visit_nonlocal_declm  sI    G 	* 	*D##D))))##A&&&&&rA   lvalueLvalue | Nonec                D   t          |t                    r|                     |j                   d S t          |t                    r|                     |j                   d S t          |t          t          f          r|j	        D ]}|                     |           d S d S r<   )
r   r   r   r_   r#   process_lvalueexprr   r&   items)r>   r   items      r?   r   z/PossiblyUndefinedVariableVisitor.process_lvaluer  s    fh'' 	*##FK00000)) 	*,,,,,9 566 	* * *##D))))	* 	** *rA   r
   c                    |j         D ]}|                     |           t                                          |           d S r<   )lvaluesr   r   visit_assignment_stmt)r>   r   r   r   s      r?   r   z6PossiblyUndefinedVariableVisitor.visit_assignment_stmt{  sI    i 	( 	(F''''%%a(((((rA   r	   c                n    |j                             |            |                     |j                   d S r<   )valueacceptr   targetr   s     r?   visit_assignment_exprz6PossiblyUndefinedVariableVisitor.visit_assignment_expr  s2    	tAH%%%%%rA   r   c                   |j         D ]}|                    |            | j                                         |j        D ]8}|j        r
|                    |            | j                                         9|j        r@|j        j        s|j                            |            n| j                                         | j        	                                 d S r<   )
r   r   r   r   bodyis_unreachabler^   	else_bodyrr   r   )r>   r   erX   s       r?   visit_if_stmtz.PossiblyUndefinedVariableVisitor.visit_if_stmt  s     	 	AHHTNNNN++--- 	' 	'A HHTNNNL$$&&&&; 	+;- +""4((((((***))+++++rA   r   c                p   |j                             |            | j                                         t	          t          |j                            D ]}|j        |         }|                    |            |j        |         }||                    |            |j        |         j	        s!|j        |                             |            n| j        
                                 t          |          t          k    }|s| j                                         | j                                         d S r<   )subjectr   r   r   rangerd   patternsguardsbodiesr   rr   r.   r-   r^   r   )r>   r   ipatternguardis_catchalls         r?   visit_match_stmtz1PossiblyUndefinedVariableVisitor.visit_match_stmt  s   		++---s1:'' 	+ 	+AjmGNN4   HQKE T"""8A;- +""4((((((***-g66+EK +((***))+++++rA   r   c                ~    |                      |j                   t                                          |           d S r<   )r   r_   r   visit_func_defr>   r   r   s     r?   r  z/PossiblyUndefinedVariableVisitor.visit_func_def  s7    '''q!!!!!rA   r   c                   |                                 r| j        j        sd S |j        pg }|D ]#}|j        |j                            |            $| j                            t          j	                   |D ]G}| 
                    |j        j                   t                                          |j                   H|j                            |            | j                                         d S r<   )
is_dynamicr   check_untyped_defs	argumentsinitializerr   r   r   r   r   r   variabler_   r   	visit_varr   r   )r>   r   argsargr   s       r?   
visit_funcz+PossiblyUndefinedVariableVisitor.visit_func  s    <<>> 	$,"A 	F{ b 	- 	-C*&&t,,,  000 	, 	,C##CL$5666GGcl++++	d!!!!!rA   r   c                   | j                             t          j                   |j        D ]}|                     |           t                                          |           | j                                          d S r<   )	r   r   r   r   indicesr   r   visit_generator_exprr   r>   r   idxr   s      r?   r  z5PossiblyUndefinedVariableVisitor.visit_generator_expr  sv      !45559 	% 	%C$$$$$$Q'''!!!!!rA   r   c                   | j                             t          j                   |j        D ]}|                     |           t                                          |           | j                                          d S r<   )	r   r   r   r   r  r   r   visit_dictionary_comprehensionr   r  s      r?   r"  z?PossiblyUndefinedVariableVisitor.visit_dictionary_comprehension  sv      !45559 	% 	%C$$$$..q111!!!!!rA   r   c                   |j                             |            |                     |j                   |j                            |            | j                                         t                      }| j                            |           |j	                            |            | j        
                                 | j                                         |j        p|j        }|r2| j                                         | j        
                                 |j                            |            |r| j                                         | j                                         d S r<   )r   r   r   indexr   r   r   r   r]   r   r^   r   r  r   r   r>   r   loopr   s       r?   visit_for_stmtz/PossiblyUndefinedVariableVisitor.visit_for_stmt  s:   	dAG$$$	t++---vv
$	d  """))+++;" I +33555((***Kt$$$ 411333
rA   r"   c                |    t                                          |           | j                                         d S r<   )r   visit_return_stmtr   rr   r  s     r?   r)  z2PossiblyUndefinedVariableVisitor.visit_return_stmt  s5    !!!$$$  """""rA   r   c                    | j                             t          j                   t	                                          |           | j                                          d S r<   )r   r   r   r   r   visit_lambda_exprr   r  s     r?   r+  z2PossiblyUndefinedVariableVisitor.visit_lambda_expr  sM      000!!!$$$!!!!!rA   r   c                    t                                          |           t          j        |j                  r| j                                         d S d S r<   )r   visit_assert_stmtr   is_false_literalr   r   rr   r  s     r?   r-  z2PossiblyUndefinedVariableVisitor.visit_assert_stmt  sT    !!!$$$#AF++ 	'L$$&&&&&	' 	'rA   r!   c                |    t                                          |           | j                                         d S r<   )r   visit_raise_stmtr   rr   r  s     r?   r0  z1PossiblyUndefinedVariableVisitor.visit_raise_stmt  s5      ###  """""rA   r   c                |    t                                          |           | j                                         d S r<   )r   visit_continue_stmtr   rr   r  s     r?   r2  z4PossiblyUndefinedVariableVisitor.visit_continue_stmt  s5    ##A&&&  """""rA   r   c                    t                                          |           | j        rd| j        d         _        | j                                         d S )NTrc   )r   visit_break_stmtr   r   r   rr   r  s     r?   r4  z1PossiblyUndefinedVariableVisitor.visit_break_stmt  sM      ###: 	,'+DJrN$  """""rA   r   c                    t          | j                            |j        d           t          t          d           f          r| j                                         t                      	                    |           d S r<   )
r   r   r   r   r1   typer   rr   r   visit_expression_stmtr  s     r?   r7  z6PossiblyUndefinedVariableVisitor.visit_expression_stmt  sf    dm''55d7TUU 	'L$$&&&%%a(((((rA   r%   c                    | xj         dz  c_         |j        A| j                                        }d| j        _        |                     |           || _        |                     |           | xj         dz  c_         dS )a  
        Note that finding undefined vars in `finally` requires different handling from
        the rest of the code. In particular, we want to disallow skipping branches due to jump
        statements in except/else clauses for finally but not for other cases. Imagine a case like:
        def f() -> int:
            try:
                x = 1
            except:
                # This jump statement needs to be handled differently depending on whether or
                # not we're trying to process `finally` or not.
                return 0
            finally:
                # `x` may be undefined here.
                pass
            # `x` is always defined here.
            return x
        r|   NT)r   finally_bodyr   rE   r   process_try_stmt)r>   r   old_trackers      r?   visit_try_stmtz/PossiblyUndefinedVariableVisitor.visit_try_stmt  s~    $ 	!>% ,++--K/3DL,!!!$$$&DLa   !rA   c                   | j                                          |j                            |            |j        |j                            |            t          |j                  dk    r't          |j                  t          |j                  cxk    rt          |j                  k    sn J t          t          |j                            D ]}| j         
                                 |j        |         }||                    |            |j        |         }|/|                     |j                   |                    |            |j        |                             |            || j                             |j                   | j                                          |j        |j                            |            dS dS )a  
        Processes try statement decomposing it into the following:
        if ...:
            body
            else_body
        elif ...:
            except 1
        elif ...:
            except 2
        else:
            except n
        finally
        Nr   )r   r   r   r   r  rd   handlersvarstypesr  r^   r   r_   rj   r   r9  )r>   r   r
  exc_typevars        r?   r:  z1PossiblyUndefinedVariableVisitor.process_try_stmt!  s    	++---	d;"Kt$$$qz??Qqz??c!&kkAAAAS\\AAAAAA3qz??++ 6 6((***71:'OOD)))fQi?++CH555JJt$$$
1$$T***?L++CH555))+++>%N!!$''''' &%rA   r'   c                   |j                             |            | j                                         t	                      }| j                            |           |j                            |            |j        }t          j
        |j                   s| j                                         | j                                         |j        p|r2| j                                         | j                                         |j        r|j                            |            |r| j                                         | j                                         d S r<   )r   r   r   r   r   r   r]   r   r   r   is_true_literalr^   r   r  r   r%  s       r?   visit_while_stmtz1PossiblyUndefinedVariableVisitor.visit_while_stmtF  s1   	d++---vv
$	dN	&qv.. 	' L$$&&&))+++;"  +33555((***{ )""4((( 411333
rA   r+   c                    |j         |                     |j                    t                                          |           d S r<   )r_   r   r   visit_as_patternr  s     r?   rG  z1PossiblyUndefinedVariableVisitor.visit_as_pattern`  s?    6'''  #####rA   r,   c                    |j         |                     |j                    t                                          |           d S r<   )capturer   r   visit_starred_patternr  s     r?   rJ  z6PossiblyUndefinedVariableVisitor.visit_starred_patterne  s?    9 	***%%a(((((rA   r   c                   |j         | j        v r&| j                            t          j                  rd S | j                            |j                   r;|                     |j         |           | j                            |j                    n| j        	                    |j                   rJ| j
        s| j        dk    r|                     |j         |           nU|                     |j         |           n9| j                            |j                   r| j                            |           t                                          |           d S )Nr   )r_   r   r   r   r   r   rt   r   rh   r   r   r   r   rw   r   r   visit_name_exprr  s     r?   rL  z0PossiblyUndefinedVariableVisitor.visit_name_exprj  s4   6T]""t|'<'<Y=M'N'N"F<--af55 	1**161555L**162222\88@@ 	1z 4T^a// ..qvq9999((3333\&&qv.. 	1 L--a000"""""rA   r(   c                    t          |j        |j                  D ]/\  }}|                    |            |                     |           0|j                            |            d S r<   )zipr   r   r   r   r   )r>   r   r   r   s       r?   visit_with_stmtz0PossiblyUndefinedVariableVisitor.visit_with_stmt  sf    QVQX.. 	% 	%ID#KK$$$$	drA   r   c                    |                      |j                   | j                            t          j                   t                                          |           | j                                         d S r<   )	r   r_   r   r   r   r   r   visit_class_defr   r  s     r?   rQ  z0PossiblyUndefinedVariableVisitor.visit_class_def  sc    '''  111"""!!!!!rA   r   c                   |j         D ]Y\  }}|| j                            |           "|                    d          }|r | j                            |d                    Zt	                                          |           d S )N.r   )idsr   rh   splitr   visit_import)r>   r   modaliasr   r   s        r?   rV  z-PossiblyUndefinedVariableVisitor.visit_import  s    % 		= 		=JC ..u5555 		# = L2258<<<QrA   r   c                    |j         D ]%\  }}|}||}| j                            |           &t                                          |           d S r<   )r   r   rh   r   visit_import_from)r>   r   rW  rX  r_   r   s        r?   rZ  z2PossiblyUndefinedVariableVisitor.visit_import_from  s^    ' 	1 	1JCD|L**40000!!!$$$$$rA   )
r   r   r   r   r   r*   r   r$   r9   r:   )r_   r`   r   r   r9   r:   r   )r   r   r9   r:   )r   r    r9   r:   )r   r   r9   r:   )r   r
   r9   r:   )r   r	   r9   r:   )r   r   r9   r:   )r   r   r9   r:   )r   r   r9   r:   )r   r   r9   r:   )r   r   r9   r:   )r   r   r9   r:   )r   r   r9   r:   )r   r"   r9   r:   )r   r   r9   r:   )r   r   r9   r:   )r   r!   r9   r:   )r   r   r9   r:   )r   r   r9   r:   )r   r   r9   r:   )r   r%   r9   r:   )r   r'   r9   r:   )r   r+   r9   r:   )r   r,   r9   r:   r   )r   r(   r9   r:   )r   r   r9   r:   )r   r   r9   r:   )r   r   r9   r:   )&rG   rH   rI   rJ   r@   r   r   r   r   r   r   r   r   r  r  r  r  r  r"  r'  r)  r+  r-  r0  r2  r4  r7  r<  r:  rE  rG  rJ  rL  rO  rQ  rV  rZ  __classcell__)r   s   @r?   r   r   +  s        "1 1 1 1*8 8 8 8> > > >- - - -% % % % % %
' ' ' ' ' '
* * * *) ) ) ) ) )
& & & &, , , , , , , ,$" " " " " "" " " " " """ " " " " "" " " " " "   .# # # # # #" " " " " "
' ' ' ' ' '
# # # # # ## # # # # ## # # # # #) ) ) ) ) )
   @#( #( #( #(J   4$ $ $ $ $ $
) ) ) ) ) )
# # # # # #4   " " " " " "           % % % % % % % % % %rA   r   N)@
__future__r   enumr   mypyr   r   mypy.messagesr   
mypy.nodesr   r	   r
   r   r   r   r   r   r   r   r   r   r   r   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,   mypy.reachabilityr-   r.   mypy.traverserr/   
mypy.typesr0   r1   r3   rM   r   r   r   r   r   rK   rA   r?   <module>rf     su   " " " " " "       $ $ $ $ $ $ $ $ ( ( ( ( ( (# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #H !           3 3 3 3 3 3 3 3 > > > > > > > > 3 3 3 3 3 3 , , , , , , , ,
 
 
 
 
 
 
 
>X
 X
 X
 X
 X
 X
 X
 X
v       4 4 4 4 4 4 4 4(\A \A \A \A \A \A \A \A~       
x% x% x% x% x%'? x% x% x% x% x%rA   