o
    h]                     @  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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 | _ g | _d S t|tr|j | _ |j| _d S t|ttfr6tdd |D | _ tdd |D | _d S t|trKt|d| _ |d| _d S zt	|}t
|}W n tyd   t
|}Y nw t|d| _ |d| _d S )Nc                 s      | ]}| d V  qdS 
Nrstrip.0x r   U/var/www/html/openai_agents/venv/lib/python3.10/site-packages/_pytest/_code/source.py	<genexpr>       z"Source.__init__.<locals>.<genexpr>c                 s  r   r   r   r   r   r   r   r      r   r   )lines	raw_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__4      zSource.__getitem__slicec                 C  r/   r*   r   r0   r   r   r   r1   7   r2   int | slicestr | Sourcec                 C  sX   t |tr
| j| S |jdvrtdt }| j|j|j |_| j|j|j |_|S )N)N   z!cannot slice a Source with a step)	r   r.   r   step
IndexErrorr   startstopr   )r$   r-   	newsourcer   r   r   r1   :   s   


Iterator[str]c                 C  
   t | jS r*   )iterr   r$   r   r   r   __iter__E      
zSource.__iter__c                 C  r=   r*   )lenr   r?   r   r   r   __len__H   rA   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|| |jdd< |S )zGReturn new Source object with trailing and leading blank lines removed.r   r6   N)rB   r   stripr   r   )r$   r9   endsourcer   r   r   rD   K   s   zSource.strip    indentc                   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rH   r   r   
<listcomp>\       z!Source.indent.<locals>.<listcomp>)r   r   r   )r$   rH   r;   r   rK   r   rH   W   s   zSource.indentlinenoc                 C  s   |  |\}}| || S )zUReturn Source statement which contains the given linenumber
        (counted from 0).)getstatementrange)r$   rN   r9   rE   r   r   r   getstatement_   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)rB   r8   getstatementrange_ast)r$   rN   astr9   rE   r   r   r   rO   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$   r;   r   r   r   r   m   s   zSource.deindentc                 C  s   d | jS Nr   )joinr   r?   r   r   r   __str__t   s   zSource.__str__r*   )r   r	   r
   r   )r(   r	   r
   r)   )r-   r.   r
   r   )r-   r3   r
   r   )r-   r4   r
   r5   )r
   r<   )r
   r.   )r
   r   )rG   )rH   r   r
   r   )rN   r.   r
   r   )rN   r.   r
   rQ   )r
   r   )__name__
__module____qualname____doc__r'   r,   __hash__r   r1   r@   rC   rD   rH   rP   rO   r   rV   r   r   r   r   r      s$    







r   r
   tuple[Source | None, int]c                 C  sL   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   rI   r   r   r   rL      rM   zfindsource.<locals>.<listcomp>)r!   
findsource	Exceptionr   r   r   )r   sourcelinesrN   rF   r   r   r   r^   }   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)ra   zcould not get code object for )__code__AttributeErrorgetattrr   typer    r#   )r   ra   callr   r   r   r       s   r    r   Iterable[str]	list[str]c                 C  s   t d|  S rT   )textwrapdedentrU   
splitlines)r   r   r   r   r      s   r   rN   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 )Nr6   )	finalbodyorelser   )rS   walkr   stmtExceptHandlerClassDefFunctionDefAsyncFunctionDefdecorator_listappendrN   rf   sortr   rB   )
rN   rn   valuesr   dnamevalinsert_indexr9   rE   r   r   r   get_statement_startend2   s(   

r   FrF   	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ignorerF   execr6   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simplefilterrS   parser   rB   r   r!   BlockFinderr)   isspacestartedtokenizegenerate_tokens
tokeneater
EndOfBlockIndentationErrorlastr_   lstrip
startswith)
rN   rF   r   r   contentr9   rE   block_findertokrJ   r   r   r   rR      s<   




rR   )r
   r\   )T)r   r	   ra   r)   r
   rb   )r   ri   r
   rj   )rN   r.   rn   ro   r
   rp   )FN)
rN   r.   rF   r   r   r)   r   r   r
   r   )
__future__r   rS   bisectr   collections.abcr   r   r!   rk   r   typestypingr   r   r   r^   r    r   r   rR   r   r   r   r   <module>   s&   
m

