o
    7fc                     @  sv  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 dZ9G 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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                   @  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)setr4   r2   r5   )selfr2   r4   r5    r<   O/home/ertert/spirit/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r2   r4   r5   )r1   r:   r2   r4   r5   r;   r<   r<   r=   copyI   s
   zBranchState.copy)NNF)r2   r3   r4   r3   r5   r6   r7   r8   r7   r1   )__name__
__module____qualname____doc__r>   rA   r<   r<   r<   r=   r1   2   s    	r1   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 | Noner7   r8   c                 C  s0   |d u rt  }|| _t | jj| jjdg| _d S N)r2   r4   )r1   rH   r2   r4   branches)r;   rH   r<   r<   r=   r>   R   s   
zBranchStatement.__init__c                 C  s    t | j}dd | jD |_|S )Nc                 S     g | ]}|  qS r<   rA   .0br<   r<   r=   
<listcomp>_       z(BranchStatement.copy.<locals>.<listcomp>)rG   rH   rK   r;   resultr<   r<   r=   rA   ]   s   
zBranchStatement.copyc                 C  s    | j t| jj| jjd d S rJ   )rK   appendr1   rH   r2   r4   r@   r<   r<   r=   next_branchb   s   zBranchStatement.next_branchnamestrc                 C  s:   t | jdks	J | jd j| | jd j| d S Nr   )lenrK   r2   addr4   discardr;   rW   r<   r<   r=   record_definitionj      z!BranchStatement.record_definitionc                 C  s:   t | jdks	J | jd j| | jd j| d S rY   )r[   rK   r2   r]   r4   r^   r<   r<   r=   
delete_varo   r`   zBranchStatement.delete_varstater1   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   rZ   T)r[   rK   r5   r2   updater4   difference_update)r;   rb   current_branchr<   r<   r=   record_nested_brancht   s   
z$BranchStatement.record_nested_branchc                 C  s"   t | jdks	J d| jd _d S )Nr   TrZ   )r[   rK   r5   r@   r<   r<   r=   skip_branch~      zBranchStatement.skip_branchr6   c                 C  s"   t | jdks	J || jd jv S rY   )r[   rK   r4   r^   r<   r<   r=   is_possibly_undefined   rh   z%BranchStatement.is_possibly_undefinedc                 C  s0   t | jdks	J | jd }||jvo||jvS rY   )r[   rK   r4   r2   )r;   rW   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[   rK   r2   r4   )r;   rW   rP   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<   )r5   rN   r<   r<   r=   rQ      s    z(BranchStatement.done.<locals>.<listcomp>r      r?   )	r:   rK   rc   r4   r2   intersection_update
differencer1   r[   )r;   all_varsrP   non_skipped_branchesr2   r4   r<   r<   r=   done   s"   



zBranchStatement.doner9   )rH   rI   r7   r8   )r7   rG   r7   r8   rW   rX   r7   r8   )rb   r1   r7   r8   rW   rX   r7   r6   rB   )rC   rD   rE   r>   rA   rV   r_   ra   rf   rg   ri   rk   rl   rr   r<   r<   r<   r=   rG   Q   s    









rG   c                   @  s   e Zd ZdZdZdZdZdS )	ScopeTyperm            N)rC   rD   rE   GlobalClassFunc	Generatorr<   r<   r<   r=   rv      s
    rv   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_typerv   r7   r8   c                 C  s   || _ || _i | _d S r9   )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  rL   r<   rM   rO   sr<   r<   r=   rQ      rR   zScope.copy.<locals>.<listcomp>)r~   r   r   r   rA   rS   r<   r<   r=   rA      s   z
Scope.copyor   c                 C  s0   |j | jvrt | j|j < | j|j  | d S r9   )rW   r   r:   r\   r;   r   r<   r<   r=   record_undefined_ref   s   zScope.record_undefined_refrW   rX   set[NameExpr]c                 C  s   | j |t S r9   )r   popr:   r^   r<   r<   r=   pop_undefined_ref   s   zScope.pop_undefined_refN)r   r   r   rv   r7   r8   r7   r~   r   r   r7   r8   rW   rX   r7   r   )rC   rD   rE   r>   rA   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.r7   r8   c                 C  s   t t gtjg| _d| _d S NF)r~   rG   rv   rz   scopesdisable_branch_skipr@   r<   r<   r=   r>      s   
zDefinedVariableTracker.__init__c                 C  s$   t  }dd | jD |_| j|_|S )Nc                 S  rL   r<   rM   r   r<   r<   r=   rQ      rR   z/DefinedVariableTracker.copy.<locals>.<listcomp>)r   r   r   rS   r<   r<   r=   rA      s   zDefinedVariableTracker.copyr~   c                 C  s   t | jdks	J | jd S rY   )r[   r   r@   r<   r<   r=   _scope   s   
zDefinedVariableTracker._scoper   rv   c                 C  sT   t |  jdksJ d }|tjkr|  jd jd }| jtt	|g| d S rY   )
r[   r   r   rv   r}   rK   r   rU   r~   rG   )r;   r   rH   r<   r<   r=   enter_scope   s
   
z"DefinedVariableTracker.enter_scopec                 C  s   | j   d S r9   )r   r   r@   r<   r<   r=   
exit_scope      z!DefinedVariableTracker.exit_scoper6   c                 C  s   |   j|kS r9   )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 rY   )r[   r   r   rU   rG   rK   r@   r<   r<   r=   start_branch_statement   s   
z-DefinedVariableTracker.start_branch_statementc                 C  s,   t |  jdksJ |  jd   d S Nrm   rZ   )r[   r   r   rV   r@   r<   r<   r=   rV      s   z"DefinedVariableTracker.next_branchc                 C  s@   t |  jdksJ |  j  }|  jd | d S r   )r[   r   r   r   rr   rf   rS   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   rg   r@   r<   r<   r=   rg      s   z"DefinedVariableTracker.skip_branchrW   rX   c                 C  B   t | jdks	J t | jd jdksJ |  jd | d S rY   )r[   r   r   r   r_   r^   r<   r<   r=   r_         z(DefinedVariableTracker.record_definitionc                 C  r   rY   )r[   r   r   r   ra   r^   r<   r<   r=   ra     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 rY   )r[   r   r   ri   r^   r<   r<   r=   ri     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   rZ   FT)r[   r   r   rk   rl   )r;   rW   stmtr<   r<   r=   is_defined_in_different_branch  s   

z5DefinedVariableTracker.is_defined_in_different_branchc                 C  r   rY   )r[   r   r   rk   r^   r<   r<   r=   rk   !  s   z#DefinedVariableTracker.is_undefinedNrs   )r7   r   r   )r   rv   r7   r8   )r   rv   r7   r6   rt   r   r   ru   )rC   rD   rE   rF   r>   rA   r   r   r   r   r   rV   r   rg   r_   ra   r   r   ri   r   rk   r<   r<   r<   r=   r      s&    















r   c                   @  s   e Zd ZdddZdS )Loopr7   r8   c                 C  s
   d| _ d S r   )	has_breakr@   r<   r<   r=   r>   '  s   
zLoop.__init__Nrs   )rC   rD   rE   r>   r<   r<   r<   r=   r   &  s    r   c                      s  e Zd ZdZdpddZdqddZdqddZdrddZds fddZdt fddZ	dud!d"Z
dv fd$d%Zdwd'd(Zdxd*d+Zdyd-d.Zdz fd0d1Zd{ fd3d4Zd| fd6d7Zd} fd9d:Zd~d<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ddTdUZddVdWZddYdZZd fd\d]Zd fd_d`Zd fdbdcZ ddedfZ!d fdhdiZ"d fdkdlZ#d fdndo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#   r7   r8   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_modrW   r<   r<   r=   r>   =  s   
z)PossiblyUndefinedVariableVisitor.__init__rW   rX   contextr   c                 C  &   | j jtjr| j || d S d S r9   )r   errorsis_error_code_enabledr   USED_BEFORE_DEFvar_used_before_defr;   rW   r   r<   r<   r=   r   R     z4PossiblyUndefinedVariableVisitor.var_used_before_defc                 C  r   r9   )r   r   r   r   POSSIBLY_UNDEFINEDvariable_may_be_undefinedr   r<   r<   r=   r   V  r   z:PossiblyUndefinedVariableVisitor.variable_may_be_undefinedc                 C  sX   | j tjs#| j |}|D ]}| jr| || q| || qn	 | j | d S r9   )	r   r   rv   r{   r   r   r   r   r_   )r;   rW   refsrefr<   r<   r=   process_definitionZ  s   z3PossiblyUndefinedVariableVisitor.process_definitionr   r   c                   &   |j D ]}| | qt | d S r9   )r   r   supervisit_global_declr;   r   rW   	__class__r<   r=   r   h     
z2PossiblyUndefinedVariableVisitor.visit_global_declr   c                   r   r9   )r   r   r   visit_nonlocal_declr   r   r<   r=   r   m  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 r9   )
r   r   r   rW   r"   process_lvalueexprr   r%   items)r;   r   itemr<   r<   r=   r   r  s   


