/* Ċ Ġ* ĠCopyright Ġ 2 0 1 7 - 2 0 2 2 Ġthe Ġoriginal Ġauthor Ġor Ġauthors . Ċ Ġ* Ċ Ġ* Ġ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 Ġorg . k oin . compiler . scanner Ċ Ċ import Ġcom . google . devtools . k sp . processing . K SP Logger Ċ import Ġcom . google . devtools . k sp . processing . Resolver Ċ import Ġcom . google . devtools . k sp . symbol . KS Class Declaration Ċ import Ġcom . google . devtools . k sp . validate Ċ import Ġorg . k oin . compiler . metadata . DEFINITION _ AN NOT ATION _ LIST _ TYPES Ċ import Ġorg . k oin . compiler . metadata . K oin MetaData Ċ import Ġorg . k oin . core . annotation . Module Ċ import Ġkotlin . reflect . K Class Ċ Ċ class ĠK oin MetaData Scanner ( ĊĠĠĠ Ġval Ġlogger : ĠK SP Logger Ċ ) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġmodule Metadata Scanner Ġ= ĠModule Scanner ( logger ) ĊĠĠĠ Ġprivate Ġval Ġcomponent Metadata Scanner Ġ= ĠComponent Scanner ( logger ) ĊĊĠĠĠ Ġfun Ġscan All MetaData ( ĊĠĠĠĠĠĠĠ Ġresolver : ĠResolver , ĊĠĠĠĠĠĠĠ Ġdefault Module : ĠK oin MetaData . Module ĊĠĠĠ Ġ): ĠList < K oin MetaData . Module > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmodule List Ġ= Ġscan Class Modules ( resolver ) ĊĠĠĠĠĠĠĠ Ġval Ġscan Component Index Ġ= Ġmodule List . generate Scan Component Index () ĊĠĠĠĠĠĠĠ Ġscan Class Components ( resolver , Ġdefault Module , Ġscan Component Index ) ĊĠĠĠĠĠĠĠ Ġreturn Ġmodule List ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġscan Class Modules ( ĊĠĠĠĠĠĠĠ Ġresolver : ĠResolver ĊĠĠĠ Ġ): ĠList < K oin MetaData . Module > Ġ{ ĊĠĠĠĠĠĠĠ Ġlogger . logging (" scan Ġmodules Ġ... ") ĊĠĠĠĠĠĠĠ Ġreturn Ġresolver . getS ymbols With Annotation ( Module :: class . qualified Name !! ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit Ġis ĠK S Class Declaration Ġ&& Ġit . validate () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġmodule Metadata Scanner . createClass Module ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. toList () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠList < K oin MetaData . Module >. generate Scan Component Index (): ĠList < K oin MetaData . Module > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmodule List Ġ= Ġhash Map Of < String , K oin MetaData . Module >() ĊĠĠĠĠĠĠĠ Ġval Ġempty Scan List Ġ= Ġarray ListOf < K oin MetaData . Module >() ĊĠĠĠĠĠĠĠ ĠforEach Ġ{ Ġmodule Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmodule . component Scan ?. let Ġ{ Ġscan Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen ( scan . packageName ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"" Ġ-> Ġempty Scan List . add ( module ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġif Ġ( module List . contains ( scan . packageName )){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexisting Ġ= Ġmodule List [ scan . packageName ] !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror ("@ Component Scan Ġwith Ġ'${ scan . packageName }' Ġfrom Ġmodule Ġ${ module . name } Ġis Ġalready Ġdeclared Ġin Ġ${ existing . name }. ĠPlease Ġfix Ġ@ Component Scan Ġvalue Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodule List [ scan . packageName ] Ġ= Ġmodule ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġmodule List . values Ġ+ Ġempty Scan List ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġscan Class Components ( ĊĠĠĠĠĠĠĠ Ġresolver : ĠResolver , ĊĠĠĠĠĠĠĠ Ġdefault Module : ĠK oin MetaData . Module , ĊĠĠĠĠĠĠĠ Ġscan Component Index : ĠList < K oin MetaData . Module > ĊĠĠĠ Ġ): ĠList < K oin MetaData . Definition > Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġcomponent Ġscan ĊĠĠĠĠĠĠĠ Ġlogger . logging (" scan Ġdefinitions Ġ... ") ĊĊĠĠĠĠĠĠĠ Ġval Ġdefinitions Ġ= ĠDEFIN ITION _ AN NOT ATION _ LIST _ TYPES . flatMap Ġ{ Ġa Ġ-> Ġresolver . scan Class Definition ( a ) Ġ} ĊĠĠĠĠĠĠĠ Ġdefinitions . forEach Ġ{ ĠaddTo Module ( it , Ġdefault Module , Ġscan Component Index ) Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġdefinitions ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠResolver . scan Class Definition ( ĊĠĠĠĠĠĠĠ Ġannotation Class : ĠK Class < *> ĊĠĠĠ Ġ): ĠList < K oin MetaData . Definition > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġget Symbols With Annotation ( annotation Class . qualified Name !! ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit Ġis ĠK S Class Declaration Ġ&& Ġit . validate () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġcomponent Metadata Scanner . extract Class Definition ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. toList () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠaddTo Module ( ĊĠĠĠĠĠĠĠ Ġdefinition : ĠK oin MetaData . Definition , ĊĠĠĠĠĠĠĠ Ġdefault Module : ĠK oin MetaData . Module , ĊĠĠĠĠĠĠĠ Ġmodules : ĠList < K oin MetaData . Module > ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdefinition Package Ġ= Ġdefinition . packageName ĊĠĠĠĠĠĠĠ Ġval Ġfound Module Ġ= Ġmodules . first OrNull Ġ{ Ġit . accept Definition ( definition Package ) Ġ} Ġ?: Ġdefault Module ĊĠĠĠĠĠĠĠ Ġval Ġalready Exists Ġ= Ġfound Module . definitions . contains ( definition ) ĊĠĠĠĠĠĠĠ Ġif Ġ(! already Exists ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfound Module . definitions . add ( definition ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . logging (" skip ĠaddTo Module Ġ- Ġdefinition ( class ) Ġ-> Ġ$ definition Ġ-> Ġmodule Ġ$ found Module Ġ- Ġalready Ġexists ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }