/* Ċ Ġ* ĠCopyright Ġ 2 0 2 1 ĠGoogle , ĠLLC . Ċ Ġ* Ċ Ġ* Ġ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 . Ċ Ġ*/ Ċ Ċ import Ġcom . google . auto . service . Auto Service Ċ import Ġcom . squareup . jav ap o et .* Ċ import Ġnet . lt gt . gradle . inc ap . Incremental Annotation Processor Ċ import Ġnet . lt gt . gradle . inc ap . Incremental Annotation Processor Type . IS OL ATING Ċ import Ġjavax . annotation . processing . Abstract Processor Ċ import Ġjavax . annotation . processing . Processor Ċ import Ġjavax . annotation . processing . Round Environment Ċ import Ġjavax . lang . model . Source Version Ċ import Ġjavax . lang . model . element . Modifier Ċ import Ġjavax . lang . model . element . Type Element Ċ import Ġjavax . lang . model . type . Declared Type Ċ import Ġjavax . tools . Diagnostic Ċ Ċ @ Auto Service ( Processor :: class ) Ċ @ Incremental Annotation Processor ( IS OL ATING ) Ċ class ĠInstall Binding Processor Ġ: ĠAbstract Processor () Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġget Supported Annotation Types () Ġ= Ġset Of ( ClassNames . INSTALL _ BINDING . canonical Name ()) ĊĊĠĠĠ Ġoverride Ġfun Ġget Supported Source Version () Ġ= ĠSource Version . latest () ĊĊĠĠĠ Ġoverride Ġfun Ġprocess ( ĊĠĠĠĠĠĠĠ Ġannotations : ĠMutable Set < out ĠType Element >, ĊĠĠĠĠĠĠĠ Ġround Env : ĠRound Environment ĊĠĠĠ Ġ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġprocessing Annotation Ġ= Ġannotations . first OrNull () Ġ?: Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġround Env . getElement s Annotated With ( processing Annotation ). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprocess Element ( it Ġas ĠType Element ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprocess Element ( type Element : ĠType Element ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġannotation Ġ= Ġtype Element . annotation Mir rors . first Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġannotation Element Ġ= Ġit . annotation Type . as Element () Ġas ĠType Element ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ first Ġannotation Element . qualified Name . toString () Ġ== ĠClass Names . INSTALL _ BINDING . canonical Name () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġcomponent Ġ= Ġannotation . getValue (" component ") Ġas ĠDecl ared Type ĊĠĠĠĠĠĠĠ Ġval Ġbound Type Ġ= Ġif Ġ( type Element . interfaces . size Ġ> Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdeclared Bound Type Ġ= Ġannotation . getValue (" bound Type ") Ġas ĠDecl ared Type ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( TypeName . get ( declared Bound Type ) Ġ== ĠType Name . OBJECT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocessing Env . mess ager . print Message ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDiagnostic . Kind . ERROR , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ type Element Ġimplements Ġmultiple Ġinterfaces Ġand Ġno Ġbound Type Ġwas Ġspecified .", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Element ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdeclared Bound Type ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype Element . interfaces . first () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġbinding ClassName Ġ= ĠClass Name . get ( type Element ) ĊĠĠĠĠĠĠĠ Ġval Ġbound TypeName Ġ= ĠType Name . get ( bound Type ) ĊĠĠĠĠĠĠĠ Ġval Ġmodule ClassName Ġ= ĠClass Name . get ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding ClassName . packageName (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ binding ClassName . simple Name ()} _ H ilt Binding Module " ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġh ilt Module Spec Ġ= ĠType Spec . interface Builder ( module ClassName ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Origin ating Element ( type Element ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Generated Annotation ( processing Env . element Utils , Ġprocessing Env . source Version ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Annotation ( ClassNames . MODULE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Annotation ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAnnotation Spec . builder ( ClassNames . INSTALL _ IN ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Member (" value ", Ġ"$ T . class ", ĠType Name . get ( component )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Annotation ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAnnotation Spec . builder ( ClassNames . ORIGIN ATING _ ELEMENT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Member ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" top Level Class ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ T . class ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding ClassName . top Level ClassName () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Modifiers ( Modifier . PUBLIC ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Method ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMethod Spec . method Builder (" bind ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Annotation ( ClassNames . BIND S ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Modifiers ( Modifier . PUBLIC , ĠModifier . AB STR ACT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. returns ( bound TypeName ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Parameter ( binding ClassName , Ġ" impl ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ ĠJava File . builder ( binding ClassName . packageName (), Ġh ilt Module Spec ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. writeTo ( processing Env . filer ) ĊĠĠĠ Ġ} Ċ }