/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 1 7 ĠSquare , ĠInc . Ċ Ġ* Ċ Ġ* Ġ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 . squareup . inject . ass isted . processor Ċ Ċ import Ġcom . google . auto . common . More Elements Ċ import Ġcom . google . auto . common . More Types Ċ import Ġcom . google . auto . service . Auto Service Ċ import Ġcom . squareup . inject . ass isted . Ass isted Ċ import Ġcom . squareup . inject . ass isted . Ass isted Inject Ċ import Ġcom . squareup . inject . ass isted . processor . internal . cast Each Ċ import Ġcom . squareup . inject . ass isted . processor . internal . create Generated Annotation Ċ import Ġcom . squareup . inject . ass isted . processor . internal . filter NotNull Values Ċ import Ġcom . squareup . inject . ass isted . processor . internal . find Elements Annotated With Ċ import Ġcom . squareup . inject . ass isted . processor . internal . has Annotation Ċ import Ġcom . squareup . inject . ass isted . processor . internal . to ClassName Ċ import Ġcom . squareup . inject . ass isted . processor . internal . to TypeName Ċ 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 . IS OL ATING Ċ import Ġjavax . annotation . processing . Abstract Processor Ċ import Ġjavax . annotation . processing . F iler Ċ import Ġjavax . annotation . processing . Mess ager Ċ import Ġjavax . annotation . processing . Processing Environment Ċ import Ġjavax . annotation . processing . Processor Ċ import Ġjavax . annotation . processing . Round Environment Ċ import Ġjavax . lang . model . Source Version Ċ import Ġjavax . lang . model . element . Element Ċ import Ġjavax . lang . model . element . Element Kind . CLASS Ċ import Ġjavax . lang . model . element . Element Kind . CON STRUCTOR Ċ import Ġjavax . lang . model . element . Element Kind . INTERFACE Ċ import Ġjavax . lang . model . element . Executable Element Ċ import Ġjavax . lang . model . element . Modifier . PRIVATE Ċ import Ġjavax . lang . model . element . Modifier . STATIC Ċ import Ġjavax . lang . model . element . Type Element Ċ import Ġjavax . lang . model . type . Declared Type Ċ import Ġjavax . lang . model . type . Executable Type Ċ import Ġjavax . lang . model . util . Elements Ċ import Ġjavax . lang . model . util . Types Ċ import Ġjavax . tools . Diagnostic . Kind . ERROR Ċ import Ġjavax . tools . Diagnostic . Kind . WARNING Ċ Ċ @ Incremental Annotation Processor ( IS OL ATING ) Ċ @ Auto Service ( Processor :: class ) Ċ class ĠAss isted Inject Processor Ġ: ĠAbstract Processor () Ġ{ ĊĠ Ġoverride Ġfun Ġget Supported Source Version () Ġ= ĠSource Version . latest () ĊĠ Ġoverride Ġfun Ġget Supported Annotation Types () Ġ= Ġset Of ( ĊĠĠĠĠĠ ĠAss isted :: class . java . canonical Name , ĊĠĠĠĠĠ ĠAss isted Inject :: class . java . canonical Name , ĊĠĠĠĠĠ ĠAss isted Inject . Factory :: 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 ĊĠ Ġ} ĊĊĠ Ġ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 ĊĊĠ Ġoverride Ġfun Ġprocess ( annotations : ĠSet < Type Element >, Ġround Env : ĠRound Environment ): ĠBoolean Ġ{ ĊĠĠĠ Ġround Env . find Ass isted Inject Candidate Type Elements () ĊĠĠĠĠĠĠĠ Ġ. map NotNull Ġ{ Ġit . to Ass isted Inject Elements OrNull () Ġ} ĊĠĠĠĠĠĠĠ Ġ. associate With Ġ{ Ġit . to Ass isted Injection OrNull () Ġ} ĊĠĠĠĠĠĠĠ Ġ. filter NotNull Values () ĊĠĠĠĠĠĠĠ Ġ. forEach (:: write Ass isted Inject ) ĊĊĠĠĠ Ġval Ġass isted Methods Ġ= Ġround Env . find Elements Annotated With < Ass isted >() ĊĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . enc lo sing Element Ġas ĠExec utable Element Ġ} ĊĠĠĠ Ġ// ĠError Ġany Ġnon - constructor Ġusage Ġof Ġ@ Ass isted . ĊĠĠĠ Ġass isted Methods ĊĠĠĠĠĠĠĠ Ġ. filter Not Ġ{ Ġit . simple Name . content Equals ("< init >") Ġ} ĊĠĠĠĠĠĠĠ Ġ. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġerror ("@ Ass isted Ġis Ġonly Ġsupported Ġon Ġconstructor Ġparameters ", Ġit ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ// ĠError Ġany Ġconstructor Ġusage Ġof Ġ@ Ass isted Ġwhich Ġlack s Ġmethod Ġannotations . ĊĠĠĠ Ġass isted Methods ĊĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . simple Name . content Equals ("< init >") Ġ} ĊĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . annotation Mir rors . isEmpty () Ġ} ĊĠĠĠĠĠĠĠ Ġ. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġerror ("@ Ass isted Ġparameter Ġuse Ġrequires Ġa Ġconstructor Ġannotation Ġsuch Ġas Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"@ Ass isted Inject Ġor Ġ@ In fl ation Inject ", Ġit ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ// ĠError Ġany Ġconstructor Ġusage Ġof Ġ@ Ass isted Ġwhich Ġalso Ġuses Ġ@ Inject . ĊĠĠĠ Ġass isted Methods ĊĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . simple Name . content Equals ("< init >") Ġ} ĊĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . has Annotation (" javax . inject . Inject ") Ġ} ĊĠĠĠĠĠĠĠ Ġ. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġerror ("@ Ass isted Ġparameter Ġdoes Ġnot Ġwork Ġwith Ġ@ Inject ! ĠUse Ġ@ Ass isted Inject Ġor Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"@ In fl ation Inject ", Ġit ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġfalse ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠFind Ġ[ Type Element ] s Ġwhich Ġare Ġcandidates Ġfor Ġass isted Ġinjection Ġby : ĊĠĠ Ġ* Ġ- ĠHaving Ġa Ġconstructor Ġannotated Ġwith Ġ[ Ass isted Inject ] ĊĠĠ Ġ* Ġ- ĠHaving Ġa Ġnested Ġtype Ġannotated Ġwith Ġ[ Ass isted Inject . Factory ] ĊĠĠ Ġ*/ ĊĠ Ġprivate Ġfun ĠRound Environment . find Ass isted Inject Candidate Type Elements (): ĠList < Type Element > Ġ{ ĊĠĠĠ Ġ// ĠGrab Ġtypes Ġwith Ġonly Ġ@ Ass isted Inject . Factory Ġso Ġwe Ġcan Ġdetect Ġmissing Ġ@ Ass isted Inject . ĊĠĠĠ Ġval Ġ( enc losed , Ġorphan ed ) Ġ= Ġfind Elements Annotated With < Ass isted Inject . Factory >() ĊĠĠĠĠĠĠĠ Ġ. partition Ġ{ Ġit . enc lo sing Element . kind Ġ== ĠCLASS Ġ} ĊĠĠĠ Ġorphan ed . forEach Ġ{ ĊĠĠĠĠĠ Ġerror ("@ Ass isted Inject . Factory Ġmust Ġbe Ġdeclared Ġas Ġa Ġnested Ġtype .", Ġit ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġfrom Factory Ġ= Ġen closed . map Ġ{ Ġit . enc lo sing Element Ġas ĠType Element Ġ} ĊĊĠĠĠ Ġ// ĠGrab Ġtypes Ġwith Ġonly Ġ@ Ass isted Inject Ġso Ġwe Ġcan Ġdetect Ġmissing Ġ@ Ass isted Inject . Factory . ĊĠĠĠ Ġval Ġfrom Constructor Ġ= Ġfind Elements Annotated With < Ass isted Inject >() ĊĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . enc lo sing Element Ġas ĠType Element Ġ} ĊĊĠĠĠ Ġreturn Ġ( from Factory Ġ+ Ġfrom Constructor ) ĊĠĠĠĠĠĠĠ Ġ. distinct By Ġ{ ĠMore Types . equiv al ence (). wrap ( it . as Type ()) Ġ} ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠFrom Ġthis Ġ[ Type Element ] Ġwhich Ġis Ġa Ġcandidate Ġfor Ġass isted Ġinjection , Ġfind Ġand Ġvalidate Ġthe ĊĠĠ Ġ* Ġsynt act ical Ġelements Ġrequired Ġto Ġgenerate Ġthe Ġfactory : ĊĠĠ Ġ* Ġ- ĠNon - private , Ġnon - inner Ġtarget Ġtype ĊĠĠ Ġ* Ġ- ĠSingle Ġnon - private Ġtarget Ġconstructor ĊĠĠ Ġ* Ġ- ĠSingle Ġnested , Ġnon - private Ġinterface Ġfactory Ġtype ĊĠĠ Ġ* Ġ- ĠSingle Ġabstract Ġfactory Ġmethod ĊĠĠ Ġ*/ ĊĠ Ġprivate Ġfun ĠType Element . to Ass isted Inject Elements OrNull (): ĠAss isted Inject Elements ? Ġ{ ĊĠĠĠ Ġvar Ġvalid Ġ= Ġtrue ĊĊĠĠĠ Ġif Ġ( PRIVATE Ġin Ġmodifiers ) Ġ{ ĊĠĠĠĠĠ Ġerror ("@ Ass isted Inject - using Ġtypes Ġmust Ġnot Ġbe Ġprivate ", Ġthis ) ĊĠĠĠĠĠ Ġvalid Ġ= Ġfalse ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ( enc lo sing Element . kind Ġ== ĠCLASS Ġ&& ĠSTATIC Ġ! in Ġmodifiers ) Ġ{ ĊĠĠĠĠĠ Ġerror (" Nested Ġ@ Ass isted Inject - using Ġtypes Ġmust Ġbe Ġstatic ", Ġthis ) ĊĠĠĠĠĠ Ġvalid Ġ= Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġconstructors Ġ= Ġen closed Elements ĊĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . kind Ġ== ĠCON STRUCTOR Ġ} ĊĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . has Annotation < Ass isted Inject >() Ġ} ĊĠĠĠĠĠĠĠ Ġ. cast Each < Executable Element >() ĊĠĠĠ Ġif Ġ( construct ors . isEmpty ()) Ġ{ ĊĠĠĠĠĠ Ġerror (" Ass isted Ġinjection Ġrequires Ġan Ġ@ Ass isted Inject - annotated Ġconstructor Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠ Ġ" with Ġat Ġleast Ġone Ġ@ Ass isted Ġparameter .", Ġthis ) ĊĠĠĠĠĠ Ġvalid Ġ= Ġfalse ĊĠĠĠ Ġ} Ġelse Ġif Ġ( construct ors . size Ġ> Ġ 1 ) Ġ{ ĊĠĠĠĠĠ Ġerror (" Multiple Ġ@ Ass isted Inject - annotated Ġconstructors Ġfound .", Ġthis ) ĊĠĠĠĠĠ Ġvalid Ġ= Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġfactory Types Ġ= Ġen closed Elements ĊĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . has Annotation < Ass isted Inject . Factory >() Ġ} ĊĠĠĠĠĠĠĠ Ġ. cast Each < Type Element >() ĊĠĠĠ Ġif Ġ( factory Types . isEmpty ()) Ġ{ ĊĠĠĠĠĠ Ġerror (" No Ġnested Ġ@ Ass isted Inject . Factory Ġfound .", Ġthis ) ĊĠĠĠĠĠ Ġvalid Ġ= Ġfalse ĊĠĠĠ Ġ} Ġelse Ġif Ġ( factory Types . size Ġ> Ġ 1 ) Ġ{ ĊĠĠĠĠĠ Ġerror (" Multiple Ġ@ Ass isted Inject . Factory Ġtypes Ġfound .", Ġthis ) ĊĠĠĠĠĠ Ġvalid Ġ= Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġif Ġ(! valid ) Ġreturn Ġnull ĊĊĠĠĠ Ġval Ġconstructor Ġ= Ġconstructors . single () ĊĠĠĠ Ġif Ġ( PRIVATE Ġin Ġconstructor . modifiers ) Ġ{ ĊĠĠĠĠĠ Ġerror ("@ Ass isted Inject Ġconstructor Ġmust Ġnot Ġbe Ġprivate .", Ġconstructor ) ĊĠĠĠĠĠ Ġvalid Ġ= Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġfactory Type Ġ= Ġfactory Types . single () ĊĠĠĠ Ġif Ġ( factory Type . kind Ġ!= ĠINTER FACE ) Ġ{ ĊĠĠĠĠĠ Ġerror ("@ Ass isted Inject . Factory Ġmust Ġbe Ġan Ġinterface .", Ġfactory Type ) ĊĠĠĠĠĠ Ġvalid Ġ= Ġfalse ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ( PRIVATE Ġin Ġfactory Type . modifiers ) Ġ{ ĊĠĠĠĠĠ Ġerror ("@ Ass isted Inject . Factory Ġmust Ġnot Ġbe Ġprivate .", Ġfactory Type ) ĊĠĠĠĠĠ Ġvalid Ġ= Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġfactory Methods Ġ= ĠMore Elements . getLocal And Inherited Methods ( factory Type , Ġtypes , Ġelements ) ĊĠĠĠĠĠĠĠ Ġ. filter Not Ġ{ Ġit . is Default Ġ} Ġ// ĠIgnore Ġdefault Ġmethods Ġfor Ġconvenience Ġover loads . ĊĠĠĠ Ġif Ġ( factory Methods . isEmpty ()) Ġ{ ĊĠĠĠĠĠ Ġerror (" Factory Ġinterface Ġdoes Ġnot Ġdefine Ġa Ġfactory Ġmethod .", Ġfactory Type ) ĊĠĠĠĠĠ Ġvalid Ġ= Ġfalse ĊĠĠĠ Ġ} Ġelse Ġif Ġ( factory Methods . size Ġ> Ġ 1 ) Ġ{ ĊĠĠĠĠĠ Ġerror (" Factory Ġinterface Ġdefines Ġmultiple Ġfactory Ġmethods .", Ġfactory Type ) ĊĠĠĠĠĠ Ġvalid Ġ= Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġif Ġ(! valid ) Ġreturn Ġnull ĊĊĠĠĠ Ġval Ġfactory Method Ġ= Ġfactory Methods . single () ĊĠĠĠ Ġreturn ĠAss isted Inject Elements ( this , Ġconstructor , Ġfactory Type , Ġfactory Method ) ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠFrom Ġthis Ġ[ Ass isted Inject Elements ], Ġparse Ġand Ġvalidate Ġthe Ġsemantic Ġinformation Ġof Ġthe Ġelements ĊĠĠ Ġ* Ġwhich Ġis Ġrequired Ġto Ġgenerate Ġthe Ġfactory : ĊĠĠ Ġ* Ġ- ĠAt Ġleast Ġone Ġass isted Ġparameter Ġand Ġno Ġduplicates ĊĠĠ Ġ* Ġ- ĠAt Ġleast Ġone Ġprovided Ġparameter Ġand Ġno Ġduplicates ĊĠĠ Ġ* Ġ- ĠFactory Ġmethod Ġparameters Ġmatch Ġass isted Ġparameters Ġin Ġany Ġorder ĊĠĠ Ġ*/ ĊĠ Ġprivate Ġfun ĠAss isted Inject Elements . to Ass isted Injection OrNull (): ĠAss isted Injection ? Ġ{ ĊĠĠĠ Ġvar Ġvalid Ġ= Ġtrue ĊĊĠĠĠ Ġval Ġrequests Ġ= Ġtarget Constructor . parameters . map Ġ{ Ġit . as Dependency Request () Ġ} ĊĠĠĠ Ġval Ġ( ass isted Requests , Ġprovided Requests ) Ġ= Ġrequests . partition Ġ{ Ġit . is Ass isted Ġ} ĊĠĠĠ Ġif Ġ( ass isted Requests . isEmpty ()) Ġ{ ĊĠĠĠĠĠ Ġwarn (" Ass isted Ġinjection Ġwithout Ġat Ġleast Ġone Ġ@ Ass isted Ġparameter Ġcan Ġuse Ġ@ Inject ", ĊĠĠĠĠĠĠĠĠĠ Ġtarget Constructor ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ( provided Requests . isEmpty ()) Ġ{ ĊĠĠĠĠĠ Ġwarn (" Ass isted Ġinjection Ġwithout Ġat Ġleast Ġone Ġnon - @ Ass isted Ġparameter Ġdoesn 't Ġneed Ġa Ġfactory ", ĊĠĠĠĠĠĠĠĠĠ Ġtarget Constructor ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠProject Ġthe Ġfactory Ġmethod Ġ( which Ġmay Ġhave Ġcome Ġfrom Ġa Ġsup ertype ) Ġas Ġif Ġit Ġwere Ġa Ġmember Ġof ĊĠĠĠ Ġ// Ġthe Ġsubtype Ġto Ġresolve Ġany Ġgeneric Ġparameters . ĊĠĠĠ Ġval Ġfactory Executable Ġ= Ġtypes . as Member Of ( factory Type . as Type () Ġas ĠDecl ared Type , ĊĠĠĠĠĠĠĠ Ġfactory Method ) Ġas ĠExec utable Type ĊĊĠĠĠ Ġval Ġexpected Keys Ġ= Ġass isted Requests . map Ġ{ Ġit . named Key Ġ}. sorted () ĊĠĠĠ Ġval Ġfactory Keys Ġ= Ġfactory Method . parameters ĊĠĠĠĠĠĠĠ Ġ. zip ( factory Executable . parameter Types ) Ġ{ Ġelement , Ġmirror Ġ-> Ġelement . as Named Key ( mirror ) Ġ} ĊĠĠĠ Ġval Ġkeys Ġ= Ġfactory Keys . sorted () ĊĠĠĠ Ġif Ġ( keys Ġ!= Ġexpected Keys ) Ġ{ ĊĠĠĠĠĠ Ġval Ġmessage Ġ= Ġbuild String Ġ{ ĊĠĠĠĠĠĠĠ Ġappend (" Factory Ġmethod Ġparameters Ġdo Ġnot Ġmatch Ġconstructor Ġ@ Ass isted Ġparameters . Ġ") ĊĠĠĠĠĠĠĠ Ġappend (" Both Ġparameter Ġtype Ġand Ġname Ġmust Ġmatch .") ĊĊĠĠĠĠĠĠĠ Ġval Ġmissing Keys Ġ= Ġexpected Keys Ġ- Ġkeys ĊĠĠĠĠĠĠĠ Ġif Ġ( missing Keys . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġappend ( missing Keys . join ToString ("\ n Ġ* Ġ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprefix Ġ= Ġ"\ n Declared Ġby Ġconstructor , Ġun matched Ġin Ġfactory Ġmethod :\ n Ġ* Ġ")) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġunknown Keys Ġ= Ġkeys Ġ- Ġexpected Keys ĊĠĠĠĠĠĠĠ Ġif Ġ( unknown Keys . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġappend ( unknown Keys . join ToString ("\ n Ġ* Ġ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprefix Ġ= Ġ"\ n Declared Ġby Ġfactory Ġmethod , Ġun matched Ġin Ġconstructor :\ n Ġ* Ġ")) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġerror ( message , ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( factory Method . enc lo sing Element Ġ== Ġfactory Type ) Ġfactory Method Ġelse Ġtarget Constructor ) ĊĠĠĠĠĠ Ġvalid Ġ= Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġif Ġ(! valid ) Ġreturn Ġnull ĊĊĠĠĠ Ġval Ġtarget Type Ġ= Ġtarget Type . as Type (). to TypeName () ĊĠĠĠ Ġval Ġfactory Type Ġ= Ġfactory Type . to ClassName () ĊĠĠĠ Ġval ĠreturnType Ġ= Ġfactory Executable . returnType . to TypeName () ĊĠĠĠ Ġval ĠmethodName Ġ= Ġfactory Method . simple Name . toString () ĊĠĠĠ Ġval Ġgenerated Annotation Ġ= Ġcreate Generated Annotation ( source Version , Ġelements ) ĊĠĠĠ Ġreturn ĠAss isted Injection ( target Type , Ġrequests , Ġfactory Type , ĠmethodName , ĠreturnType , ĊĠĠĠĠĠĠĠ Ġfactory Keys , Ġgenerated Annotation ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġwrite Ass isted Inject ( elements : ĠAss isted Inject Elements , Ġinjection : ĠAss isted Injection ) Ġ{ ĊĠĠĠ Ġval Ġgenerated Type Spec Ġ= Ġinjection . brew Java () ĊĠĠĠĠĠĠĠ Ġ. to Builder () ĊĠĠĠĠĠĠĠ Ġ. add Origin ating Element ( elements . target Type ) ĊĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠ ĠJava File . builder ( injection . generated Type . packageName (), Ġgenerated Type Spec ) ĊĠĠĠĠĠĠĠ Ġ. add File Comment (" Generated Ġby Ġ@ Ass isted Inject . ĠDo Ġnot Ġmodify !") ĊĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġ. writeTo ( filer ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġwarn ( message : ĠString , Ġelement : ĠElement ? Ġ= Ġnull ) Ġ{ ĊĠĠĠ Ġmess ager . print Message ( WARNING , Ġmessage , Ġelement ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġerror ( message : ĠString , Ġelement : ĠElement ? Ġ= Ġnull ) Ġ{ ĊĠĠĠ Ġmess ager . print Message ( ERROR , Ġmessage , Ġelement ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġdata Ġclass ĠAss isted Inject Elements ( ĊĠĠĠ Ġval Ġtarget Type : ĠType Element , ĊĠĠĠ Ġval Ġtarget Constructor : ĠExec utable Element , ĊĠĠĠ Ġval Ġfactory Type : ĠType Element , ĊĠĠĠ Ġval Ġfactory Method : ĠExec utable Element ĊĠ Ġ) Ċ } Ċ