U
    `»{jn  ã                   @  sÚ   d dl mZ d dlZd dlm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ZG dd„ dƒZd	d
œdd„Zd%ddddœdd„Zdddœdd„Zddddœdd„Zd&dddd d!d"œd#d$„ZdS )'é    )ÚannotationsN)Úbisect_right)ÚIterable)ÚIterator)Úoverloadc                   @  sæ   e Zd ZdZd,dddœdd„Zddd	œd
d„ZdZedddœdd„ƒZedd dœdd„ƒZdddœdd„Zddœdd„Z	ddœdd„Z
d dœdd„Zd-dd dœd d!„Zdd d"œd#d$„Zdd%d"œd&d'„Zd dœd(d)„Zddœd*d+„ZdS ).ÚSourcezvAn immutable object holding a source code fragment.

    When using Source(...), the source lines are deindented.
    NÚobjectÚNone)ÚobjÚreturnc                 C  sª   |sg | _ nšt|tƒr |j | _ n†t|ttfƒrDtdd„ |D ƒƒ| _ nbt|tƒr`t| d¡ƒ| _ nFzt|ƒ}t	 
|¡}W n tk
r”   t	 
|¡}Y nX t| d¡ƒ| _ d S )Nc                 s  s   | ]}|  d ¡V  qdS ©Ú
N©Úrstrip©Ú.0Úx© r   úS/var/www/html/bwave/python/venv/lib/python3.8/site-packages/_pytest/_code/source.pyÚ	<genexpr>   s     z"Source.__init__.<locals>.<genexpr>r   )ÚlinesÚ
isinstancer   ÚtupleÚlistÚdeindentÚstrÚsplitÚ
getrawcodeÚinspectÚ	getsourceÚ	TypeError)Úselfr
   ZrawcodeÚsrcr   r   r   Ú__init__   s    


zSource.__init__Úbool)Úotherr   c                 C  s   t |tƒstS | j|jkS ©N)r   r   ÚNotImplementedr   )r!   r%   r   r   r   Ú__eq__'   s    
zSource.__eq__Úintr   )Úkeyr   c                 C  s   d S r&   r   ©r!   r*   r   r   r   Ú__getitem__/   s    zSource.__getitem__Úslicec                 C  s   d S r&   r   r+   r   r   r   r,   2   s    zint | slicezstr | Sourcec                 C  sH   t |tƒr| j| S |jdkr&tdƒ‚tƒ }| j|j|j… |_|S d S )N)Né   z!cannot slice a Source with a step)r   r)   r   ÚstepÚ
IndexErrorr   ÚstartÚstop)r!   r*   Ú	newsourcer   r   r   r,   5   s    


zIterator[str]©r   c                 C  s
   t | jƒS r&   )Úiterr   ©r!   r   r   r   Ú__iter__?   s    zSource.__iter__c                 C  s
   t | jƒS r&   )Úlenr   r6   r   r   r   Ú__len__B   s    zSource.__len__c                 C  st   dt | ƒ }}||k r.| j|  ¡ s.|d7 }q||krR| j|d   ¡ sR|d8 }q.tƒ }| j||… |jdd…< |S )zGReturn new Source object with trailing and leading blank lines removed.r   r.   N)r8   r   Ústripr   )r!   r1   ÚendÚsourcer   r   r   r:   E   s    

zSource.stripú    )Úindentr   c                   s    t ƒ }‡ fdd„| jD ƒ|_|S )z^Return a copy of the source object with all lines indented by the
        given indent-string.c                   s   g | ]}ˆ | ‘qS r   r   ©r   Úline©r>   r   r   Ú
<listcomp>T   s     z!Source.indent.<locals>.<listcomp>)r   r   )r!   r>   r3   r   rA   r   r>   P   s    zSource.indent)Úlinenor   c                 C  s   |   |¡\}}| ||… S )zUReturn Source statement which contains the given linenumber
        (counted from 0).)Úgetstatementrange)r!   rC   r1   r;   r   r   r   ÚgetstatementW   s    zSource.getstatementztuple[int, int]c                 C  s:   d|  krt | ƒk s"n tdƒ‚t|| ƒ\}}}||fS )zmReturn (start, end) tuple which spans the minimal statement region
        which containing the given lineno.r   zlineno out of range)r8   r0   Úgetstatementrange_ast)r!   rC   Úastr1   r;   r   r   r   rD   ]   s    zSource.getstatementrangec                 C  s   t ƒ }t| jƒ|jdd…< |S )z&Return a new Source object deindented.N)r   r   r   )r!   r3   r   r   r   r   e   s    zSource.deindentc                 C  s   d  | j¡S ©Nr   )Újoinr   r6   r   r   r   Ú__str__k   s    zSource.__str__)N)r=   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r#   r(   Ú__hash__r   r,   r7   r9   r:   r>   rE   rD   r   rJ   r   r   r   r   r      s"   
