package Ġm oxy . compiler . view state Ċ Ċ import Ġcom . squareup . jav ap o et . Java File Ċ import Ġm oxy . compiler . Element Processor Ċ import Ġm oxy . compiler . M vp Compiler Ċ import Ġm oxy . compiler . M vp Compiler . Companion . element Utils Ċ import Ġm oxy . compiler . M vp Compiler . Companion . mess ager Ċ import Ġm oxy . compiler . as Declared Type Ċ import Ġm oxy . compiler . as Type Element Ċ import Ġm oxy . compiler . getAnnotation Mirror Ċ import Ġm oxy . compiler . getValue AsString Ċ import Ġm oxy . compiler . getValue As Type Mirror Ċ import Ġm oxy . view state . strategy . AddTo End Single Strategy Ċ import Ġm oxy . view state . strategy . State Strategy Type Ċ import Ġjava . util .* Ċ import Ġjavax . lang . model . element . Annotation Mirror Ċ import Ġjavax . lang . model . element . Element Ċ import Ġjavax . lang . model . element . Element Kind Ċ import Ġjavax . lang . model . element . Executable Element Ċ import Ġjavax . lang . model . element . Modifier Ċ import Ġjavax . lang . model . element . Type Element Ċ import Ġjavax . lang . model . type . Type Kind Ċ import Ġjavax . lang . model . type . Type Mirror Ċ import Ġjavax . tools . Diagnostic . Kind Ċ Ċ class ĠView Interface Processor ( ĊĠĠĠ Ġprivate Ġval Ġdisable Empty Strategy Check : ĠBoolean , ĊĠĠĠ Ġprivate Ġval Ġenable Empty Strategy Helper : ĠBoolean , ĊĠĠĠ Ġdefault Strategy : ĠString ? Ċ ) Ġ: ĠElement Processor < Type Element , ĠView Interface Info > Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġframework Default Strategy : ĠType Element ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġview Interface Element : ĠType Element ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġview Interface Name : ĠString ĊĠĠĠ Ġprivate Ġval Ġmigration Methods Ġ= Ġmutable ListOf < Migration Method >() ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( default Strategy Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġlocal Default Strategy : ĠType Element ? Ġ= Ġelement Utils . getType Element ( default Strategy ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( local Default Strategy Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmess ager . print Message ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKind . ERROR , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Unable Ġto Ġparse Ġoption Ġ'$ OPTION _ DEFAULT _ STR ATE GY '. ĠCheck Ġ$ default Strategy Ġexists ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocal Default Strategy Ġ= ĠDEFAULT _ STATE _ STR ATE GY ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġframework Default Strategy Ġ= Ġlocal Default Strategy ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġframework Default Strategy Ġ= ĠDEFAULT _ STATE _ STR ATE GY ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġprocess ( element : ĠType Element ): ĠView Interface Info Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . view Interface Element Ġ= Ġelement ĊĠĠĠĠĠĠĠ Ġthis . view Interface Name Ġ= Ġelement . simple Name . toString () ĊĊĠĠĠĠĠĠĠ Ġ// ĠGet Ġmethods Ġfrom Ġinput Ġinterface ĊĠĠĠĠĠĠĠ Ġval Ġmethods Ġ= Ġget Methods ( element ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠAllow Ġmethods Ġto Ġhave Ġequal Ġnames ĊĠĠĠĠĠĠĠ Ġval Ġmethods Counter Ġ= Ġmutable Map Of < String , ĠInt >() ĊĠĠĠĠĠĠĠ Ġfor Ġ( method Ġin Ġmethods ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcounter Ġ= Ġmethods Counter [ method . name ] Ġ?: Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( counter Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmethod . unique Suffix Ġ= Ġcounter . toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmethods Counter [ method . name ] Ġ= Ġcounter Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠView Interface Info ( element , Ġmethods . toList ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns ĠView Method Ġfor Ġeach Ġsuitable Ġmethod Ġfrom Ġthis Ġinterface Ġand Ġits Ġsuper interfaces ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġget Methods ( element : ĠType Element ): ĠSet < View Method > Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠGet Ġmethods Ġfrom Ġinput Ġclass ĊĠĠĠĠĠĠĠ Ġval Ġen closed Methods Ġ= Ġget En closed Methods ( element ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠGet Ġmethods Ġfrom Ġsuper Ġinterfaces ĊĠĠĠĠĠĠĠ Ġval Ġmethods From Super interfaces Ġ= Ġiterate Interfaces ( element ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠCombine Ġand Ġexclude Ġoverridden Ġmethods ĊĠĠĠĠĠĠĠ Ġreturn Ġcombine Methods ( enc losed Methods , Ġmethods From Super interfaces ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġmake Migration Helper (): ĠJava File ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( enable Empty Strategy Helper Ġ&& Ġmigration Methods . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEmpty Strategy Helper Generator . generate ( migration Methods ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns ĠView Method Ġfor Ġeach Ġsuitable Ġen closed Ġmethod Ġinto Ġthis Ġinterface Ġ( but Ġnot Ġsuper interface ) ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġget En closed Methods ( view Interface : ĠType Element ): ĠSet < View Method > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdefault Strategy Ġ= Ġget Interface State Strategy Type ( view Interface ) ĊĠĠĠĠĠĠĠ Ġreturn Ġview Interface . enc losed Elements ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġignore Ġall Ġbut Ġnon - static Ġmethods ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . kind Ġ== ĠElement Kind . METHOD Ġ&& Ġ! it . is Static () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġget View Method ( it Ġas ĠExec utable Element , Ġview Interface , Ġdefault Strategy ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. toSet () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget View Method ( ĊĠĠĠĠĠĠĠ Ġmethod Element : ĠExec utable Element , ĊĠĠĠĠĠĠĠ Ġview Interface : ĠType Element , ĊĠĠĠĠĠĠĠ Ġdefault Strategy : ĠType Element ? ĊĠĠĠ Ġ): ĠView Method Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( method Element . returnType . kind Ġ!= ĠType Kind . VOID ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmessage Ġ= Ġ" You Ġare Ġtrying Ġto Ġgenerate ĠView State Ġfor Ġ${ view Interface . simple Name }. Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" But Ġ${ view Interface . simple Name } Ġcontains Ġnon - void Ġmethod Ġ\" ${ method Element . simple Name }\" Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" with Ġthe Ġreturn Ġtype Ġof Ġ${ method Element . returnType } ." ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmess ager . print Message ( Kind . ERROR , Ġmessage , Ġmethod Element ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġannotation : ĠAnnotation Mirror ? Ġ= ĠgetState Strategy Type Mirror ( method Element ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġget Ġstrategy Ġfrom Ġannotation ĊĠĠĠĠĠĠĠ Ġval Ġstrategy Class From Annotation Ġ= Ġannotation ?. getValue As Type Mirror ( State Strategy Type :: value ) ĊĊĠĠĠĠĠĠĠ Ġval Ġstrategy Class : ĠType Element Ġ= Ġif Ġ( strategy Class From Annotation Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstrategy Class From Annotation . as Type Element () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( default Strategy Ġ== Ġnull Ġ&& Ġ! disable Empty Strategy Check ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( enable Empty Strategy Helper ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmigration Methods . add ( Migration Method ( view Interface , Ġmethod Element )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmessage Ġ= Ġ(" A ĠView Ġmethod Ġhas Ġno Ġstrategy ! Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Add Ġ@ State Strategy Type Ġannotation Ġto Ġthis Ġmethod , Ġor Ġto Ġthe ĠView Ġinterface . Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" You Ġcan Ġalso Ġspecify Ġdefault Ġstrategy Ġvia Ġcompiler Ġoption .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmess ager . print Message ( Kind . ERROR , Ġmessage , Ġmethod Element ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdefault Strategy Ġ?: Ġframework Default Strategy ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġtag From Annotation Ġ= Ġannotation ?. getValue AsString ( State Strategy Type :: tag ) ĊĠĠĠĠĠĠĠ Ġval Ġmethod Tag : ĠString Ġ= Ġtag From Annotation Ġ?: Ġmethod Element . simple Name . toString () ĊĊĠĠĠĠĠĠĠ Ġreturn ĠView Method ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview Interface Element . as Declared Type (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmethod Element , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstrategy Class , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmethod Tag ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠgetState Strategy Type Mirror ( method Element : ĠExec utable Element ): ĠAnnotation Mirror ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstrategies Ġ= ĠgetState Strategy Type Mir rors ( method Element ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( str ategies . size Ġ> Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmess ager . print Message ( Kind . ERROR , Ġ" There 's Ġmore Ġthan Ġone Ġstate Ġstrategy Ġtype Ġdefined Ġfor Ġmethod Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"' ${ method Element . simple Name } (${ method Element . parameters . join ToString Ġ{ Ġit . as Type (). toString () Ġ}}) '" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Ġin Ġinterface Ġ'${ method Element . enc lo sing Element . as Type () }' ", Ġmethod Element ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġstrategies . first OrNull () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠgetState Strategy Type Mirror ( type Element : ĠType Element ): ĠAnnotation Mirror ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstrategies Ġ= ĠgetState Strategy Type Mir rors ( type Element ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( str ategies . size Ġ> Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmess ager . print Message ( Kind . ERROR , Ġ" There 's Ġmore Ġthan Ġone Ġstate Ġstrategy Ġtype Ġdefined Ġfor Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"' ${ type Element . simple Name }' ", Ġtype Element ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġstrategies . first OrNull () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠgetState Strategy Type Mir rors ( element : ĠElement ): ĠList < Annotation Mirror > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġen closed Ġ= ĠlistOf NotNull ( element . getAnnotation Mirror ( State Strategy Type :: class )) ĊĊĠĠĠĠĠĠĠ Ġval Ġali ased Ġ= Ġelement . annotation Mir rors ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map NotNull Ġ{ Ġit . annotation Type . as Type Element (). getAnnotation Mirror ( State Strategy Type :: class ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġen closed Ġ+ Ġali ased ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns ĠView Methods Ġfor Ġall Ġsuper interfaces , Ġor Ġempty Ġset Ġif Ġelement Ġdoes Ġnot Ġhave Ġsuper interfaces ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġiterate Interfaces ( ĊĠĠĠĠĠĠĠ Ġview Interface : ĠType Element ĊĠĠĠ Ġ): ĠSet < View Method > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġview Interface . interfaces ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠgetType And Validate Gener ics ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap To Set Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġimplicit Ġrecursion ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Methods ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠgetType And Validate Gener ics ( interface Mirror : ĠType Mirror ): ĠType Element Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsuper interface Ġ= Ġinterface Mirror . as Type Element () ĊĊĠĠĠĠĠĠĠ Ġval Ġtype Arguments Ġ= Ġinterface Mirror . type Arguments ĊĠĠĠĠĠĠĠ Ġval Ġtype Parameters Ġ= Ġsuper interface . type Parameters ĊĊĠĠĠĠĠĠĠ Ġrequire ( type Arguments . size Ġ<= Ġtype Parameters . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Code Ġgeneration Ġfor Ġthe Ġinterface Ġ${ super interface . simple Name } Ġfailed . ĠSimpl ify Ġyour Ġgener ics ." ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġsuper interface ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCombin es Ġmethods , Ġcomparing Ġby Ġ[ View Method . equals ], Ġdiscard ing Ġduplicates Ġfrom Ġsuper interface ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġcombine Methods ( ĊĠĠĠĠĠĠĠ Ġmethods : ĠSet < View Method >, ĊĠĠĠĠĠĠĠ Ġsuper Interface Methods : ĠSet < View Method > ĊĠĠĠ Ġ): ĠSet < View Method > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġmethods Ġ+ Ġsuper Interface Methods ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġdefault ĠState Strategy Type Ġfor Ġthis Ġ[ view Interface ], Ġif Ġspecified ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġget Interface State Strategy Type ( view Interface : ĠType Element ): ĠType Element ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġannotation Ġ= ĠgetState Strategy Type Mirror ( view Interface ) ĊĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġannotation ?. getValue As Type Mirror ( State Strategy Type :: value ) ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( value Ġ!= Ġnull Ġ&& Ġvalue . kind Ġ== ĠType Kind . DECLARE D ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue . as Type Element () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠElement . is Static (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġmodifiers . contains ( Modifier . STATIC ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinline Ġfun Ġ< T , ĠR > ĠList < T >. flatMap To Set ( transform : Ġ( T ) Ġ-> ĠIterable < R >): ĠSet < R > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġflat Map To ( Linked HashSet (), Ġtransform ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠOPTION _ DEFAULT _ STR ATE GY Ġ= ĠM vp Compiler . DEFAULT _ MO XY _ STR ATE GY ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠDEFAULT _ STATE _ STR ATE GY : ĠType Element Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelement Utils . getType Element ( AddTo End Single Strategy :: class . java . canonical Name ) ĊĠĠĠ Ġ} Ċ }