o
    ØÝ2gÚc  ã                   @  sz  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+m,Z, d dl-m.Z. d dl/m0Z0m1Z1 d dl2m3Z3m4Z4 d d	l5m6Z6 d d
l7m8Z8m9Z9 G dd„ dƒZ:G dd„ dƒZ;G dd„ deƒZ<G dd„ dƒZ=G dd„ dƒZ>G dd„ dƒZ?G dd„ de6ƒ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ÚTypeAliasStmtÚ	WhileStmtÚWithStmtÚimplicit_module_attrs)ÚOptions)Ú	AsPatternÚStarredPattern)ÚALWAYS_TRUEÚinfer_pattern_value)ÚExtendedTraverserVisitor)ÚTypeÚUninhabitedTypec                   @  s,   e Zd ZdZ			dddd„Zd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                 C  s:   |d u rt ƒ }|d u rt ƒ }t |ƒ| _t |ƒ| _|| _d S ©N)Úsetr5   r3   r6   )Úselfr3   r5   r6   © r=   úN/home/garg/my-data/venv/lib/python3.10/site-packages/mypy/partially_defined.pyÚ__init__;   s   


zBranchState.__init__c                 C  s   t t| jƒt| jƒ| jdS )N©r3   r5   r6   )r2   r;   r3   r5   r6   ©r<   r=   r=   r>   ÚcopyJ   s
   ýzBranchState.copy)NNF)r3   r4   r5   r4   r6   r7   r8   r9   ©r8   r2   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r?   rB   r=   r=   r=   r>   r2   3   s    	ür2   c                   @  s|   e Zd Zd!d"dd„Zd#dd	„Zd$d
d„Zd%dd„Zd%dd„Zd&dd„Zd$dd„Z	d'dd„Z
d'dd„Zd'dd„Zd(dd „ZdS ))ÚBranchStatementNÚinitial_stateúBranchState | Noner8   r9   c                 C  s0   |d u rt ƒ }|| _t | jj| jjdg| _d S ©N)r3   r5   )r2   rI   r3   r5   Úbranches)r<   rI   r=   r=   r>   r?   S   s   þ
ÿzBranchStatement.__init__c                 C  s    t | jƒ}dd„ | jD ƒ|_|S )Nc                 S  ó   g | ]}|  ¡ ‘qS r=   ©rB   ©Ú.0Úbr=   r=   r>   Ú
<listcomp>`   ó    z(BranchStatement.copy.<locals>.<listcomp>)rH   rI   rL   ©r<   Úresultr=   r=   r>   rB   ^   s   
zBranchStatement.copyc                 C  s    | j  t| jj| jjd¡ d S rK   )rL   Úappendr2   rI   r3   r5   rA   r=   r=   r>   Únext_branchc   s   þÿzBranchStatement.next_branchÚnameÚstrc                 C  s:   t | jƒdks	J ‚| jd j |¡ | jd j |¡ d S ©Nr   éÿÿÿÿ)ÚlenrL   r3   Úaddr5   Údiscard©r<   rX   r=   r=   r>   Úrecord_definitionk   ó   z!BranchStatement.record_definitionc                 C  s:   t | jƒdks	J ‚| jd j |¡ | jd j |¡ d S rZ   )r\   rL   r3   r^   r5   r_   r=   r=   r>   Ú
delete_varp   ra   zBranchStatement.delete_varÚstater2   c                 C  sZ   t | jƒdks	J ‚| jd }|jrd|_d S |j |j¡ |j |j¡ |j |j¡ d S )Nr   r[   T)r\   rL   r6   r3   Úupdater5   Údifference_update)r<   rc   Úcurrent_branchr=   r=   r>   Úrecord_nested_branchu   s   
z$BranchStatement.record_nested_branchc                 C  s"   t | jƒdks	J ‚d| jd _d S )Nr   Tr[   )r\   rL   r6   rA   r=   r=   r>   Úskip_branch   ó   zBranchStatement.skip_branchr7   c                 C  s"   t | jƒdks	J ‚|| jd jv S rZ   )r\   rL   r5   r_   r=   r=   r>   Úis_possibly_undefinedƒ   ri   z%BranchStatement.is_possibly_undefinedc                 C  s0   t | jƒdks	J ‚| jd }||jvo||jvS rZ   )r\   rL   r5   r3   )r<   rX   Úbranchr=   r=   r>   Úis_undefined‡   s   
zBranchStatement.is_undefinedc                 C  s<   t | jƒdks	J ‚| jD ]}||jv s||jv r dS qdS )Nr   TF)r\   rL   r3   r5   )r<   rX   rQ   r=   r=   r>   Úis_defined_in_a_branchŒ   s   
ÿz&BranchStatement.is_defined_in_a_branchc                 C  sŽ   t ƒ }| jD ]}| |j¡ | |j¡ qdd„ | jD ƒ}|r4|d j}|dd … D ]}| |j¡ q*nt ƒ }| |¡}t||t|ƒdkdS )Nc                 S  s   g | ]}|j s|‘qS r=   )r6   rO   r=   r=   r>   rR   œ   s    z(BranchStatement.done.<locals>.<listcomp>r   é   r@   )	r;   rL   rd   r5   r3   Úintersection_updateÚ
differencer2   r\   )r<   Úall_varsrQ   Únon_skipped_branchesr3   r5   r=   r=   r>   Údone“   s"   

ÿ

ýzBranchStatement.doner:   )rI   rJ   r8   r9   )r8   rH   ©r8   r9   ©rX   rY   r8   r9   )rc   r2   r8   r9   ©rX   rY   r8   r7   rC   )rD   rE   rF   r?   rB   rW   r`   rb   rg   rh   rj   rl   rm   rs   r=   r=   r=   r>   rH   R   s    









