o
    rhn                     @  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Zd*d+ddZd,ddZd-dd Z	!	d.d/d'd(ZdS )0    )annotationsN)bisect_right)Iterable)Iterator)overloadc                   @  s   e Zd ZdZd,d-ddZd.ddZdZed/ddZed0ddZd1ddZd2ddZ	d3ddZ
d4ddZd5d6d d!Zd7d#d$Zd8d&d'Zd4d(d)Zd9d*d+ZdS ):SourcezvAn immutable object holding a source code fragment.

    When using Source(...), the source lines are deindented.
    NobjobjectreturnNonec                 C  s   |sg | _ d S t|tr|j | _ d S t|ttfr%tdd |D | _ d S t|tr4t|d| _ d S zt|}t	
|}W n tyM   t	
|}Y nw t|d| _ d S )Nc                 s  s    | ]}| d V  qdS 
Nrstrip.0x r   R/var/www/html/alpaca_bot/venv/lib/python3.10/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   rawcodesrcr   r   r   __init__   s   


zSource.__init__otherboolc                 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__keyintr   c                 C     d S r'   r   r!   r*   r   r   r   __getitem__/      zSource.__getitem__slicec                 C  r,   r'   r   r-   r   r   r   r.   2   r/   int | slicestr | Sourcec                 C  sD   t |tr
| j| S |jdvrtdt }| j|j|j |_|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   


Iterator[str]c                 C  
   t | jS r'   )iterr   r!   r   r   r   __iter__?      
zSource.__iter__c                 C  r:   r'   )lenr   r<   r   r   r   __len__B   r>   zSource.__len__c                 C  s   dt | }}||k r!| j|  s!|d7 }||k r!| j|  r||kr?| j|d   s?|d8 }||kr?| j|d   r.t }| j|| |jdd< |S )zGReturn new Source object with trailing and leading blank lines removed.r   r3   N)r?   r   stripr   )r!   r6   endsourcer   r   r   rA   E   s   zSource.strip    indentc                   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rE   r   r   
<listcomp>T       z!Source.indent.<locals>.<listcomp>)r   r   )r!   rE   r8   r   rH   r   rE   P   s   zSource.indentlinenoc                 C  s   |  |\}}| || S )zUReturn Source statement which contains the given linenumber
        (counted from 0).)getstatementrange)r!   rK   r6   rB   r   r   r   getstatementW   s   zSource.getstatementtuple[int, int]c                 C  s@   d|  krt | k std 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?   r5   getstatementrange_ast)r!   rK   astr6   rB   r   r   r   rL   ]   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!   r8   r   r   r   r   e   s   zSource.deindentc                 C  s   d | jS Nr   )joinr   r<   r   r   r   __str__k   s   zSource.__str__r'   )r   r	   r
   r   )r%   r	   r
   r&   )r*   r+   r
   r   )r*   r0   r
   r   )r*   r1   r
   r2   )r
   r9   )r
   r+   )r
   r   )rD   )rE   r   r
   r   )rK   r+   r
   r   )rK   r+   r
   rN   )r
   r   )__name__
__module____qualname____doc__r$   r)   __hash__r   r.   r=   r@   rA   rE   rM   rL   r   rS   r   r   r   r   r      s$    








r   r
   tuple[Source | None, int]c                 C  sF   z	t | \}}W n
 ty   Y dS w t }dd |D |_||fS )N)Nc                 S  s   g | ]}|  qS r   r   rF   r   r   r   rI   z   rJ   zfindsource.<locals>.<listcomp>)r   
findsource	Exceptionr   r   )r   sourcelinesrK   rC   r   r   r   r[   t   s   r[   Tr   r	   trycallr&   types.CodeTypec                 C  sT   z| j W S  ty   Y nw |r#t| dd}|r#t| ts#t|ddS td| )z&Return code object for given function.__call__NF)r^   zcould not get code object for )__code__AttributeErrorgetattrr   typer   r    )r   r^   callr   r   r   r   ~   s   r   r   Iterable[str]	list[str]c                 C  s   t d|  S rQ   )textwrapdedentrR   
splitlines)r   r   r   r   r      s   r   rK   r+   nodeast.ASTtuple[int, int | None]c           
      C  s   g }t |D ]E}t|t jt jfrLt|t jt jt jfr+|jD ]
}|	|j
d  q |	|j
d  dD ]}t||d }|rK|	|d j
d d  q5q|  t|| }||d  }|t|krhd }	||	fS || }	||	fS )Nr3   )	finalbodyorelser   )rP   walkr   stmtExceptHandlerClassDefFunctionDefAsyncFunctionDefdecorator_listappendrK   rc   sortr   r?   )
rK   rk   valuesr   dnamevalinsert_indexr6   rB   r   r   r   get_statement_startend2   s(   

r~   FrC   	assertionastnodeast.AST | Nonetuple[ast.AST, int, int]c           
   	     sV  |d u r(t |}t  td t|dd}W d    n1 s#w   Y  t| |\}}|d u r8t|j}||d krt	
 }t|j| oQ|j| d  |_dd |j|| D  zt fdd	D ]}|j|  qiW n t	jtfy   |j| }Y n	 ty   Y nw |r|j|d   }	|	d
s|	s|d8 }nn|s|||fS )NignorerC   execr3   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>   s    z'getstatementrange_ast.<locals>.<lambda>#)r   warningscatch_warningssimplefilterrP   parser~   r?   r   r   BlockFinderr&   isspacestartedtokenizegenerate_tokens
tokeneater
EndOfBlockIndentationErrorlastr\   lstrip
startswith)
rK   rC   r   r   contentr6   rB   block_findertokrG   r   r   r   rO      s<   




rO   )r
   rY   )T)r   r	   r^   r&   r
   r_   )r   rf   r
   rg   )rK   r+   rk   rl   r
   rm   )FN)
rK   r+   rC   r   r   r&   r   r   r
   r   )
__future__r   rP   bisectr   r   rh   r   typestypingr   r   r   r   r   r[   r   r   r~   rO   r   r   r   r   <module>   s&   
d