r   ztuple[Source | None, int]r4   c                 C  sH   zt  | ¡\}}W n tk
r(   Y dS X tƒ }dd„ |D ƒ|_||fS )N)Néÿÿÿÿc                 S  s   g | ]}|  ¡ ‘qS r   r   r?   r   r   r   rB   z   s     zfindsource.<locals>.<listcomp>)r   Ú
findsourceÚ	Exceptionr   r   )r
   ÚsourcelinesrC   r<   r   r   r   rQ   t   s    rQ   Tr   r$   ztypes.CodeType)r
   Útrycallr   c                 C  sZ   z| j W S  tk
r   Y nX |rHt| ddƒ}|rHt| tƒsHt|dd�S td| ›�ƒ‚dS )z&Return code object for given function.Ú__call__NF)rT   zcould not get code object for )Ú__code__ÚAttributeErrorÚgetattrr   Útyper   r    )r
   rT   Úcallr   r   r   r   ~   s    r   zIterable[str]z	list[str])r   r   c                 C  s   t  d | ¡¡ ¡ S rH   )ÚtextwrapÚdedentrI   Ú
splitlines)r   r   r   r   r   ‹   s    r   r)   zast.ASTztuple[int, int | None])rC   Únoder   c           
      C  sÚ   g }t  |¡D ]Š}t|t jt jfƒrt|t jt jt jfƒrV|jD ]}| 	|j
d ¡ q@| 	|j
d ¡ dD ],}t||d ƒ}|rj| 	|d j
d d ¡ qjq| ¡  t|| ƒ}||d  }|t|ƒkrÊd }	n|| }	||	fS )Nr.   )Z	finalbodyZorelser   )rG   Úwalkr   ÚstmtÚExceptHandlerÚClassDefÚFunctionDefÚAsyncFunctionDefZdecorator_listÚappendrC   rX   Úsortr   r8   )
rC   r^   Úvaluesr   ÚdÚnameÚvalZinsert_indexr1   r;   r   r   r   Úget_statement_startend2�   s$    

rk   Fzast.AST | Noneztuple[ast.AST, int, int])rC   r<   Ú	assertionÚastnoder   c           
   	     sR  |d kr<t |ƒ}t ¡ � t d¡ t |dd¡}W 5 Q R X t| |ƒ\}}|d kr\t|jƒ}||d k�rt	 
¡ }t|j| ƒo�|j| d  ¡ |_dd„ |j||… D ƒ‰ z&t ‡ fdd	„¡D ]}|j|Ž  qÀW n8 t	jtfk
rö   |j| }Y n tk
�r
   Y nX |�rH|j|d   ¡ }	|	 d
¡�s6|	�sH|d8 }n�qH�q|||fS )NÚignorer<   Úexecr.   r   c                 s  s   | ]}|d  V  qdS r   r   r   r   r   r   r   Ç   s     z(getstatementrange_ast.<locals>.<genexpr>c                     s   t ˆ ƒS r&   )Únextr   ©Úitr   r   Ú<lambda>É   ó    z'getstatementrange_ast.<locals>.<lambda>ú#)r   ÚwarningsÚcatch_warningsÚsimplefilterrG   Úparserk   r8   r   r   ÚBlockFinderr$   ÚisspaceÚstartedÚtokenizeÚgenerate_tokensÚ
tokeneaterÚ
EndOfBlockÚIndentationErrorÚlastrR   ÚlstripÚ
startswith)
rC   r<   rl   rm   Úcontentr1   r;   Zblock_finderÚtokr@   r   rq   r   rF   ©   s4    


ÿ
rF   )T)FN)Ú
__future__r   rG   Úbisectr   r   r[   r}   ÚtypesÚtypingr   r   r   rv   r   rQ   r   r   rk   rF   r   r   r   r   Ú<module>   s$   d
  ü