z/PossiblyUndefinedVariableVisitor.process_lvaluer	   c                   r   r9   )lvaluesr   r   visit_assignment_stmt)r;   r   r   r   r<   r=   r   {  r   z6PossiblyUndefinedVariableVisitor.visit_assignment_stmtr   c                 C  s   |j |  | |j d S r9   )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 r9   )
r   r   r   r   bodyis_unreachablerV   	else_bodyrg   r   )r;   r   erP   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 r9   )subjectr   r   r   ranger[   patternsguardsbodiesr   rg   r-   r,   rV   r   )r;   r   ipatternguardis_catchallr<   r<   r=   visit_match_stmt  s    






z1PossiblyUndefinedVariableVisitor.visit_match_stmtr   c                   s   |  |j t | d S r9   )r   rW   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 r9   )
is_dynamicr   check_untyped_defs	argumentsinitializerr   r   r   rv   r|   r   variablerW   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 r9   )	r   r   rv   r}   indicesr   r   visit_generator_exprr   r;   r   idxr   r<   r=   r     
   
z5PossiblyUndefinedVariableVisitor.visit_generator_exprr   c                   r   r9   )	r   r   rv   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 r9   )r   r   r   indexr   r   r   r   rU   r   rV   r   r   r   r   r;   r   loopr   r<   r<   r=   visit_for_stmt  s$   






