B
    aCq                 @   sD  d Z ddlZddlZddlZddlZddlmZ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 ddlmZ ddlmZmZmZmZmZ ejd	krdd
lmZ ndd
lmZ edZedZ dd Z!dd Z"dZ#ddddddddddddddZ$d d! e$% D Z&d"d! e$% D Z'd#d$d%dd&Z(ej)ej*ej+ej,d&Z-d'd( Z.d)d* ej/_0d+d* ej1_0d,d* ej2_0d-d* ej3_0d.d* ej4_0d/d* d0d* d1d* d2d* d3d* d4d* d5d* d6d* d7d* d8d* d9d* d:d* ej5dZ6x&e7e6% D ]\Z8Z9e9e6e8d; < qW ej:d<d= Z;e;ej3_<d>d? Z=d@dA Z>ej:dBdC Z?e?ej/_<e?ej1_<ej:dDdE Z@e@ejA_<e@ejB_<dFdG ZCejDdidHdIZEeEejF_GeEejH_GdjdJdKZIeIej/_GeIej1_GdkdLdMZJeJejK_GeJejL_GdNdO ZMdldPdQZNeNejO_GejDdmdRdSZPdndTdUZQePejR_GeQejS_GePejT_GdVdW ZUejDdodXdYZVeVejW_GdZd[ ZXejDdpd\d]ZYeYejZ_GejDdqd^d_Z[e[ej\_Gej:drd`daZ]e]ej^_Gej:dsej_ejKeej` ed eejaddf dbdcddZbebej__Gej:dtejcejKeej` ed eejaddf dbdedfZdedejc_Gej:duejeejKeej` ed eejaddf dbdgdhZfefeje_GdS )vzcthis module contains a set of functions to handle python protocols for nodes
where it makes sense.
    N)	GeneratorOptional)	argumentsbases)context)
decoratorshelpersnode_classesnodesutil)Context)AstroidIndexErrorAstroidTypeErrorAttributeInferenceErrorInferenceError	NoDefault)      )Literalraw_buildingobjectsc             C   s   d| dd   S )NZ__r    )namer   r   5/tmp/pip-unpacked-wheel-mm06h1t3/astroid/protocols.py_reflected_name:   s    r   c             C   s   d| dd   S )NZ__ir   r   )r   r   r   r   _augmented_name>   s    r   zcontextlib.contextmanager__add____sub____truediv____floordiv____mul____pow____mod____and____or____xor__
__lshift__
__rshift__
__matmul__)+-/z//*z**%&|^z<<z>>@c             C   s   i | ]\}}t ||qS r   )r   ).0keyvaluer   r   r   
<dictcomp>S   s   r6   c             C   s   i | ]\}}t ||d  qS )=)r   )r3   r4   r5   r   r   r   r6   V   s   __pos____neg__
__invert__)r*   r+   ~notc             C   s   t | }|| }t|S )N)_UNARY_OPERATORSr
   const_factory)objopfuncr5   r   r   r   _infer_unary_oph   s    rB   c             C   s   t t| j|S )N)rB   tupleelts)selfr@   r   r   r   <lambda>n       rF   c             C   s   t | j|S )N)rB   rD   )rE   r@   r   r   r   rF   o   rG   c             C   s   t t| j|S )N)rB   setrD   )rE   r@   r   r   r   rF   p   rG   c             C   s   t | j|S )N)rB   r5   )rE   r@   r   r   r   rF   q   rG   c             C   s   t t| j|S )N)rB   dictitems)rE   r@   r   r   r   rF   r   rG   c             C   s   | | S )Nr   )abr   r   r   rF   w   rG   c             C   s   | | S )Nr   )rK   rL   r   r   r   rF   x   rG   c             C   s   | | S )Nr   )rK   rL   r   r   r   rF   y   rG   c             C   s   | | S )Nr   )rK   rL   r   r   r   rF   z   rG   c             C   s   | | S )Nr   )rK   rL   r   r   r   rF   {   rG   c             C   s   | | S )Nr   )rK   rL   r   r   r   rF   |   rG   c             C   s   | | S )Nr   )rK   rL   r   r   r   rF   }   rG   c             C   s   | |@ S )Nr   )rK   rL   r   r   r   rF   ~   rG   c             C   s   | |B S )Nr   )rK   rL   r   r   r   rF      rG   c             C   s   | |A S )Nr   )rK   rL   r   r   r   rF      rG   c             C   s   | |> S )Nr   )rK   rL   r   r   r   rF      rG   c             C   s   | |? S )Nr   )rK   rL   r   r   r   rF      rG   r7   c             c   s   t t}t|t jry\t| }yt || j|jV  W n4 tk
