/* Ċ Ġ* ĠCopyright Ġ 2 0 1 9 ĠI ce Rock ĠMAG ĠInc . ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠApache Ġ 2 . 0 Ġlicense . Ċ Ġ*/ Ċ Ċ package Ġdev . icer ock . mo ko . widgets Ċ Ċ import Ġjava . io . File Ċ Ċ abstract Ġclass ĠCommon Generator < Kt File , ĠK t File Stub > Ġ{ ĊĠĠĠ Ġdata Ġclass ĠGenerator Input ( ĊĠĠĠĠĠĠĠ Ġval ĠpackageName : ĠString , ĊĠĠĠĠĠĠĠ Ġval ĠclassName : ĠString , ĊĠĠĠĠĠĠĠ Ġval Ġimports : ĠList < String >, ĊĠĠĠĠĠĠĠ Ġval Ġarguments : ĠMap < String , ĠArg Info >, ĊĠĠĠĠĠĠĠ Ġval Ġfactory Class : ĠString , ĊĠĠĠĠĠĠĠ Ġval Ġgeneric Types : ĠList < String > ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdata Ġclass ĠArg Info ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠdefaultValue : ĠString ? ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġabstract Ġfun Ġget Stub ( file : ĠK t File ): ĠK t File Stub ? ĊĠĠĠ Ġabstract Ġfun Ġget Generator Input ( kt File Stub : ĠK t File Stub ): ĠList < Generator Input > ĊĠĠĠ Ġabstract Ġfun Ġget Kt File FromFile ( file : ĠFile ): ĠK t File ĊĠĠĠ Ġabstract Ġfun Ġlog ( string : ĠString ) ĊĊĠĠĠ Ġfun Ġcollect Additional Sources AndUpdate Configuration ( ĊĠĠĠĠĠĠĠ Ġknown Sources : ĠCollection < Kt File >, ĊĠĠĠĠĠĠĠ Ġgeneration Dir : ĠString ĊĠĠĠ Ġ): ĠCollection < Kt File > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġto Generation Ġ= Ġknown Sources . map NotNull Ġ{ Ġfile Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstub Ġ= Ġget Stub ( file ) Ġ?: Ġreturn @ map NotNull Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Generator Input ( stub ) ĊĠĠĠĠĠĠĠ Ġ}. flatten () ĊĊĠĠĠĠĠĠĠ Ġlog (" to Ġgeneration Ġselected Ġ${ to Generation . size } Ġclasses ") ĊĊĠĠĠĠĠĠĠ Ġval Ġgenerated Ġ= Ġto Generation . map Ġ{ Ġinput Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdir Ġ= ĠFile ( generation Dir ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠFile ( dir , Ġ"${ input . className } Gen . kt ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontent Ġ= Ġgenerate FileContent ( input ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġdir . mkdir s () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile . write Text ( content ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog (" write Ġto Ġfile Ġ$ file ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Kt File FromFile ( file ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġknown Sources Ġ+ Ġgenerated ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgenerate FileContent ( input : ĠGenerator Input ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġwidget Name Ġ= Ġinput . className ĊĊĠĠĠĠĠĠĠ Ġval Ġimport Names Ġ= Ġinput . imports ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. plus (" dev . icer ock . mo ko . widgets . core . Theme ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. plus (" dev . icer ock . mo ko . widgets . core . String Id ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. distinct () ĊĊĠĠĠĠĠĠĠ Ġval Ġimports Ġ= Ġimport Names . join ToString ("\ n ") Ġ{ Ġ" import Ġ$ it " Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġshort Name Ġ= Ġwidget Name . replace (" Widget ", Ġ""). de capitalize () ĊĠĠĠĠĠĠĠ Ġval Ġcustom Args Ġ= Ġinput . arguments . filter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( it . key ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" factory " Ġ-> Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġis IdType ( string : ĠString ) Ġ= Ġstring Ġ== Ġ" Id ?" Ġ|| Ġstring Ġ== Ġ" Id " ĊĊĠĠĠĠĠĠĠ Ġval Ġparams Ġ= Ġcustom Args . map Ġ{ Ġ( name , Ġinfo ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Ġ= Ġif Ġ( is IdType ( info . type )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ widget Name .${ info . type }" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinfo . type ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdef Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinfo . defaultValue Ġ!= Ġnull Ġ-> Ġ" Ġ= Ġ${ info . defaultValue }" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype . endsWith (" ?") Ġ-> Ġ" Ġ= Ġnull " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" ĠĠĠ Ġ$ name : Ġ$ type $ def " ĊĠĠĠĠĠĠĠ Ġ}. join ToString (", \ n ") ĊĠĠĠĠĠĠĠ Ġval Ġparams Set Ġ= Ġcustom Args . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" ĠĠĠ Ġ${ it . key } Ġ= Ġ${ it . key }" ĊĠĠĠĠĠĠĠ Ġ}. join ToString (", \ n ") ĊĊĠĠĠĠĠĠĠ Ġval Ġgener ics Ġ= Ġinput . generic Types ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit Ġ!= Ġ" WS " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. let Ġ{ ĠlistOf (" WS : ĠWidget Size "). plus ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. join ToString (",") ĊĊĠĠĠĠĠĠĠ Ġ// ĠBuild Ġgeneric Ġstring Ġwith Ġstar - projection Ġlike Ġ", *, *", Ġe . g . ĠView Factory < State ful Widget < out ĠWidget Size , *, * >> ĊĠĠĠĠĠĠĠ Ġval Ġfactory Generic String Ġ= Ġif ( input . generic Types . size Ġ- Ġ 1 Ġ> Ġ 0 ) Ġ{ Ġ// Ġdo Ġnot Ġcount ĠWidget Size , Ġthis Ġis Ġa Ġrequired Ġargument Ġfor Ġall Ġfactories ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( 0 Ġuntil Ġinput . generic Types . size Ġ- Ġ 1 ). join ToString ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġseparator Ġ= Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransform Ġ= Ġ{ Ġ", *" Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"" ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġ""" package Ġ${ input . packageName } Ċ Ċ $ imports Ċ Ċ fun Ġ<$ gener ics > ĠTheme .$ short Name ( ĊĠĠĠ Ġwidget Factory : ĠView Factory <$ widget Name < out ĠWidget Size $ factory Generic String >> ? Ġ= Ġnull , ĊĠĠĠ Ġcategory : Ġ$ widget Name . Category ? Ġ= Ġnull , Ċ $ params Ċ ) Ġ= Ġ$ widget Name ( ĊĠĠĠ Ġfactory Ġ= Ġthis . factory . get ( ĊĠĠĠĠĠĠĠ Ġid Ġ= Ġid , ĊĠĠĠĠĠĠĠ Ġcategory Ġ= Ġcategory , ĊĠĠĠĠĠĠĠ Ġdefault Category Ġ= Ġ$ widget Name . Default Category , ĊĠĠĠĠĠĠĠ Ġfallback Ġ= Ġ{ Ġwidget Factory Ġ?: Ġ${ input . factory Class }() Ġ} ĊĠĠĠ Ġ), Ċ $ params Set Ċ ) Ċ Ċ fun Ġ${ short Name } Widget Id ( unique Id : ĠString ): Ġ$ widget Name . Id Ġ{ ĊĠĠĠ Ġreturn Ġobject : Ġ$ widget Name . Id , ĠString Id Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġunique Id : ĠString Ġ= Ġunique Id ĊĠĠĠ Ġ} Ċ } Ċ """ ĊĠĠĠ Ġ} Ċ } Ċ