/* Ċ Ġ* ĠCopyright Ġ 2 0 0 0 - 2 0 1 8 Ġ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 . idea . cache s . project Ċ Ċ import Ġcom . intellij . openapi . module . Module Ċ import Ġcom . intellij . openapi . module . Module Manager Ċ import Ġcom . intellij . openapi . project . Project Ċ import Ġcom . intellij . openapi . roots . Module Order Entry Ċ import Ġcom . intellij . openapi . roots . Module Root Manager Ċ import Ġcom . intellij . openapi . roots . Project Root Modification Tracker Ċ import Ġcom . intellij . psi . util . Cached Value Provider Ċ import Ġcom . intellij . psi . util . Cached Values Manager Ċ import Ġcom . intellij . util . containers . Multi Map Ċ import Ġcom . intellij . util . containers . Queue Ċ import Ġg nu . tro ve . TH ash Set Ċ import Ġjava . util .* Ċ Ċ // NOTE : Ġthis Ġis Ġan Ġapproximation Ġthat Ġmay Ġcontain Ġmore Ġmodule Ġinfos Ġthen Ġthe Ġexact Ġsolution Ċ fun ĠModule Source Info . get Dependent Modules (): ĠSet < Module Source Info > Ġ{ ĊĠĠĠ Ġval Ġdepend ents Ġ= Ġget Depend ents ( module ) ĊĠĠĠ Ġreturn Ġwhen Ġ( source Type ) Ġ{ ĊĠĠĠĠĠĠĠ ĠSource Type . TEST Ġ-> Ġdepend ents . map NotNull To ( HashSet < Module Source Info >(), ĠModule :: test Source Info ) ĊĠĠĠĠĠĠĠ ĠSource Type . PRO DU CTION Ġ-> Ġdepend ents . flatMap To ( HashSet < Module Source Info >()) Ġ{ Ġit . corre sponding Module Infos () Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ // NOTE : Ġget Depend ents Ġadapted Ġfrom Ġcom . intellij . openapi . module . impl . scopes . Module With Depend ents Scope # build Depend ents () Ċ private Ġfun Ġget Depend ents ( module : ĠModule ): ĠSet < Module > Ġ{ ĊĠĠĠ Ġval Ġresult Ġ= ĠT HashSet < Module >() ĊĠĠĠ Ġresult . add ( module ) ĊĊĠĠĠ Ġval Ġprocessed Export ing Ġ= ĠT HashSet < Module >() ĊĊĠĠĠ Ġval Ġindex Ġ= Ġget Module Index ( module . project ) ĊĊĠĠĠ Ġval Ġwalking Queue Ġ= ĠQueue < Module >( 1 0 ) ĊĠĠĠ Ġwalking Queue . add Last ( module ) ĊĊĠĠĠ Ġwhile Ġ(! walk ing Queue . isEmpty ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcurrent Ġ= Ġwalking Queue . pull First () ĊĠĠĠĠĠĠĠ Ġprocessed Export ing . add ( current !! ) ĊĠĠĠĠĠĠĠ Ġresult . addAll ( index . plain Usage s [ current ]) ĊĠĠĠĠĠĠĠ Ġfor Ġ( dependent Ġin Ġindex . export ing Usage s [ current ]) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult . add ( dependent ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( processed Export ing . add ( dependent )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwalking Queue . add Last ( dependent ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġresult Ċ } Ċ Ċ private Ġclass ĠModule Index Ġ{ ĊĠĠĠ Ġval Ġplain Usage s Ġ= ĠMulti Map . create < Module , ĠModule >() ĊĠĠĠ Ġval Ġexporting Usage s Ġ= ĠMulti Map . create < Module , ĠModule >() Ċ } Ċ Ċ private Ġfun Ġget Module Index ( project : ĠProject ): ĠModule Index Ġ{ ĊĠĠĠ Ġreturn ĠCached Values Manager . getManager ( project ). get Cached Value ( project ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġindex Ġ= ĠModule Index () ĊĠĠĠĠĠĠĠ Ġfor Ġ( module Ġin ĠModule Manager . getInstance ( project ). modules ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( order Entry Ġin ĠModule Root Manager . getInstance ( module ). order Entries ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( order Entry Ġis ĠModule Order Entry ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreferenced Ġ= Ġorder Entry . module ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( referenced Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmap Ġ= Ġif Ġ( order Entry . is Exported ) Ġindex . export ing Usage s Ġelse Ġindex . plain Usage s ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmap . put Value ( referenced , Ġmodule ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠCached Value Provider . Result ( index , ĠProject Root Modification Tracker . getInstance ( project )) ĊĠĠĠ Ġ} !! Ċ } Ċ