// ĠCopyright Ġ 2 0 0 0 - 2 0 2 0 ĠJetBrains Ġs . r . o . ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠApache Ġ 2 . 0 Ġlicense Ġthat Ġcan Ġbe Ġfound Ġin Ġthe ĠLICENSE Ġfile . Ċ package Ġcom . intellij . openapi . module . impl Ċ Ċ import Ġcom . intellij . ide . Save And Sync Handler Ċ import Ġcom . intellij . notification .* Ċ import Ġcom . intellij . openapi . action System . An ActionEvent Ċ import Ġcom . intellij . openapi . components .* Ċ import Ġcom . intellij . openapi . module . Module Description Ċ import Ġcom . intellij . openapi . module . Module Manager Ċ import Ġcom . intellij . openapi . project . Project Ċ import Ġcom . intellij . openapi . project . Project Bundle Ċ import Ġcom . intellij . openapi . roots . ui . configuration . Configure Un loaded Modules Dialog Ċ import Ġcom . intellij . openapi . util . N ls Contexts Ċ import Ġcom . intellij . util . xml b . annotations . X Collection Ċ import Ġcom . intellij . xml . util . Xml StringUtil Ċ Ċ /** Ċ Ġ* ĠIf Ġsome Ġmodules Ġwere Ġun loaded Ġand Ġnew Ġmodules Ġappears Ġafter Ġloading Ġproject Ġconfiguration , Ġautomatically Ġun loads Ġthose Ġwhich Ċ Ġ* Ġaren 't Ġrequired Ġfor Ġloaded Ġmodules . Ċ Ġ*/ Ċ @ State ( name Ġ= Ġ" Automatic Module Un loader ", Ġstorage s Ġ= Ġ[( Storage ( Storage Path Macros . WORK SPACE _ FILE )) ]) Ċ @ Service Ċ class ĠAutomatic Module Un loader ( private Ġval Ġproject : ĠProject ) Ġ: ĠSimple Persistent State Component < Loaded Modules List Storage >( Loaded Modules List Storage ()) Ġ{ ĊĠ Ġfun Ġprocess New Modules ( modules To Load : ĠSet < Module Path >, Ġmodules To Unload : ĠList < Un loaded Module Description Impl >): ĠUn loaded Modules List Change Ġ{ ĊĠĠĠ Ġval Ġold Loaded Ġ= Ġstate . modules . toSet () ĊĠĠĠ Ġif Ġ( old Loaded . isEmpty () Ġ|| Ġmodules To Load . all Ġ{ Ġit . moduleName Ġin Ġold Loaded Ġ}) Ġ{ ĊĠĠĠĠĠ Ġreturn ĠUn loaded Modules List Change ( emptyList (), Ġempty List (), Ġempty List ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġmodule Descriptions Ġ= ĠLinkedHashMap < String , ĠUn loaded Module Description Impl >( modules To Load . size Ġ+ Ġmodules To Unload . size ) ĊĠĠĠ ĠUn loaded Module Description Impl . createFrom Paths ( modules To Load , Ġproject ). associate By To ( module Descriptions ) Ġ{ Ġit . name Ġ} ĊĠĠĠ Ġmodules To Unload . associate By To ( module Descriptions ) Ġ{ Ġit . name Ġ} ĊĊĠĠĠ Ġval Ġold Loaded With Dependencies Ġ= ĠHashSet < Module Description >() ĊĠĠĠ Ġval Ġexplicitly Un loaded Ġ= Ġmodules To Unload . map To ( HashSet ()) Ġ{ Ġit . name Ġ} ĊĠĠĠ Ġfor Ġ( name Ġin Ġold Loaded ) Ġ{ ĊĠĠĠĠĠ Ġprocess Trans itive Dependencies ( name , Ġmodule Descriptions , Ġexplicitly Un loaded , Ġold Loaded With Dependencies ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġnew Loaded Names Ġ= Ġold Loaded With Dependencies . map To ( Linked HashSet ()) Ġ{ Ġit . name Ġ} ĊĠĠĠ Ġval Ġto Load Ġ= Ġmodules To Load . filter Ġ{ Ġit . moduleName Ġin Ġnew Loaded Names Ġ&& Ġit . moduleName Ġ! in Ġold Loaded } ĊĠĠĠ Ġval Ġto Unload Ġ= Ġmodules To Load . filter Ġ{ Ġit . moduleName Ġ! in Ġnew Loaded Names Ġ&& Ġit . moduleName Ġin Ġmodule Descriptions } ĊĠĠĠ Ġstate . modules . clear () ĊĠĠĠ Ġmodules To Load . as Sequence () ĊĠĠĠĠĠ Ġ. filter Ġ{ Ġit . moduleName Ġin Ġnew Loaded Names Ġ} ĊĠĠĠĠĠ Ġ. map To ( state . modules ) Ġ{ Ġit . moduleName Ġ} ĊĠĠĠ Ġval Ġchange Ġ= ĠUn loaded Modules List Change ( to Load , Ġto Unload , Ġto Unload . map Ġ{ Ġmodule Descriptions [ it . moduleName ] !! Ġ}) ĊĠĠĠ Ġfire Notifications ( change ) ĊĠĠĠ Ġreturn Ġchange ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġprocess Trans itive Dependencies ( name : ĠString , Ġmodule Descriptions : ĠMap < String , ĠUn loaded Module Description Impl >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexplicitly Un loaded : ĠSet < String >, Ġresult : ĠMutable Set < Module Description >) Ġ{ ĊĠĠĠ Ġif Ġ( name Ġin Ġexplicitly Un loaded ) Ġreturn ĊĊĠĠĠ Ġval Ġmodule Ġ= Ġmodule Descriptions [ name ] ĊĠĠĠ Ġif Ġ( module Ġ== Ġnull Ġ|| Ġ! result . add ( module )) Ġreturn ĊĊĠĠĠ Ġmodule . dependency Module Names . forEach Ġ{ ĊĠĠĠĠĠ Ġprocess Trans itive Dependencies ( it , Ġmodule Descriptions , Ġexplicitly Un loaded , Ġresult ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġfire Notifications ( change : ĠUn loaded Modules List Change ) Ġ{ ĊĠĠĠ Ġif Ġ( change . to Load . isEmpty () Ġ&& Ġchange . to Unload . isEmpty ()) Ġreturn ĊĊĠĠĠ Ġval Ġmessages Ġ= Ġmutable ListOf < String >() ĊĠĠĠ Ġval Ġactions Ġ= Ġmutable ListOf < Notification Action >() ĊĊĠĠĠ Ġif Ġ( change . to Unload . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠ Ġval Ġmodules Ġ= Ġchange . to Unload ĊĠĠĠĠĠ Ġval Ġargs Ġ= ĠarrayOf ( modules . size , Ġmodules [ 0 ]. moduleName , Ġmodules . getOrElse ( 2 ) Ġ{ Ġmodules . size Ġ- Ġ 1 Ġ}) ĊĠĠĠĠĠ Ġmessages Ġ+= ĠProject Bundle . message (" auto . un loaded . notification ", Ġ* args ) ĊĠĠĠĠĠ Ġval Ġtext Ġ= ĠProject Bundle . message ( if Ġ( change . to Unload . isEmpty ()) Ġ" auto . un loaded . revert . short " Ġelse Ġ" auto . un loaded . revert . full ", Ġ* args ) ĊĠĠĠĠĠ Ġactions Ġ+= Ġcreate Action ( text ) Ġ{ Ġlist Ġ-> Ġlist . removeAll ( modules . map Ġ{ Ġit . moduleName Ġ}) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġif Ġ( change . to Load . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠ Ġval Ġmodules Ġ= Ġchange . to Load ĊĠĠĠĠĠ Ġval Ġargs Ġ= ĠarrayOf ( modules . size , Ġmodules [ 0 ]. moduleName , Ġmodules . getOrElse ( 2 ) Ġ{ Ġmodules . size Ġ- Ġ 1 Ġ}) ĊĠĠĠĠĠ Ġmessages Ġ+= ĠProject Bundle . message (" auto . loaded . notification ", Ġ* args ) ĊĠĠĠĠĠ Ġval Ġaction Ġ= ĠProject Bundle . message ( if Ġ( change . to Unload . isEmpty ()) Ġ" auto . loaded . revert . short " Ġelse Ġ" auto . loaded . revert . full ", Ġ* args ) ĊĠĠĠĠĠ Ġactions Ġ+= Ġcreate Action ( action ) Ġ{ Ġlist Ġ-> Ġlist . addAll ( modules . map Ġ{ Ġit . moduleName Ġ}) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġactions Ġ+= Ġobject Ġ: ĠNotification Action ( Project Bundle . message (" configure . un loaded . modules ")) Ġ{ ĊĠĠĠĠĠ Ġoverride Ġfun ĠactionPerformed ( e : ĠAn ActionEvent , Ġnotification : ĠNotification ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( Configure Un loaded Modules Dialog ( project , Ġnull ). show AndGet ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġnotification . expire () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġcontent Ġ= ĠXml StringUtil . wrap In Html ( messages . join ToString ("< br > ")) ĊĠĠĠ Ġval Ġnotification Ġ= ĠNOT IFICATION _ GROUP . create Notification ( Project Bundle . message (" modules . added . notification . title "), Ġcontent , ĠNotification Type . INFORMATION , Ġnull ) ĊĠĠĠ Ġnotification . add Actions ( actions ) ĊĠĠĠ Ġnotification . notify ( project ) ĊĠ Ġ} ĊĊĠ Ġfun Ġcreate Action (@ N ls Contexts . Notification Content Ġtext : ĠString , Ġaction : Ġ( Mutable List < String >) Ġ-> ĠUnit ): ĠNotification Action Ġ= Ġobject Ġ: ĠNotification Action ( text ) Ġ{ ĊĠĠĠ Ġoverride Ġfun ĠactionPerformed ( e : ĠAn ActionEvent , Ġnotification : ĠNotification ) Ġ{ ĊĠĠĠĠĠ Ġval Ġun loaded Ġ= ĠArrayList < String >() ĊĠĠĠĠĠ Ġval Ġmodule Manager Ġ= ĠModule Manager . getInstance ( project ) ĊĠĠĠĠĠ Ġmodule Manager . un loaded Module Descriptions . map To ( un loaded ) Ġ{ Ġit . name Ġ} ĊĠĠĠĠĠ Ġaction ( un loaded ) ĊĠĠĠĠĠ Ġmodule Manager . set Un loaded Modules ( un loaded ) ĊĠĠĠĠĠ Ġnotification . expire () ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġfun Ġset Loaded Modules ( modules : ĠList < String >) Ġ{ ĊĠĠĠ Ġval Ġlist Ġ= Ġstate . modules ĊĠĠĠ Ġlist . clear () ĊĠĠĠ Ġlist . addAll ( modules ) ĊĠĠĠ Ġ// Ġcompiler Ġuses Ġmodule Ġlist Ġfrom Ġdisk , Ġask Ġto Ġsave Ġworkspace ĊĠĠĠ ĠSave And Sync Handler . getInstance (). schedule Project Save ( project , Ġforce Saving All Settings Ġ= Ġtrue ) ĊĠ Ġ} ĊĊĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġfun ĠgetInstance ( project : ĠProject ) Ġ= Ġproject . service < Automatic Module Un loader >() ĊĊĠĠĠ Ġprivate Ġval ĠNOT IFICATION _ GROUP : ĠNotification Group ĊĠĠĠĠĠ Ġget () Ġ= ĠNotification Group Manager . getInstance (). get Notification Group (" Automatic ĠModule ĠUn loading ") ĊĠ Ġ} Ċ } Ċ Ċ class ĠLoaded Modules List Storage Ġ: ĠBase State () Ġ{ ĊĠ Ġ@ get : X Collection ( element Name Ġ= Ġ" module ", Ġvalue AttributeName Ġ= Ġ" name ", Ġproperty ElementName Ġ= Ġ" loaded - modules ") ĊĠ Ġval Ġmodules Ġby Ġlist < String >() Ċ } Ċ Ċ class ĠUn loaded Modules List Change ( val Ġto Load : ĠList < Module Path >, Ġval Ġto Unload : ĠList < Module Path >, Ġval Ġto Unload Descriptions : ĠList < Un loaded Module Description Impl >) Ċ