package Ġcom . v rg soft . processor Ċ Ċ import Ġcom . google . auto . service . Auto Service Ċ import Ġcom . squareup . kotlin po et .* Ċ import Ġcom . squareup . kotlin po et . Parameterized TypeName . Companion . parameter ized By Ċ import Ġcom . v rg soft . annotations . Create Factory Ċ import Ġjava . io . File Ċ import Ġjavax . annotation . processing .* Ċ import Ġjavax . lang . model . Source Version Ċ import Ġjavax . lang . model . element . Element Kind Ċ import Ġjavax . lang . model . element . Executable Element Ċ import Ġjavax . lang . model . element . Type Element Ċ Ċ @ Auto Service ( Processor :: class ) Ċ @ Supported Source Version ( Source Version . RELEASE _ 8 ) Ċ @ Supported Options ( K AP T _ K OT LIN _ GENERATED _ OPTION _ NAME ) Ċ class ĠCreate Factory Processor Ġ: ĠAbstract Processor () Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġprocess ( annotations : ĠMutable Set < out ĠType Element >, Ġround Env : ĠRound Environment ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġround Env . getElement s Annotated With ( Create Factory :: class . java ). forEach Ġ{ Ġelement Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( element . kind Ġ!= ĠElement Kind . CLASS ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocessing Env . mess ager . error message Ġ{ Ġ" Can Ġonly Ġbe Ġapplied Ġto Ġclasses , Ġ Ġelement : Ġ$ element Ġ" Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Element Ġ= Ġelement Ġas ĠType Element ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġgenerate New Method ( type Element , Ġprocessing Env . element Utils . get Package Of ( element ). toString ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgenerate New Method ( element : ĠType Element , Ġpackage Of Method : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġgenerated Sources Root : ĠString Ġ= Ġprocessing Env . options [ K AP T _ K OT LIN _ GENERATED _ OPTION _ NAME ]. or Empty () ĊĠĠĠĠĠĠĠ Ġif Ġ( generated Sources Root . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprocessing Env . mess ager . error message Ġ{ Ġ" Can 't Ġfind Ġthe Ġtarget Ġdirectory Ġfor Ġgenerated ĠKotlin Ġfiles ." Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval ĠfileName Ġ= Ġ"${ element . simple Name } Factory " ĊĊĠĠĠĠĠĠĠ Ġvar Ġparams Ġ= Ġ"" ĊĊĠĠĠĠĠĠĠ Ġval ĠviewModel Ġ= Ġelement . as ClassName () ĊĠĠĠĠĠĠĠ Ġval Ġbase Ġ= ĠClass Name (" com . v rg soft . core . presentation . fragment ", Ġ" Base Factory ") ĊĠĠĠĠĠĠĠ Ġval Ġbase Factory Ġ= Ġbase . parameter ized By ( viewModel ) ĊĊĠĠĠĠĠĠĠ Ġval Ġfactory Type Builder Ġ= ĠType Spec . class Builder ( fileName ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. super class ( base Factory ) ĊĊĠĠĠĠĠĠĠ Ġval Ġfactory Constructor Builder Ġ= ĠFun Spec . constructor Builder () ĊĊĠĠĠĠĠĠĠ Ġelement . enc losed Elements . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . kind Ġ== ĠElement Kind . CON STRUCTOR ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconstruct r Ġ= Ġit Ġas ĠExec utable Element ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconstruct r . parameters . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġit . simple Name . toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Ġ= Ġit . as Type (). as TypeName () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġjava String Name Ġ= Ġjava . lang . String :: class . java . name ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Type Ġ= Ġif Ġ( type . toString () Ġ== Ġjava String Name ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠClass Name (" kotlin ", Ġ" String ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġtype ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfactory Constructor Builder . add Parameter ( name , Ġresult Type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfactory Type Builder . addProperty ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠProperty Spec . builder ( name , Ġresult Type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ Ġmodifiers . add ( K Modifier . PRIVATE ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. initializer ( name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparams Ġ= Ġ"$ params $ name , Ġ" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( params . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparams Ġ= Ġparams . substring ( 0 , Ġparams . length Ġ- Ġ 2 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠFile ( generated Sources Root ) ĊĠĠĠĠĠĠĠ Ġfile . mkdir () ĊĊĠĠĠĠĠĠĠ ĠFile Spec . builder ( package Of Method , ĠfileName ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Type ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfactory Type Builder ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. primary Constructor ( factory Constructor Builder . build ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. addFunction ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFun Spec . builder (" create ViewModel ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Modifiers ( K Modifier . OVERRIDE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. returns ( viewModel ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Statement ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" return Ġ% L ($ params )", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . simple Name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. writeTo ( file ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Supported Annotation Types (): ĠMutable Set < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġmutable Set Of ( Create Factory :: class . java . canonical Name ) ĊĠĠĠ Ġ} Ċ }