B
    S\g                 @   sb  d Z ddlZddlZddlZddlZddlmZ ddlmZ ddlm	Z	 ddlm
Z ddlmZ ddlmZ dd	lmZ dd
lmZ ddlmZ 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#_$d-d, ej%_$d.d, ej&_$d/d, ej'_$d0d, ej(_$d1d, d2d, d3d, d4d, d5d, d6d, d7d, d8d, d9d, d:d, d;d, d<d, d=Z)ej*d>krej+e)d?< x&e,e) D ]\Z-Z.e.e)e-d@ < qW ej/dAdB Z0e0ej'_1dCdD Z2dEdF Z3ej/dGdH Z4e4ej#_1e4ej%_1ej/dIdJ Z5e5e	j6_1e5ej7_1dKdL Z8ej9dedMdNZ:e:ej;_<e:ej=_<dfdOdPZ>e>ej#_<e>ej%_<dgdQdRZ?e?ej@_<e?ejA_<dSdT ZBdhdUdVZCeCejD_<ej9didWdXZEdjdYdZZFeEejG_<eFejH_<eEejI_<d[d\ ZJej9dkd]d^ZKeKejL_<d_d` ZMej9dldadbZNeNejO_<ej/dmdcddZPePejQ_<dS )nzcthis module contains a set of functions to handle python protocols for nodes
where it makes sense.
    N)Store)	arguments)bases)context)