rH   c                   @  s   e Zd ZdZdZdZdZdS )Ú	ScopeTypern   é   é   é   N)rD   rE   rF   ÚGlobalÚClassÚFuncÚ	Generatorr=   r=   r=   r>   rw   ­   s
    rw   c                   @  s4   e Zd Zddd„Zdd	d
„Zddd„Zddd„ZdS )ÚScopeÚstmtsúlist[BranchStatement]Ú
scope_typerw   r8   r9   c                 C  s   || _ || _i | _d S r:   )Úbranch_stmtsr‚   Úundefined_refs)r<   r€   r‚   r=   r=   r>   r?   µ   s   
zScope.__init__c                 C  s(   t dd„ | jD ƒ| jƒ}| j ¡ |_|S )Nc                 S  rM   r=   rN   ©rP   Úsr=   r=   r>   rR   »   rS   zScope.copy.<locals>.<listcomp>)r   rƒ   r‚   r„   rB   rT   r=   r=   r>   rB   º   s   z
Scope.copyÚor   c                 C  s0   |j | jvrtƒ | j|j < | j|j   |¡ d S r:   )rX   r„   r;   r]   ©r<   r‡   r=   r=   r>   Úrecord_undefined_ref¿   s   zScope.record_undefined_refrX   rY   úset[NameExpr]c                 C  s   | j  |tƒ ¡S r:   )r„   Úpopr;   r_   r=   r=   r>   Úpop_undefined_refÄ   s   zScope.pop_undefined_refN)r€   r   r‚   rw   r8   r9   ©r8   r   ©r‡   r   r8   r9   ©rX   rY   r8   rŠ   )rD   rE   rF   r?   rB   r‰   rŒ   r=   r=   r=   r>   r   ´   s
    