rT   |V  Y n tk
rn   t	j
V  Y nX W q tk
r   |V  Y qX n$t| jtr|dkrt	j
V  n|V  d S )Nr.   )r
   ConstNotImplemented
isinstanceBIN_OP_IMPLr>   r5   	TypeError	Exceptionr   Uninferablestr)rE   opnodeoperatorotherr   _not_implementedimplr   r   r   const_infer_binary_op   s    


r[   c                s4   | j |d} fdd| jD }t||j |_|S )N)parentc             3   s*   | ]"}|t jk	rt| p t jV  qd S )N)r   rS   r   Z
safe_infer)r3   elt)r   r   r   	<genexpr>   s   z'_multiply_seq_by_int.<locals>.<genexpr>)	__class__rD   listr5   )rE   rU   rW   r   nodeZfiltered_eltsr   )r   r   _multiply_seq_by_int   s
    

rb   c             c   sX   xR| D ]J}|t jkr t V  qx.||D ] }|t jk	rB|V  q,t V  q,W qW d S )N)r   rS   r
   Unknowninfer)rD   r   r]   inferredr   r   r   _filter_uninferable_nodes   s    


rf   c       	      c   s   t t}t|| jrT|dkrT| j|d}ttt| j	|t|j	||_	|V  nt|t jr|dkrt|j
ts~|V  d S t| |||V  nDt|tjr|dkrt|}|stjV  qt| |||V  n|V  d S )Nr*   )r\   r-   )r
   rM   rN   rO   r_   r`   	itertoolschainrf   rD   r5   intrb   r   Instancer   Zclass_instance_as_indexr   rS   )	rE   rU   rV   rW   r   methodrY   ra   Zas_indexr   r   r   tl_infer_binary_op   s&    



rl   c             C   s   | | |S )N)infer_call_result)rE   rU   rV   rW   r   rk   r   r   r   instance_class_infer_binary_op   s    rn   c       	      c   s   |dd }| d}x| D ]}|tjkr,qt|ds8qy| }W n tk
rZ   wY nX x|D ]}t|}y|||}W n t	t
tfk
r   wbY nX |s|V  qb|tjkrP qbyt||||E dH  W qb tk
r   P Y qbX qbW qW dS )z;recursive function to resolve multiple assignments on loopsNr   itered)popr   rS   hasattrro   rQ   r
   rM   getitemAttributeErrorr   r   _resolve_looppartrd   r   )	partsassign_pathr   indexpartro   stmt
index_nodeassignedr   r   r   rt      s4    






rt   c             c   s   t | tjst| ddr(t| |||dS |d krfxN| j|D ]"}t |tjtjfr>|j	E d H  q>W nt
| j|||E d H  t| |||dS )NZis_asyncF)ra   unknownrv   r   )rO   r
   ZAsyncForgetattrrI   iterrd   TupleListrD   rt   )rE   ra   r   rv   lstr   r   r   for_assigned_stmts  s    r   c          
   C   sp   |d krg }y| j |}W n4 tk
rP } ztd| ||d|W d d }~X Y nX |d| | jj| ||dS )Nz6Tried to retrieve a node {node!r} which does not exist)ra   rv   r   r   )ra   r   rv   )rD   rw   
ValueErrorr   insertr\   assigned_stmts)rE   ra   r   rv   rw   excr   r   r   sequence_assigned_stmts&  s    r   c             C   s   | j j| |dS )N)ra   r   )r\   r   )rE   ra   r   rv   r   r   r   assend_assigned_stmts=  s    r   c       	      c   s  | j s| js| jstjV  d S | jj}| j rt| j d dd |kr|dkr| jj }t	|t
joj|jdk}|jrt	|jtjr|jj}|s|dkr|V  d S |dkr| V  d S |r|jrt |j|j}|| j||E d H  d S || jkr<t
d}| |_| j s2| jjdkr2| jj }| g|_|V  d S || jkrbt
i }| |_|V  d S y,t|}| ||E d H  tjV  W n tk
r   tjV  Y nX d S )	Nr   r   staticmethod	metaclassclassmethodrk   r   __init__)r   varargkwargr   rS   r\   typer}   scoperO   r
   ClassDefZ	boundnoder   rj   Z_proxiedZinstantiate_classcallcontextCallSiteZextra_contextinfer_argumentr>   r   rD   
contextmodcopy_contextdefault_valuerd   r   )	rE   r   r   ZfunctypeclsZis_metaclassZ	call_siter   r   r   r   r   _arguments_infer_argnameE  sP    




r   c             C   sJ   |j r<|j }t|}d |_ tj||d}|| j|j|S t| |j|S )N)r   )	r   r   r   r   r   r   r\   r   r   )rE   ra   r   rv   r   argsr   r   r   arguments_assigned_stmts|  s    
r   c             c   s:   |s| j V  d S t| j |||E d H  t| |||dS )N)ra   r|   rv   r   )r5   _resolve_assignment_partsrd   rI   )rE   ra   r   rv   r   r   r   assign_assigned_stmts  s    r   c             c   s4   x.t | |||D ]}|d kr&tjV  q|V  qW d S )N)r   r   rS   )rE   ra   r   rv   re   r   r   r   assign_annassigned_stmts  s    
r   c          
   c   s   |dd }| d}x| D ]}d}t|tjrZy|j| \}}W q tk
rV   dS X n>t|drt|}y|||}W n t	t
fk
r   dS X |sdS |s|V  q|tjkrdS yt||||E dH  W q tk
r   dS X qW dS )z2recursive function to resolve multiple assignmentsNr   rr   )rp   rO   r
   DictrJ   
IndexErrorrq   rM   rr   r   r   r   rS   r   rd   r   )ru   rv   r   rw   rx   r{   rX   rz   r   r   r   r     s4    




r   c             c   sB   x0t | jD ] }t|tjr(t|}|V  qW t| |||dS )N)ra   r|   rv   r   )	r	   Zunpack_inferr   rO   r
   r   r   ZExceptionInstancerI   )rE   ra   r   rv   r{   r   r   r   excepthandler_assigned_stmts  s
    

r   c       
   
   c   s  yt |j|d}W n. tk
rB } zt|d|W d d }~X Y nX t|tjr|j}|jshtd|dxF|jj	D ]0}t |j|dd }t|t	j
rr| tkrrP qrW t|dyt | V  W n. tk
r } zt|d|W d d }~X Y nX nt|tjr|yt |jd|d}W n6 tttfk
rN }	 zt|d|	W d d }	~	X Y nX t|tjsht|d|| |E d H  n
t|dd S )N)r   )ra   z,No decorators found on inferred generator %s	__enter__)nextrd   StopIterationr   rO   r   r   r\   r   r
   ZFunctionDefqname_CONTEXTLIB_MGRZinfer_yield_typesrj   Zigetattrr   ZBoundMethodrm   )
rE   mgrr   re   erA   Zdecorator_node	decoratorZenterr   r   r   r   _infer_context_manager  s8    

 
r   c       	      #   s$  yt  fdd| jD }W n tk
r0   dS X |dkrNt| ||E dH  nxt| ||D ]}|}x|D ]}t|dstd|  ||dy|j| }W qj tk
r } ztd|  ||d|W dd}~X Y qj tk
r } ztd|  ||d|W dd}~X Y qjX qjW |V  q\W t	|  ||d	S )
a  Infer names and other nodes from a *with* statement.

    This enables only inference for name binding in a *with* statement.
    For instance, in the following code, inferring `func` will return
    the `ContextManager` class, not whatever ``__enter__`` returns.
    We are doing this intentionally, because we consider that the context
    manager result is whatever __enter__ returns and what it is binded
    using the ``as`` keyword.

        class ContextManager(object):
            def __enter__(self):
                return 42
        with ContextManager() as f:
            pass

        # ContextManager().infer() will return ContextManager
        # f.infer() will return 42.

    Arguments:
        self: nodes.With
        node: The target of the assignment, `as (a, b)` in `with foo as (a, b)`.
        context: Inference context used for caching already inferred objects
        assign_path:
            A list of indices, where each index specifies what item to fetch from
            the inference results.
    c             3   s   | ]\}}| kr|V  qd S )Nr   )r3   r   vars)ra   r   r   r^     s    z&with_assigned_stmts.<locals>.<genexpr>NrD   z0Wrong type ({targets!r}) for {node!r} assignment)ra   targetsrv   r   zCTried to infer a nonexistent target with index {index} in {node!r}.z1Tried to unpack a non-iterable value in {node!r}.)ra   r|   rv   r   )
r   rJ   r   r   rq   r   rD   r   rQ   rI   )	rE   ra   r   rv   r   resultr?   rw   r   r   )ra   r   with_assigned_stmts  sH    


r   c             c   s4   | j |kr | jj|dE dH  ntd| ||ddS )z9Infer names and other nodes from an assignment expression)r   Nz$Cannot infer NamedExpr node {node!r})ra   rv   r   )targetr5   rd   r   )rE   ra   r   rv   r   r   r   named_expr_assigned_stmtsG  s    
r   c          
   #   s   fdd |   }t|tjtjfs8td| |||d|dkrHt }t|tjr|j}|j	d }t
dd |tjD d	krtd
| |||dyt||}W n  ttfk
r   tjV  dS X |tjkst|dstjV  dS yt| }W n tk
r   tjV  dS X xt|jD ]\}	}
t|
tjsR|sFP |  q(tt|j|	d }x`|D ]X}t|tjs|sP |  qptjtj| |j|j d}|j!t"|d |V  P qpW q(W t|tjryt|j#j|d}W n" ttfk
r   tjV  dS X |tjks2t|ds>tjV  dS y| }W n tk
rh   tjV  dS X |j$}t|tj%std|dg } | || |std|d|d \}}||d	 k}t&||rdn|| }||d< x|D ]}d}x~|D ]v}t|ds
P t|t&s|d }y| }|| }W n4 t'k
rJ   P Y n" tk
rf   tjV  dS X |}qW tjtj| | j| j d}|j!|pg d |V  dS W tjV  dS )aD  
    Arguments:
        self: nodes.Starred
        node: a node related to the current underlying Node.
        context: Inference context used for caching already inferred objects
        assign_path:
            A list of indices, where each index specifies what item to fetch from
            the inference results.
    c                s   |  }xrt|D ]f\}}t|tjrJ|jj| jjkrJ||t|f P t|tj	r||t|  f  | || qW d S )N)
