package Ġcom . ka u fl and . generation . mapper Ċ Ċ import Ġcom . ka u fl and . Post ValidationException Ċ import Ġcom . ka u fl and . Processing Context Ċ import Ġcom . ka u fl and . Processing Context . is Assignable Ċ import Ġcom . ka u fl and . generation . Map ify able Impl Generation Ċ import Ġcom . ka u fl and . model . mapper . Map ify Holder Ċ import Ġcom . ka u fl and . model . mapper . Mapper Holder Ċ import Ġcom . ka u fl and . util . Field Extraction Util Ċ import Ġcom . ka u fl and . util . Type Util Ċ import Ġcom . squareup . kotlin po et .* Ċ import Ġcom . squareup . kotlin po et . Parameterized TypeName . Companion . parameter ized By Ċ import Ġk au fl and . com . co ach base binder api . map ify . Map ify able Ċ import Ġk au fl and . com . co ach base binder api . map ify . Mapper Ċ import Ġjava . io . Serializable Ċ import Ġjava . util .* Ċ Ċ class ĠMapper Generation Ġ{ ĊĊĠĠĠ Ġfun Ġgenerate ( holder : ĠMapper Holder ): ĠFile Spec Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġmapper Type Param Ġ= Ġholder . decl aring Name . as Full TypeName () Ġ?: Ġholder . source Clazz TypeName ĊĊĠĠĠĠĠĠĠ Ġval Ġtype Spec Ġ= ĠType Spec . class Builder ( holder . target Mapper Simple Name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Super interface ( Type Util . i Mapper ( mapper Type Param )) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( holder . type Params . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconstructor Builder Ġ= ĠFun Spec . constructor Builder () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġholder . type Params . forEach Indexed Ġ{ Ġindex , Ġtype Variable Symbol Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Spec . add Type Variable ( Type Variable Name ( type Variable Symbol . name )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Spec . addProperty ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠProperty Spec . builder (" type Param $ index ", ĠType Util . i Map ify able ( Type Variable Name ( type Variable Symbol . name ). copy ( nullable Ġ= Ġtrue ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. initializer (" type Param $ index ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Modifiers ( K Modifier . PRIVATE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconstructor Builder . add Parameter (" type Param $ index ", ĠType Util . i Map ify able ( Type Variable Name ( type Variable Symbol . name ). copy ( nullable Ġ= Ġtrue ))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype Spec . primary Constructor ( constructor Builder . build ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġfrom Map Ġ= ĠFun Spec . builder (" from Map ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Modifiers ( K Modifier . OVERRIDE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Parameter (" obj ", Ġmapper Type Param ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Parameter (" map ", ĠType Util . map String Any ()) ĊĊĠĠĠĠĠĠĠ Ġval Ġto Map Ġ= ĠFun Spec . builder (" toMap ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Modifiers ( K Modifier . OVERRIDE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Parameter (" obj ", Ġmapper Type Param ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. returns ( Type Util . map String Any ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Statement (" val Ġmap Ġ= Ġ% T ()", ĠType Util . hash Map String Any ()) ĊĊĠĠĠĠĠĠĠ Ġval Ġadded Helpers Ġ= Ġmutable Set Of < String >() ĊĠĠĠĠĠĠĠ Ġfor Ġ( field WithType Param Ġin Ġholder . fields . values . filter Ġ{ Ġit . type Handle Mode Ġ== ĠMap ify Holder . Type Handle Mode . MAP PER Ġ&& Ġit . decl aring Name . type Params . isNotEmpty () Ġ}) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( map ify Helper Ġin Ġfield WithType Param . decl aring Name . type Params ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhelper Clazz Name Ġ= Ġbuild Helper Clazz Name ( map ify Helper ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( added Helpers . contains ( helper Clazz Name )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadded Helpers . add ( helper Clazz Name ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparam Ġ= ĠResolver Param () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparam . from Map Builder . begin Control Flow (" return Ġmap [% S ]. let ", Ġ" value ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparam . toMap Builder . add Statement (" val Ġmap Ġ= Ġ% T ()", ĠType Util . hash Map String Any ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparam . toMap Builder . begin Control Flow (" obj ?. let ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresolve Decl aring Name ( map ify Helper , Ġparam , Ġ"", Ġempty List ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparam . from Map Builder . end Control Flow () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparam . toMap Builder . end Control Flow () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparam . toMap Builder . begin Control Flow (" ?. apply ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparam . toMap Builder . add Statement (" map [% S ] Ġ= Ġthis ", Ġ" value ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparam . toMap Builder . end Control Flow () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparam . toMap Builder . add Statement (" return Ġmap ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠPost ValidationException ( e , Ġ* field WithType Param . elements ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Spec . add Type ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMap ify able Impl Generation . type Spec ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMap ify able Impl Generation . Config ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodifiers Ġ= ĠarrayOf ( K Modifier . PRIVATE ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclazz Name Ġ= Ġhelper Clazz Name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Param Ġ= Ġmap ify Helper . as Full TypeName () !!. copy ( nullable Ġ= Ġtrue ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfrom Map Ġ= Ġ{ Ġit . add Code ( param . from Map Builder . build ()). build () Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġto Map Ġ= Ġ{ Ġit . add Code ( param . toMap Builder . build ()). build () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( field Ġin Ġholder . fields . values ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype Spec . add Properties ( field . reflection Properties ( holder . source Clazz TypeName )) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype Spec . addProperty ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠProperty Spec . builder ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfield . accessor Name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfield . decl aring Name . as Full TypeName ()?. copy ( nullable Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġfield . typeName . copy ( nullable Ġ= Ġtrue ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠK Modifier . PRIVATE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). receiver ( mapper Type Param ). mutable ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. getter ( field . getter Fun Spec ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setter ( field . setter Fun Spec ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresolver Param Ġ= ĠResolver Param () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresolver Param ?. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresolver Param . from Map Builder . begin Control Flow (" map [% S ]?. let ", Ġfield . map Name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresolver Param . toMap Builder . begin Control Flow (" obj .% N ?. let ", Ġfield . accessor Name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresolve Decl aring Name ( field . decl aring Name , Ġresolver Param , Ġfield . accessor Name , Ġholder . type Params ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresolver Param . from Map Builder . end Control Flow () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresolver Param . from Map Builder . begin Control Flow (" ?. apply ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresolver Param . from Map Builder . add Statement (" obj .% N = this ", Ġfield . accessor Name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresolver Param . from Map Builder . end Control Flow () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresolver Param . toMap Builder . end Control Flow () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresolver Param . toMap Builder . begin Control Flow (" ?. apply ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresolver Param . toMap Builder . add Statement (" map [% S ]= this ", Ġfield . map Name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresolver Param . toMap Builder . end Control Flow () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfrom Map . add Code ( resolver Param . from Map Builder . build ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġto Map . add Code ( resolver Param . toMap Builder . build ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠPost ValidationException ( e , Ġ* field . map ify Element . elements ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġto Map . add Statement (" return Ġmap ") ĊĊĠĠĠĠĠĠĠ Ġtype Spec . addFunction ( from Map . build ()) ĊĠĠĠĠĠĠĠ Ġtype Spec . addFunction ( toMap . build ()) ĊĊĠĠĠĠĠĠĠ Ġreturn ĠFile Spec . get ( holder .` package `, Ġtype Spec . build ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġbuild Helper Clazz Name ( name : ĠProcessing Context . Decl aring Name ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ" Helper ${ name . name . split ('. '). map Ġ{ Ġit . capitalize () Ġ}. join ToString ( separator Ġ= Ġ"") }" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġdata Ġclass ĠResolver Param ( val Ġfrom Map Builder : ĠCode Block . Builder Ġ= ĠCode Block . builder (), Ġval Ġto Map Builder : ĠCode Block . Builder Ġ= ĠCode Block . builder ()) ĊĊĠĠĠ Ġ@ Throws ( Exception :: class ) ĊĠĠĠ Ġprivate Ġfun Ġresolve Decl aring Name ( name : ĠProcessing Context . Decl aring Name , Ġresolver Param : ĠResolver Param , Ġaccessor Name : ĠString , Ġtype Params : ĠList < Processing Context . Decl aring Name >) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġif Ġ( name . is Processing Type ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresolver Param . from Map Builder . add Statement ("% T . Mapper (). from Map ( it Ġas Ġ% T )", Ġname . as TypeName () !! , ĠType Util . map String Any ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġresolver Param . toMap Builder . add Statement ("% T . Mapper (). toMap ( it )", Ġname . as TypeName () !! ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( name . is Plain Type ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġname . as TypeName ()?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresolver Param . from Map Builder . add Statement (" it Ġas Ġ% T ", Ġit ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresolver Param . toMap Builder . add Statement (" it ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( name . is Type Var ()) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype Params . indexOf First Ġ{ Ġit . name Ġ== Ġname . name Ġ} ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresolver Param . from Map Builder . add Statement (" type Param $ it . from Map ( it Ġas Ġ% T )", ĠType Util . map String Any ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresolver Param . toMap Builder . add Statement (" type Param $ it . toMap ( it )") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( name . as Type Element ()?. getAnnotation ( Mapper :: class . java ) Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmapper TypeName Ġ= ĠClass Name . best Guess ("${ name . name } Mapper ") ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( name . type Params . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . parameter ized By ( name . type Params . map NotNull Ġ{ Ġit . as Full TypeName () Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfull TypeName Ġ= Ġname . as Full TypeName () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhelper Init Ġ= Ġname . type Params . map Ġ{ Ġ"${ build Helper Clazz Name ( it )} ()" Ġ}. join ToString () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( name . has Empty Constructor ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresolver Param . from Map Builder . add Statement (" val Ġmy Obj Ġ= Ġobj .% N Ġ?: Ġ% T ()", Ġaccessor Name , Ġfull TypeName ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresolver Param . from Map Builder . add Statement (" val Ġmy Obj Ġ= Ġobj .% N ", Ġaccessor Name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġresolver Param . from Map Builder . begin Control Flow (" my Obj ?. let ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresolver Param . from Map Builder . add Statement (" obj Ġ-> ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresolver Param . from Map Builder . add Statement ("% T ($ helper Init ). from Map ( obj , Ġit Ġas Ġ% T )", Ġmapper TypeName !! , ĠType Util . map String Any ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresolver Param . from Map Builder . end Control Flow () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresolver Param . from Map Builder . add Statement (" my Obj ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġresolver Param . toMap Builder . add Statement ("% T ($ helper Init ). toMap ( it )", Ġmapper TypeName !! ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġname . as Type Element ()?. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Annotation ( Map ify able :: class . java ) Ġ!= Ġnull Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠField Extraction Util . type Mirror ( getAnnotation ( Map ify able :: class . java )) ?. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfull TypeName Ġ= ĠProcessing Context . Decl aring Name ( this ). as Full TypeName () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresolver Param . from Map Builder . add Statement ("% T (). from Map ( it Ġas Ġ% T )", Ġfull TypeName !! , ĠType Util . map String Any ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresolver Param . toMap Builder . add Statement ("% T (). toMap ( it )", Ġfull TypeName !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Assignable ( List :: class . java ) Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresolver Param . toMap Builder . begin Control Flow (" it . map ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmap Fun Ġ= Ġif Ġ( name . type Params [ 0 ]. is Nullable ()) Ġ" map " Ġelse Ġ" map NotNull " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresolver Param . from Map Builder . begin Control Flow ("( it Ġas ? Ġ% T )? .$ map Fun ", ĠType Util . list ( Type Util . any ())) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresolve Decl aring Name ( name . type Params [ 0 ], Ġresolver Param , Ġaccessor Name , Ġtype Params ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresolver Param . toMap Builder . end Control Flow () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresolver Param . from Map Builder . end Control Flow () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Assignable ( Map :: class . java ) Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresolver Param . toMap Builder . begin Control Flow (" it . map ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresolver Param . toMap Builder . begin Control Flow ("( it . key . let ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresolver Param . from Map Builder . begin Control Flow ("( it Ġas ? Ġ% T )?. map ", ĠType Util . map Any Any ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresolver Param . from Map Builder . begin Control Flow ("( it . key . let ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresolve Decl aring Name ( name . type Params [ 0 ], Ġresolver Param , Ġaccessor Name , Ġtype Params ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresolver Param . toMap Builder . end Control Flow () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresolver Param . toMap Builder . begin Control Flow (" Ġto Ġit . value . let ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresolver Param . from Map Builder . end Control Flow () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresolver Param . from Map Builder . begin Control Flow (" Ġto Ġit . value . let ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresolve Decl aring Name ( name . type Params [ 1 ], Ġresolver Param , Ġaccessor Name , Ġtype Params ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresolver Param . toMap Builder . end Control Flow () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresolver Param . toMap Builder . add Statement (" )") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresolver Param . toMap Builder . end Control Flow () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresolver Param . toMap Builder . add Statement (" ?. toMap () ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresolver Param . from Map Builder . end Control Flow () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresolver Param . from Map Builder . add Statement (" )") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresolver Param . from Map Builder . end Control Flow () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresolver Param . from Map Builder . add Statement (" ?. toMap () ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Assignable ( Serializable :: class . java ) Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresolver Param . from Map Builder . add Statement ("% T (). from Map ( it Ġas Ġ% T )", ĠType Util . serial izable Map ify able ( name . as Full TypeName () !!. copy ( nullable Ġ= Ġfalse )), ĠType Util . map String Any ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresolver Param . toMap Builder . add Statement ("% T (). toMap ( it )", ĠType Util . serial izable Map ify able ( name . as Full TypeName () !!. copy ( nullable Ġ= Ġfalse ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠException ("${ name . name } Ġis Ġnot Ġ${ Map ify able :: class . java . simple Name } Ġor Ġplain Ġor Ġany Ġother Ġparse able Ġtype .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