/* Ċ Ġ* ĠCopyright Ġ 2 0 1 0 - 2 0 1 5 ĠJetBrains Ġs . r . o . Ċ Ġ* Ċ Ġ* Ġ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 . jetbrains . kotlin . idea . js Ċ Ċ import Ġcom . intellij . Project Topics Ċ import Ġcom . intellij . openapi . application . Application Manager Ċ import Ġcom . intellij . openapi . application . Modal ity State Ċ import Ġcom . intellij . openapi . components . Project Component Ċ import Ġcom . intellij . openapi . module . Module Ċ import Ġcom . intellij . openapi . module . Module Manager Ċ import Ġcom . intellij . openapi . module . Module Type Ċ import Ġcom . intellij . openapi . module . Module TypeId Ċ import Ġcom . intellij . openapi . project . D umb Service Ċ import Ġcom . intellij . openapi . project . Project Ċ import Ġcom . intellij . openapi . roots .* Ċ import Ġcom . intellij . openapi . roots . impl . Order Entry Util Ċ import Ġcom . intellij . openapi . roots . libraries . Library Ċ import Ġcom . intellij . openapi . roots . libraries . Library Table Ċ import Ġcom . intellij . openapi . util . Dis poser Ċ import Ġcom . intellij . openapi . vfs . V fs Util Ċ import Ġcom . intellij . openapi . vfs . Virtual File Ċ import Ġcom . intellij . openapi . vfs . Virtual FileManager Ċ import Ġcom . intellij . openapi . vfs . new vfs . Bulk File Listener Ċ import Ġcom . intellij . openapi . vfs . new vfs . events . V FileContent ChangeEvent Ċ import Ġcom . intellij . openapi . vfs . new vfs . events . V File Event Ċ import Ġcom . intellij . util . FileContent Util Core Ċ import Ġcom . intellij . util . Path Util Ċ import Ġorg . jetbrains . annotations . Test Only Ċ import Ġorg . jetbrains . kotlin . idea . framework . Kotlin JavaScript Library Detection Util Ċ import Ġorg . jetbrains . kotlin . idea . project . Project Structure Util . is Js Kotlin Module Ċ import Ġorg . jetbrains . kotlin . utils . Kotlin Javascript Metadata Utils Ċ import Ġjava . io . File Ċ import Ġjava . util .* Ċ import Ġjava . util . concurrent . atomic . Atomic Boolean Ċ Ċ public Ġclass ĠKotlin JavaScript Library Manager Ġprivate Ġconstructor ( private Ġvar Ġmy Project : ĠProject ?) Ġ: ĠProject Component , ĠModule Root Listener , ĠBulk File Listener Ġ{ ĊĠĠĠ Ġprivate Ġval Ġmy Mut ed Ġ= ĠAtomic Boolean ( false ) ĊĊĠĠĠ Ġprivate Ġval Ġlibrary File Stamp Map : ĠMutable Map < String , ĠLong > Ġ= ĠCollections . synchronized Map ( hash Map Of ()) ĊĊĠĠĠ Ġoverride Ġfun Ġget Component Name (): ĠString Ġ= Ġ" Kotlin Javascript Library Manager " ĊĊĠĠĠ Ġoverride Ġfun Ġproject Opened () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġproject Ġ= Ġmy Project !! ĊĠĠĠĠĠĠĠ Ġproject . message Bus . connect ( project ). subscribe ( Project Topics . PROJECT _ ROOT S , Ġthis ) ĊĠĠĠĠĠĠĠ Ġproject . message Bus . connect ( project ). subscribe ( Virtual FileManager . V FS _ CHANG ES , Ġthis ) ĊĠĠĠĠĠĠĠ ĠD umb Service . getInstance ( project ). smart Invoke Later () Ġ{ Ġupdate Project Library () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġproject Closed () Ġ{ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġinit Component () Ġ{ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdispose Component () Ġ{ ĊĠĠĠĠĠĠĠ Ġmy Project Ġ= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġafter ( events : ĠList < V File Event >) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( my Mut ed . get ()) Ġreturn ĊĊĠĠĠĠĠĠĠ Ġval Ġchanged Files Ġ= Ġevents ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit Ġ! is ĠMy V FileContent ChangeEvent Ġ&& Ġit Ġis ĠV FileContent ChangeEvent Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . file Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter NotNull () ĊĊĠĠĠĠĠĠĠ Ġval Ġfiles Ġ= Ġupdate ( changed Files , ĠaddTo Map If Absent Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠ Ġval Ġapplication Ġ= ĠApplication Manager . getApplication () ĊĠĠĠĠĠĠĠ Ġrefresh Files ( files , Ġapplication . is UnitTest Mode ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġbefore ( events : ĠList < V File Event >) Ġ{ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġbefore Roots Change ( event : ĠModule Root Event ) Ġ{ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġroots Changed ( event : ĠModule Root Event ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( my Mut ed . get ()) Ġreturn ĊĊĠĠĠĠĠĠĠ ĠApplication Manager . getApplication (). invoke Later ( Runnable Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠD umb Service . getInstance ( my Project !! ). run When Smart () Ġ{ Ġupdate Project Library () Ġ} ĊĠĠĠĠĠĠĠ Ġ}, ĠMod ality State . NON _ MOD AL , Ġmy Project !!. dis posed ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test Only ĊĠĠĠ Ġpublic Ġfun Ġsync Update Project Library (): ĠUnit Ġ= Ġupdate Project Library ( true ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ param Ġsynchronous ly Ġmay Ġbe Ġtrue Ġonly Ġin Ġtests . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġupdate Project Library ( s ynchronously : ĠBoolean Ġ= Ġfalse ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġproject Ġ= Ġmy Project ĊĠĠĠĠĠĠĠ Ġif Ġ( project Ġ== Ġnull Ġ|| Ġproject . is Disposed ) Ġreturn ĊĊĠĠĠĠĠĠĠ ĠApplication Manager . getApplication (). assert Read Access Allowed () ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( module Ġin ĠModule Manager . getInstance ( project ). modules ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! is Module Applicable ( module )) Ġcontinue ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! is Js Kotlin Module ( module )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfind Library ByName ( module , ĠLIB R ARY _ NAME )?. let Ġ{ Ġreset Libraries ( module , ĠChanges To Apply (), ĠLIB R ARY _ NAME , Ġsynchronous ly ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcls Root Urls : ĠMutable List < String > Ġ= Ġarray ListOf () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsrc Root Urls : ĠMutable List < String > Ġ= Ġarray ListOf () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġroot Files : ĠMutable List < Virtual File > Ġ= Ġarray ListOf () ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠModule Root Manager . getInstance ( module ). order Entries (). libraries Only (). forEach Library () Ġ{ Ġlibrary Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Kotlin JavaScript Library Detection Util . is Kotlin JavaScript Library ( library )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġadd Sources Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( cls Root File Ġin Ġlibrary . get Files ( Order Root Type . CLASSES )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpath Ġ= ĠPath Util . getLocal Path ( cls Root File ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġassert ( path Ġ!= Ġnull ) Ġ{ Ġ" expected Ġnot - null Ġpath Ġfor Ġ${ cls Root File . name }" Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmetadata List Ġ= ĠKotlin Javascript Metadata Utils . load Metadata ( path !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( metadata List . filter Ġ{ Ġ! it . is Ab i Version Compatible Ġ}. isNotEmpty ()) Ġcontinue ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠV fs Util . find File By Io File ( File ( path ), Ġtrue )?. let Ġ{ Ġroot Files . add ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġclass Root Ġ= ĠKotlin JavaScript Meta FileSystem . getInstance (). refresh And Find File By Path ("$ path !/ ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclass Root ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcls Root Urls . add ( it . url ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Sources Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( add Sources ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsrc Root Urls . addAll ( library . get Files ( Order Root Type . SOURCES ). map Ġ{ Ġit . url Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfiles To Refresh Ġ= Ġupdate ( root Files , ĠaddTo Map If Absent Ġ= Ġtrue ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchanges To Apply Ġ= ĠChanges To Apply ( cls Root Urls , Ġsrc Root Urls , Ġfiles To Refresh ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreset Libraries ( module , Ġchanges To Apply , ĠLIB R ARY _ NAME , Ġsynchronous ly ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġreset Libraries ( module : ĠModule , Ġchanges To Apply : ĠChanges To Apply , Ġlibrary Name : ĠString , Ġsynchronous ly : ĠBoolean ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapply Change ( module , Ġchanges To Apply , Ġsynchronous ly , Ġlibrary Name ) ĊĊĠĠĠ Ġprivate Ġfun Ġapply Change ( module : ĠModule , Ġchanges To Apply : ĠChanges To Apply , Ġsynchronous ly : ĠBoolean , Ġlibrary Name : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( s ynchronously ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// for Ġtest Ġonly ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġapplication Ġ= ĠApplication Manager . getApplication () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! application . is UnitTest Mode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" S ynchronous Ġlibrary Ġupdate Ġmay Ġbe Ġdone Ġonly Ġin Ġtest Ġmode ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtoken Ġ= Ġapplication . acquire Write Action Lock ( Kotlin JavaScript Library Manager :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapply Change Impl ( module , Ġchanges To Apply , Ġlibrary Name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoken . finish () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcommit Ġ= ĠRunnable Ġ{ Ġapply Change Impl ( module , Ġchanges To Apply , Ġlibrary Name ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcommit In Write Action Ġ= ĠRunnable Ġ{ ĠApplication Manager . getApplication (). run Write Action ( commit ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠApplication Manager . getApplication (). invoke Later ( commit In Write Action , Ġmy Project !!. dis posed ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate ( changed Files : ĠList < Virtual File >, ĠaddTo Map If Absent : ĠBoolean ): ĠList < Virtual File > Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( changed Files . isEmpty ()) Ġreturn Ġempty List () ĊĊĠĠĠĠĠĠĠ Ġval Ġfiles Ġ= Ġarray ListOf < Virtual File >() ĊĠĠĠĠĠĠĠ Ġsynchronized ( library File Stamp Map ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchanged Files . forEach Ġ{ Ġfile Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPath Util . getLocal Path ( file )?. let Ġ{ Ġpath Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtime Stamp Ġ= Ġlibrary File Stamp Map . get ( path ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( addTo Map If Absent Ġ&& Ġtime Stamp Ġ!= Ġfile . time Stamp Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ! addTo Map If Absent Ġ&& Ġtime Stamp Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlibrary File Stamp Map [ path ] Ġ= Ġfile . time Stamp ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfiles . add ( file ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġfiles ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrefresh Files ( files : ĠList < Virtual File >, Ġsynchronous ly : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġevents Ġ= Ġfiles . filter Ġ{ Ġ! it . isDirectory Ġ&& Ġit . isValid Ġ}. map Ġ{ ĠMy V FileContent ChangeEvent ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( events . isEmpty ()) Ġreturn ĊĊĠĠĠĠĠĠĠ Ġval Ġcommit In Write Action Ġ= ĠRunnable Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠApplication Manager . getApplication (). run Write Action () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpublisher Ġ= ĠApplication Manager . getApplication (). message Bus . sync Publisher ( Virtual FileManager . V FS _ CHANG ES ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpublisher . before ( events ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpublisher . after ( events ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( s ynchronously ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcommit In Write Action . run () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠApplication Manager . getApplication (). invoke Later ( commit In Write Action , Ġmy Project !!. dis posed ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Synchron ized ĊĠĠĠ Ġprivate Ġfun Ġapply Change Impl ( module : ĠModule , Ġchanges To Apply : ĠChanges To Apply , Ġlibrary Name : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( module . is Disposed ) Ġreturn ĊĊĠĠĠĠĠĠĠ Ġrefresh Files ( changes To Apply . files To Refresh , Ġsynchronous ly Ġ= Ġtrue ) ĊĊĠĠĠĠĠĠĠ Ġval Ġmodel Ġ= ĠModule Root Manager . getInstance ( module ). modifiable Model ĊĠĠĠĠĠĠĠ Ġval Ġlibrary TableModel Ġ= Ġmodel . module Library Table . modifiable Model ĊĊĠĠĠĠĠĠĠ Ġvar Ġlibrary Ġ= Ġfind Library ByName ( library TableModel , Ġlibrary Name ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( library Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( changes To Apply . cls Urls ToAdd . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodel . dispose () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġlibrary Ġ= Ġlibrary TableModel . create Library ( library Name ) !! ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( changes To Apply . cls Urls ToAdd . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlibrary TableModel . remove Library ( library ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcommit Libraries ( null , Ġlibrary TableModel , Ġmodel ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġlibrary Model Ġ= Ġlibrary . modifiable Model ĊĊĠĠĠĠĠĠĠ Ġval Ġexisting Cls Urls Ġ= Ġlibrary . get Urls ( Order Root Type . CLASSES ). toSet () ĊĠĠĠĠĠĠĠ Ġval Ġexisting Src Urls Ġ= Ġlibrary . get Urls ( Order Root Type . SOURCES ). toSet () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( existing Cls Urls Ġ== Ġchanges To Apply . cls Urls ToAdd . toSet () Ġ&& Ġexisting Src Urls Ġ== Ġchanges To Apply . src Urls ToAdd . toSet ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmodel . dispose () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDis poser . dispose ( library Model ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġexisting Cls Urls . forEach Ġ{ Ġlibrary Model . remove Root ( it , ĠOrder Root Type . CLASSES ) Ġ} ĊĠĠĠĠĠĠĠ Ġexisting Src Urls . forEach Ġ{ Ġlibrary Model . remove Root ( it , ĠOrder Root Type . SOURCES ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġchanges To Apply . cls Urls ToAdd . forEach Ġ{ Ġlibrary Model . add Root ( it , ĠOrder Root Type . CLASSES ) Ġ} ĊĠĠĠĠĠĠĠ Ġchanges To Apply . src Urls ToAdd . forEach Ġ{ Ġlibrary Model . add Root ( it , ĠOrder Root Type . SOURCES ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġcommit Libraries ( library Model , Ġlibrary TableModel , Ġmodel ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcommit Libraries ( library Model : ĠLibrary . Mod ifiable Model ?, Ġtable Model : ĠLibrary Table . Mod ifiable Model , Ġmodel : ĠMod ifiable Root Model ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmy Mut ed . set ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlibrary Model ?. commit () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtable Model . commit () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmodel . commit () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmy Mut ed . set ( false ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġis Module Applicable ( module : ĠModule ) Ġ= ĠModule TypeId . JAVA _ MODULE Ġ== ĠModule Type . get ( module ). id ĊĊĠĠĠ Ġprivate Ġfun Ġfind Library ByName ( library TableModel : ĠLibrary Table . Mod ifiable Model , Ġlibrary Name : ĠString ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlibrary TableModel . libraries . first OrNull Ġ{ Ġlibrary Name Ġ== Ġit . name Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfind Library ByName ( module : ĠModule , Ġlibrary Name : ĠString ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOrder Entry Util . find Library Order Entry ( Module Root Manager . getInstance ( module ), Ġlibrary Name )?. library ĊĊĠĠĠ Ġprivate Ġclass ĠChanges To Apply ( val Ġcls Urls ToAdd : ĠList < String > Ġ= ĠlistOf (), Ġval Ġsrc Urls ToAdd : ĠList < String > Ġ= ĠlistOf (), Ġval Ġfiles To Refresh : ĠList < Virtual File > Ġ= ĠlistOf ()) ĊĊĠĠĠ Ġprivate Ġclass ĠMy V FileContent ChangeEvent ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile : ĠVirtual File ĊĠĠĠ Ġ) Ġ: ĠV FileContent ChangeEvent ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFile Content Util Core . FORCE _ RE LOAD _ REQUEST OR , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile . modification Stamp , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ- 1 , Ġ/* Ġold Modification Stamp Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse Ġ/* Ġis From Refresh Ġ*/ ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠgetPath (): ĠString Ġ= ĠPath Util . getLocal Path ( file . path Ġ+ ĠKotlin JavaScript Meta FileSystem . ARCH IVE _ SUFFIX ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġpublic Ġval ĠLIB R ARY _ NAME : ĠString Ġ= Ġ"< Kotlin ĠJavaScript Ġlibrary >" ĊĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġpublic Ġfun ĠgetInstance ( project : ĠProject ): ĠKotlin JavaScript Library Manager Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproject . getComponent ( Kotlin JavaScript Library Manager :: class . java ) !! ĊĠĠĠ Ġ} Ċ } Ċ