o
    noi{                    @   s   d dl mZmZ d dlZd dlmZ d dlmZmZm	Z	 d dl
mZ d dlmZ G dd deZd	ed
ejfddZG dd deZdS )    )AnyCallableN)parse_statement)CSTNodeTestDummyIndentedBlockparse_statement_as)	CodeRange)data_providerc                   @   s  e Zd Zeg eede ee	 fddejede ee	 fe
edddeddd	ejede ee	 fe d
ddejede ee	 fe e
edddeddd	eedejeedeedfdee	 fddeedejeede
edeede
edfdee	 fddeedejejededdejededdfdee	 fddeedejejede
ededdejede
ededdfdee	 fddeedejeedeedfdee	 fddeedejeede
edeede
edfdee	 fddeedejejededdejededdfdee	 fddeedejejede
ededdejede
ededdfdee	 fddeedejeede
edejede
ededdfdee	 fddeedejejededdeedfd ee	 fd!deedejejede
ededdeede
edejed"e
eded#dfd ee	 fd$deedejeed%eed&fejede
ededdeede
edejed"e
eded#dfd'ee	 fd(deedejejed%ed)dejed&ed*dfejede
ededdeede
edejed"e
eded#dfd'ee	 fd+deedejeed%eed&ejed,ed)dejed-ed*dfejede
ededdeede
edejed"e
eded#dfd'ee	 fd.deedejeed/d0ee	 fd1deedejeed/e
edejede
ededdeede
edejed"e
eded#dfd2ee	 fd3deedejeed%eed&ejed,ed)dejed-ed*dfeed/e
edejede
ededdeede
edejed"e
eded#dfd4ee	 fd5deedejeed6d7ee	 fd8deedejeed/eed6d9ee	 fd:deedejeed/e
edeed6e
edd9ee	 fd;deedejeedfeedfd<ee	 fd=deedejeedfeedd>ee	 fd?deedejeedfeedfd@ee	 fdAdeedejeedfeeddBee	 fdCdeede ee	 feedfdDdeede ee	 feeedeedeedEffdFdeede ee	 feeedeedEfeeedeedGffdHedIdJd	edKeede ee	 feedfdLdedKeede eee	 ffeedfdMedNdOd	ejede ee	 fejedPdQfdRdSedTdUd	eje ejedVdQfejedWejededWedXdYdZfejed[dQfejedXd\edXededXedXe ej
edXedXedd]edWee	 fd^d_ed`dad	ejedWejededWedXdYdZdbeddcd	eede ee	 feejejedddddfdedeede ee	 feeedfe edgfdhdeede ee	 feejde fe fdifdjdejeed%eed&ejed,ed)dejed-ed*dfeed/e
edejede
ededdeede
edejed"e
eded#dfd4dkeddld	ejed,dmed)dndoeddpd	ejed,dqedWdrdseddtd	ejejdduejejejdvdudwgdejeje	 gdxgdxejejdKdudydzd{edd|d	R d}ed~dfddZ eejejdduejg ejdqedfej
ej!edgduedmdddee	 fde"ddejejdduejg ejdqedfej
ej!ej#edej$e%ede& dej$ej%eddqedmde& de$e%e' gdduedmdddee	 fde"ddejede ee	 fe(e)e*edfdde"dejede ee	 fe(e)ej*ededej+edWd\dej&edWd\e)e,edej&edWd\e)e-edfdde"dejede ee	 fej(ej)ej*ededej+edWeje fdddde&edWde)e-ededXe&edXfdedXdde"dfd}ed~dfddZ.edd dfdd dfdd dfdd dfdd dfdd dfdd dfdd dfdd dfdd dfdd dfdd dfdd dfdd dffde/g ej0f de1d~dfddZ2dS )FunctionDefCreationTestfoodef foo(): pass
nodecodestrreturnsdef foo() -> str: pass
)   r   )r      )r   r   expected_positionasynchronousasync def foo(): pass
intr   r   async def foo() -> int: pass
)r      barbazparamsdef foo(bar, baz): pass
"def foo(bar: str, baz: int): pass
"one"default5$def foo(bar = "one", baz = 5): pass
.def foo(bar: str = "one", baz: int = 5): pass
)posonly_paramsdef foo(bar, baz, /): pass
%def foo(bar: str, baz: int, /): pass
'def foo(bar = "one", baz = 5, /): pass
1def foo(bar: str = "one", baz: int = 5, /): pass
&def foo(bar: str, baz: int = 5): pass
kwonly_params#def foo(*, bar = "one", baz): pass
biz"two"?def foo(*, bar: str = "one", baz: int, biz: str = "two"): pass
firstsecond)r!   r1   Ndef foo(first, second, *, bar: str = "one", baz: int, biz: str = "two"): pass
1.01.5Zdef foo(first = 1.0, second = 1.5, *, bar: str = "one", baz: int, biz: str = "two"): pass
thirdfourthidef foo(first, second, third = 1.0, fourth = 1.5, *, bar: str = "one", baz: int, biz: str = "two"): pass
r!   star_argdef foo(*params): pass
r@   r1   Jdef foo(*params: str, bar: str = "one", baz: int, biz: str = "two"): pass
r!   r@   r1   tdef foo(first, second, third = 1.0, fourth = 1.5, *params: str, bar: str = "one", baz: int, biz: str = "two"): pass
kwparams
star_kwargdef foo(**kwparams): pass
r@   rH   #def foo(*params, **kwparams): pass
-def foo(*params: str, **kwparams: int): pass
r*   r!   def foo(bar, /, baz): pass
)r*   r@   def foo(bar, /, *baz): pass
)r*   r1   def foo(bar, /, *, baz): pass
)r*   rH   def foo(bar, /, **baz): pass
@bar
def foo(): pass
'123'!@bar(baz, '123')
def foo(): pass
'456'(@bar('123')
@baz('456')
def foo(): pass
)   r   )rW      z    z    @bar
    def foo(): pass
z%    @bar
    def foo():
        pass
)      )rW      # leading commentcommentleading_lines"# leading comment
def foo(): pass
)rY   r   )rY   rX   # What an amazing decorator   funcwhitespace_after_funcwhitespace_before_argswhitespace_after_at	decorator# What a great functionwhitespace_afterwhitespace_before_indicatorwhitespace_after_indicator
annotationr`   
decoratorslines_after_decoratorsr   whitespace_after_defnamewhitespace_after_namewhitespace_before_paramsr!   r   whitespace_before_colonbodyf
# What an amazing decorator
@ bar (  )
# What a great function
async  def  foo  (  )  ->  str : pass
)   r   )r}   %   z@ bar (  )
)r   
   )rf   z@bar()()
