package Ġcom . github . d aku en j ery . cal lib ri . cal lib ri processor Ċ Ċ import Ġcom . github . d aku en j ery . cal lib ri . annotations . Local Method Ċ import Ġcom . github . d aku en j ery . cal lib ri . annotations . Remote Method Ċ import Ġcom . squareup . kotlin po et .* Ċ import Ġcom . squareup . kotlin po et . Parameterized TypeName . Companion . parameter ized By Ċ import Ġjavax . lang . model . element . Element Ċ import Ġjavax . lang . model . element . Executable Element Ċ Ċ abstract Ġclass ĠImp l Provider ( val Ġserial iser : ĠArgs Serializer Provider ) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġimp ls Ġ= Ġmutable ListOf < Type Spec >() ĊĊĠĠĠ Ġfun Ġprepare ( element : ĠElement , Ġmethods : ĠList < Executable Element >) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġspec Ġ= ĠType Spec . class Builder ("${ element . simple Name } Impl ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. super class ( element . as Type (). as TypeName ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ Ġprocess ( this , Ġelement , Ġmethods ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠ Ġimp ls . add ( spec ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġabstract Ġfun Ġprocess ( builder : ĠType Spec . Builder , Ġelement : ĠElement , Ġmethods : ĠList < Executable Element >) ĊĊĠĠĠ Ġfun Ġbuild File ( packageName : ĠString , ĠfileName : ĠString ): ĠFile Spec Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠFile Spec . builder ( packageName , ĠfileName ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( spec Ġin Ġimp ls ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Type ( spec ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. build () ĊĊĠĠĠĠĠĠĠ Ġreturn Ġfile ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠI pc Client Impl Provider ( serial iser : ĠArgs Serializer Provider ) Ġ: ĠImp l Provider ( serial iser ) Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġprocess ( builder : ĠType Spec . Builder , Ġelement : ĠElement , Ġmethods : ĠList < Executable Element >) Ġ{ ĊĠĠĠĠĠĠĠ Ġbuilder . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmethods . forEach Ġ{ Ġoverride Remote Method ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġbuilder . addProperty ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠProperty Spec . builder (" method Wrapper Factory ", ĠClass Name ( ROOT _ PACKAGE , Ġ" Remote Method Wrapper Factory "), ĠK Modifier . OVERRIDE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. initializer ("% L ", Ġcreate Remote Method Wrapper Factory ( methods )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠType Spec . Builder . override Remote Method ( method : ĠExec utable Element ): ĠType Spec . Builder Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmethod Id Ġ= Ġmethod . getAnnotation ( Remote Method :: class . java ). method Id ĊĠĠĠĠĠĠĠ Ġval Ġparams Ġ= Ġmethod . parameters . join ToString Ġ{ Ġit . simple Name . toString () Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġfunc Ġ= ĠFun Spec . builder ( method . simple Name . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Modifiers ( K Modifier . OVERRIDE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( param Ġin Ġmethod . parameters ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Parameter ( param . simple Name . toString (), Ġparam . as Type (). kotlin Type ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. returns ( method . returnType . kotlin Type ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Code (" return Ġremote Invoke (% L , Ġ$ params )", Ġmethod Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĊĠĠĠĠĠĠĠ Ġadd Function ( func ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Remote Method Wrapper Factory ( methods : ĠList < Executable Element >): ĠType Spec Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtype Ġ= ĠType Spec . anonymous Class Builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Super interface ( ClassName ( ROOT _ PACKAGE , Ġ" Remote Method Wrapper Factory ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. addFunction ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFun Spec . builder (" create Method Wrapper ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Modifiers ( K Modifier . OVERRIDE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Parameter (" method Id ", ĠInt :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. returns ( ClassName ( CORE _ PACKAGE , Ġ" Primitive Args Remote Serializer "). parameter ized By ( Wildcard TypeName . STAR )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Code ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCode Block . builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. begin Control Flow (" return Ġwhen Ġ( method Id )") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmethods . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmethod Id Ġ= Ġit . getAnnotation ( Remote Method :: class . java ). method Id ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġserializer Ġ= Ġserial iser . get Serializer ( it ) Ċ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Statement ("% L Ġ-> Ġ% T ()", Ġmethod Id , ĠClass Name ("", Ġserializer . name !! )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Statement (" else Ġ-> Ġthrow ĠException () ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. end Control Flow () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). build () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). build () ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtype ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠI pc ServiceImpl Provider ( serial iser : ĠArgs Serializer Provider ) Ġ: ĠImp l Provider ( serial iser ) Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġprocess ( builder : ĠType Spec . Builder , Ġelement : ĠElement , Ġmethods : ĠList < Executable Element >) Ġ{ ĊĠĠĠĠĠĠĠ Ġbuilder . override Handle Message ( methods ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. addProperty ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠProperty Spec . builder (" serializer Factory ", ĠClass Name ( ROOT _ PACKAGE , Ġ" Local Serializer Factory "), ĠK Modifier . OVERRIDE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. initializer ("% L ", Ġcreate Local Method Wrapper Factory ( methods )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠType Spec . Builder . override Handle Message ( methods : ĠList < Executable Element >): ĠType Spec . Builder Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfunc Ġ= ĠFun Spec . builder (" handle Message ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Modifiers ( K Modifier . OVERRIDE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Parameter (" msg Id ", ĠInt :: class ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Parameter (" receiver ", ĠClass Name (" android . os ", Ġ" Result Receiver ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Parameter (" args ", ĠClass Name ("", Ġ" Any "), ĠK Modifier . VAR ARG ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Code ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCode Block . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. begin Control Flow (" when Ġ( msg Id )") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( method Ġin Ġmethods ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmethod Id Ġ= Ġmethod . getAnnotation ( Local Method :: class . java ). method Id ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Statement ("% L Ġ-> Ġ% L ( receiver , Ġ% L )", Ġmethod Id , Ġmethod . simple Name , Ġmethod . to Params Literal (" args ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. end Control Flow () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). build () ĊĊĠĠĠĠĠĠĠ Ġadd Function ( func ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠExec utable Element . to Params Literal ( param Arr Name : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġthis . parameters . sub List ( 1 , Ġparameters . size ). map Indexed Ġ{ Ġi , Ġvariable Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPair ( i , Ġvariable . as Type (). kotlin Type (). toString ()) ĊĠĠĠĠĠĠĠ Ġ}. join ToString Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" args [ ${ it . first }] Ġas Ġ${ it . second }" ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Local Method Wrapper Factory ( methods : ĠList < Executable Element >): ĠType Spec Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtype Ġ= ĠType Spec . anonymous Class Builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Super interface ( ClassName ( ROOT _ PACKAGE , Ġ" Local Serializer Factory ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. addFunction ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFun Spec . builder (" create Serializer ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Modifiers ( K Modifier . OVERRIDE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Parameter (" method Id ", ĠInt :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. returns ( ClassName ( CORE _ PACKAGE , Ġ" Primitive Args Local Serializer ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Code ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCode Block . builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. begin Control Flow (" return Ġwhen Ġ( method Id )") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmethods . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmethod Id Ġ= Ġit . getAnnotation ( Local Method :: class . java ). method Id ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġserializer Ġ= Ġserial iser . get Serializer ( it ) Ċ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Statement ("% L Ġ-> Ġ% T ()", Ġmethod Id , ĠClass Name ("", Ġserializer . name !! )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Statement (" else Ġ-> Ġthrow ĠException () ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. end Control Flow () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). build () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). build () ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtype ĊĠĠĠ Ġ} Ċ }