/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 2 1 ĠR ick ĠBus ar ow Ċ Ġ* Ġ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 Ġt angle . fragment . compiler Ċ Ċ import Ġcom . google . auto . service . Auto Service Ċ import Ġcom . squareup . an vil . compiler . api . Code Generator Ċ import Ġcom . squareup . an vil . compiler . api . Generated File Ċ import Ġcom . squareup . an vil . compiler . api . create Generated File Ċ import Ġcom . squareup . an vil . compiler . internal . as ClassName Ċ import Ġcom . squareup . an vil . compiler . internal . classes And Inner Classes Ċ import Ġcom . squareup . an vil . compiler . internal . has Annotation Ċ import Ġcom . squareup . an vil . compiler . internal . scope Ċ import Ġcom . squareup . kotlin po et .* Ċ import Ġcom . squareup . kotlin po et . K Modifier . AB STR ACT Ċ import Ġorg . jetbrains . kotlin . descriptors . Module Descriptor Ċ import Ġorg . jetbrains . kotlin . descriptors . resolve Class By Fq Name Ċ import Ġorg . jetbrains . kotlin . incremental . components . No Lookup Location . FROM _ BACKEND Ċ import Ġorg . jetbrains . kotlin . name . Fq Name Ċ import Ġorg . jetbrains . kotlin . psi . Kt Class Or Object Ċ import Ġorg . jetbrains . kotlin . psi . Kt File Ċ import Ġt angle . inject . compiler .* Ċ import Ġjava . io . File Ċ Ċ @ Suppress (" unused ") Ċ @ Auto Service ( Code Generator :: class ) Ċ class ĠT angle Fragment Factory Module Generator Ġ: ĠT angle Code Generator () Ġ{ ĊĊĠ Ġoverride Ġfun Ġgenerate T angle Code ( ĊĠĠĠ Ġcode Gen Dir : ĠFile , ĊĠĠĠ Ġmodule : ĠModule Descriptor , ĊĠĠĠ Ġproject Files : ĠCollection < Kt File > ĊĠ Ġ): ĠCollection < Generated File > Ġ= Ġproject Files ĊĠĠĠ Ġ. flatMap Ġ{ Ġit . classes And Inner Classes ( module ) Ġ} ĊĠĠĠ Ġ. filter Ġ{ Ġit . has Annotation ( Fq Names . merge Component , Ġmodule ) Ġ} ĊĠĠĠ Ġ// Ġfast Ġpath Ġfor Ġexcluding Ġduplicate Ġbinding Ġmodules Ġif Ġthey 're Ġin Ġthe Ġsame Ġsource ĊĠĠĠ Ġ. distinct By Ġ{ Ġit . scope ( Fq Names . merge Component , Ġmodule ) Ġ} ĊĠĠĠ Ġ. map NotNull Ġ{ Ġgenerate Component ( code Gen Dir , Ġmodule , Ġit ) Ġ} ĊĊĠ Ġprivate Ġfun Ġgenerate Component ( ĊĠĠĠ Ġcode Gen Dir : ĠFile , ĊĠĠĠ Ġmodule : ĠModule Descriptor , ĊĠĠĠ Ġclazz : ĠK t Class Or Object ĊĠ Ġ): ĠGenerated File ? Ġ{ ĊĠĠĠ Ġ// ĠEvery Ġsingle Ġinstance Ġof Ġthis Ġgenerated ĠModule Ġwill Ġhave Ġthe Ġsame ĠF q Name , ĊĠĠĠ Ġ// Ġexcept Ġfor Ġthe Ġscope Ġname Ġwhich Ġis Ġpre pended Ġto Ġthe Ġinterface Ġname . ĊĠĠĠ Ġ// ĠThis Ġis Ġcr uc ial Ġbecause Ġwe Ġcan Ġonly Ġever Ġhave Ġone ĠT angle Fragment Factory Ġbinding Ġdeclaration ĊĠĠĠ Ġ// Ġper Ġscope , Ġeven Ġif Ġthey 're Ġin Ġdifferent ĠGradle Ġmodules . Ġ ĠWe Ġuse Ġthis Ġknown Ġconstant ĠF q Name ĊĠĠĠ Ġ// Ġto Ġlook Ġfor Ġinstances Ġof Ġthe Ġmodule Ġwithin Ġthe Ġclasspath , ĊĠĠĠ Ġ// Ġand Ġskip Ġgeneration Ġif Ġone Ġalready Ġexists . ĊĠĠĠ Ġ// ĠModules Ġfor Ġa Ġdifferent Ġscope Ġare Ġokay . ĊĠĠĠ Ġval ĠpackageName Ġ= Ġ" t angle . fragment " ĊĊĠĠĠ Ġval Ġscope Fq Name Ġ= Ġclazz . scope ( Fq Names . merge Component , Ġmodule ) ĊĠĠĠ Ġval Ġscope ClassName Ġ= Ġscope Fq Name . as ClassName ( module ) ĊĠĠĠ Ġval Ġscope ClassName String Ġ= Ġscope ClassName . generate Simple Name String () ĊĊĠĠĠ Ġval Ġmodule ClassName String Ġ= Ġ"${ scope ClassName String }_ T angle _ Fragment Factory _ Module " ĊĠĠĠ Ġval Ġmodule Fq Name Ġ= ĠF q Name ("$ packageName .$ module ClassName String ") ĊĠĠĠ Ġval Ġmodule ClassName Ġ= ĠClass Name ( packageName , Ġmodule ClassName String ) ĊĊĠĠĠ Ġ// ĠIf Ġthe Ġ( D agger ) ĠModule Ġfor Ġthis Ġscope Ġalready Ġexists Ġin Ġa Ġdifferent ĠGradle Ġmodule , ĊĠĠĠ Ġ// Ġit Ġcan 't Ġbe Ġcreated Ġagain Ġhere Ġwithout Ġcreating Ġa Ġduplicate Ġbinding ĊĠĠĠ Ġ// Ġfor Ġthe ĠT angle Fragment Factory . ĊĠĠĠ Ġval Ġalready Created Ġ= ĠlistOf ( module ) ĊĠĠĠĠĠ Ġ. plus ( module . all Dependency Modules ) ĊĠĠĠĠĠ Ġ. any Ġ{ Ġdep Mod Ġ-> ĊĠĠĠĠĠĠĠ Ġdep Mod . resolve Class By Fq Name ( module Fq Name , ĠFROM _ BACKEND ) Ġ!= Ġnull ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġif Ġ( already Created ) Ġ{ ĊĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġcontent Ġ= ĠFile Spec . build File ( packageName , Ġmodule ClassName String ) Ġ{ ĊĠĠĠĠĠ ĠType Spec . interface Builder ( module ClassName ) ĊĠĠĠĠĠĠĠ Ġ. add Annotation ( ClassNames . module ) ĊĠĠĠĠĠĠĠ Ġ. add Annotation ( ĊĠĠĠĠĠĠĠĠĠ ĠAnnotation Spec . builder ( ClassNames . contribut es To ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Member ("% T :: class ", Ġscope Fq Name . as ClassName ( module )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ. addFunction (" bind Provider Map ") Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġadd Annotation ( ClassNames . mult ib inds ) ĊĠĠĠĠĠĠĠĠĠ Ġadd Modifiers ( AB STR ACT ) ĊĠĠĠĠĠĠĠĠĠ Ġreturns ( ClassNames . fragment Map ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ. addFunction (" bind T angle Provider Map ") Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġadd Annotation ( ClassNames . mult ib inds ) ĊĠĠĠĠĠĠĠĠĠ Ġadd Annotation ( ClassNames . t angle Fragment Provider Map ) ĊĠĠĠĠĠĠĠĠĠ Ġadd Modifiers ( AB STR ACT ) ĊĠĠĠĠĠĠĠĠĠ Ġreturns ( ClassNames . fragment Map ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ. add Type ( ĊĠĠĠĠĠĠĠĠĠ ĠType Spec . comp anion Object Builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. addFunction (" provide _${ ClassNames . t angle Fragment Factory . simple Name }") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Annotation ( ClassNames . provides ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Parameter (" provider Map ", ĠClass Names . fragment Provider Map ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Parameter ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠParameter Spec . builder (" t angle Provider Map ", ĠClass Names . fragment Provider Map ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Annotation ( ClassNames . t angle Fragment Provider Map ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturns ( ClassNames . t angle Fragment Factory ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Statement ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" return Â· % T ( provider Map , Â· t angle Provider Map )", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠClass Names . t angle Fragment Factory ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġ. let Ġ{ Ġadd Type ( it ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġcreate Generated File ( code Gen Dir , ĠpackageName , Ġmodule ClassName String , Ġcontent ) ĊĠ Ġ} Ċ } Ċ