def foo(): pass
abz@a + b
def foo(): pass
lparrparz@(bar)
def foo(): pass
zdfirst, second, third = 1.0, fourth = 1.5, *params: str, bar: str = "one", baz: int, biz: str = "two")r   d    )starr&   zthird = 1.0)r   r}   *)r   whitespace_after_starz* third)r      )valueparam1)rw   )r{   )	last_line)rw   r!   r{   ry   zdef foo(
    param1):
    pass
)rW      kwargsreturnNc                 K   s&   d|v r	| d | jdi | d S )Nnative_only )popvalidate_nodeselfr   r   r   T/home/ubuntu/.local/lib/python3.10/site-packages/libcst/_nodes/tests/test_funcdef.py
test_valid   s        \
z"FunctionDefCreationTest.test_validrp   )r   rw   rr   )r!   r@   )rw   r!   r{   zdef foo(*a: *b): pass
)r   parserr   tuplecommaTs)r   r   r   )r   slicez'def foo(*a: *tuple[int,*Ts,...]): pass
T)type_parameterszdef foo[T](): pass
)r   r   r   )boundcolonKWz#def foo[T: int, *Ts, **KW](): pass
T)empty_linesindent)whitespace_beforern   )paramr   PS)r    whitespace_after_type_parametersz'def foo[T :

