/* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 1 8 ĠU ber ĠTechnologies , ĠInc . Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ package Ġmot if . compiler . codegen Ċ Ċ import Ġcom . squareup . jav ap o et . Method Spec Ċ import Ġcom . squareup . jav ap o et . TypeName Ċ import Ġcom . squareup . jav ap o et . Type Spec Ċ import Ġmot if . compiler . ir . Compiler Method Parameter Ċ import Ġmot if . models . graph . Graph Ċ import Ġmot if . models . graph . Scope Ċ import Ġmot if . models . mot if . dependencies . Dependency Ċ import Ġmot if . models . mot if . child . Child Method Ċ import Ġmot if . models . mot if . dependencies . Required Dependencies Ċ import Ġjavax . annotation . processing . Processing Environment Ċ import Ġjavax . lang . model . element . Modifier Ċ import Ġjavax . lang . model . type . Declared Type Ċ Ċ class ĠChild Method Factory ( ĊĠĠĠĠĠĠĠ Ġenv : ĠProcessing Environment , ĊĠĠĠĠĠĠĠ Ġcache Scope : ĠCache Scope , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġgraph : ĠGraph ) Ġ: ĠCode gen Cache ( env , Ġcache Scope ) Ġ{ ĊĊĠĠĠ Ġfun Ġcreate ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscope : ĠScope , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchild Method : ĠChild Method ): ĠMethod Spec Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġexecutable Ġ= Ġchild Method . cir ĊĠĠĠĠĠĠĠ Ġval Ġchild Scope Impl Name Ġ= Ġscope Impl ( executable . returnType . cir . mirror Ġas ĠDecl ared Type ) ĊĠĠĠĠĠĠĠ Ġval Ġchild Dependencies Name Ġ= Ġchild Scope Impl Name . nested Class ( GENERATED _ DEPEND ENCI ES _ NAME ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġexecutable . override With Final Params () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Modifiers ( Modifier . PUBLIC ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Statement ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" return Ġnew Ġ\$ T (\ $ L )", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchild Scope Impl Name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchild Method . child Dependencies Impl ( scope , Ġchild Dependencies Name )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠChild Method . child Dependencies Impl ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscope : ĠScope , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchild Dependencies Name : ĠType Name ): ĠType Spec Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdynamic Dependencies : ĠMap < Dependency , ĠCompiler Method Parameter > Ġ= Ġcir . parameters . associate By ({ Ġparameter Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparameter . to Dependency () ĊĠĠĠĠĠĠĠ Ġ}) Ġ{ Ġit Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġcomponent Methods : ĠMap < Dependency , ĠMethod Spec > Ġ= Ġscope . component Method Specs ĊĠĠĠĠĠĠĠ Ġfun ĠMethod Spec . Builder . add Return ( dependency : ĠDependency ): ĠMethod Spec . Builder Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdynamic Dependency Ġ= Ġdynamic Dependencies [ dependency ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcomponent Method Ġ= Ġcomponent Methods [ dependency ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdynamic Dependency Ġ!= Ġnull Ġ-> Ġadd Statement (" return Ġ\$ N ", Ġdynamic Dependency . element . simple Name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcomponent Method Ġ!= Ġnull Ġ-> Ġadd Statement (" return Ġ\$ N .\ $ N ()", Ġscope . component Field Spec , Ġcomponent Method ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalStateException (" Could Ġnot Ġsatisfy Ġdependency : Ġ$ dependency ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġchild Type Ġ= Ġcir . returnType ĊĠĠĠĠĠĠĠ Ġval Ġchild Required Dependencies : ĠRequired Dependencies Ġ= Ġgraph . get Dependencies ( child Type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠIllegalStateException (" Could Ġnot Ġfind ĠDepend en encies Ġfor Ġchild : Ġ$ child Type ") ĊĊĠĠĠĠĠĠĠ Ġval Ġmethods : ĠList < Method Spec > Ġ= Ġchild Required Dependencies . method Spec Builders () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġ( dependency , Ġbuilder ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Modifiers ( Modifier . PUBLIC ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Annotation ( Override :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Return ( dependency ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠType Spec . anonymous Class Builder ("") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Super interface ( child Dependencies Name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Methods ( methods ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠ Ġ} Ċ }