package Ġde . qual ers oft . robot framework . library . model Ċ Ċ import Ġde . qual ers oft . robot framework . library . annotation . Keyword Ċ import Ġjava . time . Duration Ċ import Ġjava . time . temporal . Temporal Ċ import Ġjava . util . Date Ċ import Ġjava . util . Optional Ċ Ċ import Ġkotlin . reflect . K Class Ċ import Ġkotlin . reflect . K Function Ċ import Ġkotlin . reflect . K Parameter Ċ import Ġkotlin . reflect . K Visibility Ċ import Ġkotlin . reflect . full . instance Parameter Ċ import Ġkotlin . reflect . full . is Subclass Of Ċ import Ġkotlin . reflect . full . value Parameters Ċ Ċ open Ġclass ĠKeyword Descriptor ( private Ġval Ġfunction : ĠK Function <* >) Ġ{ ĊĊĠ Ġ// Ġ 1 . Ġwe Ġget Ġthe Ġkeyword Ġannotation ĊĠ Ġprivate Ġval Ġannotation Ġ= Ġfunction . annotations . first Ġ{ Ġit Ġis ĠKeyword Ġ} Ġas ĠKeyword ĊĊĠ Ġ// Ġ 2 . Ġwe Ġget Ġthe Ġname ; ĊĠ Ġval Ġname : ĠString Ġ= Ġannotation . name . if Blank Ġ{ ĊĠĠĠ Ġfunction . name ĊĠ Ġ} ĊĊĠ Ġ// Ġ 3 . Ġget Ġdeclaring Ġclass Ġof Ġthe Ġfunction ĊĠ Ġval Ġdeclaring Class : ĠK Class < *> Ġ= Ġdetect Decl aring Class () ĊĊĠ Ġprivate Ġval Ġparameters : ĠList < Keyword Parameter Descriptor > ĊĊĠ Ġval Ġdescription : ĠString Ġby Ġlazy Ġ{ ĊĠĠĠ Ġ""" ${ normalize Summary ( annotation . doc Summary )} ĊĠĠĠ Ġ${ create Details Description ( annotation . doc Details )} ĊĠĠĠ Ġ${ create Parameter Doc ()} """. trim () ĊĠ Ġ} ĊĊĠ Ġinit Ġ{ ĊĠĠĠ Ġvalidate Function () ĊĊĠĠĠ Ġ// Ġ 4 . Ġparse Ġparameter ĊĠĠĠ Ġparameters Ġ= Ġfunction . value Parameters . map Ġ{ ĠKeyword Parameter Descriptor ( it ) Ġ} ĊĠ Ġ} ĊĊĠ Ġval Ġrobot Argument Types Ġby Ġlazy Ġ{ ĊĠĠĠ Ġparameters . associate Ġ{ Ġit . name Ġto Ġto Robot Type ( it . type ) Ġ} ĊĠ Ġ} ĊĊĠ Ġval Ġrobot Arguments Ġby Ġlazy Ġ{ ĊĠĠĠ Ġparameters . map Ġ{ Ġit . robot Argument Descriptor Ġ} ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠMaps Ġa Ġkotlin Ġclass Ġto Ġa Ġrobot Ġframework Ġtype Ġiff Ġpossible ĊĠĠ Ġ* Ġotherwise Ġthe Ġkotlin Ġclass Ġitself Ġwill Ġbe Ġreturned ĊĠĠ Ġ*/ ĊĠ Ġprivate Ġfun Ġto Robot Type ( origin Type : ĠK Class < *> ): ĠAny Ġ{ ĊĠĠĠ Ġval Ġresult Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠ Ġorigin Type . is Subclass Of ( Number :: class ) Ġ-> Ġ{ ĊĠĠĠĠĠĠĠ Ġdetermine Number Type ( origin Type ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġorigin Type Ġ== ĠBoolean :: class Ġ-> Ġ{ ĊĠĠĠĠĠĠĠ Ġ" bool " ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġorigin Type Ġ== ĠString :: class Ġ-> Ġ{ ĊĠĠĠĠĠĠĠ Ġ" str " ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġorigin Type Ġ== ĠDate :: class Ġ|| Ġorigin Type . is Subclass Of ( Temporal :: class ) Ġ-> Ġ{ ĊĠĠĠĠĠĠĠ Ġ" datetime " ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġorigin Type Ġ== ĠDuration :: class Ġ-> Ġ{ ĊĠĠĠĠĠĠĠ Ġ" timedelta " ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġorigin Type Ġ== ĠByteArray :: class Ġ-> Ġ{ ĊĠĠĠĠĠĠĠ Ġ" byte array " ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġelse Ġ-> Ġorigin Type ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġresult ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġdetermine Number Type ( type : ĠK Class < *> ): ĠAny Ġ{ ĊĠĠĠ Ġreturn Ġwhen Ġ( type ) Ġ{ ĊĠĠĠĠĠ ĠByte :: class , ĠShort :: class , ĠInt :: class , ĠLong :: class Ġ-> Ġ" int " ĊĠĠĠĠĠ ĠFloat :: class , ĠDouble :: class Ġ-> Ġ" float " ĊĠĠĠĠĠ Ġelse Ġ-> Ġtype ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠCalls Ġthe Ġfunction Ġdescribed Ġby Ġthis Ġobject . ĊĠĠ Ġ* ĠTherefore Ġthe Ġgiven Ġarguments Ġare Ġmapped Ġfrom ĠRobot ĠFramework Ġpresentation Ġto Ġkotlin . ĊĠĠ Ġ* ĊĠĠ Ġ* Ġ@ see Ġmap Arguments To Parameter Names ĊĠĠ Ġ* Ġ@ see Ġmap And Validate Prepared Parameter ĊĠĠ Ġ*/ ĊĠ Ġfun Ġinvoke ( this Ref : ĠAny , Ġargs : ĠList < Any ? >, Ġkw Args : ĠMap < String , ĠAny ?> ?): ĠAny ? Ġ{ ĊĠĠĠ Ġval Ġnamed Values Ġ= Ġmutable Map Of < String , ĠAny ?> () ĊĠĠĠ Ġif Ġ(! kw Args . isNull OrEmpty ()) Ġ{ ĊĠĠĠĠĠ Ġnamed Values . put All ( kw Args ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġcall Args Ġ= Ġmutable Map Of < K Parameter , ĠAny ? >( function . instance Parameter !! Ġto Ġthis Ref ) ĊĊĠĠĠ Ġval Ġparams Ġ= Ġparameters . to Mutable List () ĊĠĠĠ Ġparams . sortBy Ġ{ Ġit . position Ġ} ĊĊĠĠĠ Ġ// Ġ 1 . Ġmap Ġrf Ġargs Ġto Ġargument - names ĊĠĠĠ Ġval Ġprepared Args Ġ= Ġmap Arguments To Parameter Names ( params , Ġargs , Ġnamed Values ) ĊĠĠĠ Ġ// Ġ 2 . Ġvalidate Ġprepared Ġarguments Ġarg ĊĠĠĠ Ġcall Args . put All ( map And Validate Prepared Parameter ( prepared Args )) ĊĊĠĠĠ Ġreturn Ġfunction . call By ( call Args ) ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĊĠĠ Ġ* Ġ@ see Ġconsume Kw Args ĊĠĠ Ġ*/ ĊĠ Ġprivate Ġfun Ġmap Arguments To Parameter Names ( ĊĠĠĠ Ġordered Params : ĠList < Keyword Parameter Descriptor >, ĊĠĠĠ Ġargs : ĠList < Any ? >, ĊĠĠĠ Ġkw Args : ĠMap < String , ĠAny ?> ĊĠ Ġ): ĠMap < String , ĠOptional < Any >> Ġ{ ĊĊĠĠĠ Ġval Ġresult : ĠMutable Map < String , ĠOptional < Any > ?> Ġ= Ġordered Params . associate Ġ{ Ġit . name Ġto Ġnull Ġ}. to Mutable Map () ĊĠĠĠ Ġval Ġvalidation Errors Ġ= Ġmutable ListOf < String >() ĊĊĠĠĠ Ġ// Ġ 1 . Ġwe Ġfill Ġup Ġwith Ġpositional Ġargs ĊĠĠĠ Ġvar Ġi Ġ= Ġ 0 ĊĠĠĠ Ġwhile Ġ( i Ġ< Ġargs . size ) Ġ{ ĊĠĠĠĠĠ Ġval Ġdesc Ġ= Ġordered Params [ i ] ĊĠĠĠĠĠ Ġif Ġ( Parameter Kind . VAR ARG Ġ== Ġdesc . kind ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġwe Ġhave Ġto Ġpack Ġeverything Ġin Ġsingle Ġobject ĊĠĠĠĠĠĠĠ Ġ// Ġand Ġas Ġvar args Ġhas Ġto Ġbe Ġlast Ġ' arg ' Ġ( kw Args Ġare Ġseparate ) ĊĠĠĠĠĠĠĠ Ġ// Ġwe Ġcan Ġconsume Ġeverything ĊĠĠĠĠĠĠĠ Ġval Ġvar args Ġ= Ġ( i Ġuntil Ġargs . size ). map Ġ{ Ġargs [ it ] Ġ} ĊĠĠĠĠĠĠĠ Ġresult [ desc . name ] Ġ= ĠOptional . of ( var args . toList ()) ĊĠĠĠĠĠĠĠ Ġi Ġ= Ġargs . size ĊĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġnormal Ġvalue Ġargument ĊĠĠĠĠĠĠĠ Ġresult [ desc . name ] Ġ= ĠOptional . of Nullable ( args [ i ]) ĊĠĠĠĠĠĠĠ Ġ++ i ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġ 2 . Ġwe Ġfill Ġup Ġkw Args Ġwith Ġnamed Ġargs ĊĠĠĠ Ġval Ġargs Map Ġ= Ġordered Params . associate By Ġ{ Ġit . name Ġ} ĊĠĠĠ Ġval Ġnamed Args Ġ= Ġkw Args . to Mutable Map () ĊĠĠĠ Ġfor Ġ( k Ġin Ġkw Args . keys ) Ġ{ ĊĠĠĠĠĠ Ġval Ġdesc Ġ= Ġargs Map [ k ] ĊĠĠĠĠĠ Ġif Ġ( null Ġ!= Ġdesc ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( null Ġ!= Ġresult [ desc . name ]) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġvalidation Errors Ġ+= Ġ" The Ġparameter Ġwith Ġname Ġ'$ k ' Ġwas Ġalready Ġset Ġfrom Ġpositional Ġarguments " ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġnamed Args . remove ( k ) ĊĠĠĠĠĠĠĠĠĠ Ġresult [ desc . name ] Ġ= ĠOptional . of Nullable ( value ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġ 3 . Ġif Ġkw Args Ġ( named Args ) Ġleft Ġfind Ġthe Ġappropriate Ġparameter ĊĠĠĠ Ġvalidation Errors . addAll ( consume Kw Args ( named Args , Ġresult )) ĊĊĠĠĠ Ġif Ġ( validation Errors . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠ Ġthrow ĠIllegalArgumentException ( ĊĠĠĠĠĠĠĠ Ġ" When Ġcalling Ġthe Ġkeyword , Ġfollowing Ġargument Ġmapping Ġerrors Ġoccurred :\ n \ t " Ġ+ Ġvalidation Errors . join ToString ( ĊĠĠĠĠĠĠĠĠĠ Ġ"\ n \ t " ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġresult . filter Values Ġ{ Ġnull Ġ!= Ġit Ġ}. map Values Ġ{ Ġit . value Ġas ĠOptional < Any > Ġ} ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠPut Ġthe Ġremaining Ġ` kw Args ` Ġto Ġan Ġappropriate Ġparameter Ġmarked Ġwith Ġkw Arg Ġwithin Ġthe Ġ[ result ]- map . ĊĠĠ Ġ* ĠIf Ġthe Ġtarget Ġkw Arg - Parameter Ġalready Ġexists , Ġremain ders Ġwill Ġbe Ġadded Ġotherwise Ġa Ġnew Ġentry ĊĠĠ Ġ* Ġwith Ġthe Ġparameter Ġname Ġwill Ġbe Ġadded Ġto Ġ[ result ] ĊĠĠ Ġ* ĊĠĠ Ġ* Ġ@ param Ġremaining Kw Args ĠThe Ġremaining Ġkw Args Ġif Ġany ĊĠĠ Ġ* Ġ@ param Ġresult ĠThe Ġso Ġfar Ġprocessed Ġtarget Ġarguments Ġof Ġthe Ġfunction Ġto Ġcall Ġ( k := Ġname Ġof Ġparameter ; Ġv := argument Ġfrom ĠRF ) ĊĠĠ Ġ* ĊĠĠ Ġ* Ġ@ return ĠA Ġlist Ġof Ġerror Ġmessages . ĊĠĠ Ġ* ĊĠĠ Ġ* Ġ@ see Ġmap Arguments To Parameter Names ĊĠĠ Ġ*/ ĊĠ Ġ@ Suppress (" Too Generic Exception ") ĊĠ Ġprivate Ġfun Ġconsume Kw Args ( ĊĠĠĠ Ġremaining Kw Args : ĠMutable Map < String , ĠAny ? >, ĊĠĠĠ Ġresult : ĠMutable Map < String , ĠOptional < Any > ?> ĊĠ Ġ): ĠList < String > Ġ{ ĊĠĠĠ Ġval Ġvalidation Errors Ġ= Ġmutable ListOf < String >() ĊĠĠĠ Ġif Ġ( remaining Kw Args . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠ Ġval Ġdesc Ġ= Ġparameters . find Ġ{ ĠParameter Kind . KW ARG Ġ== Ġit . kind Ġ} ĊĠĠĠĠĠ Ġif Ġ( null Ġ!= Ġdesc ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġkw Entry Ġ= Ġresult [ desc . name ] ĊĠĠĠĠĠĠĠ Ġif Ġ( null Ġ== Ġkw Entry Ġ|| Ġkw Entry . isEmpty ) Ġ{ Ġ// Ġnot Ġset Ġso Ġfar ĊĠĠĠĠĠĠĠĠĠ Ġresult [ desc . name ] Ġ= ĠOptional . of ( remaining Kw Args ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ Ġ// Ġmerge Ġwith Ġexisting ĊĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwe Ġalready Ġens ured Ġtype Ġis ĠMap < String , ĠAny ?> Ġbut Ġbetter Ġsave Ġthan Ġs orrow ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġorigin Map Ġ= Ġkw Entry . get () Ġas ĠMap < *, Ġ*> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Map Ġ= Ġorigin Map . entries . associate Ġ{ Ġit . key . toString () Ġto Ġit . value Ġ}. to Mutable Map () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew Map . put All ( remaining Kw Args ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult [ desc . name ] Ġ= ĠOptional . of ( new Map ) ĊĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠClass CastException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalidation Errors Ġ+= Ġ" Unable Ġto Ġextend Ġexisting Ġkw Arg - map : Ġ${ kw Entry . get () }" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Ġwith Ġremaining Ġkw Args Ġ$ remaining Kw Args ! Ġ$ ex " ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġvalidation Errors Ġ+= Ġ" No Ġkw Arg - Parameter Ġfound Ġbut Ġarguments Ġleft ! Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠ Ġ" The Ġfollowing Ġkw Args Ġare Ġleft Ġover : Ġ$ remaining Kw Args " ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġvalidation Errors ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* Ġvalue . isEmpty Ġis Ġinterpreted Ġas Ġ` null ` ĊĠĠ Ġ*/ ĊĠ Ġprivate Ġfun Ġmap And Validate Prepared Parameter ( args : ĠMap < String , ĠOptional < Any >> ): ĠMap < K Parameter , ĠAny ?> Ġ{ ĊĠĠĠ Ġval Ġresult Ġ= Ġmutable Map Of < K Parameter , ĠAny ?> () ĊĠĠĠ Ġval Ġvalidation Errors Ġ= Ġmutable ListOf < String >() ĊĠĠĠ Ġfor Ġ(( k , Ġv ) Ġin Ġargs ) Ġ{ ĊĠĠĠĠĠ Ġval Ġdesc Ġ= Ġparameters . find Ġ{ Ġk Ġ== Ġit . name Ġ} ĊĠĠĠĠĠ Ġif Ġ( null Ġ== Ġdesc ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠThis Ġshould Ġnot Ġhappen ĊĠĠĠĠĠĠĠ Ġvalidation Errors Ġ+= Ġ" Could Ġnot Ġfind Ġa ĠParameter Description Ġwith Ġname Ġ$ k " ĊĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġresult [ desc . param ] Ġ= Ġdesc . convertTo Target Type ( v ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġresult ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠAccess ible Ġand Ġnot Ġabstract ĊĠĠ Ġ*/ ĊĠ Ġprivate Ġfun Ġvalidate Function () Ġ{ ĊĠĠĠ Ġif Ġ( function . is Abstract ) Ġ{ ĊĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Keyword Ġfunctions Ġmay Ġnot Ġabstract ! ĠMake Ġ'$ name ' Ġconcrete .") ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ( K Visibility . PUBLIC Ġ!= Ġfunction . visibility ) Ġ{ ĊĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Function Ġ'$ name ' Ġis Ġnot Ġaccessible ! ĠMake Ġit Ġpublic .") ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠRetrieves Ġthe Ġdeclaring Ġclass Ġof Ġthis Ġfunction . ĊĠĠ Ġ* ĊĠĠ Ġ* Ġ@ throws ĠIllegalArgumentException Ġwhen Ġgiven Ġfunction Ġis Ġnot Ġwithin Ġa Ġreal Ġclass ĊĠĠ Ġ*/ ĊĠ Ġprivate Ġfun Ġdetect Decl aring Class (): ĠK Class < *> Ġ{ ĊĠĠĠ Ġval Ġthis Arg Ġ= Ġfunction . instance Parameter ĊĠĠĠĠĠ Ġ?: Ġthrow ĠIllegalArgumentException ( ĊĠĠĠĠĠĠĠ Ġ" Keyword Ġannotation Ġmay Ġonly Ġbe Ġplaced Ġon Ġmember Ġfunctions ! ĠMove Ġfunction Ġ'$ name ' Ġto Ġa Ġclass ." ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠ Ġreturn Ġthis Arg . type . classifier Ġas ĠK Class < *> ĊĠĠĠ Ġ} Ġcatch Ġ( n pe : ĠNullPointerException ) Ġ{ ĊĠĠĠĠĠ Ġthrow ĠIllegalArgumentException ( ĊĠĠĠĠĠĠĠ Ġ" Cannot Ġretrieve Ġclass Ġfor Ġmethod Ġ'$ name '! ĠIntersection Ġtypes Ġare Ġnot Ġsupported !", ĊĠĠĠĠĠĠĠ Ġn pe ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ġcatch Ġ( cce : ĠClass CastException ) Ġ{ ĊĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Something Ġwent Ġtotally Ġwrong ! ĠCould Ġnot Ġcast Ġto ĠK Class .", Ġc ce ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġnormalize Summary ( summary : ĠArray < String >): ĠString Ġ{ ĊĠĠĠ Ġreturn Ġsummary . map Ġ{ Ġit . trim () Ġ}. filter Ġ{ Ġit . isNotEmpty () Ġ}. join ToString (" Ġ"). let Ġ{ ĊĠĠĠĠĠ Ġif Ġ( it . isNotBlank ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġ"* Summary * :\ n \ n $ it \ n " ĊĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġ"" ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġcreate Details Description ( details : ĠArray < String >): ĠString Ġ{ ĊĠĠĠ Ġreturn Ġif Ġ( details . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠ Ġdetails . join ToString ("\ n ", Ġprefix Ġ= Ġ"\ n * Details * :\ n \ n ") Ġ{ Ġit . trim () Ġ} ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠ Ġ"" ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġcreate Parameter Doc () Ġ= ĊĠĠĠ Ġif Ġ( parameters . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠ Ġ"\ n * Parameters * :\ n " Ġ+ Ġparameters . join ToString ( ĊĠĠĠĠĠĠĠ Ġ"\ n - Ġ", Ġprefix Ġ= Ġ"- Ġ" ĊĠĠĠĠĠ Ġ) Ġ{ Ġit . documentation Ġ} ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠ Ġ"" ĊĠĠĠ Ġ} Ċ } Ċ