r   c                   @  sº   e Zd ZdZd0dd„Zd1dd„Zd2d	d
„Zd3dd„Zd0dd„Zd4dd„Z	d0dd„Z
d0dd„Zd0dd„Zd0dd„Zd5dd„Zd5d d!„Zd6d$d%„Zd7d'd(„Zd8d)d*„Zd8d+d,„Zd8d-d.„Zd/S )9ÚDefinedVariableTrackerzUDefinedVariableTracker manages the state and scope for the UndefinedVariablesVisitor.r8   r9   c                 C  s   t tƒ gtjƒg| _d| _d S ©NF)r   rH   rw   r{   ÚscopesÚdisable_branch_skiprA   r=   r=   r>   r?   Ë   s   
zDefinedVariableTracker.__init__c                 C  s$   t ƒ }dd„ | jD ƒ|_| j|_|S )Nc                 S  rM   r=   rN   r…   r=   r=   r>   rR   Ô   rS   z/DefinedVariableTracker.copy.<locals>.<listcomp>)r   r’   r“   rT   r=   r=   r>   rB   Ò   s   zDefinedVariableTracker.copyr   c                 C  s   t | jƒdks	J ‚| jd S rZ   )r\   r’   rA   r=   r=   r>   Ú_scopeØ   s   
zDefinedVariableTracker._scoper‚   rw   c                 C  sT   t |  ¡ jƒdksJ ‚d }|tjkr|  ¡ jd jd }| j tt	|ƒg|ƒ¡ d S rZ   )
r\   r”   rƒ   rw   r~   rL   r’   rV   r   rH   )r<   r‚   rI   r=   r=   r>   Úenter_scopeÜ   s
   
z"DefinedVariableTracker.enter_scopec                 C  s   | j  ¡  d S r:   )r’   r‹   rA   r=   r=   r>   Ú
exit_scopeä   ó   z!DefinedVariableTracker.exit_scoper7   c                 C  s   |   ¡ j|kS r:   )r”   r‚   )r<   r‚   r=   r=   r>   Úin_scopeç   r—   zDefinedVariableTracker.in_scopec                 C  s>   t |  ¡ jƒdksJ ‚|  ¡ j t|  ¡ jd jd ƒ¡ d S rZ   )r\   r”   rƒ   rV   rH   rL   rA   r=   r=   r>   Ústart_branch_statementê   s   
ÿz-DefinedVariableTracker.start_branch_statementc                 C  s,   t |  ¡ jƒdksJ ‚|  ¡ jd  ¡  d S ©Nrn   r[   )r\   r”   rƒ   rW   rA   r=   r=   r>   rW   ð   s   z"DefinedVariableTracker.next_branchc                 C  s@   t |  ¡ jƒdksJ ‚|  ¡ j ¡  ¡ }|  ¡ jd  |¡ d S rš   )r\   r”   rƒ   r‹   rs   rg   rT   r=   r=   r>   Úend_branch_statementô   s   z+DefinedVariableTracker.end_branch_statementc                 C  s6   t |  ¡ jƒdkr| js|  ¡ jd  ¡  d S d S d S rš   )r\   r”   rƒ   r“   rh   rA   r=   r=   r>   rh   ù   s   ÿz"DefinedVariableTracker.skip_branchrX   rY   c                 C  óB   t | jƒdks	J ‚t | jd jƒdksJ ‚|  ¡ jd  |¡ d S rZ   )r\   r’   rƒ   r”   r`   r_   r=   r=   r>   r`   þ   ó   z(DefinedVariableTracker.record_definitionc                 C  rœ   rZ   )r\   r’   rƒ   r”   rb   r_   r=   r=   r>   rb     r   z!DefinedVariableTracker.delete_varr‡   r   c                 C  s$   t | jƒdks	J ‚|  ¡  |¡ dS )zURecords an undefined reference. These can later be retrieved via `pop_undefined_ref`.r   N)r\   r’   r”   r‰   rˆ   r=   r=   r>   r‰     s   z+DefinedVariableTracker.record_undefined_refrŠ   c                 C  s    t | jƒdks	J ‚|  ¡  |¡S )zaIf name has previously been reported as undefined, the NameExpr that was called will be returned.r   )r\   r’   r”   rŒ   r_   r=   r=   r>   rŒ     s   z(DefinedVariableTracker.pop_undefined_refc                 C  ó*   t |  ¡ jƒdksJ ‚|  ¡ jd  |¡S rZ   )r\   r”   rƒ   rj   r_   r=   r=   r>   rj     s   z,DefinedVariableTracker.is_possibly_undefinedc                 C  sV   t |  ¡ jƒdksJ ‚|  ¡ jd }| |¡sdS |  ¡ jD ]
}| |¡r( dS qdS )zYThis will return true if a variable is defined in a branch that's not the current branch.r   r[   FT)r\   r”   rƒ   rl   rm   )r<   rX   Ústmtr=   r=   r>   Úis_defined_in_different_branch  s   

