package Ġcom . map k . core Ċ Ċ import Ġcom . map k . annotations . K Constructor Ċ import Ġcom . map k . annotations . K Parameter Flatten Ċ import Ġcom . map k . core . internal . Argument Binder Ċ import Ġcom . map k . core . internal . Bucket Generator Ċ import Ġcom . map k . core . internal . ParameterName Converter Ċ import Ġcom . map k . core . internal . get Alias Or Name Ċ import Ġcom . map k . core . internal . is Use Default Argument Ċ import Ġkotlin . reflect . K Class Ċ import Ġkotlin . reflect . K Function Ċ import Ġkotlin . reflect . K Parameter Ċ import Ġkotlin . reflect . full . find Annotation Ċ import Ġkotlin . reflect . full . primary Constructor Ċ import Ġkotlin . reflect . jvm . is Accessible Ċ import Ġkotlin . reflect . jvm . jvm Name Ċ import Ġorg . jetbrains . annotations . Test Only Ċ Ċ class ĠK Function For Call < T > Ġinternal Ġconstructor ( ĊĠĠĠ Ġ@ Test Only ĊĠĠĠ Ġinternal Ġval Ġfunction : ĠK Function < T >, ĊĠĠĠ Ġparameter Name Converter : ĠParameter Name Converter , ĊĠĠĠ Ġinstance : ĠAny ? Ġ= Ġnull Ċ ) Ġ{ ĊĠĠĠ Ġconstructor ( function : ĠK Function < T >, Ġparameter Name Converter : Ġ( String ) Ġ-> ĠString , Ġinstance : ĠAny ? Ġ= Ġnull ) Ġ: Ġthis ( ĊĠĠĠĠĠĠĠ Ġfunction , ĊĠĠĠĠĠĠĠ ĠParameter Name Converter . Simple ( parameter Name Converter ), ĊĠĠĠĠĠĠĠ Ġinstance ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġ@ Test Only ĊĠĠĠ Ġinternal Ġval Ġparameters : ĠList < K Parameter > Ġ= Ġfunction . parameters ĊĊĠĠĠ Ġ// Ġä¸Ĭ ãģ¯ å¤ĸéĥ¨ ãģ¸ãģ® åħ¬ éĸĭ çĶ¨ ãĢģ ä¸ĭ ãģ¯ Argument Adaptor çĶŁæĪĲ çĶ¨ ĊĠĠĠ Ġval Ġrequired Parameters : ĠList < Value Parameter <* >> ĊĠĠĠ Ġprivate Ġval Ġrequired Parameters Map : ĠMap < String , ĠValue Parameter <* >> ĊĊĠĠĠ Ġprivate Ġval Ġbucket Generator : ĠBucket Generator ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( parameters . isEmpty () Ġ|| Ġ( instance Ġ!= Ġnull Ġ&& Ġparameters . size Ġ== Ġ 1 )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" This Ġfunction Ġis Ġnot Ġrequire Ġarguments .") ĊĊĠĠĠĠĠĠĠ Ġ// Ġãģĵãģ® éĸ¢æķ° ãģ«ãģ¯ ç¢º å®Ł ãģ« ãĤ¢ãĤ¯ãĤ»ãĤ¹ ãģĻãĤĭãģŁãĤģ ãĤ¢ãĤ¯ ãĤ» ãĤ· ãĥĵ ãĥªãĥĨãĤ£ æĽ¸ ãģį æıĽ ãģĪ ĊĠĠĠĠĠĠĠ Ġfunction . is Accessible Ġ= Ġtrue ĊĊĠĠĠĠĠĠĠ Ġval Ġbind ers : ĠList < Argument Binder > Ġ= Ġparameters ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . kind Ġ== ĠK Parameter . Kind . VALUE Ġ&& Ġ! it . is Use Default Argument () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . to Argument Binder ( parameter Name Converter ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġbucket Generator Ġ= ĠBucket Generator ( parameters , Ġbind ers , Ġinstance ) ĊĊĠĠĠĠĠĠĠ Ġval Ġtemp List Ġ= ĠArrayList < Value Parameter < *> >( bind ers . size ) ĊĠĠĠĠĠĠĠ Ġval Ġtemp Map Ġ= ĠHashMap < String , ĠValue Parameter < *> >( bind ers . size ) ĊĊĠĠĠĠĠĠĠ Ġbind ers . forEach Ġ{ Ġbinder Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( binder ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠArgument Binder . Value < *> Ġ-> Ġadd Args ( binder , Ġtemp List , Ġtemp Map ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠArgument Binder . Function Ġ-> Ġbinder . required Parameters . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Args ( it , Ġtemp List , Ġtemp Map ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġrequired Parameters Ġ= Ġtemp List ĊĠĠĠĠĠĠĠ Ġrequired Parameters Map Ġ= Ġtemp Map ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġadd Args ( ĊĠĠĠĠĠĠĠ Ġparameter : ĠValue Parameter <* >, ĊĠĠĠĠĠĠĠ Ġtemp List : ĠArrayList < Value Parameter <* >>, ĊĠĠĠĠĠĠĠ Ġtemp Map : ĠMutable Map < String , ĠValue Parameter <* >> ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( temp Map . containsKey ( parameter . name )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" The Ġargument Ġname Ġ${ parameter . name } Ġis Ġduplicated .") ĊĠĠĠĠĠĠĠ Ġtemp Map [ parameter . name ] Ġ= Ġparameter ĊĠĠĠĠĠĠĠ Ġtemp List . add ( parameter ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Argument Adaptor (): ĠArgument Adaptor Ġ= ĠArgument Adaptor ( required Parameters Map ) ĊĊĠĠĠ Ġfun Ġcall ( adapt or : ĠArgument Adaptor ): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbucket Ġ= Ġbucket Generator . generate ( adapt or ) ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( bucket . isInitialized ) Ġfunction . call (* bucket . value Array ) Ġelse Ġfunction . call By ( bucket ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Suppress (" UN CHECK ED _ CAST ") Ċ internal Ġfun Ġ< T Ġ: ĠAny > ĠK Class < T >. to K Constructor ( parameter Name Converter : ĠParameter Name Converter ): ĠK Function For Call < T > Ġ{ ĊĠĠĠ Ġval Ġconstructors Ġ= ĠArrayList < K Function For Call < T >>() ĊĊĠĠĠ Ġthis . get Annotated Functions From Companion Object < K Constructor >() ?. let Ġ{ Ġ( instance , Ġfunctions ) Ġ-> ĊĠĠĠĠĠĠĠ Ġfunctions . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconstructors . add ( K Function For Call ( it Ġas ĠK Function < T >, Ġparameter Name Converter , Ġinstance )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġthis . construct ors . get Annotated Functions < K Constructor , ĠT >(). forEach Ġ{ ĊĠĠĠĠĠĠĠ Ġconstructors . add ( K Function For Call ( it , Ġparameter Name Converter )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġif Ġ( construct ors . size Ġ== Ġ 1 ) Ġreturn Ġconstructors . single () ĊĊĠĠĠ Ġif Ġ( construct ors . isEmpty ()) Ġreturn ĠK Function For Call ( this . primary Constructor !! , Ġparameter Name Converter ) ĊĊĠĠĠ Ġthrow ĠIllegalArgumentException ("${ this . jvm Name } Ġhas Ġmultiple Ġ${ K Constructor :: class . jvm Name }. ") Ċ } Ċ Ċ @ Suppress (" UN CHECK ED _ CAST ") Ċ fun Ġ< T Ġ: ĠAny > ĠK Class < T >. to K Constructor ( parameter Name Converter : Ġ( String ) Ġ-> ĠString ): ĠK Function For Call < T > Ġ= ĊĠĠĠ Ġthis . to K Constructor ( ParameterName Converter . Simple ( parameter Name Converter )) Ċ Ċ private Ġfun ĠK Parameter . to Argument Binder ( parameter Name Converter : ĠParameter Name Converter ): ĠArgument Binder Ġ{ ĊĠĠĠ Ġval Ġname Ġ= Ġget Alias Or Name () !! ĊĊĠĠĠ Ġreturn Ġfind Annotation < K Parameter Flatten >() ?. let Ġ{ Ġannotation Ġ-> ĊĠĠĠĠĠĠĠ Ġ// Ġ åĲįåīį ãģ® å¤ī æıĽ åĩ¦çĲĨ ĊĠĠĠĠĠĠĠ Ġval Ġconverter : ĠParameter Name Converter Ġ= Ġif Ġ( annotation . fieldName To Prefix ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ çµĲ åĲĪ ãģĮ å¿ħè¦ģ ãģª åł´åĲĪãģ¯ çµĲ åĲĪ æ©Łèĥ½ ãģ® ãĤ¤ãĥ³ ãĤ¹ãĤ¿ ãĥ³ãĤ¹ ãĤĴ æĮģ ãģ£ãģ¦ ãģį ãģ¦ å¯¾ å¿ľ ãģĻãĤĭ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparameter Name Converter . nest ( name , Ġannotation . name Join er . object Instance !! ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ ãĥĹ ãĥ¬ ãĥķãĤ£ ãĥĥãĤ¯ãĤ¹ ãĤĴ è¦ģæ±Ĥ ãģĹãģªãģĦ åł´åĲĪãģ¯ åħ¨ ãģ¦ simple ãģ§ ãĥŀ ãĥĥãĥĹ ãģĻãĤĭ ãĤĪãģĨãģ« ä¿®æŃ£ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparameter Name Converter . to Simple () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠArgument Binder . Function ( get K Class (). to K Constructor ( converter ), Ġindex , Ġannotations ) ĊĠĠĠ Ġ} Ġ?: ĠArgument Binder . Value ( ĊĠĠĠĠĠĠĠ Ġindex , ĊĠĠĠĠĠĠĠ Ġannotations , ĊĠĠĠĠĠĠĠ Ġis Optional , ĊĠĠĠĠĠĠĠ Ġparameter Name Converter . convert ( name ), ĊĠĠĠĠĠĠĠ Ġget K Class () ĊĠĠĠ Ġ) Ċ } Ċ