/* Ċ Ġ* ĠCopyright Ġ 2 0 2 0 ĠL ala fo . Ċ Ġ* Ċ Ġ* Ġ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 Ġcom . l ala fo . codegen . processor . factory Ċ Ċ import Ġcom . google . auto . common . More Elements Ċ import Ġcom . google . auto . service . Auto Service Ċ import Ġcom . l ala fo . codegen . factory . Con duct or Factory Ċ import Ġcom . l ala fo . codegen . injection . Inject Controller Ċ import Ġcom . l ala fo . codegen . processor . injection . binding Name Ċ import Ġcom . l ala fo . codegen . processor . internal .* Ċ import Ġcom . squareup . jav ap o et . Java File Ċ import Ġnet . lt gt . gradle . inc ap . Incremental Annotation Processor Ċ import Ġnet . lt gt . gradle . inc ap . Incremental Annotation Processor Type Ċ import Ġjavax . annotation . processing .* Ċ import Ġjavax . lang . model . Source Version Ċ import Ġjavax . lang . model . element .* Ċ import Ġjavax . lang . model . util . Elements Ċ import Ġjavax . lang . model . util . Types Ċ import Ġjavax . tools . Diagnostic . Kind . ERROR Ċ Ċ @ Incremental Annotation Processor ( Incremental Annotation Processor Type . AGG REG ATING ) Ċ @ Auto Service ( Processor :: class ) Ċ class ĠConduct or Factory Processor Ġ: ĠAbstract Processor () Ġ{ ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġsource Version : ĠSource Version ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġmess ager : ĠMess ager ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġf iler : ĠF iler ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġelements : ĠElements ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġtypes : ĠTypes ĊĊĠĠĠ Ġprivate Ġval Ġun processed Binding Names Ġ= Ġmutable ListOf < Name >() ĊĊĠĠĠ Ġoverride Ġfun Ġget Supported Source Version () Ġ= ĠSource Version . latest () ĊĊĠĠĠ Ġoverride Ġfun Ġget Supported Annotation Types () Ġ= Ġset Of ( ĊĠĠĠĠĠĠĠ ĠConduct or Factory :: class . java . canonical Name , ĊĠĠĠĠĠĠĠ ĠInject Controller :: class . java . canonical Name ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġoverride Ġfun Ġinit ( env : ĠProcessing Environment ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . init ( env ) ĊĠĠĠĠĠĠĠ Ġsource Version Ġ= Ġenv . source Version ĊĠĠĠĠĠĠĠ Ġmess ager Ġ= Ġenv . mess ager ĊĠĠĠĠĠĠĠ Ġf iler Ġ= Ġenv . filer ĊĠĠĠĠĠĠĠ Ġelements Ġ= Ġenv . element Utils ĊĠĠĠĠĠĠĠ Ġtypes Ġ= Ġenv . type Utils ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġprocess ( annotations : ĠSet < Type Element >, Ġround Env : ĠRound Environment ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġun processed Binding Names Ġ+= Ġround Env . find Elements Annotated With < Inject Controller >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . enc lo sing Element Ġas ĠType Element Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . qualified Name Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġfactory Candidate Ġ= Ġround Env . find Controller Factory Candidate OrNull () Ġ?: Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġval Ġprovider Deleg ates Ġ= ĠfindAll Controller Injection Candidates () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . to Factory Delegate Provider () Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġfactory Ġ= Ġfactory Candidate . to Controller Factory OrNull ( provider Deleg ates ) Ġ?: Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġwrite Factory ( factory ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠfindAll Controller Injection Candidates (): ĠList < Type Element > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġun processed Binding Names ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map NotNull ( elements :: getType Element ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠType Element . to Factory Delegate Provider (): ĠFactory Delegate Provider Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠSkip Ġvalidation , Ġlet Ġthe Ġbinding Ġprocessor Ġdo Ġthis ĊĠĠĠĠĠĠĠ Ġval Ġtarget Name Ġ= Ġto ClassName () ĊĠĠĠĠĠĠĠ Ġval Ġbinding Name Ġ= Ġtarget Name . raw ClassName (). binding Name () ĊĠĠĠĠĠĠĠ Ġreturn ĠFactory Delegate Provider ( this , Ġtarget Name , Ġbinding Name ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠRound Environment . find Controller Factory Candidate OrNull (): ĠType Element ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcontroller Factories Ġ= Ġfind Elements Annotated With < Con duct or Factory >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. cast Each < Type Element >() ĊĊĠĠĠĠĠĠĠ Ġif Ġ( controller Factories . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( controller Factories . size Ġ> Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontroller Factories . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror (" Multiple Ġ@ Con duct or Factory - annotated Ġclasses Ġfound .", Ġit ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġcontroller Factory Ġ= Ġcontroller Factories . single () ĊĊĠĠĠĠĠĠĠ Ġ// ĠCheck Ġit Ġimplements ĊĠĠĠĠĠĠĠ Ġval Ġcontroller Factory Mirror Ġ= Ġelements . getType Element ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" com . blue lin el abs . cond uctor . Controller Factory " ĊĠĠĠĠĠĠĠ Ġ). as Type () ĊĊĠĠĠĠĠĠĠ Ġval Ġis Controller Factory Ġ= Ġtypes . is Assignable ( controller Factory . as Type (), Ġcontroller Factory Mirror ) ĊĠĠĠĠĠĠĠ Ġif Ġ(! is Controller Factory ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġerror ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Using Ġ@ Con duct or Factory Ġannotation Ġon Ġnon ĠController Factory Ġclass .", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontroller Factory ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( Modifier . PRIVATE Ġin Ġcontroller Factory . modifiers ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġerror ("@ Con duct or Factory - using Ġtypes Ġmust Ġbe Ġnot Ġprivate ", Ġcontroller Factory ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( controller Factory . kind Ġ== ĠElement Kind . CLASS Ġ&& ĠModifier . FINAL Ġin Ġcontroller Factory . modifiers ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġerror ("@ Con duct or Factory - using Ġtypes Ġmust Ġbe Ġdefined Ġas Ġnon - final Ġclasses .", Ġcontroller Factory ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( controller Factory . enc lo sing Element . kind Ġ== ĠElement Kind . CLASS Ġ&& ĠModifier . STATIC Ġ! in Ġcontroller Factory . modifiers ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġerror (" Nested Ġ@ Con duct or Factory - using Ġtypes Ġmust Ġbe Ġstatic .", Ġcontroller Factory ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġconstructors Ġ= Ġcontroller Factory . enc losed Elements ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . kind Ġ== ĠElement Kind . CON STRUCTOR Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. cast Each < Executable Element >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ ĠModifier . PRIVATE Ġ! in Ġit . modifiers Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . parameters . isEmpty () Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( construct ors . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġerror ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"@ Con duct or Factory - annotated Ġtype Ġshould Ġcontain Ġa Ġnon - private Ġempty Ġconstructor .", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontroller Factory ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġabstract Methods Ġ= ĠMore Elements . getLocal And Inherited Methods ( controller Factory , Ġtypes , Ġelements ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġ! it . is Default Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ ĠModifier . AB STR ACT Ġin Ġit . modifiers Ġ} ĊĊĠĠĠĠĠĠĠ Ġabstract Methods . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġerror ("@ Con duct or Factory - annotated Ġtype Ġmust Ġnot Ġcontain Ġany Ġabstract Ġmethods .", Ġit ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( abstract Methods . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġcontroller Factory ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠType Element . to Controller Factory OrNull ( ĊĠĠĠĠĠĠĠ Ġprovider Deleg ates : ĠList < Factory Delegate Provider > ĊĠĠĠ Ġ): ĠController Factory ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġgenerated Annotation Ġ= Ġcreate Generated Annotation ( source Version , Ġelements ) ĊĠĠĠĠĠĠĠ Ġreturn ĠController Factory ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġto ClassName (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprovider Deleg ates , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgenerated Annotation ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġwrite Factory ( ĊĠĠĠĠĠĠĠ Ġfactory : ĠController Factory ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġgenerated Type Spec Ġ= Ġfactory . brew Java () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. to Builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Origin ating Element ( factory . factory Type ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Each ( factory . deleg ates ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Origin ating Element ( it . target Element ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠ ĠJava File . builder ( factory . generated Type . packageName (), Ġgenerated Type Spec ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add File Comment (" Generated Ġby Ġ@ Con duct or Factory . ĠDo Ġnot Ġmodify !") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. writeTo ( filer ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġerror ( message : ĠString , Ġelement : ĠElement ? Ġ= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġmess ager . print Message ( ERROR , Ġmessage , Ġelement ) ĊĠĠĠ Ġ} Ċ }