ÿz5DefinedVariableTracker.is_defined_in_different_branchc                 C  rž   rZ   )r\   r”   rƒ   rl   r_   r=   r=   r>   rl   "  s   z#DefinedVariableTracker.is_undefinedNrt   )r8   r   r   )r‚   rw   r8   r9   )r‚   rw   r8   r7   ru   rŽ   r   rv   )rD   rE   rF   rG   r?   rB   r”   r•   r–   r˜   r™   rW   r›   rh   r`   rb   r‰   rŒ   rj   r    rl   r=   r=   r=   r>   r   È   s&    















r   c                   @  s   e Zd Zddd„ZdS )ÚLoopr8   r9   c                 C  s
   d| _ d S r‘   )Ú	has_breakrA   r=   r=   r>   r?   (  s   
zLoop.__init__Nrt   )rD   rE   rF   r?   r=   r=   r=   r>   r¡   '  s    r¡   c                      s¸  e Zd ZdZdsdd„Zdtdd„Zdtdd„Zdudd„Zdv‡ fdd„Zdw‡ fdd„Z	dxd!d"„Z
dy‡ fd$d%„Zdzd'd(„Zd{d*d+„Zd|d-d.„Zd}‡ fd0d1„Zd~‡ fd3d4„Zd‡ fd6d7„Zd€‡ fd9d:„Zdd<d=„Zd‚‡ fd?d@„Zdƒ‡ fdBdC„Zd„‡ fdEdF„Zd…‡ fdHdI„Zd†‡ fdKdL„Zd‡‡ fdNdO„Zdˆ‡ fdQdR„Zd‰dTdU„Zd‰dVdW„ZdŠdYdZ„Zd‹‡ fd\d]„ZdŒ‡ fd_d`„Zd‡ fdbdc„Z dŽdedf„Z!d‡ fdhdi„Z"d‡ fdkdl„Z#d‘‡ fdndo„Z$d’dqdr„Z%‡  Z&S )“Ú 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#   r8   r9   c                 C  sr   || _ || _|| _tƒ | _| dd ¡}|r"t|jtƒsJ ‚|jj	| _g | _
d| _tƒ | _tD ]}| j |¡ q.d S )NÚ__builtins__r   )r¤   r¥   r§   r#   ÚbuiltinsÚgetÚ
isinstanceÚnoder   r¨   ÚloopsÚ	try_depthr   Útrackerr)   r`   )r<   r¤   r¥   r§   r¨   Úbuiltins_modrX   r=   r=   r>   r?   >  s   
ÿz)PossiblyUndefinedVariableVisitor.__init__rX   rY   Úcontextr   c                 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<   rX   r²   r=   r=   r>   r·   S  ó   ÿz4PossiblyUndefinedVariableVisitor.var_used_before_defc                 C  r³   r:   )r¤   r´   rµ   r   ÚPOSSIBLY_UNDEFINEDÚvariable_may_be_undefinedr¸   r=   r=   r>   r»   W  r¹   z:PossiblyUndefinedVariableVisitor.variable_may_be_undefinedc                 C  sX   | j  tj¡s#| j  |¡}|D ]}| jr|  ||¡ q|  ||¡ qn	 | j  |¡ d S r:   )	r°   r˜   rw   r|   rŒ   r®   r»   r·   r`   )r<   rX   ÚrefsÚrefr=   r=   r>   Úprocess_definition[  s   üz3PossiblyUndefinedVariableVisitor.process_definitionr‡   r   c                   ó&   |j D ]}|  |¡ qtƒ  |¡ d S r:   )r¨   r¾   ÚsuperÚvisit_global_decl©r<   r‡   rX   ©Ú	__class__r=   r>   rÁ   i  ó   
z2PossiblyUndefinedVariableVisitor.visit_global_declr   c                   r¿   r:   )r¨   r¾   rÀ   Úvisit_nonlocal_declrÂ   rÃ   r=   r>   rÆ   n  rÅ   z4PossiblyUndefinedVariableVisitor.visit_nonlocal_declÚlvalueúLvalue | Nonec                 C  s`   t |tƒr|  |j¡ d S t |tƒr|  |j¡ d S t |ttfƒr,|j	D ]	}|  |¡ q$d S d S r:   )
r¬   r   r¾   rX   r"   Úprocess_lvalueÚexprr   r%   Úitems)r<   rÇ   Úitemr=   r=   r>   rÉ   s  s   


þz/PossiblyUndefinedVariableVisitor.process_lvaluer	   c                   r¿   r:   )ÚlvaluesrÉ   rÀ   Úvisit_assignment_stmt)r<   r‡   rÇ   rÃ   r=   r>   rÎ   |  rÅ   z6PossiblyUndefinedVariableVisitor.visit_assignment_stmtr   c                 C  s   |j  | ¡ |  |j¡ d S r:   )ÚvalueÚacceptrÉ   Útargetrˆ   r=   r=   r>   Úvisit_assignment_expr  ó   z6PossiblyUndefinedVariableVisitor.visit_assignment_exprr   c                 C  s|   |j D ]}| | ¡ q| j ¡  |jD ]}|jrq| | ¡ | j ¡  q|jr7|jjs2|j | ¡ n| j ¡  | j 	¡  d S r:   )
rÊ   rÐ   r°   r™   ÚbodyÚis_unreachablerW   Ú	else_bodyrh   r›   )r<   r‡   ÚerQ   r=   r=   r>   Úvisit_if_stmt…  s   




z.PossiblyUndefinedVariableVisitor.visit_if_stmtr   c                 C  sª   |j  | ¡ | j ¡  tt|jƒƒD ];}|j| }| | ¡ |j| }|d ur,| | ¡ |j| j	s;|j|  | ¡ n| j 
¡  t|ƒtk}|sM| j ¡  q| j ¡  d S r:   )ÚsubjectrÐ   r°   r™   Úranger\   ÚpatternsÚguardsÚbodiesrÕ   rh   r.   r-   rW   r›   )r<   r‡   ÚiÚpatternÚguardÚis_catchallr=   r=   r>   Úvisit_match_stmt•  s    






€z1PossiblyUndefinedVariableVisitor.visit_match_stmtr   c                   s   |   |j¡ tƒ  |¡ d S r:   )r¾   rX   rÀ   Úvisit_func_defrˆ   rÃ   r=   r>   rã   §  rÓ   z/PossiblyUndefinedVariableVisitor.visit_func_defr   c                   sŒ   |  ¡ r
| jjs
d S |jpg }|D ]}|jd ur|j | ¡ q| j tj	¡ |D ]}|  
|jj¡ tƒ  |j¡ q(|j | ¡ | j ¡  d S r:   )Ú
is_dynamicr§   Úcheck_untyped_defsÚ	argumentsÚinitializerrÐ   r°   r•   rw   r}   r¾   ÚvariablerX   rÀ   Ú	visit_varrÔ   r–   )r<   r‡   ÚargsÚargrÃ   r=   r>   Ú
visit_func«  s   

€z+PossiblyUndefinedVariableVisitor.visit_funcr   c                   ó>   | j  tj¡ |jD ]}|  |¡ q
tƒ  |¡ | j  ¡  d S r:   )	r°   r•   rw   r~   ÚindicesrÉ   rÀ   Úvisit_generator_exprr–   ©r<   r‡   ÚidxrÃ   r=   r>   rï   ¼  ó
   
z5PossiblyUndefinedVariableVisitor.visit_generator_exprr   c                   rí   r:   )	r°   r•   rw   r~   rî   rÉ   rÀ   Úvisit_dictionary_comprehensionr–   rð   rÃ   r=   r>   ró   Ã  rò   z?PossiblyUndefinedVariableVisitor.visit_dictionary_comprehensionr   c                 C  s°   |j  | ¡ |  |j¡ |j | ¡ | j ¡  tƒ }| j |¡ |j	 | ¡ | j 
¡  | j ¡  |jd urQ|j}|rD| j ¡  | j 
¡  |j | ¡ |rQ| j ¡  | j ¡  d S r:   )rÊ   rÐ   rÉ   Úindexr°   r™   r¡   r®   rV   rÔ   rW   r›   rÖ   r¢   r‹   ©r<   r‡   Úloopr¢   r=   r=   r>   Úvisit_for_stmtÊ  s$   






z/PossiblyUndefinedVariableVisitor.visit_for_stmtr!   c                   ó   t ƒ  |¡ | j ¡  d S r:   )rÀ   Úvisit_return_stmtr°   rh   rˆ   rÃ   r=   r>   rù   á  ó   z2PossiblyUndefinedVariableVisitor.visit_return_stmtr   c                   s(   | j  tj¡ tƒ  |¡ | j  ¡  d S r:   )r°   r•   rw   r}   rÀ   Úvisit_lambda_exprr–   rˆ   rÃ   r=   r>   rû   å  s   z2PossiblyUndefinedVariableVisitor.visit_lambda_exprr   c                   s*   t ƒ  |¡ t |j¡r| j ¡  d S d S r:   )rÀ   Úvisit_assert_stmtr   Úis_false_literalrÊ   r°   rh   rˆ   rÃ   r=   r>   rü   ê  s   ÿz2PossiblyUndefinedVariableVisitor.visit_assert_stmtr    c                   rø   r:   )rÀ   Úvisit_raise_stmtr°   rh   rˆ   rÃ   r=   r>   rþ   ï  rú   z1PossiblyUndefinedVariableVisitor.visit_raise_stmtr   c                   rø   r:   )rÀ   Úvisit_continue_stmtr°   rh   rˆ   rÃ   r=   r>   rÿ   ó  rú   z4PossiblyUndefinedVariableVisitor.visit_continue_stmtr
   c                   s,   t ƒ  |¡ | jrd| jd _| j ¡  d S )NTr[   )rÀ   Úvisit_break_stmtr®   r¢   r°   rh   rˆ   rÃ   r=   r>   r   ÷  s   z1PossiblyUndefinedVariableVisitor.visit_break_stmtr   c                   s8   t | j |jd ¡ttd ƒfƒr| j ¡  tƒ  	|¡ d S r:   )
r¬   r¥   r«   rÊ   r1   Útyper°   rh   rÀ   Úvisit_expression_stmtrˆ   rÃ   r=   r>   r  ý  s   
z6PossiblyUndefinedVariableVisitor.visit_expression_stmtr$   c                 C  sV   |  j d7  _ |jdur| j ¡ }d| j_|  |¡ || _|  |¡ |  j d8  _ 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
        rn   NT)r¯   Úfinally_bodyr°   rB   r“   Úprocess_try_stmt)r<   r‡   Úold_trackerr=   r=   r>   Úvisit_try_stmt  s   



z/PossiblyUndefinedVariableVisitor.visit_try_stmtc                 C  s  | j  ¡  |j | ¡ |jdur|j | ¡ t|jƒdkrxt|jƒt|jƒ  kr1t|jƒks4J ‚ J ‚t	t|jƒƒD ]<}| j  
¡  |j| }|durP| | ¡ |j| }|durd|  |j¡ | | ¡ |j|  | ¡ |durw| j  |j¡ q;| j  ¡  |jdurŠ|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Ö   r\   ÚhandlersÚvarsÚtypesrÚ   rW   r¾   rX   rb   r›   r  )r<   r‡   rÞ   Úexc_typeÚvarr=   r=   r>   r  "  s.   

.




€

ÿz1PossiblyUndefinedVariableVisitor.process_try_stmtr'   c                 C  sª   |j  | ¡ | j ¡  tƒ }| j |¡ |j | ¡ |j}t	 
|j ¡s(| j ¡  | j ¡  |jd urN|r>| j ¡  | j ¡  |jrG|j | ¡ |rN| j ¡  | j ¡  d S r:   )rÊ   rÐ   r°   r™   r¡   r®   rV   rÔ   r¢   r   Úis_true_literalrW   r›   rÖ   r‹   rõ   r=   r=   r>   Úvisit_while_stmtG  s$   






z1PossiblyUndefinedVariableVisitor.visit_while_stmtr+   c                   ó&   |j d ur|  |j ¡ tƒ  |¡ d S r:   )rX   rÉ   rÀ   Úvisit_as_patternrˆ   rÃ   r=   r>   r  a  rÅ   z1PossiblyUndefinedVariableVisitor.visit_as_patternr,   c                   r  r:   )ÚcapturerÉ   rÀ   Úvisit_starred_patternrˆ   rÃ   r=   r>   r  f  rÅ   z6PossiblyUndefinedVariableVisitor.visit_starred_patternr   c                   s²   |j | jv r| j tj¡rd S | j |j ¡r%|  |j |¡ | j |j ¡ n,| j 	|j ¡rD| j
s4| jdkr<|  |j |¡ n|  |j |¡ n| j |j ¡rQ| j |¡ tƒ  |¡ d S )Nr   )rX   rª   r°   r˜   rw   r{   rj   r»   r`   r    r®   r¯   r·   rl   r‰   rÀ   Úvisit_name_exprrˆ   rÃ   r=   r>   r  k  s   z0PossiblyUndefinedVariableVisitor.visit_name_exprr(   c                 C  s<   t |j|jƒD ]\}}| | ¡ |  |¡ q|j | ¡ d S r:   )ÚziprÊ   rÑ   rÐ   rÉ   rÔ   )r<   r‡   rÊ   rñ   r=   r=   r>   Úvisit_with_stmt…  s   
z0PossiblyUndefinedVariableVisitor.visit_with_stmtr   c                   s4   |   |j¡ | j tj¡ tƒ  |¡ | j ¡  d S r:   )	r¾   rX   r°   r•   rw   r|   rÀ   Úvisit_class_defr–   rˆ   rÃ   r=   r>   r  ‹  s   z0PossiblyUndefinedVariableVisitor.visit_class_defr   c                   sT   |j D ]\}}|d ur| j |¡ q| d¡}|r!| j |d ¡ qtƒ  |¡ d S )NÚ.r   )Úidsr°   r`   ÚsplitrÀ   Úvisit_import)r<   r‡   ÚmodÚaliasr¨   rÃ   r=   r>   r  ‘  s   
€z-PossiblyUndefinedVariableVisitor.visit_importr   c                   s<   |j D ]\}}|}|d u r|}| j |¡ qtƒ  |¡ d S r:   )r¨   r°   r`   rÀ   Úvisit_import_from)r<   r‡   r  r  rX   rÃ   r=   r>   r  ž  s   z2PossiblyUndefinedVariableVisitor.visit_import_fromr&   c                 C  s   | j  |jj¡ d S r:   )r°   r`   rX   rˆ   r=   r=   r>   Úvisit_type_alias_stmt¦  s   z6PossiblyUndefinedVariableVisitor.visit_type_alias_stmt)
r¤   r   r¥   r¦   r§   r*   r¨   r#   r8   r9   )rX   rY   r²   r   r8   r9   ru   )r‡   r   r8   r9   )r‡   r   r8   r9   )rÇ   rÈ   r8   r9   )r‡   r	   r8   r9   )r‡   r   r8   r9   )r‡   r   r8   r9   )r‡   r   r8   r9   )r‡   r   r8   r9   )r‡   r   r8   r9   )r‡   r   r8   r9   )r‡   r   r8   r9   )r‡   r   r8   r9   )r‡   r!   r8   r9   )r‡   r   r8   r9   )r‡   r   r8   r9   )r‡   r    r8   r9   )r‡   r   r8   r9   )r‡   r
   r8   r9   )r‡   r   r8   r9   )r‡   r$   r8   r9   )r‡   r'   r8   r9   )r‡   r+   r8   r9   )r‡   r,   r8   r9   rŽ   )r‡   r(   r8   r9   )r‡   r   r8   r9   )r‡   r   r8   r9   )r‡   r   r8   r9   )r‡   r&   r8   r9   )'rD   rE   rF   rG   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  r  Ú__classcell__r=   r=   rÃ   r>   r£   ,  sH    




	





 
%
r£   N)AÚ
__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(   r)   Úmypy.optionsr*   Úmypy.patternsr+   r,   Úmypy.reachabilityr-   r.   Úmypy.traverserr/   Ú
mypy.typesr0   r1   r2   rH   rw   r   r   r¡   r£   r=   r=   r=   r>   Ú<module>   s"    ”%[_