package Ġcom . pp lo der . regular map Ċ Ċ import Ġcom . pp lo der . regular map . err . Constructor Retrie val Exception Ċ import Ġcom . pp lo der . regular map . err . Illegal Parameter Exception Ċ import Ġcom . pp lo der . regular map . err . Mismatch Exception Ċ import Ġcom . pp lo der . regular map . err . Regular Map Exception Ċ import Ġjava . util . regex . Pattern Ċ import Ġkotlin . reflect . K Function Ċ import Ġkotlin . reflect . K Parameter Ċ import Ġkotlin . reflect . full . cast Ċ import Ġkotlin . reflect . full . is Subclass Of Ċ import Ġkotlin . reflect . jvm . jvm Er asure Ċ Ċ /** Ċ Ġ* ĠMat ches Ġthe Ġgiven Ġinput Ġwith Ġthe Ġpattern Ġand Ġmaps Ġthe Ġresult Ġto Ġan Ġinstance Ġof Ġthe Ġgiven Ġtype . Ċ Ġ* ĠIf Ġthe Ġtype Ġcontains Ġmore Ġthan Ġone Ġconstructor Ġthe Ġone Ġwith Ġthe Ġ[ Regular Map Target ] Ġannotation Ġwill Ġbe Ġused . Ċ Ġ* ĠOnly Ġone Ġconstructor Ġmay Ġbe Ġannotated Ġwith Ġthis Ġannotation . ĠAll Ġconstructor Ġparameters Ġmust Ġbe Ġannotated Ġwith Ġa Ġsingle Ċ Ġ* Ġrelevant Ġannotation . ĠSee Ġ[ map Call ] Ġfor Ġthe Ġlist Ġof Ġrelevant Ġannotations . Ċ Ġ* Ċ Ġ* Ġ@ param ĠT ĠThe Ġtype Ġof Ġthe Ġmap Ġtarget Ċ Ġ* Ġ@ param Ġinput ĠThe Ġinput Ġcharacter Ġsequence Ġthat Ġshould Ġbe Ġmatched Ġto Ġthe Ġpattern Ċ Ġ* Ġ@ return ĠA Ġnew Ġinstance Ġof Ġthe Ġgiven Ġtype Ġwith Ġall Ġrequested Ġinformation Ġinjected Ġvia Ġthe Ġrelevant Ġconstructor Ċ Ġ*/ Ċ inline Ġfun Ġ< re ified ĠT > ĠPattern . map Object ( input : ĠCharSequence ) Ġ= Ġmap Call ( find Re levant Constructor < T >(), Ġinput ) Ċ Ċ /** Ċ Ġ* ĠMat ches Ġthe Ġgiven Ġinput Ġwith Ġthe Ġpattern Ġand Ġpasses Ġthe Ġrequested Ġinformation Ġfrom Ġthe Ġmatch Ġto Ġthe Ġgiven Ġfunction . Ċ Ġ* ĠAll Ġparameters Ġmust Ġbe Ġannotated Ġwith Ġa Ġsingle Ġrelevant Ġannotation . Ċ Ġ* Ċ Ġ* ĠRe levant Ġannotations Ġare : Ċ Ġ* Ġ- Ġ[ Named Group ] Ċ Ġ* Ġ- Ġ[ Group ] Ċ Ġ* Ġ- Ġ[ Group Count ] Ċ Ġ* Ġ- Ġ[ Group List ] Ċ Ġ* Ġ- Ġ[ Named Group Offset ] Ċ Ġ* Ġ- Ġ[ Group Offset ] Ċ Ġ* Ċ Ġ* Ġ@ param ĠT ĠThe Ġreturn Ġtype Ġof Ġthe Ġfunction Ċ Ġ* Ġ@ param Ġinput ĠThe Ġinput Ġcharacter Ġsequence Ġthat Ġshould Ġbe Ġmatched Ġto Ġthe Ġpattern Ċ Ġ* Ġ@ return ĠThe Ġresult Ġof Ġthe Ġgiven Ġfunction Ġafter Ġthe Ġrequested Ġinformation Ġwas Ġpassed Ġto Ġit Ċ Ġ* Ġ@ throws Ġ[ Mismatch Exception ] ĠIf Ġthe Ġinput Ġdoes Ġnot Ġmatch Ġthe Ġpattern Ċ Ġ* Ġ@ throws Ġ[ Illegal Parameter Exception ] ĠIf Ġthe Ġfunction Ġparameters Ġare Ġannotated Ġincorrectly Ċ Ġ*/ Ċ fun Ġ< T > ĠPattern . map Call ( function : ĠK Function < T >, Ġinput : ĠCharSequence ): ĠT Ġ{ ĊĠĠĠ Ġval Ġmatcher Ġ= Ġmatcher ( input ) !! ĊĊĠĠĠ Ġif Ġ(! matcher . find ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠMis match Exception ( this , Ġinput . toString ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġnamed Groups Ġ= Ġmutable ListOf < String >() ĊĠĠĠ Ġval Ġcaptured Groups Ġ= Ġmutable ListOf < Int >() ĊĊĠĠĠ Ġval Ġparams Ġ= Ġfunction . parameters . map Ġ{ ĠParameter ( it , Ġfind Re levant Annotation ( it )) Ġ} ĊĠĠĠ Ġval Ġfunction Args Ġ= Ġparams . map Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( it . annotation Ġis ĠNamed Group ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert ParameterType < String >( it . parameter ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgroup Ġ= Ġit . annotation . groupName ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnamed Groups . add ( group ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmatcher . group ( group ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( it . annotation Ġis ĠGroup ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert ParameterType < String >( it . parameter ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgroup Ġ= Ġit . annotation . groupId ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcaptured Groups . add ( group ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmatcher . group ( group ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( it . annotation Ġis ĠGroup Count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert ParameterType < Number >( it . parameter ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . parameter . type . jvm Er asure . cast ( matcher . group Count ()) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( it . annotation Ġis ĠGroup List ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert ParameterType < Collection < String >>( it . parameter ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( 0 .. matcher . group Count ()). map Ġ{ Ġmatcher . group ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( it . annotation Ġis ĠNamed Group Offset ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert ParameterType < Pair < Number , ĠNumber >>( it . parameter ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠPair < Number , ĠNumber >( matcher . start ( it . annotation . groupName ), Ġmatcher . end ( it . annotation . groupName )) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( it . annotation Ġis ĠGroup Offset ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert ParameterType < Pair < Number , ĠNumber >>( it . parameter ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠPair < Number , ĠNumber >( matcher . start ( it . annotation . groupId ), Ġmatcher . end ( it . annotation . groupId )) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRegular Map Exception (" Annotation Ġ${ it . annotation . annotation Class . qualified Name } Ġis Ġregistered Ġas Ġa Ġvalid Ġannotation Ġbut Ġhas Ġnot Ġmapping Ġfunctionality ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġfunction . call (* function Args . to Typed Array ()) Ċ } Ċ Ċ inline Ġfun Ġ< re ified ĠT > Ġfind Re levant Constructor (): ĠK Function < T > Ġ{ ĊĠĠĠ Ġval Ġconstructors Ġ= ĠT :: class . construct ors ĊĊĠĠĠ Ġif Ġ( construct ors . size Ġ== Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġconstructors . single () ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrelevant Ġ= Ġconstructors . filter Ġ{ Ġit :: class . annotations . filter Ġ{ Ġit Ġis ĠRegular Map Target Ġ}. isNotEmpty () Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( relevant . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠConstructor Retrie val Exception ( T :: class , Ġ" The Ġclass Ġ${ T :: class } Ġcontains Ġno Ġconstructor Ġannotated Ġwith Ġthe Ġ${ Regular Map Target :: class . qualified Name } Ġannotation ") ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( relevant . size Ġ> Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠConstructor Retrie val Exception ( T :: class , Ġ" The Ġclass Ġ${ T :: class } Ġcontains Ġmore Ġthan Ġa Ġsingle Ġrelevant Ġconstructor : Ġ$ relevant ") ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġrelevant . first () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ internal Ġfun Ġfind Re levant Annotation ( parameter : ĠK Parameter ): ĠAnnotation Ġ{ ĊĠĠĠ Ġval Ġrelevant Ġ= Ġparameter . annotations . filter Ġ{ Ġit . annotation Class Ġin Ġvalue Annotations Ġ} ĊĊĠĠĠ Ġif Ġ( relevant . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠIllegal Parameter Exception ( parameter , Ġ" The Ġparameter Ġ${ parameter . name } Ġcontains Ġno Ġrelevant Ġannotation ") ĊĠĠĠ Ġ} Ġelse Ġif Ġ( relevant . size Ġ> Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠIllegal Parameter Exception ( parameter , Ġ" The Ġparameter Ġ${ parameter . name } Ġhas Ġmore Ġthan Ġa Ġsingle Ġrelevant Ġannotation : Ġ$ relevant ") ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġrelevant . first () ĊĠĠĠ Ġ} Ċ } Ċ Ċ internal Ġinline Ġfun Ġ< re ified ĠT Ġ: ĠAny > Ġassert ParameterType ( parameter : ĠK Parameter ) Ġ{ ĊĠĠĠ Ġval Ġparameter Class Ġ= Ġparameter . type . jvm Er asure ĊĠĠĠ Ġval Ġrequired Class Ġ= ĠT :: class ĊĠĠĠ Ġif Ġ( parameter Class Ġ!= Ġrequired Class Ġ&& Ġ! parameter Class . is Subclass Of ( required Class )) Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠIllegal Parameter Exception ( parameter , Ġ" Parameter Ġ${ parameter . name } Ġdoes Ġnot Ġhave Ġrequired Ġtype Ġ${ T :: class . qualified Name }") ĊĠĠĠ Ġ} Ċ } Ċ Ċ internal Ġdata Ġclass ĠParameter ( val Ġparameter : ĠK Parameter , Ġval Ġannotation : ĠAnnotation ) Ċ