/* Ċ Ġ* ĠCopyright Ġ 2 0 1 0 - 2 0 2 0 Ġ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 . script ing . gradle . roots Ċ Ċ import Ġcom . intellij . code Insight . daemon . Daemon Code Analyzer Ċ import Ġcom . intellij . openapi . external System . util . External System Api Util Ċ import Ġcom . intellij . openapi . file Editor . File Editor Manager Ċ import Ġcom . intellij . openapi . progress . util . Background Task Util Ċ import Ġcom . intellij . openapi . project . Project Ċ import Ġcom . intellij . openapi . vfs . Local FileSystem Ċ import Ġcom . intellij . openapi . vfs . V fs Util Ċ import Ġcom . intellij . openapi . vfs . Virtual File Ċ import Ġcom . intellij . psi . Psi Manager Ċ import Ġcom . intellij . ui . Editor Notifications Ċ import Ġkotlinx . coroutines . Global Scope Ċ import Ġkotlinx . coroutines . launch Ċ import Ġorg . jetbrains . kotlin . idea . core . script . Script Configuration Manager Ċ import Ġorg . jetbrains . kotlin . idea . core . script . configuration . Composite Script Configuration Manager Ċ import Ġorg . jetbrains . kotlin . idea . core . script . configuration . Script ing Support Ċ import Ġorg . jetbrains . kotlin . idea . core . script . uc ache . Script Class Roots Builder Ċ import Ġorg . jetbrains . kotlin . idea . core . util . ED T Ċ import Ġorg . jetbrains . kotlin . idea . script ing . gradle .* Ċ import Ġorg . jetbrains . kotlin . idea . script ing . gradle . import ing . Kotlin Dsl Gradle Build Sync Ċ import Ġorg . jetbrains . kotlin . psi . Kt File Ċ import Ġorg . jetbrains . kotlin . utils . addTo Std lib . first Is Instance Ċ import Ġorg . jetbrains . kotlin . utils . addTo Std lib . lastIndexOf OrNull Ċ import Ġorg . jetbrains . plugins . gradle . config . Gradle Settings Listener Adapter Ċ import Ġorg . jetbrains . plugins . gradle . settings .* Ċ import Ġorg . jetbrains . plugins . gradle . util . Gradle Constants Ċ import Ġjava . io . File Ċ import Ġjava . nio . file . Paths Ċ import Ġjava . util . concurrent . atomic . Atomic Boolean Ċ Ċ /** Ċ Ġ* Ġ[ Gradle Build Root ] Ġis Ġa Ġlinked Ġgradle Ġbuild Ġ( don 't Ġconf use Ġwith Ġgradle Ġproject Ġand Ġincluded Ġbuild ). Ċ Ġ* ĠEach Ġ[ Gradle Build Root ] Ġmay Ġhave Ġit 's Ġown ĠGradle Ġversion , ĠJava Ġhome Ġand Ġother Ġsettings . Ċ Ġ* Ċ Ġ* ĠTypically , ĠIntelliJ Ġproject Ġhave Ġno Ġmore Ġthan Ġone Ġ[ Gradle Build Root ]. Ċ Ġ* Ċ Ġ* ĠThis Ġmanager Ġallows Ġto Ġfind Ġrelated ĠGradle Ġbuild Ġby Ġthe ĠGradle ĠKotlin Ġscript Ġfile Ġpath . Ċ Ġ* ĠEach Ġimported Ġbuild Ġhave Ġinfo Ġabout Ġall Ġof Ġit 's ĠKotlin ĠBuild ĠScripts . Ċ Ġ* ĠIt Ġis Ġpopulated Ġby Ġcalling Ġ[ update ], Ġstored Ġin ĠFS Ġand Ġwill Ġbe Ġloaded Ġfrom ĠFS Ġon Ġnext Ġproject Ġopening Ċ Ġ* Ċ Ġ* Ġ[ Composite Script Configuration Manager ] Ġmay Ġask Ġabout Ġknown Ġscripts Ġby Ġcalling Ġ[ collect Configurations ]. Ċ Ġ* Ċ Ġ* ĠIt Ġalso Ġused Ġto Ġshow Ġrelated Ġnotification Ġand Ġfloating Ġactions Ġdepending Ġon Ġroot Ġkind , Ġstate Ġand Ġscript Ġstate Ġitself . Ċ Ġ* Ċ Ġ* ĠRoot s Ġmay Ġbe : Ċ Ġ* Ġ- Ġ[ Gradle Build Root . Un linked ] Ġ- ĠThe Ġscript Ġnot Ġrelated Ġto Ġany ĠGradle Ġbuild Ġthat Ġis Ġlinked Ġto ĠIntelliJ ĠProject , Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġor Ġwe Ġcannot Ġknown Ġwhat Ġis Ġit Ċ Ġ* Ġ- Ġ[ Gradle Build Root . Linked ] Ġ- ĠLinked Ġproject , Ġthat Ġmay Ġbe Ġitself : Ċ Ġ* ĠĠ Ġ- Ġ[ Gradle Build Root . Legacy ] Ġ- ĠGradle Ġbuild Ġwith Ġold ĠGradle Ġversion Ġ(< 6 . 0 ) Ċ Ġ* ĠĠ Ġ- Ġ[ Gradle Build Root . New ] Ġ- Ġnot Ġyet Ġimported Ċ Ġ* ĠĠ Ġ- Ġ[ Gradle Build Root . Imported ] Ġ- Ġimported Ċ Ġ*/ Ċ class ĠGradle Build Roots Manager ( val Ġproject : ĠProject ) Ġ: ĠScript ing Support () Ġ{ ĊĠĠĠ Ġprivate Ġval Ġmanager : ĠComposite Script Configuration Manager ĊĠĠĠĠĠĠĠ Ġget () Ġ= ĠScript Configuration Manager . getInstance ( project ) Ġas ĠComposite Script Configuration Manager ĊĊĠĠĠ Ġprivate Ġval Ġupdater ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġmanager . updater ĊĊĠĠĠ Ġprivate Ġval Ġroots Ġ= ĠGradle Build Root Index () ĊĊĠĠĠ Ġ// //////// // ĊĠĠĠ Ġ/// ĠScript ing Support . Provider Ġimplementation : ĊĊĠĠĠ Ġoverride Ġfun Ġis Applicable ( file : ĠVirtual File ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġscript Under Root Ġ= Ġfind Script Build Root ( file ) Ġ?: Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġif Ġ( script Under Root . root Ġis ĠGradle Build Root . Legacy ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġis Configuration Loading InProgress ( file : ĠK t File ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( val Ġroot Ġ= Ġfind Script Build Root ( file . original File . virtual File )?. root ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠGradle Build Root . Linked Ġ-> Ġroot . import ing ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġused Ġin Ġ 2 0 1 ĊĠĠĠ Ġ@ Suppress (" UNUSED ") ĊĠĠĠ Ġfun Ġis Configuration OutOf Date ( file : ĠVirtual File ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġscript Ġ= Ġget Script Info ( file ) Ġ?: Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġreturn Ġ! script . model . inputs . is Up ToDate ( project , Ġfile ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġcollect Configurations ( builder : ĠScript Class Roots Builder ) Ġ{ ĊĠĠĠĠĠĠĠ Ġroots . list . forEach Ġ{ Ġroot Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( root Ġis ĠGradle Build Root . Imported ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġroot . collect Configurations ( builder ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// //////////////// ĊĊĠĠĠ Ġprivate Ġval ĠVirtual File . local Path ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġpath ĊĊĠĠĠ Ġfun Ġget Script Info ( file : ĠVirtual File ): ĠGradle Script Info ? Ġ= ĊĠĠĠĠĠĠĠ Ġget Script Info ( file . local Path ) ĊĊĠĠĠ Ġfun Ġget Script Info ( local Path : ĠString ): ĠGradle Script Info ? Ġ= ĊĠĠĠĠĠĠĠ Ġmanager . get Light Script Info ( local Path ) Ġas ? ĠGradle Script Info ĊĊĠĠĠ Ġclass ĠScript Under Root ( ĊĠĠĠĠĠĠĠ Ġval Ġroot : ĠGradle Build Root ?, ĊĠĠĠĠĠĠĠ Ġval Ġscript : ĠGradle Script Info ? Ġ= Ġnull ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġfun Ġfind Script Build Root ( gradle K ts File : ĠVirtual File ): ĠScript Under Root ? Ġ= ĊĠĠĠĠĠĠĠ Ġfind Script Build Root ( gradle K ts File . path ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠFast Ġmethod Ġthat Ġcan Ġreturn Ġfalse Ġpositive ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġmaybe Affected Gradle Project File ( filePath : ĠString ): ĠBoolean Ġ= ĊĠĠĠĠĠĠĠ ĠfilePath . endsWith ("/ gradle . properties ") Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠfilePath . endsWith ("/ gradle . local ") Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠfilePath . endsWith ("/ gradle - wrapper . properties ") Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠfilePath . endsWith ("/ build . gradle . k ts ") Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠfilePath . endsWith ("/ settings . gradle . k ts ") Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠfilePath . endsWith ("/ init . gradle . k ts ") ĊĊĠĠĠ Ġfun Ġis Affected Gradle Project File ( filePath : ĠString ): ĠBoolean Ġ= ĊĠĠĠĠĠĠĠ Ġfind Affected File Root ( filePath ) Ġ!= Ġnull ĊĊĠĠĠ Ġfun Ġfile Changed ( filePath : ĠString , Ġts : ĠLong Ġ= ĠSystem . currentTimeMillis ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġfind Affected File Root ( filePath )?. file Changed ( filePath , Ġts ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfind Affected File Root ( filePath : ĠString ): ĠGradle Build Root . Linked ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( filePath . endsWith ("/ gradle . properties ") Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠ ĠfilePath . endsWith ("/ gradle . local ") ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġroots . get Build By Project Dir ( filePath . substring Before Last ("/ ")) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( filePath . endsWith ("/ gradle - wrapper . properties ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgradle Wrapper Dir Index Ġ= ĠfilePath . lastIndexOf OrNull ('/') Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgradle Dir Index Ġ= ĠfilePath . lastIndexOf OrNull ('/', Ġgradle Wrapper Dir Index Ġ- Ġ 1 ) Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuild Dir Index Ġ= ĠfilePath . lastIndexOf OrNull ('/', Ġgradle Dir Index Ġ- Ġ 1 ) Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġroots . get Build By Root Dir ( filePath . substring ( 0 , Ġbuild Dir Index )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġfind Script Build Root ( filePath , Ġsearch Nearest Legacy Ġ= Ġfalse )?. root Ġas ? ĠGradle Build Root . Linked ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfind Script Build Root ( filePath : ĠString , Ġsearch Nearest Legacy : ĠBoolean Ġ= Ġtrue ): ĠScript Under Root ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! filePath . endsWith (". gradle . k ts ")) Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠ Ġval Ġscript Info Ġ= Ġget Script Info ( filePath ) ĊĠĠĠĠĠĠĠ Ġval Ġimported Ġ= Ġscript Info ?. build Root ĊĠĠĠĠĠĠĠ Ġif Ġ( imported Ġ!= Ġnull ) Ġreturn ĠScript Under Root ( imported , Ġscript Info ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( filePath . endsWith ("/ build . gradle . k ts ") Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠ ĠfilePath . endsWith ("/ settings . gradle . k ts ") Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠ ĠfilePath . endsWith ("/ init . gradle . k ts ") ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġbuild | settings | init . gradle . k ts Ġscripts Ġshould Ġbe Ġlocated Ġnear Ġgradle Ġproject Ġroot Ġonly ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgradle Build Ġ= Ġroots . get Build By Project Dir ( filePath . substring Before Last ("/ ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( gradle Build Ġ!= Ġnull ) Ġreturn ĠScript Under Root ( gradle Build ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġother Ġscripts : Ġ" included ", Ġ" pre compiled " Ġscripts , Ġscripts Ġin Ġun linked Ġprojects , ĊĠĠĠĠĠĠĠ Ġ// Ġor Ġjust Ġrandom Ġfiles Ġwith Ġ". gradle . k ts " Ġending ĊĊĠĠĠĠĠĠĠ Ġ// Ġtodo ( gradle 6 ): Ġremove , Ġit Ġis Ġrequired Ġonly Ġfor Ġprojects Ġwith Ġold Ġgradle ĊĠĠĠĠĠĠĠ Ġif Ġ( search Nearest Legacy ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfound Ġ= Ġroots . find Nearest Root ( filePath ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( found Ġis ĠGradle Build Root . Legacy ) Ġreturn ĠScript Under Root ( found ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠScript Under Root ( Gradle Build Root . Un linked ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Build Root ( gradle Working Dir : ĠString ) Ġ= ĊĠĠĠĠĠĠĠ Ġroots . get Build By Root Dir ( gradle Working Dir ) ĊĊĠĠĠ Ġfun Ġmark Import ing InProgress ( working Dir : ĠString , Ġin Progress : ĠBoolean Ġ= Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠ Ġactual ize Build Root ( working Dir )?. import ing Ġ= Ġin Progress ĊĠĠĠĠĠĠĠ Ġupdate Notifications ( working Dir ) ĊĠĠĠĠĠĠĠ Ġhide Notification For Project Import ( project ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġupdate ( build : ĠKotlin Dsl Gradle Build Sync ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġfast Ġpath Ġfor Ġlinked Ġgradle Ġbuilds Ġwithout Ġ. gradle . k ts Ġsupport ĊĠĠĠĠĠĠĠ Ġif Ġ( build . models . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġroot Ġ= Ġroots . get Build By Root Dir ( build . working Dir ) Ġ?: Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( root Ġis ĠGradle Build Root . Imported Ġ&& Ġroot . data . models . isEmpty ()) Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġroot Ġ= Ġactual ize Build Root ( build . working Dir ) Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġroot . import ing Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠ Ġif Ġ( root Ġis ĠGradle Build Root . Legacy ) Ġreturn ĊĊĠĠĠĠĠĠĠ Ġval Ġtemplate Classpath Ġ= ĠGradle Script Definitions Contributor . get Definitions Template Classpath ( project ) ĊĠĠĠĠĠĠĠ Ġval ĠnewData Ġ= ĠGradle Build Root Data ( build . project Roots , Ġtemplate Classpath , Ġbuild . models ) ĊĠĠĠĠĠĠĠ Ġval Ġmerged Data Ġ= Ġif Ġ( build . failed Ġ&& Ġroot Ġis ĠGradle Build Root . Imported ) Ġmerge ( root . data , ĠnewData ) Ġelse ĠnewData ĊĊĠĠĠĠĠĠĠ Ġval Ġnew Support Ġ= Ġtry Create Imported Root ( build . working Dir ) Ġ{ Ġmerged Data Ġ} Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ ĠGradle Build Root Data Serializer . write ( new Support . dir Ġ?: Ġreturn , Ġmerged Data ) ĊĊĠĠĠĠĠĠĠ Ġadd ( new Support ) ĊĊĠĠĠĠĠĠĠ Ġhide Notification For Project Import ( project ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġmerge ( old : ĠGradle Build Root Data , Ġnew : ĠGradle Build Root Data ): ĠGradle Build Root Data Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġroots Ġ= Ġold . project Roots . to Mutable Set () ĊĠĠĠĠĠĠĠ Ġroots . addAll ( new . project Roots ) ĊĊĠĠĠĠĠĠĠ Ġval Ġmodels Ġ= Ġold . models . associate By To ( mutable Map Of ()) Ġ{ Ġit . file Ġ} ĊĠĠĠĠĠĠĠ Ġnew . models . associate By To ( models ) Ġ{ Ġit . file Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠGradle Build Root Data ( roots , Ġnew . template Classpath , Ġmodels . values ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġlast Modified Files Save Scheduled Ġ= ĠAtomic Boolean () ĊĊĠĠĠ Ġfun Ġschedule LastModified Files Save () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( lastModified Files Save Scheduled . compare AndSet ( false , Ġtrue )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBackground Task Util . execute On P ooled Thread ( project ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( lastModified Files Save Scheduled . compare AndSet ( true , Ġfalse )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġroots . list . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . save LastModified Files () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġget Gradle Project Settings ( project ). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġdon 't Ġcall Ġthis . add , Ġas Ġwe Ġare Ġinside Ġscripting Ġmanager Ġinitialization ĊĠĠĠĠĠĠĠĠĠĠĠ Ġroots . add ( load Linked Root ( it )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġsubscribe Ġto Ġlinked Ġgradle Ġproject Ġmodification ĊĠĠĠĠĠĠĠ Ġval Ġlistener Ġ= Ġobject Ġ: ĠGradle Settings Listener Adapter () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Projects Linked ( settings : ĠMutable Collection < Gradle Project Settings >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsettings . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( load Linked Root ( it )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Projects Un linked ( linked Project Paths : ĠMutable Set < String >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlinked Project Paths . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremove ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Gradle Home Change ( old Path : ĠString ?, Ġnew Path : ĠString ?, Ġlinked Project Path : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreload Build Root ( linked Project Path ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Gradle Distribution Type Change ( current Value : ĠDistribution Type ?, Ġlinked Project Path : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreload Build Root ( linked Project Path ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġproject . message Bus . connect ( project ). subscribe ( Gradle Settings Listener . TOPIC , Ġlistener ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Gradle Project Settings ( working Dir : ĠString ): ĠGradle Project Settings ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ( External System Api Util . get Settings ( project , ĠGradle Constants . SYSTEM _ ID ) Ġas ĠGradle Settings ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. get Linked Project Settings ( working Dir ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCheck Ġthat Ġroot Ġunder Ġ[ working Dir ] Ġin Ġsync Ġwith Ġit 's Ġ[ Gradle Project Settings ]. ĊĠĠĠĠ Ġ* ĠActually Ġthis Ġshould Ġbe Ġtrue , Ġbut Ġwe Ġmay Ġmiss Ġsome Ġchange Ġevents . ĊĠĠĠĠ Ġ* ĠFor Ġthat Ġcases Ġwe Ġare Ġre checking Ġthis Ġon Ġeach ĠGradle ĠProject Ġsync Ġ( import ing / re import ing ) ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġactual ize Build Root ( working Dir : ĠString ): ĠGradle Build Root . Linked ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġactual Settings Ġ= Ġget Gradle Project Settings ( working Dir ) ĊĠĠĠĠĠĠĠ Ġval Ġbuild Root Ġ= Ġroots . get Build By Root Dir ( working Dir ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Root Ġ!= Ġnull Ġ-> Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ! build Root . check Actual ( actual Settings ) Ġ-> Ġreload Build Root ( working Dir ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġbuild Root ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġactual Settings Ġ!= Ġnull Ġ-> Ġload Linked Root ( actual Settings ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠGradle Build Root . Linked . check Actual ( actual Settings : ĠGradle Project Settings ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( actual Settings Ġ== Ġnull ) Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġval Ġknown As Supported Ġ= Ġthis Ġ! is ĠGradle Build Root . Legacy ĊĠĠĠĠĠĠĠ Ġval ĠshouldBe Supported Ġ= Ġkotlin Dsl Scripts Model Import Supported ( actual Settings . resolve Gradle Version (). version ) ĊĠĠĠĠĠĠĠ Ġreturn Ġknown As Supported Ġ== ĠshouldBe Supported ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġreload Build Root ( rootPath : ĠString ): ĠGradle Build Root . Linked ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsettings Ġ= Ġget Gradle Project Settings ( rootPath ) ĊĠĠĠĠĠĠĠ Ġif Ġ( settings Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġremove ( rootPath ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Root Ġ= Ġload Linked Root ( settings ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( new Root ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnew Root ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġload Linked Root ( settings : ĠGradle Project Settings ) Ġ= ĊĠĠĠĠĠĠĠ Ġtry Load From Fs Cache ( settings ) Ġ?: Ġcreate Other Linked Root ( settings ) ĊĊĠĠĠ Ġprivate Ġfun Ġtry Load From Fs Cache ( settings : ĠGradle Project Settings ) Ġ= ĊĠĠĠĠĠĠĠ Ġtry Create Imported Root ( settings . external Project Path ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGradle Build Root Data Serializer . read ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Other Linked Root ( settings : ĠGradle Project Settings ): ĠGradle Build Root . Linked Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsupported Ġ= Ġkotlin Dsl Scripts Model Import Supported ( settings . resolve Gradle Version (). version ) ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsupported Ġ-> ĠGradle Build Root . New ( this , Ġsettings ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠGradle Build Root . Legacy ( this , Ġsettings ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġtry Create Imported Root ( ĊĠĠĠĠĠĠĠ Ġexternal Project Path : ĠString , ĊĠĠĠĠĠĠĠ Ġdata Provider : Ġ( build Root : ĠVirtual File ) Ġ-> ĠGradle Build Root Data ? ĊĠĠĠ Ġ): ĠGradle Build Root . Imported ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbuild Root Ġ= ĠV fs Util . find File ( Paths . get ( external Project Path ), Ġtrue ) Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġdata Provider ( build Root ) Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġjava Home Ġ= ĠExternal System Api Util ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. get Execution Settings < Gradle Execution Settings >( project , Ġexternal Project Path , ĠGradle Constants . SYSTEM _ ID ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. java Home ?. let Ġ{ ĠFile ( it ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠGradle Build Root . Imported ( this , Ġexternal Project Path , Ġjava Home , Ġdata ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġadd ( new Root : ĠGradle Build Root . Linked ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġold Ġ= Ġroots . add ( new Root ) ĊĠĠĠĠĠĠĠ Ġif Ġ( old Ġis ĠGradle Build Root . Imported Ġ&& Ġnew Root Ġ! is ĠGradle Build Root . Imported ) Ġremove Data ( old . path Prefix ) ĊĠĠĠĠĠĠĠ Ġif Ġ( old Ġis ĠGradle Build Root . Imported Ġ|| Ġnew Root Ġis ĠGradle Build Root . Imported ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdater . invalidate And Commit () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġupdate Notifications ( new Root . path Prefix ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġremove ( rootPath : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġremoved Ġ= Ġroots . remove ( rootPath ) ĊĠĠĠĠĠĠĠ Ġif Ġ( removed Ġis ĠGradle Build Root . Imported ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġremove Data ( rootPath ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdater . invalidate And Commit () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġupdate Notifications ( rootPath ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġremove Data ( rootPath : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbuild Root Ġ= ĠLocal FileSystem . getInstance (). find File By Path ( rootPath ) ĊĠĠĠĠĠĠĠ Ġif Ġ( build Root Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGradle Build Root Data Serializer . remove ( build Root ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLast Modified Files . remove ( build Root ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate Notifications ( dir 1 : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! project . isOpen ) Ġreturn ĊĊĠĠĠĠĠĠĠ Ġval Ġopened Scripts Ġ= ĠFile Editor Manager . getInstance ( project ). open Files . filter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . path . startsWith ( dir 1 ) Ġ&& Ġis Gradle Kotlin Script ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( opened Scripts . isEmpty ()) Ġreturn ĊĊĠĠĠĠĠĠĠ ĠGlobal Scope . launch ( ED T ( project )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( project . is Disposed ) Ġreturn @ launch ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġopened Scripts . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkt File Ġ= ĠPsi Manager . getInstance ( project ). find File ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( kt File Ġ!= Ġnull ) ĠDa emon Code Analyzer . getInstance ( project ). restart ( kt File ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEditor Notifications . getInstance ( project ). update All Notifications () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun ĠgetInstance ( project : ĠProject ): ĠGradle Build Roots Manager Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠE PN . get Point ( project ). extension List . first Is Instance () ĊĠĠĠ Ġ} Ċ }