package Ġcom . squareup . he pha est us . compiler Ċ Ċ import Ġcom . squareup . he pha est us . annotations . Contribut es To Ċ import Ġcom . squareup . he pha est us . annotations . Merge Component Ċ import Ġcom . squareup . he pha est us . annotations . Merge Sub component Ċ import Ġcom . squareup . he pha est us . annotations . compat . Merge Modules Ċ import Ġdagger . Component Ċ import Ġdagger . Module Ċ import Ġdagger . Sub component Ċ import Ġorg . jetbrains . kotlin . codegen . Implementation Body Code gen Ċ import Ġorg . jetbrains . kotlin . codegen . extensions . Expression Code gen Extension Ċ import Ġorg . jetbrains . kotlin . descriptors . Class Descriptor Ċ import Ġorg . jetbrains . kotlin . descriptors . Effective Visibility . Public Ċ import Ġorg . jetbrains . kotlin . descriptors . annotations . Annotation Descriptor Ċ import Ġorg . jetbrains . kotlin . descriptors . effective Visibility Ċ import Ġorg . jetbrains . kotlin . name . Fq Name Ċ import Ġorg . jetbrains . kotlin . resolve . Descriptor Utils Ċ import Ġorg . jetbrains . kotlin . resolve . constants . Array Value Ċ import Ġorg . jetbrains . kotlin . resolve . constants . Constant Value Ċ import Ġorg . jetbrains . kotlin . resolve . constants . K Class Value Ċ import Ġorg . jetbrains . kotlin . resolve . descriptor Util . fq Name Safe Ċ import Ġorg . jetbrains . kotlin . resolve . descriptor Util . module Ċ import Ġorg . jetbrains . org . object web . asm . Annotation Visitor Ċ import Ġorg . jetbrains . org . object web . asm . Type Ċ import Ġkotlin . reflect . K Class Ċ Ċ /** Ċ Ġ* ĠFinds Ġall Ġcontributed ĠD agger Ġmodules Ġand Ġadds Ġthem Ġto ĠD agger Ġcomponents Ġannotated Ġwith Ċ Ġ* Ġ`@ Merge Component ` Ġor Ġ`@ Merge Sub component `. ĠThis Ġclass Ġis Ġresponsible Ġfor Ġgenerating Ġthe Ċ Ġ* Ġ`@ Component ` Ġand Ġ`@ Sub component ` Ġannotation Ġrequired Ġfor ĠD agger . Ċ Ġ*/ Ċ internal Ġclass ĠModule Mer ger ( ĊĠ Ġprivate Ġval Ġclass Scanner : ĠClass Scanner Ċ ) Ġ: ĠExpression Code gen Extension Ġ{ ĊĊĠ Ġoverride Ġfun Ġgenerate Class Synt hetic Parts ( codegen : ĠImplementation Body Code gen ) Ġ{ ĊĠĠĠ Ġval Ġholder Ġ= ĠAnnotation Holder . create ( codegen . descriptor ) Ġ?: Ġreturn ĊĠĠĠ Ġval Ġ( merge Annotation , Ġannotation Class , Ġdagger Class , Ġdagger Fq Name , Ġmodules Keyword ) Ġ= Ġholder ĊĊĠĠĠ Ġif Ġ( codegen . descriptor . find Annotation ( d agger Fq Name ) Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġthrow ĠHe pha est us Compilation Exception ( ĊĠĠĠĠĠĠĠĠĠ Ġcodegen . descriptor , ĊĠĠĠĠĠĠĠĠĠ Ġ" When Ġusing Ġ@ ${ annotation Class . simple Name } Ġit 's Ġnot Ġallowed Ġto Ġannotate Ġthe Ġsame Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" class Ġwith Ġ@ ${ d agger Class . simple Name }. ĠThe ĠD agger Ġannotation Ġwill Ġbe Ġgenerated ." ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġscope Ġ= Ġmerge Annotation . scope ( codegen . descriptor . module ) ĊĊĠĠĠ Ġval Ġpredefined Modules Ġ= ĊĠĠĠĠĠ Ġ( merge Annotation . getAnnotation Value ( modules Keyword ) Ġas ? ĠArray Value ) ĊĠĠĠĠĠĠĠĠĠ Ġ? . value ĊĠĠĠĠĠĠĠĠĠ Ġ? . map Ġ{ Ġit . to Type ( codegen ) Ġ} ĊĊĠĠĠ Ġval Ġmodules Ġ= Ġclass Scanner ĊĠĠĠĠĠĠĠ Ġ. find Cont ributed Classes ( codegen . descriptor . module ) ĊĠĠĠĠĠĠĠ Ġ. as Sequence () ĊĠĠĠĠĠĠĠ Ġ. map NotNull Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġval Ġcontribut es Annotation Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . find Annotation ( contribut es To Fq Name , Ġscope Ġ= Ġscope ) Ġ?: Ġreturn @ map NotNull Ġnull ĊĠĠĠĠĠĠĠĠĠ Ġit Ġto Ġcontribut es Annotation ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġ( class Descriptor , Ġ_) Ġ-> ĊĠĠĠĠĠĠĠĠĠ Ġval Ġmodule Annotation Ġ= Ġclass Descriptor . find Annotation ( d agger Module Fq Name ) ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ(! Descriptor Utils . is Interface ( class Descriptor ) Ġ&& Ġmodule Annotation Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠHe pha est us Compilation Exception ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclass Descriptor , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ class Descriptor . fq Name Safe } Ġis Ġannotated Ġwith Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"@ ${ Contribut es To :: class . simple Name }, Ġbut Ġthis Ġclass Ġis Ġneither Ġan Ġinterface Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" nor Ġa ĠD agger Ġmodule . ĠDid Ġyou Ġforget Ġto Ġadd Ġ@ ${ Module :: class . simple Name } ?" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠ Ġmodule Annotation Ġ!= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ. on Each Ġ{ Ġ( class Descriptor , Ġ_) Ġ-> ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( class Descriptor . effective Visibility () Ġ! is ĠPublic ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠHe pha est us Compilation Exception ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclass Descriptor , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ class Descriptor . fq Name Safe } Ġis Ġcontributed Ġto Ġthe ĠD agger Ġgraph , Ġbut Ġthe Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" module Ġis Ġnot Ġpublic . ĠOnly Ġpublic Ġmodules Ġare Ġsupported ." ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġreplaced Modules Ġ= Ġmodules ĊĠĠĠĠĠĠĠ Ġ. map NotNull Ġ{ Ġ( class Descriptor , Ġcontribute Annotation ) Ġ-> ĊĠĠĠĠĠĠĠĠĠ Ġval Ġk Class Value Ġ= Ġcontribute Annotation . getAnnotation Value (" re places ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġas ? ĠK Class Value Ġ?: Ġreturn @ map NotNull Ġnull ĊĊĠĠĠĠĠĠĠĠĠ Ġ// ĠVerify Ġhas Ġ@ Module Ġannotation . ĠIt Ġdoesn 't Ġmake Ġsense Ġfor Ġa ĠD agger Ġmodule Ġto Ġreplace Ġa ĊĠĠĠĠĠĠĠĠĠ Ġ// Ġnon - D agger Ġmodule . ĊĠĠĠĠĠĠĠĠĠ Ġval Ġkotlin Type Ġ= Ġk Class Value . getType ( codegen . descriptor . module ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. argument Type () ĊĠĠĠĠĠĠĠĠĠ Ġval Ġclass Descriptor For Replacement Ġ= ĠDescriptor Utils . getClass Descriptor ForType ( kotlin Type ) ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( class Descriptor For Replacement . find Annotation ( d agger Module Fq Name ) Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠHe pha est us Compilation Exception ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclass Descriptor , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ class Descriptor . fq Name Safe } Ġwants Ġto Ġreplace Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ class Descriptor For Replacement . fq Name Safe }, Ġbut Ġthe Ġclass Ġbeing Ġreplaced Ġis Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" not Ġa ĠD agger Ġmodule ." ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠ Ġk Class Value . to Type ( codegen ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġexcluded Modules Ġ= Ġ( merge Annotation . getAnnotation Value (" exclude ") Ġas ? ĠArray Value ) ĊĠĠĠĠĠĠĠ Ġ? . value ĊĠĠĠĠĠĠĠ Ġ? . map Ġ{ Ġit . to Type ( codegen ) Ġ} ĊĠĠĠĠĠĠĠ Ġ?: Ġempty List () ĊĊĠĠĠ Ġif Ġ( pre defined Modules Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġval Ġintersect Ġ= Ġpredefined Modules . intersect ( excluded Modules ) ĊĠĠĠĠĠ Ġif Ġ( intersect . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠHe pha est us Compilation Exception ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcodegen . descriptor , Ġ"${ codegen . descriptor . name } Ġincludes Ġand Ġexclude s Ġmodules Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" at Ġthe Ġsame Ġtime : Ġ${ intersect . join ToString Ġ{ Ġit . className Ġ}}" ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġcontributed Modules Ġ= Ġmodules ĊĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . first Ġ} ĊĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġcodegen . type Mapper . map Type ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġ. minus ( re placed Modules ) ĊĠĠĠĠĠĠĠ Ġ. minus ( excluded Modules ) ĊĠĠĠĠĠĠĠ Ġ. distinct () ĊĊĠĠĠ Ġcodegen . v ĊĠĠĠĠĠĠĠ Ġ. new Annotation (" L ${ d agger Class . java . canonical Name . replace ('.', Ġ'/') }; ", Ġtrue ) ĊĠĠĠĠĠĠĠ Ġ. use Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġvisit Array ( modules Keyword ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpredefined Modules ?. forEach Ġ{ Ġvisit ( modules Keyword , Ġit ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontributed Modules . forEach Ġ{ Ġvisit ( modules Keyword , Ġit ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( holder . is Component ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcopy Array Value ( codegen , Ġmerge Annotation , Ġ" dependencies ") ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( holder . is Module ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcopy Array Value ( codegen , Ġmerge Annotation , Ġ" sub components ") ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun ĠAnnotation Visitor . copy Array Value ( ĊĠĠĠ Ġcodegen : ĠImplementation Body Code gen , ĊĠĠĠ Ġannotation : ĠAnnotation Descriptor , ĊĠĠĠ Ġname : ĠString ĊĠ Ġ) Ġ{ ĊĠĠĠ Ġval Ġpredefined Values Ġ= ĊĠĠĠĠĠ Ġ( annotation . getAnnotation Value ( name ) Ġas ? ĠArray Value ) ĊĠĠĠĠĠĠĠĠĠ Ġ? . value ĊĠĠĠĠĠĠĠĠĠ Ġ? . map Ġ{ Ġit . to Type ( codegen ) Ġ} ĊĊĠĠĠ Ġvisit Array ( name ). use Ġ{ ĊĠĠĠĠĠ Ġpredefined Values ?. forEach Ġ{ Ġvisit ( name , Ġit ) Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun ĠConstant Value <* >. to Type ( codegen : ĠImplementation Body Code gen ): ĠType Ġ{ ĊĠĠĠ Ġreturn Ġto Type ( codegen . descriptor . module , Ġcodegen . type Mapper ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġinline Ġfun ĠAnnotation Visitor . use ( block : ĠAnnotation Visitor . () Ġ-> ĠUnit ) Ġ{ ĊĠĠĠ Ġblock ( this ) ĊĠĠĠ Ġvisit End () ĊĠ Ġ} Ċ } Ċ Ċ @ Suppress (" Data Class Private Constructor ") Ċ private Ġdata Ġclass ĠAnnotation Holder Ġprivate Ġconstructor ( ĊĠ Ġval Ġannotation Descriptor : ĠAnnotation Descriptor , ĊĠ Ġval Ġannotation Class : ĠK Class <* >, ĊĠ Ġval Ġdagger Class : ĠK Class <* >, ĊĠ Ġval Ġdagger Fq Name : ĠF q Name , ĊĠ Ġval Ġmodules Keyword : ĠString Ċ ) Ġ{ ĊĠ Ġval Ġis Component Ġ= Ġannotation Class Ġ== ĠMerge Component :: class ĊĠ Ġval Ġis Module Ġ= Ġannotation Class Ġ== ĠMerge Modules :: class ĊĊĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠ Ġfun Ġcreate ( descriptor : ĠClass Descriptor ): ĠAnnotation Holder ? Ġ{ ĊĠĠĠĠĠ Ġdescriptor . find Annotation ( merge Component Fq Name ) ĊĠĠĠĠĠĠĠĠĠ Ġ? . let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠAnnotation Holder ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit , ĠMerge Component :: class , ĠComponent :: class , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdagger Component Fq Name , Ġ" modules " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġdescriptor . find Annotation ( merge Sub component Fq Name ) ĊĠĠĠĠĠĠĠĠĠ Ġ? . let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠAnnotation Holder ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit , ĠMerge Sub component :: class , ĠSub component :: class , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdagger Sub component Fq Name , Ġ" modules " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġdescriptor . find Annotation ( merge Modules Fq Name ) ĊĠĠĠĠĠĠĠĠĠ Ġ? . let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠAnnotation Holder ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit , ĠMerge Modules :: class , ĠModule :: class , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdagger Module Fq Name , Ġ" includes " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ } Ċ