package Ġcom . squareup . an vil . compiler . codegen . d agger Ċ Ċ import Ġcom . squareup . an vil . compiler . ass isted Fq Name Ċ import Ġcom . squareup . an vil . compiler . d agger Double Check Fq Name String Ċ import Ġcom . squareup . an vil . compiler . d agger Lazy Fq Name Ċ import Ġcom . squareup . an vil . compiler . inject Fq Name Ċ import Ġcom . squareup . an vil . compiler . internal . capitalize Ċ import Ġcom . squareup . an vil . compiler . internal . reference . Class Reference Ċ import Ġcom . squareup . an vil . compiler . internal . reference . Parameter Reference Ċ import Ġcom . squareup . an vil . compiler . internal . reference . Property Reference Ċ import Ġcom . squareup . an vil . compiler . internal . reference . Type Parameter Reference Ċ import Ġcom . squareup . an vil . compiler . internal . reference . Type Reference Ċ import Ġcom . squareup . an vil . compiler . internal . reference . Visibility . PRIVATE Ċ import Ġcom . squareup . an vil . compiler . internal . reference . all Super Type Class References Ċ import Ġcom . squareup . an vil . compiler . internal . reference . argument At Ċ import Ġcom . squareup . an vil . compiler . internal . reference . as ClassName Ċ import Ġcom . squareup . an vil . compiler . internal . reference . generate ClassName Ċ import Ġcom . squareup . an vil . compiler . internal . with Jvm Suppress W ild cards IfNeeded Ċ import Ġcom . squareup . an vil . compiler . provider Fq Name Ċ import Ġcom . squareup . kotlin po et . ClassName Ċ import Ġcom . squareup . kotlin po et . Fun Spec Ċ import Ġcom . squareup . kotlin po et . Parameterized TypeName Ċ import Ġcom . squareup . kotlin po et . Parameterized TypeName . Companion . parameter ized By Ċ import Ġcom . squareup . kotlin po et . TypeName Ċ import Ġcom . squareup . kotlin po et . as ClassName Ċ import Ġdagger . Lazy Ċ import Ġdagger . internal . Provider Of Lazy Ċ import Ġjavax . inject . Provider Ċ Ċ internal Ġfun ĠType Name . wrap In Provider (): ĠParameter ized TypeName Ġ{ ĊĠ Ġreturn ĠProvider :: class . as ClassName (). parameter ized By ( this ) Ċ } Ċ Ċ internal Ġfun ĠType Name . wrap In Lazy (): ĠParameter ized TypeName Ġ{ ĊĠ Ġreturn ĠLazy :: class . as ClassName (). parameter ized By ( this ) Ċ } Ċ Ċ internal Ġfun ĠList < Parameter Reference >. map To Constructor Parameters (): ĠList < Constructor Parameter > Ġ{ ĊĠ Ġreturn Ġfold ( listOf ()) Ġ{ Ġacc , Ġcallable Reference Ġ-> ĊĠĠĠ Ġacc Ġ+ Ġcallable Reference . to Constructor Parameter ( callable Reference . name . unique ParameterName ( acc )) ĊĠ Ġ} Ċ } Ċ Ċ private Ġfun ĠParameter Reference . to Constructor Parameter ( ĊĠ Ġunique Name : ĠString Ċ ): ĠConstructor Parameter Ġ{ ĊĠ Ġval Ġtype Ġ= Ġtype () ĊĊĠ Ġval Ġis Wrapped In Provider Ġ= Ġtype . as Class Reference OrNull ()?. fq Name Ġ== Ġprovider Fq Name ĊĠ Ġval Ġis Wrapped In Lazy Ġ= Ġtype . as Class Reference OrNull ()?. fq Name Ġ== Ġdagger Lazy Fq Name ĊĠ Ġval Ġis Lazy Wrapped In Provider Ġ= Ġis Wrapped In Provider Ġ&& ĊĠĠĠ Ġtype . un wrapped Types . first (). as Class Reference OrNull ()?. fq Name Ġ== Ġdagger Lazy Fq Name ĊĊĠ Ġval ĠtypeName Ġ= Ġwhen Ġ{ ĊĠĠĠ Ġis Lazy Wrapped In Provider Ġ-> Ġtype . un wrapped Types . first (). un wrapped Types . first () ĊĠĠĠ Ġis Wrapped In Provider Ġ|| Ġis Wrapped In Lazy Ġ-> Ġtype . un wrapped Types . first () ĊĠĠĠ Ġelse Ġ-> Ġtype ĊĠ Ġ}. as TypeName (). with Jvm Suppress W ild cards IfNeeded ( this , Ġtype ) ĊĊĠ Ġval Ġass isted Annotation Ġ= Ġannotations . single OrNull Ġ{ Ġit . fq Name Ġ== Ġass isted Fq Name Ġ} ĊĊĠ Ġval Ġass isted Identifier Ġ= Ġass isted Annotation ĊĠĠĠ Ġ? . argument At (" value ", Ġ 0 ) ĊĠĠĠ Ġ? . value () ĊĠĠĠ Ġ?: Ġ"" ĊĊĠ Ġreturn ĠConstructor Parameter ( ĊĠĠĠ Ġname Ġ= Ġunique Name , ĊĠĠĠ Ġoriginal Name Ġ= Ġname , ĊĠĠĠ ĠtypeName Ġ= ĠtypeName , ĊĠĠĠ Ġprovider TypeName Ġ= ĠtypeName . wrap In Provider (), ĊĠĠĠ Ġlazy TypeName Ġ= ĠtypeName . wrap In Lazy (), ĊĠĠĠ Ġis Wrapped In Provider Ġ= Ġis Wrapped In Provider , ĊĠĠĠ Ġis Wrapped In Lazy Ġ= Ġis Wrapped In Lazy , ĊĠĠĠ Ġis Lazy Wrapped In Provider Ġ= Ġis Lazy Wrapped In Provider , ĊĠĠĠ Ġis Ass isted Ġ= Ġass isted Annotation Ġ!= Ġnull , ĊĠĠĠ Ġass isted Identifier Ġ= Ġass isted Identifier ĊĠ Ġ) Ċ } Ċ Ċ internal Ġfun ĠFun Spec . Builder . add Member Injection ( ĊĠ Ġmember Inject Parameters : ĠList < Member Inject Parameter >, ĊĠ Ġinstance Name : ĠString Ċ ): ĠFun Spec . Builder Ġ= Ġapply Ġ{ ĊĊĠ Ġmember Inject Parameters . forEach Ġ{ Ġparameter Ġ-> ĊĊĠĠĠ Ġval Ġfunction Name Ġ= Ġ" inject ${ parameter . access Name . capitalize () }" ĊĊĠĠĠ Ġval Ġparam Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠ Ġparameter . is Lazy Wrapped In Provider Ġ-> ĊĠĠĠĠĠĠĠ Ġ"${ Provider Of Lazy :: class . qualified Name }. create (${ parameter . name })" ĊĠĠĠĠĠ Ġparameter . is Wrapped In Provider Ġ-> Ġparameter . name ĊĠĠĠĠĠ Ġparameter . is Wrapped In Lazy Ġ-> ĊĠĠĠĠĠĠĠ Ġ"$ d agger Double Check Fq Name String . lazy (${ parameter . name })" ĊĠĠĠĠĠ Ġelse Ġ-> Ġparameter . name Ġ+ Ġ". get ()" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġadd Statement ("% T .$ function Name ($ instance Name , Ġ$ param )", Ġparameter . member Injector ClassName ) ĊĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠReturns Ġall Ġmember - inject ed Ġparameters Ġfor Ġthe Ġreceiver Ġclass Ġ* and Ġany Ġsuper classes *. Ċ Ġ* Ċ Ġ* ĠWe Ġuse ĠPsi Ġwhenever Ġpossible , Ġto Ġsupport Ġgenerated Ġcode . Ċ Ġ* Ċ Ġ* ĠOrder Ġis Ġimportant . ĠD agger Ġexpects Ġthe Ġproperties Ġof Ġthe Ġmost - upstream Ġclass Ġto Ġbe Ġlisted Ġfirst Ċ Ġ* Ġin Ġa Ġfactory 's Ġconstructor . Ċ Ġ* Ċ Ġ* ĠGiven Ġthe Ġhierarchy : Ċ Ġ* ĠImp l Ġ-> ĠMiddle Ġ-> ĠBase Ċ Ġ* ĠThe Ġorder Ġof Ġdependencies Ġin Ġ` Impl _ Factory `' s Ġconstructor Ġshould Ġbe : Ċ Ġ* ĠBase Ġ-> ĠMiddle Ġ-> ĠImp l Ċ Ġ*/ Ċ internal Ġfun ĠClass Reference . member Inject Parameters (): ĠList < Member Inject Parameter > Ġ{ ĊĠ Ġreturn Ġall Super Type Class References ( include Self Ġ= Ġtrue ) ĊĠĠĠ Ġ. filter Not Ġ{ Ġit . is Interface () Ġ} ĊĠĠĠ Ġ. toList () ĊĠĠĠ Ġ. fold Right ( listOf ()) Ġ{ Ġclass Reference , Ġacc Ġ-> ĊĠĠĠĠĠ Ġacc Ġ+ Ġclass Reference . declared Member Inject Parameters ( acc , Ġthis ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* Ġ@ param Ġsuper Parameters Ġinjected Ġparameters Ġfrom Ġany Ġsuper - classes , Ġregardless Ġof Ġwhether Ġthey 're Ċ Ġ* Ġoverridden Ġby Ġthe Ġreceiver Ġclass Ċ Ġ* Ġ@ return Ġthe Ġmember - inject ed Ġparameters Ġfor Ġthis Ġclass Ġonly , Ġnot Ġincluding Ġany Ġsuper - classes Ċ Ġ*/ Ċ private Ġfun ĠClass Reference . declared Member Inject Parameters ( ĊĠ Ġsuper Parameters : ĠList < Parameter >, ĊĠ Ġimplementing Class : ĠClass Reference Ċ ): ĠList < Member Inject Parameter > Ġ{ ĊĠ Ġreturn Ġproperties ĊĠĠĠ Ġ. filter Ġ{ Ġit . is Annotated With ( inject Fq Name ) Ġ} ĊĠĠĠ Ġ. filter Ġ{ Ġit . visibility () Ġ!= ĠPRIVATE Ġ} ĊĠĠĠ Ġ. fold ( listOf ()) Ġ{ Ġacc , Ġproperty Ġ-> ĊĠĠĠĠĠ Ġval Ġunique Name Ġ= Ġproperty . name . unique ParameterName ( super Parameters , Ġacc ) ĊĠĠĠĠĠ Ġacc Ġ+ Ġproperty . to Member Inject Parameter ( ĊĠĠĠĠĠĠĠ Ġunique Name Ġ= Ġunique Name , ĊĠĠĠĠĠĠĠ Ġimplementing Class Ġ= Ġimplementing Class ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠConverts Ġthe Ġparameter Ġlist Ġto Ġcomma Ġseparated Ġargument Ġlist Ġthat Ġcan Ġbe Ġused Ġto Ġcall Ġother Ċ Ġ* Ġfunctions , Ġe . g . Ċ Ġ* Ġ``` Ċ Ġ* Ġ[ param 0 : ĠString , Ġparam 1 : ĠInt ] Ġ-> Ġ" param 0 , Ġparam 1 " Ċ Ġ* Ġ``` Ċ Ġ* Ġ[ as Provider ] Ġallows Ġyou Ġto Ġdecide Ġif Ġeach Ġparameter Ġis Ġwrapped Ġin Ġa Ġ` Provider ` Ġinterface . ĠIf Ċ Ġ* Ġtrue , Ġthen Ġthe Ġ` get ()` Ġfunction Ġwill Ġbe Ġcalled Ġfor Ġthe Ġprovider Ġparameter . ĠIf Ġfalse , Ġthen Ċ Ġ* Ġthen Ġalways Ġonly Ġthe Ġparameter Ġname Ġwill Ġused Ġin Ġthe Ġargument Ġlist : Ċ Ġ* Ġ``` Ċ Ġ* Ġ" param 0 . get ()" Ġvs Ġ" param 0 " Ċ Ġ* Ġ``` Ċ Ġ* ĠSet Ġ[ include Module ] Ġto Ġtrue Ġif Ġa ĠD agger Ġmodule Ġinstance Ġis Ġpart Ġof Ġthe Ġargument Ġlist . Ċ Ġ*/ Ċ internal Ġfun ĠList < Parameter >. as ArgumentList ( ĊĠ Ġas Provider : ĠBoolean , ĊĠ Ġinclude Module : ĠBoolean Ċ ): ĠString Ġ{ ĊĠ Ġreturn Ġthis ĊĠĠĠ Ġ. let Ġ{ Ġlist Ġ-> ĊĠĠĠĠĠ Ġif Ġ( as Provider ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlist . map Ġ{ Ġparameter Ġ-> ĊĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparameter . is Lazy Wrapped In Provider Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ Provider Of Lazy :: class . qualified Name }. create (${ parameter . name })" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparameter . is Wrapped In Provider Ġ-> Ġparameter . name ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNorm ally ĠD agger Ġchanges ĠLazy < Type > Ġparameters Ġto Ġa ĠProvider < Type > Ġ( usually Ġthe ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcontainer Ġis Ġa Ġjoined Ġtype ), Ġtherefore Ġwe Ġuse Ġ`. lazy (.. )` Ġto Ġconvert Ġthe ĠProvider ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġto Ġa ĠLazy . ĠAss isted Ġparameters Ġbehave Ġdifferently Ġand Ġthe ĠLazy Ġtype Ġis Ġnot Ġchanged ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġto Ġa ĠProvider Ġand Ġwe Ġcan Ġsimply Ġuse Ġthe Ġparameter Ġname Ġin Ġthe Ġargument Ġlist . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparameter . is Wrapped In Lazy Ġ&& Ġparameter . is Ass isted Ġ-> Ġparameter . name ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparameter . is Wrapped In Lazy Ġ-> Ġ"$ d agger Double Check Fq Name String . lazy (${ parameter . name })" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparameter . is Ass isted Ġ-> Ġparameter . name ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ"${ parameter . name }. get ()" ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} Ġelse Ġlist . map Ġ{ Ġit . name Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġ. let Ġ{ ĊĠĠĠĠĠ Ġif Ġ( include Module ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġit . to Mutable List () ĊĠĠĠĠĠĠĠ Ġresult . add ( 0 , Ġ" module ") ĊĠĠĠĠĠĠĠ Ġresult . toList () ĊĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġit ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġ. join ToString () Ċ } Ċ Ċ private Ġfun ĠProperty Reference . to Member Inject Parameter ( ĊĠ Ġunique Name : ĠString , ĊĠ Ġimplementing Class : ĠClass Reference Ċ ): ĠMember Inject Parameter Ġ{ ĊĠ Ġval Ġoriginal Name Ġ= Ġname ĊĠ Ġval Ġtype Ġ= Ġtype () ĊĊĠ Ġval Ġis Wrapped In Provider Ġ= Ġtype . as Class Reference OrNull ()?. fq Name Ġ== Ġprovider Fq Name ĊĠ Ġval Ġis Wrapped In Lazy Ġ= Ġtype . as Class Reference OrNull ()?. fq Name Ġ== Ġdagger Lazy Fq Name ĊĠ Ġval Ġis Lazy Wrapped In Provider Ġ= Ġis Wrapped In Provider Ġ&& ĊĠĠĠ Ġtype . un wrapped Types . first (). as Class Reference OrNull ()?. fq Name Ġ== Ġdagger Lazy Fq Name ĊĊĠ Ġval Ġun wrapped Type Ġ= Ġwhen Ġ{ ĊĠĠĠ Ġis Lazy Wrapped In Provider Ġ-> Ġtype . un wrapped Types . first (). un wrapped Types . first () ĊĠĠĠ Ġis Wrapped In Provider Ġ|| Ġis Wrapped In Lazy Ġ-> Ġtype . un wrapped Types . first () ĊĠĠĠ Ġelse Ġ-> Ġtype ĊĠ Ġ} ĊĠ Ġval ĠtypeName Ġ= Ġun wrapped Type . as TypeName (). with Jvm Suppress W ild cards IfNeeded ( this , Ġtype ) ĊĠ Ġval Ġresolved TypeName Ġ= Ġif Ġ( un wrapped Type . is Generic Ex cluding Type Aliases ()) Ġ{ ĊĠĠĠ Ġun wrapped Type . as Class Reference OrNull () ĊĠĠĠĠĠ Ġ? . as ClassName () ĊĠĠĠĠĠ Ġ? . option ally Parameterized By Names ( ĊĠĠĠĠĠĠĠ Ġun wrapped Type . un wrapped Types . map NotNull Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġit . resolve Generic TypeName OrNull ( implement ing Class ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ Ġ? . with Jvm Suppress W ild cards IfNeeded ( this , Ġun wrapped Type ) ĊĠ Ġ} Ġelse Ġ{ ĊĠĠĠ Ġnull ĊĠ Ġ} ĊĊĠ Ġval Ġass isted Annotation Ġ= Ġannotations . single OrNull Ġ{ Ġit . fq Name Ġ== Ġass isted Fq Name Ġ} ĊĊĠ Ġval Ġass isted Identifier Ġ= Ġass isted Annotation ĊĠĠĠ Ġ? . argument At (" value ", Ġ 0 ) ĊĠĠĠ Ġ? . value () ĊĠĠĠ Ġ?: Ġ"" ĊĊĠ Ġval Ġmember Injector ClassName Ġ= Ġdeclaring Class ĊĠĠĠ Ġ. generate ClassName ( separator Ġ= Ġ"_ ", Ġsuffix Ġ= Ġ"_ Members Injector ") ĊĠĠĠ Ġ. relative ClassName ĊĠĠĠ Ġ. asString () ĊĊĠ Ġval Ġmember Injector Class Ġ= ĠClass Name ( ĊĠĠĠ Ġdeclaring Class . package Fq Name . asString (), Ġmember Injector ClassName ĊĠ Ġ) ĊĊĠ Ġval Ġis Setter Inject ed Ġ= Ġthis . setter Annotations . any Ġ{ Ġit . fq Name Ġ== Ġinject Fq Name Ġ} ĊĊĠ Ġ// Ġsetter Ġdeleg ates Ġrequire Ġa Ġ" set " Ġprefix Ġfor Ġtheir Ġinject Ġfunction ĊĠ Ġval Ġaccess Name Ġ= Ġif Ġ( is Setter Inject ed ) Ġ{ ĊĠĠĠ Ġ" set ${ original Name . capitalize () }" ĊĠ Ġ} Ġelse Ġ{ ĊĠĠĠ Ġoriginal Name ĊĠ Ġ} ĊĊĠ Ġval Ġqualifier Annotations Ġ= Ġannotations ĊĠĠĠ Ġ. filter Ġ{ Ġit . is Qualifier () Ġ} ĊĠĠĠ Ġ. map Ġ{ Ġit . to Annotation Spec () Ġ} ĊĊĠ Ġval Ġprovider TypeName Ġ= ĠtypeName . wrap In Provider () ĊĊĠ Ġreturn ĠMember Inject Parameter ( ĊĠĠĠ Ġname Ġ= Ġunique Name , ĊĠĠĠ Ġoriginal Name Ġ= Ġoriginal Name , ĊĠĠĠ ĠtypeName Ġ= ĠtypeName , ĊĠĠĠ Ġprovider TypeName Ġ= Ġprovider TypeName , ĊĠĠĠ Ġlazy TypeName Ġ= ĠtypeName . wrap In Lazy (), ĊĠĠĠ Ġis Wrapped In Provider Ġ= Ġis Wrapped In Provider , ĊĠĠĠ Ġis Wrapped In Lazy Ġ= Ġis Wrapped In Lazy , ĊĠĠĠ Ġis Lazy Wrapped In Provider Ġ= Ġis Lazy Wrapped In Provider , ĊĠĠĠ Ġis Ass isted Ġ= Ġass isted Annotation Ġ!= Ġnull , ĊĠĠĠ Ġass isted Identifier Ġ= Ġass isted Identifier , ĊĠĠĠ Ġmember Injector ClassName Ġ= Ġmember Injector Class , ĊĠĠĠ Ġis Setter Inject ed Ġ= Ġis Setter Inject ed , ĊĠĠĠ Ġaccess Name Ġ= Ġaccess Name , ĊĠĠĠ Ġqualifier Annotation Specs Ġ= Ġqualifier Annotations , ĊĠĠĠ Ġinjected Field Signature Ġ= Ġfq Name , ĊĠĠĠ Ġresolved Provider TypeName Ġ= Ġresolved TypeName ?. wrap In Provider () Ġ?: Ġprovider TypeName ĊĠ Ġ) Ċ } Ċ Ċ private Ġfun ĠType Reference . is Generic Ex cluding Type Aliases (): ĠBoolean Ġ{ ĊĠ Ġ// ĠA ĠType Reference Ġfor Ġ' type alias ĠString List Ġ= ĠList < String > Ġwould Ġstill Ġshow Ġup Ġas Ġgeneric Ġbut ĊĠ Ġ// Ġwould Ġhave Ġno Ġun wrapped Ġtypes Ġavailable Ġ( String ). ĊĠ Ġreturn Ġis GenericType () Ġ&& Ġun wrapped Types . isNotEmpty () Ċ } Ċ Ċ private Ġfun ĠClass Name . option ally Parameterized By Names ( ĊĠ Ġtype Names : ĠList < TypeName > Ċ ): ĠType Name Ġ{ ĊĠ Ġreturn Ġif Ġ( type Names . isEmpty ()) Ġ{ ĊĠĠĠ Ġthis ĊĠ Ġ} Ġelse Ġ{ ĊĠĠĠ Ġparameter ized By ( type Names ) ĊĠ Ġ} Ċ } Ċ Ċ internal Ġfun ĠClass Name . option ally Parameterized By ( ĊĠ Ġtype Parameters : ĠList < Type Parameter Reference > Ċ ): ĠType Name Ġ{ ĊĠ Ġreturn Ġif Ġ( type Parameters . isEmpty ()) Ġ{ ĊĠĠĠ Ġthis ĊĠ Ġ} Ġelse Ġ{ ĊĠĠĠ Ġparameter ized By ( type Parameters . map Ġ{ Ġit . type Variable Name Ġ}) ĊĠ Ġ} Ċ } Ċ