/* Ċ Ġ* ĠCopyright Ġ 2 0 2 0 ĠAnt on ĠNov ik au Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġb oring y uri . d agger Ċ Ċ import Ġb oring y uri . api . Uri Factory Ċ import Ġb oring y uri . d agger . util . D agger TypeName Ċ import Ġb oring y uri . d agger . util . Processor Options Ċ import Ġb oring y uri . processor . Uri Factory Generator Step . Companion . CONTAINER _ IMPL _ SUFFIX Ċ import Ġb oring y uri . processor . base . B oring Processing Step Ċ import Ġb oring y uri . processor . base . Processing Session Ċ import Ġb oring y uri . processor . type . Common TypeName Ċ import Ġcom . google . common . collect . Immutable Set Ċ import Ġcom . google . common . collect . Immutable Set Multimap Ċ import Ġcom . squareup . jav ap o et . ClassName Ċ import Ġcom . squareup . jav ap o et . Method Spec Ċ import Ġcom . squareup . jav ap o et . Type Spec Ċ import Ġjavax . lang . model . element . Element Ċ import Ġjavax . lang . model . element . Modifier Ċ import Ġjavax . lang . model . element . Type Element Ċ import Ġjavax . lang . model . util . Element Filter Ċ Ċ class ĠD agger Module Generator Step ( session : ĠProcessing Session ) Ġ: ĠB oring Processing Step ( session ) Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġannotations (): ĠSet < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠImmutable Set . of ( Uri Factory :: class . java . name ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġprocess ( ĊĠĠĠĠĠĠĠ Ġelements By Annotation : ĠImmutable Set Multimap < String , ĠElement > ĊĠĠĠ Ġ): ĠSet < Element > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfactories Ġ= ĠElement Filter . types In ( elements By Annotation [ Uri Factory :: class . java . name ]) ĊĠĠĠĠĠĠĠ Ġval ĠmoduleName Ġ= ĠProcessor Options . get ModuleName ( session ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġgenerate B oring D agger Module ( moduleName , Ġfactories ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgenerate B oring D agger Module ( ĊĠĠĠĠĠĠĠ ĠmoduleName : ĠClass Name , ĊĠĠĠĠĠĠĠ Ġfactories : ĠSet < Type Element > ĊĠĠĠ Ġ): ĠSet < Element > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmodule Content Ġ= ĠType Spec . class Builder ( moduleName ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Modifiers ( Modifier . PUBLIC , ĠModifier . FINAL ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Annotation ( D agger TypeName . MODULE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Method ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMethod Spec . constructor Builder (). add Modifiers ( Modifier . PRIVATE ). build () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( factory Ġin Ġfactories ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmodule Content . add Method ( build Provides Method ( factory )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġwrite SourceFile ( moduleName , Ġmodule Content . build (), Ġnull ) ĊĠĠĠĠĠĠĠ Ġreturn Ġempty Set () Ġ// Ġset Ġof Ġdeferred Ġannotated Ġelements ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġbuild Provides Method ( factory : ĠType Element ): ĠMethod Spec Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfactory Name Ġ= ĠClass Name . get ( factory ) ĊĠĠĠĠĠĠĠ Ġval Ġfactory Impl Name Ġ= ĠClass Name . get ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfactory Name . packageName (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ factory Name . simple Name ()} $ CONTAINER _ IMPL _ SUFFIX " ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġreturn ĠMethod Spec . method Builder (" provide ${ factory Name . simple Name () }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Modifiers ( Modifier . STATIC ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Annotation ( D agger TypeName . PRO VID ES ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Annotation ( Common TypeName . NON _ NULL ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. returns ( factory Name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Statement (" return Ġnew Ġ\$ T ()", Ġfactory Impl Name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠ Ġ} Ċ Ċ }