package Ġcom . github . afe zer ia . kt mapping Ċ Ċ import Ġcom . github . afe zer ia . kt mapping . model . Entity Model Ċ import Ġcom . google . devtools . k sp . symbol . KS Function Declaration Ċ import Ġcom . squareup . kotlin po et . Fun Spec Ċ import Ġcom . squareup . kotlin po et . K Modifier Ċ import Ġcom . squareup . kotlin po et . Parameter Spec Ċ import Ġcom . squareup . kotlin po et . TypeName Ċ Ċ /** Ċ Ġ* Ċ Ġ* Ġ@ date Ġ 2 0 2 1 / 8 / 1 6 Ċ Ġ*/ Ċ class ĠBuild Function Ġprivate Ġconstructor ( private Ġval Ġfn : ĠK S Function Declaration ) Ġ{ ĊĠĠĠ Ġvar Ġbuilder : ĠFun Spec . Builder Ġ= ĠFun Spec . builder ( fn . simple Name . asString ()) ĊĠĠĠĠĠĠĠ Ġ. add Modifiers ( K Modifier . OVERRIDE ) ĊĠĠĠĠĠĠĠ Ġ. returns ( fn . returnType !!. className ()) ĊĠĠĠĠĠĠĠ Ġ. also Ġ{ Ġspec Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfn . parameters . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġspec . add Parameter ( Parameter Spec ( it . name Str , Ġit . type . className ())) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġbuild (): ĠFun Spec Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( ctx . is Update Function ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Update Function () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Mapping Function () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġbuild Mapping Function (): ĠFun Spec Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtypes : ĠMutable List < TypeName ?> Ġ= Ġmutable ListOf ( ctx . target Model . type . className ( false )) ĊĠĠĠĠĠĠĠ Ġval Ġconstructor Str Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġctx . target Model . constructor . parameters . join ToString Ġ{ Ġparameter Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( str , Ġtype , Ġ_) Ġ= Ġctx . source Model . create Source Getter Invoke Chain ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġctx . target 2 Sources [ parameter . name Str ] !! , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparameter . ks Type ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtypes Ġ+= Ġtype ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstr ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" val Ġresult Ġ= Ġ% T ($ it )" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġbuilder . add Statement ( constructor Str , Ġ* types . filter NotNull (). to Typed Array ()) ĊĊĠĠĠĠĠĠĠ Ġctx . target 2 Sources ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġctx . target Model . getProperty ( it . key ) !! Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . has Setter Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Ġ{ Ġproperty Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsetter Str Ġ= Ġctx . target Model . create Setter Invoke ( property . name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( getter Str , Ġtype , Ġ_) Ġ= Ġctx . source Model . create Source Getter Invoke Chain ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġctx . target 2 Sources [ property . name ] !! , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproperty . type ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . add Statement ( setter Str Ġ+ Ġgetter Str , Ġ* type . to Typed Array ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġbuilder . add Statement (" return Ġresult ") ĊĠĠĠĠĠĠĠ Ġreturn Ġbuilder . build () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġbuild Update Function (): ĠFun Spec Ġ{ ĊĠĠĠĠĠĠĠ Ġctx . target 2 Sources ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġctx . target Model . getProperty ( it . key ) !! Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . has Setter Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Ġ{ Ġproperty Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsetter Str Ġ= Ġctx . target Model . create Setter Invoke ( property . name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( getter Str , Ġtypes , Ġis Nullable ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġctx . source Model . create Source Getter Invoke Chain ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġctx . target 2 Sources [ property . name ] !! , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproperty . type ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( ctx . update Policy ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUpdate Policy . UPDATE _ ALL Ġ-> Ġbuilder . add Statement ( setter Str Ġ+ Ġgetter Str , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* types . to Typed Array ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUpdate Policy . TARGET _ IS _ NULL Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( target Getter Str , Ġ_, Ġnullable ) Ġ= Ġctx . target Model . create Target Getter ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproperty . name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( nullable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtmp Var Name Ġ= Ġproperty . name Ġ+ Ġ" Tmp " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . add Statement (" val Ġ$ tmp Var Name Ġ= Ġ$ target Getter Str ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproperty . type . make Nullable (). className ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. begin Control Flow (" if Ġ($ tmp Var Name Ġ== Ġnull )") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Statement ( setter Str Ġ+ Ġgetter Str , Ġ* types . to Typed Array ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. end Control Flow () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . add Statement ( setter Str Ġ+ Ġgetter Str , Ġ* types . to Typed Array ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUpdate Policy . SOURCE _ IS _ NOT _ NULL Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtmp Var Name Ġ= Ġproperty . name Ġ+ Ġ" Tmp " ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Nullable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ctx . source Model Ġis ĠEntity Model ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . add Statement (" val Ġ$ tmp Var Name Ġ= Ġ$ getter Str ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* types . to Typed Array ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . add Statement (" val Ġ$ tmp Var Name : Ġ% T Ġ= Ġ$ getter Str ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproperty . type . className ( true )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. begin Control Flow (" if Ġ($ tmp Var Name Ġ!= Ġnull )") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Statement ( setter Str Ġ+ Ġtmp Var Name , Ġ* types . to Typed Array ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. end Control Flow () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . add Statement ( setter Str Ġ+ Ġgetter Str , Ġ* types . to Typed Array ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġbuilder . build () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġoperator Ġfun Ġinvoke ( fn : ĠK S Function Declaration ): ĠFun Spec ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠContext ( fn ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! Function Validation ( fn )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ Context Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBuild Function ( fn ). build () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }