package Ġdev . qu iro . she ath . compiler . codegen . d agger Ċ Ċ import Ġcom . squareup . kotlin po et . Annotation Spec Ċ import Ġcom . squareup . kotlin po et . ClassName Ċ import Ġcom . squareup . kotlin po et . File Spec Ċ import Ġcom . squareup . kotlin po et . Fun Spec Ċ import Ġcom . squareup . kotlin po et . K Modifier Ċ import Ġcom . squareup . kotlin po et . Parameter Spec Ċ import Ġcom . squareup . kotlin po et . Parameterized TypeName . Companion . parameter ized By Ċ import Ġcom . squareup . kotlin po et . STAR Ċ import Ġcom . squareup . kotlin po et . Type Spec Ċ import Ġcom . squareup . kotlin po et . as ClassName Ċ import Ġdagger . Bind s Ċ import Ġdagger . Module Ċ import Ġdagger . Sub component Ċ import Ġdagger . android . Android Injector Ċ import Ġdagger . mult ib ind ings . Class Key Ċ import Ġdagger . mult ib ind ings . Into Map Ċ import Ġdev . qu iro . she ath . compiler . codegen . Code Generator Ċ import Ġdev . qu iro . she ath . compiler . codegen . Private Code Generator Ċ import Ġdev . qu iro . she ath . compiler . codegen . build File Ċ import Ġdev . qu iro . she ath . compiler . codegen . classes And Inner Classes Ċ import Ġdev . qu iro . she ath . compiler . codegen . extract ArrayOf Class Ċ import Ġdev . qu iro . she ath . compiler . codegen . extract Single Parameter Ċ import Ġdev . qu iro . she ath . compiler . codegen . find Annotation Ċ import Ġdev . qu iro . she ath . compiler . codegen . fq Name OrNull Ċ import Ġdev . qu iro . she ath . compiler . codegen . functions Ċ import Ġdev . qu iro . she ath . compiler . codegen . has Annotation Ċ import Ġdev . qu iro . she ath . compiler . codegen . require Fq Name Ċ import Ġdev . qu iro . she ath . compiler . codegen . require TypeName Ċ import Ġdev . qu iro . she ath . compiler . codegen . require Type Reference Ċ import Ġdev . qu iro . she ath . compiler . codegen . with Jvm Suppress W ild cards IfNeeded Ċ import Ġdev . qu iro . she ath . compiler . d agger Contribut es Android Injector Ċ import Ġdev . qu iro . she ath . compiler . d agger Module Fq Name Ċ import Ġdev . qu iro . she ath . compiler . generate ClassName Ċ import Ġorg . jetbrains . kotlin . descriptors . Module Descriptor Ċ import Ġorg . jetbrains . kotlin . name . Fq Name Ċ import Ġorg . jetbrains . kotlin . psi . Kt Class Or Object Ċ import Ġorg . jetbrains . kotlin . psi . Kt File Ċ import Ġorg . jetbrains . kotlin . psi . Kt Named Function Ċ import Ġjava . io . File Ċ import Ġjava . lang . StringBuilder Ċ Ċ internal Ġclass ĠContribut es Android Injector Generator Ġ: ĠPrivate Code Generator () Ġ{ ĊĠ Ġoverride Ġfun Ġgenerate Code Private ( ĊĠĠĠ Ġcode Gen Dir : ĠFile , ĊĠĠĠ Ġmodule : ĠModule Descriptor , ĊĠĠĠ Ġproject Files : ĠCollection < Kt File > ĊĠ Ġ) Ġ{ ĊĠĠĠ Ġproject Files . as Sequence () ĊĠĠĠĠĠ Ġ. flatMap Ġ{ Ġit . classes And Inner Classes () Ġ} ĊĠĠĠĠĠ Ġ. filter Ġ{ Ġit . has Annotation ( d agger Module Fq Name ) Ġ} ĊĠĠĠĠĠ Ġ. flatMap Ġ{ Ġclazz Ġ-> ĊĠĠĠĠĠĠĠ Ġclazz ĊĠĠĠĠĠĠĠĠĠ Ġ. functions ( include Companion Objects Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠĠĠ Ġ. as Sequence () ĊĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . has Annotation ( d agger Contribut es Android Injector ) Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġfunction Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgenerate Injector Class ( code Gen Dir , Ġmodule , Ġclazz , Ġfunction ) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ. toList () ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġgenerate Injector Class ( ĊĠĠĠ Ġcode Gen Dir : ĠFile , ĊĠĠĠ Ġmodule : ĠModule Descriptor , ĊĠĠĠ Ġclazz : ĠK t Class Or Object , ĊĠĠĠ Ġfunction : ĠK t Named Function ĊĠ Ġ): ĠCode Generator . Generated File Ġ{ ĊĠĠĠ Ġval ĠpackageName Ġ= Ġclazz . containing Kt File . package Fq Name . asString () ĊĠĠĠ Ġval ĠreturnType Ġ= Ġfunction . require Type Reference () ĊĠĠĠĠĠ Ġ. require TypeName ( module ) ĊĠĠĠĠĠ Ġ. with Jvm Suppress W ild cards IfNeeded ( function ) ĊĠĠĠ Ġval Ġbinding Target Name Ġ= Ġfunction . require Type Reference () ĊĠĠĠĠĠ Ġ. require Fq Name ( module ) ĊĠĠĠĠĠ Ġ. short Name () ĊĠĠĠĠĠ Ġ. asString () ĊĠĠĠ Ġval ĠclassName Ġ= Ġ"${ clazz . generate ClassName ()} _${ function . name !!. capitalize () }" ĊĠĠĠ Ġval Ġfactory Class Ġ= ĠClass Name ( packageName , ĠclassName ) ĊĠĠĠ Ġval Ġcontribut es Android Injector Ġ= Ġfunction . find Annotation ( d agger Contribut es Android Injector ) !! ĊĠĠĠ Ġval Ġmodule Classes Ġ= Ġcontribut es Android Injector . extract Single Parameter () ĊĠĠĠĠĠ Ġ? . extract ArrayOf Class ( module ) Ġ?: Ġempty List () ĊĠĠĠ Ġval Ġscope Annotations Ġ= Ġfunction . annotation Entries ĊĠĠĠĠĠ Ġ. as Sequence () ĊĠĠĠĠĠ Ġ. filter Not Ġ{ Ġit Ġ== Ġcontribut es Android Injector Ġ} ĊĠĠĠĠĠ Ġ. map NotNull Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġelement Ġ= Ġit . children . single OrNull ()?. children ?. single OrNull () ĊĠĠĠĠĠĠĠ Ġelement ?. fq Name OrNull ( module ) Ġ?: Ġelement ?. text ?. let (:: Fq Name ) ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġcontent Ġ= ĠFile Spec . build File ( packageName , ĠclassName ) Ġ{ ĊĠĠĠĠĠ Ġval Ġclass Builder Ġ= ĠType Spec . class Builder ( factory Class ) ĊĊĠĠĠĠĠ Ġval Ġsub component Factory ClassName Ġ= ĠClass Name ( packageName , Ġ" Factory ") ĊĠĠĠĠĠ Ġval Ġsub component Factory Ġ= ĠType Spec . interface Builder ( sub component Factory ClassName ) ĊĠĠĠĠĠĠĠ Ġ. add Annotation ( Sub component . Factory :: class . java ) ĊĠĠĠĠĠĠĠ Ġ. add Super interface ( ĊĠĠĠĠĠĠĠĠĠ ĠAndroid Injector . Factory :: class . as ClassName (). parameter ized By ( returnType ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠ Ġval Ġsub component ClassName Ġ= Ġ"${ binding Target Name } Sub component " ĊĠĠĠĠĠ Ġval Ġfull Sub component Factory ClassName Ġ= ĊĠĠĠĠĠĠĠ ĠClass Name ( packageName , Ġ"$ sub component ClassName . Factory ") ĊĠĠĠĠĠ Ġval Ġsub component Ġ= ĠType Spec . interface Builder ( ClassName ( packageName , Ġsub component ClassName )) ĊĠĠĠĠĠĠĠ Ġ. add Annotation ( ĊĠĠĠĠĠĠĠĠĠ ĠAnnotation Spec . builder ( Sub component :: class . java ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( module Classes . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= ĠStringBuilder (" modules Ġ= Ġ[ "). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodule Classes . forEach Indexed Ġ{ Ġindex , Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend ("% T :: class ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnext Ġ= Ġif Ġ( index Ġ== Ġmodule Classes . last Index ) Ġ" ]" Ġelse Ġ"," ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend ( next ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Member ( builder . toString (), Ġ* module Classes . to Typed Array ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ}. build () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġscope Annotations . forEach Ġ{ Ġannotation Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Annotation ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠClass Name ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġannotation . parent (). asString (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġannotation . short Name (). asString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ. add Super interface ( Android Injector :: class . as ClassName (). parameter ized By ( returnType )) ĊĠĠĠĠĠĠĠ Ġ. add Type ( sub component Factory ) ĊĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠ Ġval Ġfull Sub component ClassName Ġ= ĠClass Name . best Guess ( ĊĠĠĠĠĠĠĠ Ġ"$ packageName .$ className .$ sub component ClassName " ĊĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ Ġclass Builder . primary Constructor ( ĊĠĠĠĠĠĠĠ ĠFun Spec . constructor Builder () ĊĠĠĠĠĠĠĠĠĠ Ġ. add Modifiers ( K Modifier . PRIVATE ) ĊĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ. add Annotation ( ĊĠĠĠĠĠĠĠĠĠ ĠAnnotation Spec . builder ( Module :: class ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Member (" sub components Ġ= Ġ[% T :: class ]", Ġfull Sub component ClassName ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ. add Modifiers ( K Modifier . AB STR ACT ) ĊĠĠĠĠĠĠĠ Ġ. add Type ( sub component ) ĊĠĠĠĠĠĠĠ Ġ. addFunction ( ĊĠĠĠĠĠĠĠĠĠ ĠFun Spec . builder (" bind Android Injector Factory ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Parameter ( Parameter Spec (" builder ", Ġfull Sub component Factory ClassName )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Modifiers ( K Modifier . AB STR ACT ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Annotation ( Bind s :: class ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Annotation ( Into Map :: class ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Annotation ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAnnotation Spec . builder ( Class Key :: class ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Member ("% T :: class ", ĠreturnType ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. returns ( Android Injector . Factory :: class . as ClassName (). parameter ized By ( STAR )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġ. let Ġ{ Ġadd Type ( it ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġdirectory Ġ= ĠFile ( code Gen Dir , ĠpackageName . replace ('.', ĠFile . separator Char )) ĊĠĠĠ Ġval Ġfile Ġ= ĠFile ( directory , Ġ"$ className . kt ") ĊĠĠĠ Ġcheck ( file . parent File . exists () Ġ|| Ġfile . parent File . mkdir s ()) Ġ{ ĊĠĠĠĠĠ Ġ" Could Ġnot Ġgenerate Ġpackage Ġdirectory : Ġ${ file . parent File }" ĊĠĠĠ Ġ} ĊĠĠĠ Ġfile . write Text ( content ) ĊĊĠĠĠ Ġreturn ĠCode Generator . Generated File ( file , Ġcontent ) ĊĠ Ġ} Ċ } Ċ