package Ġcom . squareup . an vil . compiler . codegen Ċ Ċ import Ġcom . squareup . an vil . compiler . ass isted Fq Name Ċ import Ġcom . squareup . an vil . compiler . codegen . d agger . is Setter Inject ed Ċ 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 . internal . capitalize Ċ import Ġcom . squareup . an vil . compiler . internal . find Annotation Ċ import Ġcom . squareup . an vil . compiler . internal . fq Name OrNull Ċ import Ġcom . squareup . an vil . compiler . internal . generate ClassName Ċ import Ġcom . squareup . an vil . compiler . internal . is Nullable Ċ import Ġcom . squareup . an vil . compiler . internal . qual ifier Annotation Specs Ċ import Ġcom . squareup . an vil . compiler . internal . require Fq Name Ċ import Ġcom . squareup . an vil . compiler . internal . require TypeName Ċ import Ġcom . squareup . an vil . compiler . internal . require Type Reference Ċ 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 . 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 Ġorg . jetbrains . kotlin . descriptors . Module Descriptor Ċ import Ġorg . jetbrains . kotlin . psi . Kt Callable Declaration Ċ import Ġorg . jetbrains . kotlin . psi . Kt Property Ċ import Ġorg . jetbrains . kotlin . psi . Kt String Template Expression Ċ import Ġorg . jetbrains . kotlin . psi . Kt Type ArgumentList Ċ import Ġorg . jetbrains . kotlin . psi . Kt Type Element Ċ import Ġorg . jetbrains . kotlin . psi . Kt Type Projection Ċ import Ġorg . jetbrains . kotlin . psi . Kt Type Reference Ċ import Ġorg . jetbrains . kotlin . psi . Kt Value Argument Ċ import Ġorg . jetbrains . kotlin . psi . psi Util . containing Class Ċ import Ġjavax . inject . Provider Ċ Ċ private Ġfun ĠK t Type Element . single Type Argument (): ĠK t Type Reference Ġ{ ĊĠ Ġreturn Ġchildren ĊĠĠĠ Ġ. filter Is Instance < Kt Type ArgumentList >() ĊĠĠĠ Ġ. single () ĊĠĠĠ Ġ. children ĊĠĠĠ Ġ. filter Is Instance < Kt Type Projection >() ĊĠĠĠ Ġ. single () ĊĠĠĠ Ġ. children ĊĠĠĠ Ġ. filter Is Instance < Kt Type Reference >() ĊĠĠĠ Ġ. single () Ċ } Ċ Ċ internal Ġfun ĠList < Kt Callable Declaration >. map To Constructor Parameters ( ĊĠ Ġmodule : ĠModule Descriptor Ċ ): ĠList < Constructor Parameter > Ġ= ĊĠ Ġfold ( listOf ()) Ġ{ Ġacc , Ġkt Callable Declaration Ġ-> ĊĊĠĠĠ Ġval Ġunique Name Ġ= Ġkt Callable Declaration . name As Safe Name . asString (). unique ParameterName ( acc ) ĊĊĠĠĠ Ġacc Ġ+ Ġkt Callable Declaration . to Constructor Parameter ( module Ġ= Ġmodule , Ġunique Name Ġ= Ġunique Name ) ĊĠ Ġ} Ċ Ċ private Ġfun ĠK t Callable Declaration . to Constructor Parameter ( ĊĠ Ġmodule : ĠModule Descriptor , ĊĠ Ġunique Name : ĠString Ċ ): ĠConstructor Parameter Ġ{ ĊĊĠ Ġval Ġtype Element Ġ= Ġtype Reference ?. type Element ĊĠ Ġval Ġtype Fq Name Ġ= Ġtype Element ?. fq Name OrNull ( module ) ĊĊĠ Ġval Ġis Wrapped In Provider Ġ= Ġtype Fq Name Ġ== Ġprovider Fq Name ĊĠ Ġval Ġis Wrapped In Lazy Ġ= Ġtype Fq Name Ġ== Ġdagger Lazy Fq Name ĊĊĠ Ġvar Ġis Lazy Wrapped In Provider Ġ= Ġfalse ĊĊĠ Ġval ĠtypeName Ġ= Ġwhen Ġ{ ĊĠĠĠ Ġrequire Type Reference ( module ). is Nullable () Ġ-> ĊĠĠĠĠĠ Ġrequire Type Reference ( module ). require TypeName ( module ). copy ( nullable Ġ= Ġtrue ) ĊĊĠĠĠ Ġis Wrapped In Provider Ġ|| Ġis Wrapped In Lazy Ġ-> Ġ{ ĊĠĠĠĠĠ Ġval Ġtype Parameter Reference Ġ= Ġtype Element !!. single Type Argument () ĊĊĠĠĠĠĠ Ġif Ġ( is Wrapped In Provider Ġ&& ĊĠĠĠĠĠĠĠ Ġtype Parameter Reference . fq Name OrNull ( module ) Ġ== Ġdagger Lazy Fq Name ĊĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠThis Ġis Ġa Ġsuper Ġrare Ġcase Ġwhen Ġsomeone Ġinject s ĠProvider < Lazy < Type >> Ġthat Ġrequires ĊĠĠĠĠĠĠĠ Ġ// Ġspecial Ġcare . ĊĠĠĠĠĠĠĠ Ġis Lazy Wrapped In Provider Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġtype Parameter Reference . type Element !!. single Type Argument (). require TypeName ( module ) ĊĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġtype Parameter Reference . require TypeName ( module ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġelse Ġ-> Ġrequire Type Reference ( module ). require TypeName ( module ) ĊĠ Ġ}. with Jvm Suppress W ild cards IfNeeded ( this , Ġmodule ) ĊĊĠ Ġval Ġass isted Annotation Ġ= Ġfind Annotation ( ass isted Fq Name , Ġmodule ) ĊĠ Ġval Ġass isted Identifier Ġ= ĊĠĠĠ Ġ( ass isted Annotation ?. value Arguments ?. first OrNull () Ġas ? ĠK t Value Argument ) ĊĠĠĠĠĠ Ġ? . children ĊĠĠĠĠĠ Ġ? . filter Is Instance < Kt String Template Expression >() ĊĠĠĠĠĠ Ġ? . single () ĊĠĠĠĠĠ Ġ? . children ĊĠĠĠĠĠ Ġ? . first () ĊĠĠĠĠĠ Ġ? . text ĊĠĠĠĠĠ Ġ?: Ġ"" ĊĊĠ Ġreturn ĠConstructor Parameter ( ĊĠĠĠ Ġname Ġ= Ġunique Name , ĊĠĠĠ Ġoriginal Name Ġ= Ġname As Safe Name . asString (), ĊĠĠĠ Ġ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 ĠList < Kt Property >. map To Member Inject Parameters ( ĊĠ Ġmodule : ĠModule Descriptor , ĊĠ Ġsuper Parameters : ĠList < Parameter > Ċ ): ĠList < Member Inject Parameter > Ġ= Ġfold ( listOf ()) Ġ{ Ġacc , Ġkt Property Ġ-> ĊĊĠ Ġval Ġunique Name Ġ= Ġkt Property . name As Safe Name . asString () ĊĠĠĠ Ġ. unique ParameterName ( super Parameters , Ġacc ) ĊĊĠ Ġacc Ġ+ Ġkt Property . to Member Inject Parameter ( module Ġ= Ġmodule , Ġunique Name Ġ= Ġunique Name ) Ċ } Ċ Ċ private Ġfun ĠK t Property . to Member Inject Parameter ( ĊĠ Ġmodule : ĠModule Descriptor , ĊĠ Ġunique Name : ĠString Ċ ): ĠMember Inject Parameter Ġ{ ĊĊĠ Ġval Ġconstructor Parameter Ġ= Ġto Constructor Parameter ( module , Ġunique Name ) ĊĊĠ Ġval Ġcontaining Class Ġ= Ġcontaining Class () !! ĊĠ Ġval ĠpackageName Ġ= Ġcontaining Class . containing Kt File . package Fq Name . asString () ĊĊĠ Ġval Ġmember Injector ClassName Ġ= Ġ"${ containing Class . generate ClassName ()} _ Members Injector " ĊĠ Ġval Ġmember Injector Class Ġ= ĠClass Name ( packageName , Ġmember Injector ClassName ) ĊĊĠ Ġval Ġqualifier Annotations Ġ= Ġannotation Entries . qual ifier Annotation Specs ( module ) ĊĠ Ġval Ġis Setter Inject ed Ġ= Ġis Setter Inject ed ( module ) ĊĊĠ Ġval Ġoriginal Name Ġ= Ġconstructor Parameter . original 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 ĊĠ Ġ} ĊĠ Ġreturn ĠMember Inject Parameter ( ĊĠĠĠ Ġname Ġ= Ġconstructor Parameter . name , ĊĠĠĠ ĠtypeName Ġ= Ġconstructor Parameter . typeName , ĊĠĠĠ Ġprovider TypeName Ġ= Ġconstructor Parameter . provider TypeName , ĊĠĠĠ Ġlazy TypeName Ġ= Ġconstructor Parameter . lazy TypeName , ĊĠĠĠ Ġis Wrapped In Provider Ġ= Ġconstructor Parameter . is Wrapped In Provider , ĊĠĠĠ Ġis Wrapped In Lazy Ġ= Ġconstructor Parameter . is Wrapped In Lazy , ĊĠĠĠ Ġis Lazy Wrapped In Provider Ġ= Ġconstructor Parameter . is Lazy Wrapped In Provider , ĊĠĠĠ Ġis Ass isted Ġ= Ġconstructor Parameter . is Ass isted , ĊĠĠĠ Ġass isted Identifier Ġ= Ġconstructor Parameter . ass isted Identifier , ĊĠĠĠ Ġmember Injector ClassName Ġ= Ġmember Injector Class , ĊĠĠĠ Ġoriginal Name Ġ= Ġoriginal Name , ĊĠĠĠ Ġis Setter Inject ed Ġ= Ġis Setter Inject ed , ĊĠĠĠ Ġaccess Name Ġ= Ġaccess Name , ĊĠĠĠ Ġqualifier Annotation Specs Ġ= Ġqualifier Annotations , ĊĠĠĠ Ġinjected Field Signature Ġ= Ġrequire Fq Name () ĊĠ Ġ) Ċ } Ċ Ċ /** Ċ Ġ* Ġ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 () Ċ } Ċ Ċ 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 ) Ċ } Ċ