package Ġcom . ba el . d ads . processor . generator . render . file Ċ Ċ import Ġcom . ba el . d ads . processor . ext . annotation Of Ċ import Ġcom . ba el . d ads . processor . ext . fields Ċ import Ġcom . ba el . d ads . processor . ext . is Nullable Ċ import Ġcom . ba el . d ads . processor . ext . methods Ċ import Ġcom . ba el . d ads . processor . ext . parameter Of Ċ import Ġcom . ba el . d ads . processor . ext . to Getter Ċ import Ġcom . ba el . d ads . processor . ext . varName Ċ import Ġcom . ba el . d ads . processor . generator . util . Custom Equals . generate Double Equals Method Ċ import Ġcom . ba el . d ads . processor . generator . util . Custom Equals . generate Float Equals Method Ċ import Ġcom . ba el . d ads . processor . generator . util . Custom Equals . generate Object Equals Method Ċ import Ġcom . ba el . d ads . processor . logger . Logger Ċ import Ġcom . squareup . jav ap o et . ClassName Ċ import Ġcom . squareup . jav ap o et . Code Block Ċ import Ġcom . squareup . jav ap o et . Field Spec Ċ import Ġcom . squareup . jav ap o et . Java File Ċ import Ġcom . squareup . jav ap o et . Method Spec Ċ import Ġcom . squareup . jav ap o et . Parameter Spec Ċ import Ġcom . squareup . jav ap o et . Parameterized TypeName Ċ import Ġcom . squareup . jav ap o et . TypeName Ċ import Ġcom . squareup . jav ap o et . Type Spec Ċ import Ġorg . jetbrains . annotations . NotNull Ċ import Ġorg . jetbrains . annotations . Nullable Ċ import Ġjavax . lang . model . element . Element Ċ import Ġjavax . lang . model . element . Executable Element Ċ import Ġjavax . lang . model . element . Modifier . FINAL Ċ import Ġjavax . lang . model . element . Modifier . PRIVATE Ċ import Ġjavax . lang . model . element . Modifier . PUBLIC Ċ import Ġjavax . lang . model . element . Name Ċ import Ġjavax . lang . model . element . Type Element Ċ import Ġjavax . lang . model . element . Variable Element Ċ import Ġjavax . lang . model . type . Type Kind . ARRAY Ċ import Ġjavax . lang . model . type . Type Kind . DOUBLE Ċ import Ġjavax . lang . model . type . Type Kind . FLOAT Ċ import Ġjavax . lang . model . util . Types Ċ import Ġkotlin . reflect . K Class Ċ import Ġkotlin . reflect . K Property Ċ Ċ /** Ċ Ġ* ĠCreated Ġby ĠEr ick Sum argo Ġon Ġ 0 1 / 0 1 / 2 1 . Ċ Ġ*/ Ċ Ċ internal Ġclass ĠRender Executor File ( ĊĠĠĠ Ġprivate Ġval Ġannotation : ĠK Class < out ĠAnnotation >, ĊĠĠĠ Ġprivate Ġval Ġannotation Parameter : ĠK Property <* >, ĊĠĠĠ Ġprivate Ġval Ġelement : ĠElement , ĊĠĠĠ Ġprivate Ġval ĠpackageName : ĠString , ĊĠĠĠ Ġprivate Ġval Ġtypes : ĠTypes , ĊĠĠĠ Ġprivate Ġval Ġlogger : ĠLogger , ĊĠĠĠ Ġprivate Ġval Ġrenderer Class : ĠClass Name , ĊĠĠĠ Ġprivate Ġval ĠviewModel Class : ĠClass Name , ĊĠĠĠ Ġprivate Ġval Ġstate Class : ĠClass Name , ĊĠĠĠ Ġprivate Ġval Ġbase Render Executor Class : ĠClass Name Ċ ) Ġ{ ĊĊĠĠĠ Ġfun Ġgenerate (): ĠJava File Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ` class ` Ġ= Ġgenerate Class () ĊĠĠĠĠĠĠĠ Ġreturn ĠJava File . builder ( packageName , Ġ` class `). build () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgenerate Class (): ĠType Spec Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠsuperClass Ġ= Ġgenerate Super Class () ĊĊĠĠĠĠĠĠĠ Ġval Ġrenderer Field Ġ= Ġgenerate Renderer Field () ĊĊĠĠĠĠĠĠĠ Ġval ĠviewModel Field Ġ= Ġgenerate ViewModel Field () ĊĊĠĠĠĠĠĠĠ Ġval Ġconstructor Ġ= Ġgenerate Constructor () ĊĊĠĠĠĠĠĠĠ Ġval Ġrender Method Ġ= Ġgenerate Render Method () ĊĊĠĠĠĠĠĠĠ Ġval Ġdouble Equals Method Ġ= Ġgenerate Double Equals Method () ĊĊĠĠĠĠĠĠĠ Ġval Ġfloat Equals Method Ġ= Ġgenerate Float Equals Method () ĊĊĠĠĠĠĠĠĠ Ġval Ġobject Equals Method Ġ= Ġgenerate Object Equals Method () ĊĊĠĠĠĠĠĠĠ Ġreturn ĠType Spec . class Builder (" Render Executor ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Modifiers ( PUBLIC , ĠFIN AL ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. super class ( super Class ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. addField ( renderer Field ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. addField ( viewModel Field ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Method ( constructor ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Method ( render Method ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Method ( double Equals Method ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Method ( float Equals Method ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Method ( object Equals Method ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgenerate Super Class (): ĠType Name Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠParameter ized TypeName . get ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbase Render Executor Class , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate Class ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgenerate Renderer Field (): ĠField Spec Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠField Spec . builder ( renderer Class , Ġrenderer Class . varName ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Modifiers ( PRIVATE , ĠFIN AL ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgenerate ViewModel Field (): ĠField Spec Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠField Spec . builder ( viewModel Class , ĠviewModel Class . varName ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Modifiers ( PRIVATE , ĠFIN AL ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgenerate Constructor (): ĠMethod Spec Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrenderer Parameter Ġ= ĠParameter Spec . builder ( renderer Class , Ġrenderer Class . varName ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Annotation ( NotNull :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠ Ġval ĠviewModel Parameter Ġ= ĠParameter Spec . builder ( viewModel Class , ĠviewModel Class . varName ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Annotation ( NotNull :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠ Ġval Ġstatement Ġ= ĠCode Block . builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Statement (" super (\ $ 1 N , Ġ\$ 2 N )", Ġrenderer Parameter . name , ĠviewModel Parameter . name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Statement (" this .\ $ 1 N Ġ= Ġ\$ 1 N ", Ġrenderer Parameter . name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Statement (" this .\ $ 1 N Ġ= Ġ\$ 1 N ", ĠviewModel Parameter . name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠ Ġreturn ĠMethod Spec . constructor Builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Modifiers ( PUBLIC ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Parameter ( renderer Parameter ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Parameter ( viewModel Parameter ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Code ( statement ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgenerate Render Method (): ĠMethod Spec Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstate Fields Ġ= Ġelement . annotation Of ( annotation ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . parameter Of ( types , Ġparameter Ġ= Ġannotation Parameter ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . fields ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. or Empty () ĊĊĠĠĠĠĠĠĠ Ġval Ġrender ers Ġ= Ġ( element Ġas ĠType Element ). methods ĊĊĠĠĠĠĠĠĠ Ġval Ġstate Null ified Statement Ġ= Ġgenerate State Null ified Statement ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate Fields , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrender ers ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġstate Diff Statement Ġ= Ġgenerate State Diff Statement ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate Fields , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrender ers ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġold State Parameter Ġ= ĠParameter Spec . builder ( state Class , ĠO LD _ STATE _ NAME ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Annotation ( Nullable :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠ Ġval ĠnewState Parameter Ġ= ĠParameter Spec . builder ( state Class , ĠNEW _ STATE _ NAME ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Annotation ( NotNull :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠ Ġreturn ĠMethod Spec . method Builder (" render ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Annotation ( Override :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Modifiers ( PUBLIC , ĠFIN AL ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Parameter ( old State Parameter ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Parameter ( newState Parameter ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Code ( state Null ified Statement ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Code ( state Diff Statement ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgenerate State Null ified Statement ( ĊĠĠĠĠĠĠĠ Ġstate Fields : ĠMap < Name , ĠType Name >, ĊĠĠĠĠĠĠĠ Ġrender ers : ĠList < Executable Element > ĊĠĠĠ Ġ): ĠCode Block Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠCode Block . builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. begin Control Flow (" if Ġ(\ $ 1 N Ġ== Ġnull )", ĠO LD _ STATE _ NAME ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrender ers . forEach Ġ{ Ġrenderer Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstatement Ġ= Ġgenerate Render Statement ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrenderer , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate Fields ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Statement ( statement ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. end Control Flow () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgenerate State Diff Statement ( ĊĠĠĠĠĠĠĠ Ġstate Fields : ĠMap < Name , ĠType Name >, ĊĠĠĠĠĠĠĠ Ġrender ers : ĠList < Executable Element > ĊĠĠĠ Ġ): ĠCode Block Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠCode Block . builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. begin Control Flow (" else "). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrender ers . forEach Ġnext @{ Ġrenderer Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( renderer . parameters . isEmpty ()) Ġreturn @ next ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbegin Control Flow ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" if Ġ(\ $ N )", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgenerate State Diff Check ( renderer . parameters ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstatement Ġ= Ġgenerate Render Statement ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrenderer , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate Fields ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Statement ( statement ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġend Control Flow () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. end Control Flow () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgenerate State Diff Check ( parameters : ĠList < Variable Element >): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġparameters . join ToString (" Ġ|| Ġ") Ġ{ Ġparameter Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstate Ġ= Ġparameter . simple Name . to Getter () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Ġ= Ġparameter . as Type (). kind ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcustom Equals Ġ= Ġtype Ġin ĠlistOf ( FLOAT , ĠDOUBLE , ĠARRAY ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( type . is Primitive Ġ&& Ġ! custom Equals ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ OLD _ STATE _ NAME .$ state Ġ!= Ġ$ NEW _ STATE _ NAME .$ state " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( parameter . is Nullable Ġ|| Ġcustom Equals ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"! equals ($ OLD _ STATE _ NAME .$ state , Ġ$ NEW _ STATE _ NAME .$ state )" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"! $ OLD _ STATE _ NAME .$ state . equals ($ NEW _ STATE _ NAME .$ state )" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgenerate Render Statement ( ĊĠĠĠĠĠĠĠ Ġrenderer : ĠExec utable Element , ĊĠĠĠĠĠĠĠ Ġstate Fields : ĠMap < Name , ĠType Name >, ĊĠĠĠ Ġ): ĠCode Block Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠCode Block . of ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" renderer .\ $ 1 N (\ $ 2 N )", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrenderer . simple Name , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrenderer . parameters . join ToString Ġ{ Ġparameter Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġparameter . simple Name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate Fields [ name ] Ġ?: Ġlogger . error (" Field Ġ$ name Ġnot Ġfound Ġin ĠState ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ NEW _ STATE _ NAME .${ name . to Getter () }" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠO LD _ STATE _ NAME : ĠString Ġ= Ġ" old State " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠNEW _ STATE _ NAME : ĠString Ġ= Ġ" newState " ĊĠĠĠ Ġ} Ċ } Ċ