U
    nuf                     @   s   d dl mZmZ d dlmZmZmZ d dlmZ d dl	m
Z
 G dd dZeddZed	d
ZeddZdd ZdddZdd Zdd ZdS )    )DictOptional)get_flow_branch_keywordis_scopeget_parent_scope)execution_allowed)is_big_annoying_libraryc                   @   sT   e Zd ZU i Zeee d f ed< ee eddddZ	dd Z
dd	 Zd
d ZdS )Statuslookup_tableN)valuenamereturnc                 C   s   || _ || _| tj|< d S N)_value_namer	   r
   )selfr   r    r   @/tmp/pip-unpacked-wheel-ol4ehs9f/jedi/inference/flow_analysis.py__init__   s    zStatus.__init__c                 C   s    | t krtS | tkrt S tS d S r   )	REACHABLEUNREACHABLEUNSUREr   r   r   r   invert   s
    zStatus.invertc                 C   s(   t | |fkrt S | jr |jr tS tS d S r   )r   r   r   r   )r   otherr   r   r   __and__   s    zStatus.__and__c                 C   s   dt | j| jf S )Nz<%s: %s>)type__name__r   r   r   r   r   __repr__   s    zStatus.__repr__)r   
__module____qualname__r
   r   r   bool__annotations__strr   r   r   r   r   r   r   r   r	      s
   
r	   T	reachableFZunreachableNZunsurec                 c   s,   t | dd} | d kst| r d S | V  q d S )NTZinclude_flows)r   r   )noder   r   r   _get_flow_scopes'   s    r'   c                 C   s   t | s| jjstS t|dd}|d k	rtt|}tt|}d}|D ]n}||krHt||}	t||}
|	|
k}|jdkr|st	  S n&|jdkr|s|
dkr|	dkrt	  S |rH qqH|d k	r||kr|rt
S |j}qt| |||S )NTr%   if_stmttry_stmtelseexcept)r   inference_stateZflow_analysis_enabledr   r   listr'   r   r   r   r   parent_break_check)contextvalue_scoper&   Zorigin_scopeZfirst_flow_scopeZorigin_flow_scopesZnode_flow_scopesZbranch_matches
flow_scopeZnode_keywordZorigin_keywordr   r   r   reachability_check/   s:    




	r3   c                 C   s   t }|jdkrh||rJ| D ]}t| |}|t tfkr  q@q | }qv||}|d k	rvt| |}n|jdkrvtS |ttfkr|S ||kr||j	krt
|dd}|t| |||@ S |S d S )Nr(   )r)   Z
while_stmtTr%   )r   r   Zis_node_after_elseZget_test_nodes	_check_ifr   r   Zget_corresponding_test_noder   r.   r   r/   )r0   r1   r2   r&   r$   Z
check_nodeZ	flow_noder   r   r   r/   X   s&    





r/   c              
   C   s   t | j|l}|s"tW  5 Q R  S | |}tdd |D }t|dkrdtj|  W  5 Q R  S tW  5 Q R  S W 5 Q R X d S )Nc                 s   s   | ]}|  V  qd S r   )Z
py__bool__).0xr   r   r   	<genexpr>y   s     z_check_if.<locals>.<genexpr>   )	r   r,   r   Z
infer_nodesetlenr	   r
   pop)r0   r&   allowedtypesvaluesr   r   r   r4   s   s    
r4   )N)typingr   r   Zjedi.parser_utilsr   r   r   Zjedi.inference.recursionr   Zjedi.inference.helpersr   r	   r   r   r   r'   r3   r/   r4   r   r   r   r   <module>   s   



)