package Ġcom . github . f eng da i . inject . view holder . processor Ċ Ċ import Ġandroidx . annotation . NonNull Ċ import Ġcom . github . f eng da i . inject . view holder . In fl ation Ċ import Ġcom . github . f eng da i . inject . view holder . processor . Dependency Request . Inf late Ċ import Ġcom . github . f eng da i . inject . view holder . processor . Dependency Request . Parent Ċ import Ġcom . github . f eng da i . inject . view holder . processor . Dependency Request . Provided Ċ import Ġcom . github . f eng da i . inject . view holder . processor . internal . apply Each Ċ import Ġcom . github . f eng da i . inject . view holder . processor . internal . join To Code Ċ import Ġcom . github . f eng da i . inject . view holder . processor . internal . peer Class With Reflection N esting Ċ import Ġcom . github . f eng da i . inject . view holder . processor . internal . raw ClassName Ċ import Ġcom . github . f eng da i . inject . view holder . processor . internal . to ClassName Ċ import Ġcom . squareup . jav ap o et . ClassName Ċ import Ġcom . squareup . jav ap o et . Code Block Ċ import Ġcom . squareup . jav ap o et . Method Spec Ċ import Ġcom . squareup . jav ap o et . Parameter Spec Ċ import Ġcom . squareup . jav ap o et . Parameterized TypeName Ċ import Ġcom . squareup . jav ap o et . TypeName Ċ import Ġcom . squareup . jav ap o et . Type Spec Ċ import Ġcom . squareup . jav ap o et . Type Variable Name Ċ import Ġjavax . lang . model . element . Modifier . FINAL Ċ import Ġjavax . lang . model . element . Modifier . PRIVATE Ċ import Ġjavax . lang . model . element . Modifier . PUBLIC Ċ Ċ private Ġval ĠVIEW _ GROUP Ġ= ĠClass Name . get (" android . view ", Ġ" ViewGroup ") Ċ private Ġval ĠJ AV AX _ IN JECT Ġ= ĠClass Name . get (" javax . inject ", Ġ" Inject ") Ċ private Ġval ĠJ AV AX _ PROVIDER Ġ= ĠClass Name . get (" javax . inject ", Ġ" Provider ") Ċ private Ġval ĠIN FL ATION Ġ= ĠIn fl ation :: class . to ClassName () Ċ Ċ data Ġclass ĠViewHolder Injection ( ĊĠ Ġval Ġtarget Type : ĠType Name , ĊĠ Ġval Ġdependency Requests : ĠList < Dependency Request > Ċ ) Ġ{ ĊĠ Ġval Ġgenerated Type : ĠClass Name Ġ= Ġtarget Type . raw ClassName (). view Holder Inject Factory Name () ĊĠ Ġprivate Ġval Ġprovided Ġ= Ġdependency Requests . filter Is Instance < Provided >() ĊĊĠ Ġfun Ġbrew Java (): ĠType Spec Ġ{ ĊĠĠĠ Ġreturn ĠType Spec . class Builder ( generated Type ) ĊĠĠĠĠĠĠĠ Ġ. add Modifiers ( PUBLIC , ĠFIN AL ) ĊĠĠĠĠĠĠĠ Ġ. add Super interface ( target Type . view Holder Factory Interface Name ()) ĊĠĠĠĠĠĠĠ Ġ. apply Each ( provided ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġadd Field ( it . provider Type . without Annotations (), Ġit . name , ĠPRIVATE , ĠFIN AL ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ. add Method ( Method Spec . constructor Builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Modifiers ( PUBLIC ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Annotation ( J AV AX _ IN JECT ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Each ( provided ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Parameter ( it . provider Type , Ġit . name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Statement (" this .$ 1 N Ġ= Ġ$ 1 N ", Ġit . name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build ()) ĊĠĠĠĠĠĠĠ Ġ. add Method ( Method Spec . method Builder (" create ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Annotation ( NonNull :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Annotation ( Override :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Modifiers ( PUBLIC ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. returns ( target Type ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( target Type Ġis ĠParameter ized TypeName ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Type Variables ( target Type . type Arguments . filter Is Instance < Type Variable Name >()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Parameter ( Parameter Spec . builder ( VIEW _ GROUP , Ġ" parent "). add Annotation ( NonNull :: class . java ). build ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Statement (" return Ġnew Ġ\$ T (\ n \$ L )", Ġtarget Type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdependency Requests . map Ġ{ Ġit . argument Provider Ġ}. join To Code (", \ n ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build ()) ĊĠĠĠĠĠĠĠ Ġ. build () ĊĠ Ġ} Ċ } Ċ Ċ fun ĠClass Name . view Holder Inject Factory Name (): ĠClass Name Ġ= ĊĠ Ġpeer Class With Reflection N esting ( simple Name () Ġ+ Ġ"_ Factory ") Ċ Ċ fun ĠType Name . view Holder Factory Interface Name (): ĠParameter ized TypeName Ġ= ĊĠ ĠParameter ized TypeName . get ( ClassName . get (" com . github . f eng da i . view holder ", Ġ" ViewHolder Factory "), Ġthis ) Ċ Ċ /** ĠTrue Ġwhen Ġthis Ġkey Ġrepresents Ġa Ġparameter ized ĠJ SR Ġ 3 3 0 Ġ` Provider `. Ġ*/ Ċ private Ġval ĠKey . is Provider Ġget () Ġ= Ġtype Ġis ĠParameter ized TypeName Ġ&& Ġtype . raw Type Ġ== ĠJ AV AX _ PROVIDER Ċ Ċ private Ġval ĠProvide d . provider Type : ĠType Name ĊĠ Ġget () Ġ{ ĊĠĠĠ Ġval Ġtype Ġ= Ġif Ġ( key . is Provider ) Ġ{ ĊĠĠĠĠĠ Ġkey . type Ġ// ĠDo Ġnot Ġwrap Ġa ĠProvider Ġinside Ġanother ĠProvider . ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠ ĠParameter ized TypeName . get ( J AV AX _ PROVIDER , Ġkey . type . box ()) ĊĠĠĠ Ġ} ĊĠĠĠ Ġkey . qual ifier ?. let Ġ{ ĊĠĠĠĠĠ Ġreturn Ġtype . annotated ( it ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġtype ĊĠ Ġ} Ċ Ċ private Ġval ĠDependency Request . argument Provider ĊĠ Ġget () Ġ= Ġwhen Ġ( this ) Ġ{ ĊĠĠĠ Ġis ĠInf late Ġ-> ĠCode Block . of (" (\ $ T ) Ġ\$ T . inflate ( parent , Ġ\$ L )", Ġkey . type , ĠIN FL ATION , Ġlayout Res . code ) ĊĠĠĠ Ġis ĠParent Ġ-> ĠCode Block . of (" parent ") ĊĠĠĠ Ġis ĠProvide d Ġ-> ĠCode Block . of ( if Ġ( key . is Provider ) Ġ" this .\ $ N " Ġelse Ġ" this .\ $ N . get ()", Ġname ) ĊĠ Ġ} Ċ