a
    *ñ»j]  ã                   @  sÚ   d dl mZ d dlZd dlmZ d dlm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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 | _ g | _nÌt|tƒr.|j | _ |j| _n°t|ttfƒrftdd„ |D ƒƒ| _ tdd„ |D ƒƒ| _nxt|tƒrŽt| d¡ƒ| _ | d¡| _nPzt	|ƒ}t
 |¡}W n tyÀ   t
 |¡}Y n0 t| d¡ƒ| _ | d¡| _d S )Nc                 s  s   | ]}|  d ¡V  qdS ©Ú
N©Úrstrip©Ú.0Úx© r   ú:E:\soccer\ml_env\Lib\site-packages\_pytest/_code/source.pyÚ	<genexpr>   ó    z"Source.__init__.<locals>.<genexpr>c                 s  s   | ]}|  d ¡V  qdS r   r   r   r   r   r   r      r   r   )ÚlinesÚ	raw_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__4   s    zSource.__getitem__Úslicec                 C  s   d S r(   r   r-   r   r   r   r.   7   s    zint | slicezstr | Sourcec                 C  s\   t |tƒr| j| S |jdvr&tdƒ‚tƒ }| j|j|j… |_| j|j|j… |_|S d S )N)Né   z!cannot slice a Source with a step)	r   r+   r   ÚstepÚ
IndexErrorr   ÚstartÚstopr   )r#   r,   Ú	newsourcer   r   r   r.   :   s    


zIterator[str]©r   c                 C  s
   t | jƒS r(   )Úiterr   ©r#   r   r   r   Ú__iter__E   s    zSource.__iter__c                 C  s
   t | jƒS r(   )Úlenr   r8   r   r   r   Ú__len__H   s    zSource.__len__c                 C  s|   dt | ƒ }}||k r.| j|  ¡ s.|d7 }q||krR| j|d   ¡ sR|d8 }q.tƒ }| j|_| j||… |jdd…< |S )zGReturn new Source object with trailing and leading blank lines removed.r   r0   N)r:   r   Ústripr   r   )r#   r3   ÚendÚsourcer   r   r   r<   K   s    

zSource.stripú    )Úindentr   c                   s(   t ƒ }| j|_‡ 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>\   r   z!Source.indent.<locals>.<listcomp>)r   r   r   )r#   r@   r5   r   rC   r   r@   W   s    zSource.indent)Úlinenor   c                 C  s   |   |¡\}}| ||… S )zUReturn Source statement which contains the given linenumber
        (counted from 0).)Úgetstatementrange)r#   rE   r3   r=   r   r   r   Úgetstatement_   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)r:   r2   Úgetstatementrange_ast)r#   rE   Úastr3   r=   r   r   r   rF   e   s    zSource.getstatementrangec                 C  s&   t ƒ }t| jƒ|jdd…< | j|_|S )z&Return a new Source object deindented.N)r   r   r   r   )r#   r5   r   r   r   r   m   s    zSource.deindentc                 C  s   d  | j¡S ©Nr   )Újoinr   r8   r   r   r   Ú__str__t   s    zSource.__str__)N)r?   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r%   r*   Ú__hash__r   r.   r9   r;   r<   r@   rG   rF   r   rL   r   r   r   r   r      s"   r   ztuple[Source | None, int]r6   c                 C  sL   zt  | ¡\}}W n ty&   Y dS 0 tƒ }dd„ |D ƒ|_||_||fS )N)Néÿÿÿÿc                 S  s   g | ]}|  ¡ ‘qS r   r   rA   r   r   r   rD   ƒ   r   zfindsource.<locals>.<listcomp>)r    Ú
findsourceÚ	Exceptionr   r   r   )r
   ÚsourcelinesrE   r>   r   r   r   rS   }   s    rS   Tr   r&   ztypes.CodeType)r
   Útrycallr   c                 C  sX   z| j W S  ty   Y n0 |rFt| ddƒ}|rFt| tƒsFt|dd�S td| ›�ƒ‚dS )z&Return code object for given function.Ú__call__NF)rV   zcould not get code object for )Ú__code__ÚAttributeErrorÚgetattrr   Útyper   r"   )r
   rV   Úcallr   r   r   r   ˆ   s    r   zIterable[str]z	list[str])r   r   c                 C  s   t  d | ¡¡ ¡ S rJ   )ÚtextwrapÚdedentrK   Ú
splitlines)r   r   r   r   r   •   s    r   r+   zast.ASTztuple[int, int | None])rE   Ú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 )Nr0   )Ú	finalbodyÚorelser   )rI   Úwalkr   ÚstmtÚExceptHandlerÚClassDefÚFunctionDefÚAsyncFunctionDefÚdecorator_listÚappendrE   rZ   Úsortr   r:   )
rE   r`   Úvaluesr   ÚdÚnameÚvalZinsert_indexr3   r=   r   r   r   Úget_statement_startend2™   s$    

rp   Fzast.AST | Noneztuple[ast.AST, int, int])rE   r>   Ú	assertionÚastnoder   c           
   	     sd  |d u rPt |ƒ}t ¡ �( t d¡ t |dd¡}W d   ƒ n1 sF0    Y  t| |ƒ\}}|d u rpt|jƒ}||d k�rt	 
¡ }t|j| ƒo¤|j| d  ¡ |_dd„ |j||… D ƒ‰ z&t ‡ fdd	„¡D ]}|j|Ž  qÔW n6 t	jtf�y
   |j| }Y n t�y   Y n0 |�rZ|j|d   ¡ }	|	 d
¡�sH|	�sZ|d8 }n�qZ�q|||fS )NÚignorer>   Úexecr0   r   c                 s  s   | ]}|d  V  qdS r   r   r   r   r   r   r   Ñ   r   z(getstatementrange_ast.<locals>.<genexpr>c                     s   t ˆ ƒS r(   )Únextr   ©Úitr   r   Ú<lambda>Ó   r   z'getstatementrange_ast.<locals>.<lambda>ú#)r   ÚwarningsÚcatch_warningsÚsimplefilterrI   Úparserp   r:   r   r    ÚBlockFinderr&   ÚisspaceÚstartedÚtokenizeÚgenerate_tokensÚ
tokeneaterÚ
EndOfBlockÚIndentationErrorÚlastrT   ÚlstripÚ
startswith)
rE   r>   rq   rr   Úcontentr3   r=   Zblock_finderÚtokrB   r   rv   r   rH   ³   s4    

,
ÿ
rH   )T)FN)Ú
__future__r   rI   Úbisectr   Úcollections.abcr   r   r    r]   r�   ÚtypesÚtypingr   rz   r   rS   r   r   rp   rH   r   r   r   r   Ú<module>   s$   m  ü