
    ?gn                        S SK Jr  S SKrS SKJr  S SKrS SKrS SKrS SKrS SK	J
r
  S SK	Jr  S SK	Jr  S SKr " S S5      rSS	 jrSSS
 jjrSS jrSS jr  S         SS jjrg)    )annotationsN)bisect_right)Iterable)Iterator)overloadc                      \ rS rSrSrSSS jjrSS jrSr\SS j5       r	\SS j5       r	SS jr	SS	 jr
SS
 jrSS jrSSS jjrSS jrSS jrSS jrSS jrSrg) Source   znAn immutable object holding a source code fragment.

When using Source(...), the source lines are deindented.
Nc                   U(       d  / U l         g [        U[        5      (       a  UR                   U l         g [        U[        [        45      (       a  [        S U 5       5      U l         g [        U[        5      (       a   [        UR                  S5      5      U l         g  [        U5      n[        R                  " U5      n[        UR                  S5      5      U l         g ! [         a    [        R                  " U5      n NBf = f)Nc              3  B   #    U  H  oR                  S 5      v   M     g7f
N)rstrip.0xs     6/usr/lib/python3/dist-packages/_pytest/_code/source.py	<genexpr>"Source.__init__.<locals>.<genexpr>   s     !>#Q((4..#s   r   )lines
isinstancer	   tuplelistdeindentstrsplit
getrawcodeinspect	getsource	TypeError)selfobjrawcodesrcs       r   __init__Source.__init__   s    $&DJV$$DJeT]++!!>#!>>DJS!!!#))D/2DJ-$S/''0 "#))D/2DJ  -'',-s    !C! ! DDc                j    [        U[        5      (       d  [        $ U R                  UR                  :H  $ N)r   r	   NotImplementedr   )r!   others     r   __eq__Source.__eq__'   s(    %((!!zzU[[((    c                    g r(    r!   keys     r   __getitem__Source.__getitem__/   s    ,/r-   c                    g r(   r/   r0   s     r   r2   r3   2   s    14r-   c                    [        U[        5      (       a  U R                  U   $ UR                  S;  a  [	        S5      e[        5       nU R                  UR                  UR                   Ul        U$ )N)N   z!cannot slice a Source with a step)r   intr   step
IndexErrorr	   startstop)r!   r1   	newsources      r   r2   r3   5   s\    c3::c?"xxy( !DEEI"jjSXX>IOr-   c                ,    [        U R                  5      $ r(   )iterr   r!   s    r   __iter__Source.__iter__?   s    DJJr-   c                ,    [        U R                  5      $ r(   )lenr   r?   s    r   __len__Source.__len__B   s    4::r-   c                   S[        U 5      p!X:  aP  U R                  U   R                  5       (       d.  US-  nX:  a$  U R                  U   R                  5       (       d  M.  X!:  aV  U R                  US-
     R                  5       (       d1  US-  nX!:  a'  U R                  US-
     R                  5       (       d  M1  [        5       nU R                  X UR                  SS& U$ )zGReturn new Source object with trailing and leading blank lines removed.r   r6   N)rC   r   stripr	   )r!   r:   endsources       r   rG   Source.stripE   s    D	sk$**U"3"9"9";";QJE k$**U"3"9"9";";k$**S1W"5";";"="=1HC k$**S1W"5";";"="=**U/Qr-   c                l    [        5       nU R                   Vs/ s H  o1U-   PM	     snUl        U$ s  snf )zVReturn a copy of the source object with all lines indented by the
given indent-string.)r	   r   )r!   indentr<   lines       r   rL   Source.indentP   s3     H	7;zzBztTMzB	 Cs   1c                0    U R                  U5      u  p#XU $ )zMReturn Source statement which contains the given linenumber
(counted from 0).)getstatementrange)r!   linenor:   rH   s       r   getstatementSource.getstatementW   s      ++F3
#r-   c                j    SUs=::  a  [        U 5      :  d  O  [        S5      e[        X5      u  p#nX44$ )zeReturn (start, end) tuple which spans the minimal statement region
which containing the given lineno.r   zlineno out of range)rC   r9   getstatementrange_ast)r!   rQ   astr:   rH   s        r   rP   Source.getstatementrange]   s7     V'c$i'233/=Czr-   c                ^    [        5       n[        U R                  5      UR                  SS& U$ )z&Return a new Source object deindented.N)r	   r   r   )r!   r<   s     r   r   Source.deindente   s&    H	%djj1	r-   c                8    SR                  U R                  5      $ Nr   )joinr   r?   s    r   __str__Source.__str__k   s    yy$$r-   r   r(   )r"   objectreturnNone)r*   r`   ra   bool)r1   r7   ra   r   )r1   slicera   r	   )r1   zint | slicera   zstr | Source)ra   zIterator[str])ra   r7   )ra   r	   )z    )rL   r   ra   r	   )rQ   r7   ra   r	   )rQ   r7   ra   ztuple[int, int])ra   r   )__name__
__module____qualname____firstlineno____doc__r%   r+   __hash__r   r2   r@   rD   rG   rL   rR   rP   r   r]   __static_attributes__r/   r-   r   r	   r	      sa    
3") H/ /4 4 	%r-   r	   c                     [         R                  " U 5      u  p[        5       nU Vs/ s H  oDR	                  5       PM     snUl        X24$ ! [         a     gf = fs  snf )N)N)r   
findsource	Exceptionr	   r   r   )r"   sourcelinesrQ   rI   rM   s        r   rn   rn   t   s]    %005 XF.9:kdKKMk:FL>	   ;s   A A
AAc                     U R                   $ ! [         a     Of = fU(       a3  [        U SS5      nU(       a  [        U [        5      (       d
  [        USS9$ [        SU < 35      e)z&Return code object for given function.__call__NF)trycallzcould not get code object for )__code__AttributeErrorgetattrr   typer   r    )r"   rs   calls      r   r   r   ~   sc    || sJ-
3--dE22
4SG<
==s    
c                h    [         R                  " SR                  U 5      5      R                  5       $ r[   )textwrapdedentr\   
splitlinesr_   s    r   r   r      s#    ??499U+,7799r-   c                   / n[         R                  " U5       GH  n[        U[         R                  [         R                  45      (       d  M5  [        U[         R
                  [         R                  [         R                  45      (       a1  UR                   H!  nUR                  UR                  S-
  5        M#     UR                  UR                  S-
  5        S H<  n[        X5S 5      nU(       d  M  UR                  US   R                  S-
  S-
  5        M>     GM     UR                  5         [        X 5      nX'S-
     nU[        U5      :  a  S n	X4$ X'   n	X4$ )Nr6   )	finalbodyorelser   )rV   walkr   stmtExceptHandlerClassDefFunctionDefAsyncFunctionDefdecorator_listappendrQ   rv   sortr   rC   )
rQ   nodevaluesr   dnamevalinsert_indexr:   rH   s
             r   get_statement_startend2r      s    FXXd^a#((C$5$5677!cllCOOS=Q=QRSS))AMM!((Q,/ *MM!((Q,'/-4Qd-C3MM#a&--!"3a"78	 0  KKM/L!#$Es6{" : ":r-   c                  ^
 UcW  [        U5      n[        R                  " 5          [        R                  " S5        [        R
                  " USS5      nS S S 5        [        X5      u  pVUc  [        UR                  5      nXeS-   :  a  [        R                  " 5       n[        UR                  U   5      =(       a     UR                  U   S   R                  5       Ul        S UR                  XV  5       m
 [        R                  " U
4S j5       H  nUR                   " U6   M     U(       aM  UR                  US-
     R+                  5       n	U	R-                  S5      (       d  U	(       d  US-  nOO	U(       a  MM  X5U4$ ! , (       d  f       GN3= f! [        R"                  [$        4 a    UR&                  U-   n N[(         a     Nf = f)	NignorerI   execr6   r   c              3  *   #    U  H	  oS -   v   M     g7fr   r/   r   s     r   r   (getstatementrange_ast.<locals>.<genexpr>   s     :"9Q4x"9s   c                    > [        T 5      $ r(   )next)its   r   <lambda>'getstatementrange_ast.<locals>.<lambda>   s	    Rr-   #)r   warningscatch_warningssimplefilterrV   parser   rC   r   r   BlockFinderrc   isspacestartedtokenizegenerate_tokens
tokeneater
EndOfBlockIndentationErrorlastro   lstrip
startswith)rQ   rI   	assertionastnodecontentr:   rH   block_findertokrM   r   s             @r   rU   rU      s    f+ $$&!!(+ii6:G ' )9JE
 {&,,
QY **, e$%J&,,u*=a*@*H*H*J 	 ;&,,u"9:	//0@A''- B ||C!G$++-??3t1HC # 3I '&0 ""$45 	,##e+C 		s#   /F 80F  
F)G	=	G	G	)ra   ztuple[Source | None, int])T)r"   r`   rs   rc   ra   ztypes.CodeType)r   zIterable[str]ra   z	list[str])rQ   r7   r   zast.ASTra   ztuple[int, int | None])FN)
rQ   r7   rI   r	   r   rc   r   zast.AST | Nonera   ztuple[ast.AST, int, int])
__future__r   rV   bisectr   r   rz   r   typestypingr   r   r   r   r	   rn   r   r   r   rU   r/   r-   r   <module>r      s    " 
         \% \%H
>:: "	... . 	.
 .r-   