/* Ċ Ġ* ĠCopyright Ġ 2 0 1 0 - 2 0 1 9 ĠJetBrains Ġs . r . o . Ġand ĠKotlin ĠProgramming ĠLanguage Ġcontributors . Ċ Ġ* ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠApache Ġ 2 . 0 Ġlicense Ġthat Ġcan Ġbe Ġfound Ġin Ġthe Ġlicense / LICENSE . txt Ġfile . Ċ Ġ*/ Ċ Ċ package Ġorg . jetbrains . kotlin . descriptors . common izer Ċ Ċ import Ġorg . jetbrains . kotlin . descriptors . Module Descriptor Ċ import Ġorg . jetbrains . kotlin . descriptors . common izer . builder .* Ċ import Ġorg . jetbrains . kotlin . descriptors . common izer . builder . Declarations Builder Visitor 1 Ċ import Ġorg . jetbrains . kotlin . descriptors . common izer . builder . Declarations Builder Visitor 2 Ċ import Ġorg . jetbrains . kotlin . descriptors . common izer . core . Common ization Visitor Ċ import Ġorg . jetbrains . kotlin . descriptors . common izer . merge dt ree . merge Roots Ċ import Ġorg . jetbrains . kotlin . storage . Lock Based Storage Manager Ċ Ċ class ĠCommon ization Parameters Ġ{ ĊĠĠĠ Ġ// Ġuse Ġlinked Ġhash Ġmap Ġto Ġpreserve Ġorder ĊĠĠĠ Ġprivate Ġval Ġmodules By Targets Ġ= ĠLinkedHashMap < Input Target , ĠCollection < Module Descriptor >>() ĊĊĠĠĠ Ġfun Ġadd Target ( target : ĠInput Target , Ġmodules : ĠCollection < Module Descriptor >): ĠCommon ization Parameters Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire ( target Ġ! in Ġmodules By Targets ) Ġ{ Ġ" Target Ġ$ target Ġis Ġalready Ġadded " Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġmodules With Unique Names Ġ= Ġmodules . grouping By Ġ{ Ġit . name Ġ}. each Count () ĊĠĠĠĠĠĠĠ Ġrequire ( modules With Unique Names . size Ġ== Ġmodules . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Modules Ġwith Ġduplicated Ġnames Ġfound : Ġ${ modules With Unique Names . filter Ġ{ Ġit . value Ġ> Ġ 1 Ġ}}" ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġmodules By Targets [ target ] Ġ= Ġmodules ĊĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġget Ġthem Ġas Ġordered Ġimmutable Ġcollection Ġ( List ) Ġfor Ġfurther Ġprocessing ĊĠĠĠ Ġfun Ġget Modules By Targets (): ĠList < Pair < Input Target , ĠCollection < Module Descriptor >>> Ġ= ĊĠĠĠĠĠĠĠ Ġmodules By Targets . map Ġ{ Ġit . key Ġto Ġit . value Ġ} ĊĊĠĠĠ Ġfun Ġhas Intersection (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( modules By Targets . size Ġ< Ġ 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġreturn Ġmodules By Targets . flatMap Ġ{ Ġit . value Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. grouping By Ġ{ Ġit . name Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. each Count () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. any Ġ{ Ġit . value Ġ== Ġmodules By Targets . size Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ sealed Ġclass ĠCommon ization Result Ċ Ċ object ĠNothing To Common ize Ġ: ĠCommon ization Result () Ċ Ċ class ĠCommon ization Performed ( ĊĠĠĠ Ġval Ġmodules By Targets : ĠMap < Target , ĠCollection < Module Descriptor >> Ċ ) Ġ: ĠCommon ization Result () Ġ{ ĊĠĠĠ Ġval Ġcommon Target : ĠOutput Target Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġmodules By Targets . keys . filter Is Instance < Output Target >(). single () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġconcrete Targets : ĠSet < Input Target > Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġmodules By Targets . keys . filter Is Instance < Input Target >(). toSet () ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġrun Common ization ( parameters : ĠCommon ization Parameters ): ĠCommon ization Result Ġ{ ĊĠĠĠ Ġif Ġ(! parameters . has Intersection ()) ĊĠĠĠĠĠĠĠ Ġreturn ĠNothing To Common ize ĊĊĠĠĠ Ġval Ġstorage Manager Ġ= ĠLock Based Storage Manager (" Declaration Ġdescriptors Ġcommon ization ") ĊĊĠĠĠ Ġ// Ġbuild Ġmerged Ġtree : ĊĠĠĠ Ġval Ġmerged Tree Ġ= Ġmerge Roots ( storage Manager , Ġparameters . get Modules By Targets ()) ĊĊĠĠĠ Ġ// Ġcommon ize : ĊĠĠĠ Ġmerged Tree . accept ( Common ization Visitor ( merged Tree ), ĠUnit ) ĊĊĠĠĠ Ġ// Ġbuild Ġresulting Ġdescriptors : ĊĠĠĠ Ġval Ġcomponents Ġ= Ġmerged Tree . create Global Builder Components ( storage Manager ) ĊĠĠĠ Ġmerged Tree . accept ( Declarations Builder Visitor 1 ( components ), Ġempty List ()) ĊĠĠĠ Ġmerged Tree . accept ( Declarations Builder Visitor 2 ( components ), Ġempty List ()) ĊĊĠĠĠ Ġval Ġmodules By Targets Ġ= ĠLinkedHashMap < Target , ĠCollection < Module Descriptor >>() Ġ// Ġuse Ġlinked Ġhash Ġmap Ġto Ġpreserve Ġorder ĊĠĠĠ Ġcomponents . target Components . forEach Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtarget Ġ= Ġit . target ĊĠĠĠĠĠĠĠ Ġcheck ( target Ġ! in Ġmodules By Targets ) ĊĊĠĠĠĠĠĠĠ Ġmodules By Targets [ target ] Ġ= Ġcomponents . cache . get Cached Modules ( it . index ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn ĠCommon ization Performed ( modules By Targets ) Ċ } Ċ