z/PossiblyUndefinedVariableVisitor.visit_for_stmtr!   c                      t  | | j  d S r9   )r   visit_return_stmtr   rg   r   r   r<   r=   r        z2PossiblyUndefinedVariableVisitor.visit_return_stmtr   c                   s(   | j tj t | | j   d S r9   )r   r   rv   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 r9   )r   visit_assert_stmtr   is_false_literalr   r   rg   r   r   r<   r=   r     s   z2PossiblyUndefinedVariableVisitor.visit_assert_stmtr    c                   r   r9   )r   visit_raise_stmtr   rg   r   r   r<   r=   r     r   z1PossiblyUndefinedVariableVisitor.visit_raise_stmtr   c                   r   r9   )r   visit_continue_stmtr   rg   r   r   r<   r=   r     r   z4PossiblyUndefinedVariableVisitor.visit_continue_stmtr
   c                   s,   t  | | jrd| jd _| j  d S )NTrZ   )r   visit_break_stmtr   r   r   rg   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 r9   )
r   r   r   r   r0   typer   rg   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
        rm   NT)r   finally_bodyr   rA   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   rV   r   rW   ra   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 r9   )r   r   r   r   r   r   rU   r   r   r   is_true_literalrV   r   r   r   r   r<   r<   r=   visit_while_stmtF  s$   






z1PossiblyUndefinedVariableVisitor.visit_while_stmtr*   c                   &   |j d ur| |j  t | d S r9   )rW   r   r   visit_as_patternr   r   r<   r=   r  `  r   z1PossiblyUndefinedVariableVisitor.visit_as_patternr+   c                   r  r9   )capturer   r   visit_starred_patternr   r   r<   r=   r  e  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   )rW   r   r   r   rv   rz   ri   r   r_   r   r   r   r   rk   r   r   visit_name_exprr   r   r<   r=   r  j  s   z0PossiblyUndefinedVariableVisitor.visit_name_exprr'   c                 C  s<   t |j|jD ]\}}||  | | q|j|  d S r9   )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 r9   )	r   rW   r   r   rv   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 r9   )r   r   r_   r   visit_import_from)r;   r   r  r  rW   r   r<   r=   r    s   z2PossiblyUndefinedVariableVisitor.visit_import_from)
r   r   r   r   r   r)   r   r#   r7   r8   )rW   rX   r   r   r7   r8   rt   )r   r   r7   r8   )r   r   r7   r8   )r   r   r7   r8   )r   r	   r7   r8   )r   r   r7   r8   )r   r   r7   r8   )r   r   r7   r8   )r   r   r7   r8   )r   r   r7   r8   )r   r   r7   r8   )r   r   r7   r8   )r   r   r7   r8   )r   r!   r7   r8   )r   r   r7   r8   )r   r   r7   r8   )r   r    r7   r8   )r   r   r7   r8   )r   r
   r7   r8   )r   r   r7   r8   )r   r$   r7   r8   )r   r&   r7   r8   )r   r*   r7   r8   )r   r+   r7   r8   r   )r   r'   r7   r8   )r   r   r7   r8   )r   r   r7   r8   )r   r   r7   r8   )&rC   rD   rE   rF   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   +  sF    




	





 
%
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.typesr/   r0   r1   rG   rv   r~   r   r   r   r<   r<   r<   r=   <module>   s"    $[_