exceptions)
decorators)node_classes)helpers)nodes)utilraw_buildingobjectsc             C   s   d| dd   S )NZ__r    )namer   r   0lib/python3.7/site-packages/astroid/protocols.py_reflected_name,   s    r   c             C   s   d| dd   S )NZ__ir   r   )r   r   r   r   _augmented_name0   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>E   s   r-   c             C   s   i | ]\}}t ||d  qS )=)r   )r*   r+   r,   r   r   r   r-   H   s   __pos____neg__
__invert__)r!   r"   ~notc             C   s   t | }|| }t|S )N)_UNARY_OPERATORSr
   const_factory)objopfuncr,   r   r   r   _infer_unary_opZ   s    r9   c             C   s   t t| j|S )N)r9   tupleelts)selfr7   r   r   r   <lambda>`   s    r=   c             C   s   t | j|S )N)r9   r;   )r<   r7   r   r   r   r=   a   s    c             C   s   t t| j|S )N)r9   setr;   )r<   r7   r   r   r   r=   b   s    c             C   s   t | j|S )N)r9   r,   )r<   r7   r   r   r   r=   c   s    c             C   s   t t| j|S )N)r9   dictitems)r<   r7   r   r   r   r=   d   s    c             C   s   | | S )Nr   )abr   r   r   r=   i   s    c             C   s   | | S )Nr   )rA   rB   r   r   r   r=   j   s    c             C   s   | | S )Nr   )rA   rB   r   r   r   r=   k   s    c             C   s   | | S )Nr   )rA   rB   r   r   r   r=   l   s    c             C   s   | | S )Nr   )rA   rB   r   r   r   r=   m   s    c             C   s   | | S )Nr   )rA   rB   r   r   r   r=   n   s    c             C   s   | | S )Nr   )rA   rB   r   r   r   r=   o   s    c             C   s   | |@ S )Nr   )rA   rB   r   r   r   r=   p   s    c             C   s   | |B S )Nr   )rA   rB   r   r   r   r=   q   s    c             C   s   | |A S )Nr   )rA   rB   r   r   r   r=   r   s    c             C   s   | |> S )Nr   )rA   rB   r   r   r   r=   s   s    c             C   s   | |? S )Nr   )rA   rB   r   r   r   r=   t   s    )r!   r"   r#   z//r$   z**r%   r&   r'   r(   z<<z>>)      r)   r.   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_IMPLr5   r,   	TypeError	Exceptionr   Uninferablestr)r<   opnodeoperatorotherr   _not_implementedimplr   r   r   const_infer_binary_op~   s    


rS   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   rK   r	   Z
safe_infer)r*   elt)r   r   r   	<genexpr>   s   z'_multiply_seq_by_int.<locals>.<genexpr>)	__class__r;   listr,   )r<   rM   rO   r   nodeZfiltered_eltsr   )r   r   _multiply_seq_by_int   s
    

rZ   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   rK   r
   ZUnknowninfer)r;   r   rU   inferredr   r   r   _filter_uninferable_nodes   s    


r]   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!   )rT   r$   )r
   rE   rF   rG   rW   rX   	itertoolschainr]   r;   r,   intrZ   r   Instancer	   Zclass_instance_as_indexr   rK   )	r<   rM   rN   rO   r   methodrQ   rY   Zas_indexr   r   r   tl_infer_binary_op   s&    



rc   c             C   s   | | |S )N)infer_call_result)r<   rM   rN   rO   r   rb   r   r   r   instance_class_infer_binary_op   s    re   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
jt
jfk
r   wbY nX |s|V  qb|tjkrP qbyt||||E dH  W qb t
jk
r   P Y qbX qbW qW dS )z;recursive function to resolve multiple assignments on loopsNr   itered)popr   rK   hasattrrf   rI   r
   rE   getitemAttributeErrorr   AstroidTypeErrorAstroidIndexError_resolve_looppartr[   InferenceError)	partsassign_pathr   indexpartrf   stmt
index_nodeassignedr   r   r   rm      s:    






rm   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)rY   unknownrp   r   )rG   r
   ZAsyncForgetattrr?   iterr[   TupleListr;   rm   )r<   rY   r   rp   Zlstr   r   r   for_assigned_stmts  s    r{   c          
   C   sr   |d krg }y| j |}W n6 tk
rR } ztj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)rY   rp   r   r   )rY   r   rp   )r;   rq   
ValueErrorr   rn   insertrT   assigned_stmts)r<   rY   r   rp   rq   excr   r   r   sequence_assigned_stmts  s    r   c             C   s   | j j| |dS )N)rY   r   )rT   r~   )r<   rY   r   rp   r   r   r   assend_assigned_stmts6  s    r   c       	      c   sb  | j s| js| jstjV  d S | j rt| j d dd |kr| jj}| jj }t	|t
job|jdk}|sp|dkrz|V  d S |dkrt|V  d S |r|jrt|j|j}|| j||E d H  d S || jkrt
d}| |_|V  d S || jkrt
i }| |_|V  d S y,t|}| ||E d H  tjV  W n  tjk
r\   tjV  Y nX d S )Nr   r   	metaclassclassmethodrb   r   )argsvarargkwargr   rK   rw   rT   typescoperG   r
   ClassDefr   ra   callcontextr   CallSiteZextra_contextinfer_argumentr5   
contextmodcopy_contextZdefault_valuer[   r   Z	NoDefault)	r<   r   r   ZfunctypeclsZis_metaclassZ	call_siter   r   r   r   r   _arguments_infer_argname>  sB    




r   c             C   sF   |j r8|j }t|}d |_ t|}|| j|j|S t| |j|S )N)	r   r   r   r   r   r   rT   r   r   )r<   rY   r   rp   r   r   r   r   r   arguments_assigned_stmtsk  s    

r   c             c   s:   |s| j V  d S t| j |||E d H  t| |||dS )N)rY   rv   rp   r   )r,   _resolve_assignment_partsr[   r?   )r<   rY   r   rp   r   r   r   assign_assigned_stmtsy  s    r   c             c   s4   x.t | |||D ]}|d kr&tjV  q|V  qW d S )N)r   r   rK   )r<   rY   r   rp   r\   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 nBt|drt|}y|||}W n t	j
t	jfk
r   dS X |sdS |s|V  q|tjkrdS yt||||E dH  W q t	jk
r   dS X qW dS )z2recursive function to resolve multiple assignmentsNr   ri   )rg   rG   r
   Dictr@   
IndexErrorrh   rE   ri   r   rk   rl   r   rK   r   r[   rn   )ro   rp   r   rq   rr   ru   rP   rt   r   r   r   r     s4    




r   c             c   sB   x0t | jD ] }t|tjr(t|}|V  qW t| |||dS )N)rY   rv   rp   r   )	r   Zunpack_inferr   rG   r
   r   r   ZExceptionInstancer?   )r<   rY   r   rp   ru   r   r   r   excepthandler_assigned_stmts  s
    

r   c       
   	   #   s  t |j|d}t|tjr|j  js6tjd dxD jj	D ],}t ||}t|t	j
r@| tkr@P q@W tj d t	j}t  fdd|D d }|r|jst	d }||_|j|_|V  n|jj|dE d H  nt|tjrvyt |jd|d}	W n* tjtjfk
r.   tj|dY nX t|	tjsJtj|	d|jsbtj|gd|_|	| |E d H  ntj|dd S )N)r   z,No decorators found on inferred generator %s)rY   c             3   s   | ]}|   kr|V  qd S )N)r   )r*   rY   )r8   r   r   rV     s    z)_infer_context_manager.<locals>.<genexpr>	__enter__)r   )nextr[   rG   r   	GeneratorrT   r   r   rn   r
   ZFunctionDefZqname_CONTEXTLIB_MGRnodes_of_classZYieldr,   rE   linenora   ZigetattrZAttributeInferenceErrorZBoundMethodr   r   ZCallContextrd   )
r<   mgrr   r\   Zdecorator_nodeZ	decoratorZpossible_yield_pointsZyield_pointZconstZenterr   )r8   r   _infer_context_manager  sB    

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jd|  ||dy|j| }W qj tk
r } ztjd|  ||d|W dd}~X Y qj t	k
r
 } ztj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   )r*   r   vars)rY   r   r   rV     s    z&with_assigned_stmts.<locals>.<genexpr>Nr;   z0Wrong type ({targets!r}) for {node!r} assignment)rY   targetsrp   r   zCTried to infer a nonexistent target with index {index} in {node!r}.z1Tried to unpack a non-iterable value in {node!r}.)rY   rv   rp   r   )r   r@   StopIterationr   rh   r   rn   r;   r   rI   r?   )	r<   rY   r   rp   r   resultr6   rq   r   r   )rY   r   with_assigned_stmts  sH    


r   c          
   #   s   fdd |   }t|tjtjfs:tjd| |||d|dkrJt }t|tjr|j	}|j
d }tdd |tjD d	krtjd
| |||dyt||}W n tj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sT|sHP |  q*tt|j|	d }xZ|D ]R}t|tjs|sP |  qrtjt| |j|jd}|j |d |V  P qrW q*W t|tjryt|j!j|d}W n  tjk
r   tjV  dS X |tjks,t|ds8tjV  dS y| }W n tk
rb   tjV  dS X |j"}t|tj#stjd|dg } | || |stj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
rH   P Y n" tk
rd   tjV  dS X |}qW tjt| | 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)
rf   	enumeraterG   r
   Starredr,   r   appendlenry   )Zstarredtargetlookupsrf   rq   element)$_determine_starred_iteration_lookupsr   r   r   M  s    zDstarred_assigned_stmts.<locals>._determine_starred_iteration_lookupszDStatement {stmt!r} enclosing {node!r} must be an Assign or For node.)rY   rs   rv   r   Nr   c             s   s   | ]
}d V  qdS )   Nr   )r*   rP   r   r   r   rV   l  s    z)starred_assigned_stmts.<locals>.<genexpr>r   z>Too many starred arguments in the  assignment targets {lhs!r}.)rY   r   rv   r   rf   )ZctxrT   r   
col_offset)r;   )r   z8Could not make sense of this, the target must be a tuplez5Could not make sense of this, needs at least a lookup)&Z	statementrG   r
   AssignForr   rn   r   ZInferenceContextr,   r   sumr   r   r   r[   r   rK   rh   collectionsdequerf   rI   r   r;   popleftreversedrg   rz   r   r   r   Zpostinitrx   r   ry   slicer   )r<   rY   r   rp   rs   r,   ZlhsZrhsr;   rq   Z	left_nodeZlhs_eltsZ
right_nodeZpackedZinferred_iterablerf   r   r   Zlast_element_indexZlast_element_lengthZis_starred_lastZlookup_slicer   Zfound_elementlookupZitered_inner_elementZunpackedr   )r   r   starred_assigned_stmtsA  s    
	





r   )NNN)NNN)NNN)NNN)NNN)NNN)NNN)NNN)NNN)R__doc__r   rN   Zoperator_modsysr^   Zastroidr   r   r   r   r   r   r   r   r	   r
   r   Zlazy_importr   r   r   r   r   ZBIN_OP_METHODr@   ZREFLECTED_BIN_OP_METHODZAUGMENTED_OP_METHODZUNARY_OP_METHODposneginvertnot_r4   r9   ry   Zinfer_unary_oprz   SetrE   r   rH   version_infomatmulrX   Z_KEYZ_IMPLZyes_if_nothing_inferredrS   Zinfer_binary_oprZ   r]   rc   re   ra   r   rm   Zraise_if_nothing_inferredr{   r   r~   ZComprehensionr   r   Z
AssignNameZ
AssignAttrr   r   Z	Argumentsr   r   r   Z	AnnAssignZ	AugAssignr   r   ZExceptHandlerr   r   ZWithr   r   r   r   r   r   <module>   s   



(

-

(	1E 2