str ,**  PS  ,]  (): pass
c                 K   s   | j di | d S )Nr   )r   r   r   r   r   test_valid_native  s    z)FunctionDefCreationTest.test_valid_nativec                   C   s6   t t jdt  ft  fdt  t t  fS )Nr   r   )cstFunctionDefName	LeftParen
RightParen
ParametersSimpleStatementSuitePassr   r   r   r   <lambda>  s
    z FunctionDefCreationTest.<lambda>zCannot have parens around Namec                   C   s6   t jt dt  t t  ft jt dddS )Nr   r   rm   r   )r   r   r   r   r   r   AsynchronousSimpleWhitespacer   r   r   r   r     s    zone space after Asynchronousc                   C   s.   t jt dt  t t  ft ddS )Nr   r   )rv   )r   r   r   r   r   r   r   r   r   r   r   r     s    z one space between 'def' and namec                   C   s<   t t dt jt jt dt  ddt t  fS )Nr   r   )equalrG   )r   r   r   r   ParamAssignEqualr   r   r   r   r   r   r     s    z3Must have a default when specifying an AssignEqual.c                   C   8   t t dt jt jt ddddt t  fS )Nr   r   z***r   rG   r   r   r   r   r   r   r   r   r   r   r   r     
    z0Must specify either '', '\*' or '\*\*' for star.c                
   C   sN   t t dt jt jt dt ddt t dfdt t  fS )Nr   r   r$   r%   r    r   r   r   r   r   SimpleStringr   r   r   r   r   r   r     s    zCCannot have param without defaults following a param with defaults.c                
   C   sP   t t dt jt jt dt ddft t dfdt t  fS )Nr   r   r$   r%   rM   r   r   r   r   r   r     s    c                   C   ,   t t dt jt  dt t  fS )Nr   r?   )r   r   r   r   	ParamStarr   r   r   r   r   r   r     
    z9Must have at least one kwonly param if ParamStar is used.c                   C   r   )Nr   )posonly_ind)r   r   r   r   
ParamSlashr   r   r   r   r   r   r     r   z;Must have at least one posonly param if ParamSlash is used.c                   C   :   t t dt jt jt dddfdt t  fS )Nr   r   r   r   r    r   r   r   r   r   r     s
    zExpecting a star prefix of ''c                	   C   sB   t t dt jt jt dt dddfdt t  fS )Nr   r   r$   r   r&   r   r    r   r   r   r   r   r     s    	c                   C   r   )Nr   r   r   r   r0   r   r   r   r   r   r     s    c                   C   r   )Nr   r   **r   r?   r   r   r   r   r   r     r   zExpecting a star prefix of '\*'c                   C   r   )Nr   r   r   r   rG   r   r   r   r   r   r     r   z!Expecting a star prefix of '\*\*'get_nodeexpected_rec                 C   s   |  || d S N)assert_invalid)r   r   r   r   r   r   test_invalid}  s    z$FunctionDefCreationTest.test_invalid)3__name__
__module____qualname__r	   r   r   r   r   r   r   
Annotationr   r   r   r   IntegerFloat	DecoratorCallArgr   IndentedBlockSimpleStatementLine	EmptyLineCommentr   BinaryOperationAddr   r   ParenthesizedWhitespacer   r   StarredElementr   	SubscriptSubscriptElementIndexCommaEllipsisTypeParameters	TypeParamTypeVarColonTypeVarTuple	ParamSpecr   r   CSTNoder   r   r   r   r   r   r
      s"   !-8
FVl
z
 	    /
  A  Q  h           <    E    _         	            %      1      =      I      U      ^      q       	        	        #        0$        Y        f         p
        ~                   +          0          9		          [


"&,
 	
					  r
   r   r   c                 C   s.   t j| t jddd}t|t jstd|S )Nz3.8python_version)configz=This function is expecting to parse compound statements only!)r   r   PartialParserConfig
