o
    DDi~}                    @   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 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)	is_native)	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"   r2   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
rA   r2   Jdef foo(*params: str, bar: str = "one", baz: int, biz: str = "two"): pass
r"   rA   r2   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
rA   rI   #def foo(*params, **kwparams): pass
-def foo(*params: str, **kwparams: int): pass
r+   r"   def foo(bar, /, baz): pass
)r+   rA   def foo(bar, /, *baz): pass
)r+   r2   def foo(bar, /, *, baz): pass
)r+   rI   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   )rX      z    z    @bar
    def foo(): pass
z%    @bar
    def foo():
        pass
)      )rX      # leading commentcommentleading_lines"# leading comment
def foo(): pass
)rZ   r   )rZ   rY   # 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ra   
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   
   )rg   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)rx   )r|   )	last_line)rx   r"   r|   rz   zdef foo(
    param1):
    pass
)rX      kwargsreturnNc                 K   sB   t  s|ddr| d d|v r|d | jdi | d S )Nnative_onlyFzDisabled for native parser )r   getskipTestpopvalidate_nodeselfr   r   r   Y/var/www/Datamplify/venv/lib/python3.10/site-packages/libcst/_nodes/tests/test_funcdef.py
test_valid   s        \

z"FunctionDefCreationTest.test_validrq   )r   rx   rs   )r"   rA   )rx   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_beforero   )paramr   PS)r    whitespace_after_type_parametersz'def foo[T :

str ,**  PS  ,]  (): pass
c                 K   s$   t  s| d | jdi | d S )NzDisabled for pure python parserr   )r   r   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   rn   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   )rw   )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   )equalrH   )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   rH   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&   rN   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   r1   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   rH   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	Exception)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   rd   r   r   r   r   r   r   r   r   r   r   rn   )r   r   r    r   r!   r#   r$   r%   )r   r'   r   r   r(   )r   r'   r   r)   r*   N)r'   r   r   r0   r   rC   r3   r4   r5   r6   r7   )rs   r'   r   r   r8   rE   r9   r:   )rs   r   r'   r   r   r;   r<   r=   r>   r?   r"   r   )rs   r'   r   r@   rB   rD   rF   rG   r   rH   rJ   rK   rL   rM   rS   )keywordr   rT   )r   rU   rV   rW   r]   r^   r`   rb   rc   re   rf   rj   rm   rp   rt   r}   r   r   r   c                 C   s   |  ||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"   rO   )r+   r   rA   rP   )r+   r   rA   r2   rQ   )r+   r   rI   rR   r   c                 K   s.   t  s|ddr| d | ||t d S )Nr   Fzdisabled for pure python parser)r   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   s0   t  r|dds| d | jdi | d S )Nr   Tz+parse errors are disabled for native parserr   )r   r   r   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.   t  s| d | jdi |dtd d S )NzSkipped for non-native parserF)r   r   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._parser.entrypointsr   libcst.metadatar	   libcst.testing.utilsr
   r   r   r   r   r   r   r   r   r   <module>   s$           	