package Ġmo e . pine . r xb ind ing . shared Ċ Ċ import Ġandroid . view . View Ċ import Ġorg . jetbrains . kotlin . descriptors . Simple Function Descriptor Ċ import Ġorg . jetbrains . kotlin . psi . Kt Named Function Ċ import Ġorg . jetbrains . kotlin . types . type Util . get Immediate Super class Not Any Ċ import Ġorg . jetbrains . kotlin . types . type Util . is Type Parameter Ċ import Ġorg . jetbrains . kotlin . types . type Util . sup ert ypes Ċ import Ġrx . Observable Ċ import Ġjava . io . Buffered Writer Ċ import Ġjava . io . File Ċ import Ġjava . io . FileWriter Ċ import Ġjava . text . DateFormat Ċ import Ġjava . util .* Ċ Ċ /** Ċ Ġ* ĠCode Generator Ċ Ġ* ĠCreated Ġby Ġp ine Ġon Ġ 2 0 1 6 / 0 3 / 3 0 . Ċ Ġ*/ Ċ class ĠCode Generator ( ĊĠĠĠĠĠĠĠ Ġval Ġjava Root Paths : ĠList < String > Ġ= Ġempty List () Ċ ) Ġ{ ĊĠĠĠ Ġval Ġclass Paths : ĠList < Class <* >> Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAnnotation Target :: class . java , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠView :: class . java , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠObservable :: class . java ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġgenerate ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnamespace : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkotlin FilePath : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġimports : ĠList < String >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoutput FilePath : ĠString ĊĠĠĠ Ġ): ĠList < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġparser Ġ= ĠKotlin Script Parser ( this . class Paths ) ĊĠĠĠĠĠĠĠ Ġval Ġast Ġ= Ġparser . parse ( listOf ( kotlin FilePath ), Ġthis . java Root Paths ) ĊĠĠĠĠĠĠĠ Ġval Ġ( enum Types , shared Functions ) Ġ= Ġthis . generate Functions ( ast . functions . toList ()) ĊĠĠĠĠĠĠĠ Ġval Ġkotlin Code Ġ= ĠStringBuffer () ĊĊĠĠĠĠĠĠĠ Ġkotlin Code . append (" package Ġ$ namespace \ n ") ĊĠĠĠĠĠĠĠ Ġkotlin Code . append ("\ n ") ĊĠĠĠĠĠĠĠ Ġimports . forEach Ġ{ Ġkotlin Code . append (" import Ġ$ it \ n ") Ġ} ĊĠĠĠĠĠĠĠ Ġkotlin Code . append (" import Ġmo e . pine . r xb ind ing . shared . Cached Observable \ n ") ĊĠĠĠĠĠĠĠ Ġkotlin Code . append (" import Ġmo e . pine . r xb ind ing . shared . Observable Type \ n ") ĊĠĠĠĠĠĠĠ Ġkotlin Code . append (" import Ġrx . Observable \ n ") ĊĠĠĠĠĠĠĠ Ġkotlin Code . append (" import Ġrx . functions .* \ n ") ĊĠĠĠĠĠĠĠ Ġkotlin Code . append ("\ n ") ĊĠĠĠĠĠĠĠ Ġkotlin Code . append ( this . generate Comment ()) ĊĠĠĠĠĠĠĠ Ġkotlin Code . append ( shared Functions . join ToString ("\ n \ n ")) ĊĊĠĠĠĠĠĠĠ ĠFile ( output FilePath ). let Ġ{ Ġfile Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile . parent File . mkdir s () ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠBuffered Writer ( FileWriter ( file )). let Ġ{ Ġwriter Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwriter . append ( kotlin Code ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwriter . close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġenum Types ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġgenerate Enum Types ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġenum Types : ĠList < String >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoutput FilePath : ĠString ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġkotlin Code Ġ= ĠStringBuffer () ĊĠĠĠĠĠĠĠ Ġkotlin Code . append (" package Ġmo e . pine . r xb ind ing . shared \ n ") ĊĠĠĠĠĠĠĠ Ġkotlin Code . append ("\ n ") ĊĠĠĠĠĠĠĠ Ġkotlin Code . append ( this . generate Comment ()) ĊĠĠĠĠĠĠĠ Ġkotlin Code . append (" enum Ġclass ĠObservable Type Ġ{\ n ") ĊĊĠĠĠĠĠĠĠ Ġenum Types . distinct (). sorted (). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkotlin Code . append (" ĠĠĠ Ġ$ it ,\ n ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġkotlin Code . append (" }\ n ") ĊĊĠĠĠĠĠĠĠ ĠFile ( output FilePath ). let Ġ{ Ġfile Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile . parent File . mkdir s () ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠBuffered Writer ( FileWriter ( file )). let Ġ{ Ġwriter Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwriter . append ( kotlin Code ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwriter . close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgenerate Functions ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfunctions : ĠList < Pair < Kt Named Function , ĠSimple Function Descriptor >> ĊĠĠĠ Ġ) Ġ: ĠPair < List < String >, ĠList < String >> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġenum Types Ġ= Ġmutable ListOf < String >() ĊĠĠĠĠĠĠĠ Ġval Ġshared Functions Ġ= Ġmutable ListOf < String >() ĊĊĠĠĠĠĠĠĠ Ġfunctions . forEach Ġ{ Ġfunction Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( function . returnType ?. name Ġ== Ġ" Observable ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġenum Type Ġ= Ġthis . generate Enum Type ( function ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġenum Types . add ( enum Type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshared Functions . add ( this . generate Function ( function , Ġenum Type )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠPair ( enum Types , Ġshared Functions ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgenerate Function ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfunction : ĠPair < Kt Named Function , ĠSimple Function Descriptor >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġenum Type : ĠString ĊĠĠĠ Ġ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġgener ics Ġ= Ġfunction . extension Type ?. to Gener ics Code () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. or Empty (). let Ġ{ Ġif Ġ( it . length Ġ> Ġ 0 ) Ġ"$ it Ġ" Ġelse Ġ"" Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġshared Function Ġ= ĠStringBuffer () ĊĠĠĠĠĠĠĠ Ġshared Function . append (" fun Ġ") ĊĠĠĠĠĠĠĠ Ġshared Function . append ( gener ics ) ĊĠĠĠĠĠĠĠ Ġshared Function . append ( function . extension Type ) ĊĠĠĠĠĠĠĠ Ġshared Function . append (".") ĊĠĠĠĠĠĠĠ Ġshared Function . append (" shared " Ġ+ Ġfunction . name . capitalize ()) ĊĠĠĠĠĠĠĠ Ġshared Function . append (" (" Ġ+ Ġfunction . arguments . to Arguments Code () Ġ+ Ġ" ): Ġ") ĊĠĠĠĠĠĠĠ Ġshared Function . append ( function . returnType ) ĊĠĠĠĠĠĠĠ Ġshared Function . append (" Ġ{\ n ") ĊĠĠĠĠĠĠĠ Ġshared Function . append (" ĠĠĠ Ġreturn ĠCached Observable . get OrCreate ( this , ĠObservable Type .$ enum Type ) Ġ{\ n ") ĊĠĠĠĠĠĠĠ Ġshared Function . append (" ĠĠĠĠĠĠĠ Ġ" Ġ+ Ġfunction . body Ġ+ Ġ"\ n ") ĊĠĠĠĠĠĠĠ Ġshared Function . append (" ĠĠĠ Ġ}\ n ") ĊĠĠĠĠĠĠĠ Ġshared Function . append (" }") ĊĠĠĠĠĠĠĠ Ġreturn Ġshared Function . toString () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgenerate Enum Type ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfunction : ĠPair < Kt Named Function , ĠSimple Function Descriptor > ĊĠĠĠ Ġ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġvar ĠtypeName Ġ= Ġfunction . extension Type ?. name ĊĊĠĠĠĠĠĠĠ Ġif Ġ( function . extension Type ?. is Type Parameter () Ġ?: Ġfalse ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠtypeName Ġ= Ġfunction . extension Type ?. sup ert ypes ()?. first ()?. name ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠtypeName . or Empty () Ġ+ Ġfunction . name . capitalize () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgenerate Comment () Ġ: ĠString { ĊĠĠĠĠĠĠĠ Ġval Ġtoday Ġ= ĠDate Format . get DateTime Instance (). format ( Date ()) ĊĠĠĠĠĠĠĠ Ġval Ġbuffer Ġ= ĠStringBuffer () ĊĠĠĠĠĠĠĠ Ġbuffer . append (" /** \ n ") ĊĠĠĠĠĠĠĠ Ġbuffer . append (" Ġ* ĠAuto Ġgenerated \ n ") ĊĠĠĠĠĠĠĠ Ġbuffer . append (" Ġ* ĠCreated Ġby ĠCode Generator . kt Ġon Ġ$ today .\ n ") ĊĠĠĠĠĠĠĠ Ġbuffer . append (" Ġ*/ \ n ") ĊĠĠĠĠĠĠĠ Ġreturn Ġbuffer . toString () ĊĠĠĠ Ġ} Ċ }