isinstanceBaseCompoundStatement
ValueError)r   	statementr   r   r   _parse_statement_force_38  s   r   c                )   @   s  e Zd Zeeede ee	 fdfejede ee	 fej
ededdddfejede ee	 fe dd	fejede ee	 fe ej
ed
eddddfeedejejeddejedddejedddfdee	 fdfeedejejedej
ededddejedddejedej
ed
eddddfdee	 fdfeedejejede eddejedddejede edddfdee	 fdfeedejejedej
ededde eddejedddejedej
ed
edde edddfdee	 fdfeedejejedej
ededdddejedddejedej
ed
edde edddfdee	 fdfeedeje ejede eddejedddejeddddfd ee	 fd!feedeje ejedej
ededde eddejedddejedej
ed
eddddejedddejed"ej
ededde ed#ddfd ee	 fd$feedejejed%dddejeddd&ejed'dddejeddd&fe ejedej
ededde eddejedddejedej
ed
eddddejedddejed"ej
ededde ed#ddfd(ee	 fd)feedejejed%de ed*dejeddd+ejed'de ed,dejeddd+fe ejedej
ededde eddejedddejedej
ed
eddddejedddejed"ej
ededde ed#ddfd(ee	 fd-feedejejed%dddejeddd&ejed'dddejeddd&ejed.de ed*dejeddd+ejed/de ed,dejeddd+fe ejedej
ededde eddejedddejedej
ed
eddddejedddejed"ej
ededde ed#ddfd(ee	 fd0feedejejed1ddd2d3d4ee	 fd5feedejejed1ej
ededddd2ejedddejedej
ededde eddejedddejedej
ed
eddddejedddejed"ej
ededde ed#ddfd ee	 fd6feedejejed%dddejeddd&ejed'dddejeddd&ejed.de ed*dejeddd+ejed/de ed,dejeddd+fejed1ej
ededddd2ejedddejedej
ededde eddejedddejedej
ed
eddddejedddejed"ej
ededde ed#ddfd(ee	 fd7feedejejed8ddd9d3d:ee	 fd;feedejejed1ddd2ejeddd&ejed8ddd9d3d<ee	 fd=feedejejed1ej
ededddd2ejedddejed8ej
ed
edddd9dd<ee	 fd>feede ee	 feedfd?feede ee	 feeedejeddejeddd@ejedAddBffdCfeede ee	 feeedejedAddBfeeedejedDddBffdEfejede ee	 fejedFdGfdHdIfeje ejedJdGfejedejedededKdLdMfejedNdGfejedKdedKededKedKe ej
edKedKeddOedee	 fdPdQffdRejdSedTdfdUdVZeeedejejeddejedddejeddejedddfe dWee	 fdXdYeedejejeddejedddejeddejedddfejedddWee	 fdZd[d\eedejejedej
ededddejedddejedej
ed
edddejedddfe dWee	 fd]dYeedejejedede dejeddd^ejedede dejeddd^fe dWee	 fd_dYeedejejedej
ededdede dejeddd^ejedej
ed
eddede dejeddd^fe dWee	 fd`dYeedejejeddejedddfejejedddaejedddfdbee	 fdcdYeedejejeddejedddfejejedddaejedd2dddee	 fdedYeedejejeddejedddfejejedddaejejedddaejedddfdfee	 fdgdYeedejejeddejedddfejejedddaejedd9ddhee	 fdidYf	dRejdSedjedTdfdkdlZedmedndod[dpdmedqdod[dpdmedrdod[dpdmedsdodtdpfdjedTdfdudvZ edSdwidSdxidSdyidSdzidSd{idSd|idSd}idSd~idSdidSdif
djedTdfddZ!dS )FunctionDefParserTestr   r   r   rc   r   r   r   r   r   r   r   r   r   r   rm   )r   r   r   r   r    r"   r#   r$   )r   r&   r   r   r'   )r   r&   r   r(   r)   N)r&   r   r   r/   r   rB   r2   r3   r4   r5   r6   )rr   r&   r   r   r7   rD   r8   r9   )rr   r   r&   r   r   r:   r;   r<   r=   r>   r!   r   )rr   r&   r   r?   rA   rC   rE   rF   r   rG   rI   rJ   rK   rL   rR   )keywordr   rS   )r   rT   rU   rV   r\   r]   r_   ra   rb   rd   re   ri   rl   ro   rs   r|   r   r   r   c                 C      |  ||t d S r   )r   r   )r   r   r   r   r   r   r   !  s         }z FunctionDefParserTest.test_valid)r*   r   r+   r   zdef foo(bar, baz, / ): pass
T)r   r   r   r,   )r&   r   r   r   r-   r.   r   )r*   r   r!   rN   )r*   r   r@   rO   )r*   r   r@   r1   rP   )r*   r   rH   rQ   r   c                 K   r   r   )r   r   )r   r   r   r   r   r   r   test_valid_38  s     z#FunctionDefParserTest.test_valid_38zasync def foo(): passz3.7r   )r   r   expect_successz3.6z3.5z3.3Fc                 K   s*   | dds| d | jdi | d S )Nr   Tz+parse errors are disabled for native parserr   )getskipTestassert_parsesr   r   r   r   test_versions  s   
z#FunctionDefParserTest.test_versionszA[:*b]zA[*b:]zA[*b:*b]z	A[*(1:2)]zA[*:]zA[:*]zA[**b]zdef f(x: *b): passzdef f(**x: *b): passzx: *bc                 K   s   | j di |dtd d S )NF)r   r   r   )r   r   r   r   r   r   test_parse_error  s   z&FunctionDefParserTest.test_parse_error)"r   r   r   r	   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r      s   
	
$	#("'	.27	BFK
DHM		
(VZ_	7;@		
(_ch

$            |#(	  #',				   r   )typingr   r   libcstr   r   libcst._nodes.tests.baser   r   r   libcst.metadatar   libcst.testing.utilsr	   r
   r   r   r   r   r   r   r   r   <module>   s"           