ro   	enumeraterO   r
   Starredr5   r   appendlenr   )Zstarredr   lookupsro   rw   element)$_determine_starred_iteration_lookupsr   r   r   d  s    zDstarred_assigned_stmts.<locals>._determine_starred_iteration_lookupszDStatement {stmt!r} enclosing {node!r} must be an Assign or For node.)ra   ry   r|   r   Nr   c             s   s   | ]
}d V  qdS )   Nr   )r3   rX   r   r   r   r^     s    z)starred_assigned_stmts.<locals>.<genexpr>r   z>Too many starred arguments in the  assignment targets {lhs!r}.)ra   r   r|   r   ro   )ctxr\   lineno
col_offset)rD   )r   z8Could not make sense of this, the target must be a tuplez5Could not make sense of this, needs at least a lookup)(Z	statementrO   r
   AssignForr   r   InferenceContextr5   r   sumZnodes_of_classr   r   rd   r   r   rS   rq   collectionsdequero   rQ   r   rD   popleftreversedrp   r   r   ZStorer   r   Zpostinitr`   r~   r   r   slicer   )rE   ra   r   rv   ry   r5   lhsrhsrD   rw   Z	left_nodeZlhs_eltsZ
right_nodepackedZinferred_iterablero   r   r   Zlast_element_indexZlast_element_lengthZis_starred_lastZlookup_slicer   Zfound_elementlookupZitered_inner_elementunpackedr   )r   r   starred_assigned_stmtsX  s    
	







r   )rE   ra   r   rv   returnc             c   s   dS )zbReturn empty generator (return -> raises StopIteration) so inferred value
    is Uninferable.
    Nr   )rE   ra   r   rv   r   r   r   match_mapping_assigned_stmts  s    
r   c             c   s   dS )zbReturn empty generator (return -> raises StopIteration) so inferred value
    is Uninferable.
    Nr   )rE   ra   r   rv   r   r   r   match_star_assigned_stmts%  s    
r   c             c   s8   t | jtjr4t | jjtjr4| jdkr4| jjjV  dS )z}Infer MatchAs as the Match subject if it's the only MatchCase pattern
    else raise StopIteration to yield Uninferable.
    N)rO   r\   r
   Z	MatchCaseMatchpatternsubject)rE   ra   r   rv   r   r   r   match_as_assigned_stmts6  s    
r   )NNN)NNN)NNN)NNN)NNN)NNN)NNN)NNN)NN)NNN)NN)NN)NN)g__doc__r   rg   rV   Zoperator_modsystypingr   r   Zastroidr   r   r   r   r   r   r	   r
   r   Zastroid.constr   Zastroid.exceptionsr   r   r   r   r   version_infor   typing_extensionsZlazy_importr   r   r   r   r   ZBIN_OP_METHODrJ   ZREFLECTED_BIN_OP_METHODZAUGMENTED_OP_METHODZUNARY_OP_METHODposneginvertnot_r=   rB   r   Zinfer_unary_opr   SetrM   r   matmulrP   r`   Z_KEYZ_IMPLZyes_if_nothing_inferredr[   Zinfer_binary_oprb   rf   rl   rn   rj   r   rt   Zraise_if_nothing_inferredr   r   r   ZComprehensionr   r   Z
AssignNameZ
AssignAttrr   r   	Argumentsr   r   r   Z	AnnAssignZ	AugAssignr   r   ZExceptHandlerr   r   ZWithr   Z	NamedExprr   r   ZMatchMappingr   ZNodeNGr   Z	MatchStarr   ZMatchAsr   r   r   r   r   <module>   s   




$

7

(	&E 9   