package Ġcom . github . igu is so uma . nx console . graph Ċ Ċ import Ġcom . github . igu is so uma . nx console . graph . model . App Node Ċ import Ġcom . github . igu is so uma . nx console . graph . model . Basic Nx Edge Ċ import Ġcom . github . igu is so uma . nx console . graph . model . Basic Nx Node Ċ import Ġcom . github . igu is so uma . nx console . graph . model . Lib Node Ċ import Ġcom . google . common . reflect . Type Token Ċ import Ġcom . google . gson . Gson Ċ import Ġcom . intellij . execution . configurations . General CommandLine Ċ import Ġcom . intellij . execution . process . Capt uring Process Handler Ċ import Ġcom . intellij . openapi . application . Application Manager Ċ import Ġcom . intellij . openapi . diagnostic . Attachment Ċ import Ġcom . intellij . openapi . diagnostic . Logger Ċ import Ġcom . intellij . openapi . graph . builder . Graph DataModel Ċ import Ġcom . intellij . openapi . progress . Progress Indicator Ċ import Ġcom . intellij . openapi . progress . Task Ċ import Ġcom . intellij . openapi . project . Project Ċ import Ġcom . intellij . openapi . util . text . StringUtil Ċ import Ġcom . intellij . openapi . vfs . Local FileSystem Ċ import Ġcom . intellij . psi . Psi File Ċ import Ġorg . jetbrains . concurrency . Async Promise Ċ import Ġjava . io . File Ċ import Ġjava . util . concurrent . TimeUnit Ċ Ċ private Ġval ĠLOG : ĠLogger Ġ= ĠLogger . getInstance ("# com . github . igu is so uma . nx console . graph . Nx Dep Graph DataModel ") Ċ Ċ class ĠN x Dep Graph DataModel ( val Ġnx Json File : ĠPsi File ) Ġ: ĠGraph DataModel < Basic Nx Node , ĠBasic Nx Edge >() Ġ{ ĊĊĠĠĠ Ġval ĠLOG Ġ= ĠLogger . getInstance ( Nx Dep Graph DataModel :: class . java ) ĊĊĠĠĠ Ġprivate Ġval Ġmy Nodes : ĠMutable Set < Basic Nx Node > Ġ= Ġmutable Set Of () ĊĠĠĠ Ġprivate Ġval Ġmy Edges : ĠMutable Set < Basic Nx Edge > Ġ= Ġmutable Set Of () ĊĠĠĠ Ġprivate Ġval Ġmy Project Ġ= Ġnx Json File . project ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġobject Ġ: ĠTask . Background able ( my Project , Ġ" lo ding Ġnx - dep graph ...", Ġfalse ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġrun ( indicator : ĠProgress Indicator ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠApplication Manager . getApplication (). run Read Action { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠApplication Manager . getApplication (). invoke Later Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġrefresh DataModel () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}. queue () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdispose () Ġ{ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Nodes (): ĠMutable Collection < Basic Nx Node > Ġ{ ĊĠĠĠĠĠĠĠ Ġrefresh DataModel () ĊĠĠĠĠĠĠĠ Ġreturn Ġmy Nodes . to Mutable Set () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Edges (): ĠMutable Collection < Basic Nx Edge > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġmy Edges . to Mutable Set () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Source Node ( edge : ĠBasic Nx Edge ): ĠBasic Nx Node Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġedge . source ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Target Node ( edge : ĠBasic Nx Edge ): ĠBasic Nx Node Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġedge . target ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget NodeName ( node : ĠBasic Nx Node ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġnode . name ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Edge Name ( node : ĠBasic Nx Edge ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġnode . name ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġcreate Edge ( from : ĠBasic Nx Node , Ġto : ĠBasic Nx Node ): ĠBasic Nx Edge ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrefresh DataModel () Ġ{ ĊĠĠĠĠĠĠĠ Ġmy Nodes . clear () ĊĠĠĠĠĠĠĠ Ġmy Edges . clear () ĊĠĠĠĠĠĠĠ Ġ// ĠTODO Ġcheck Ġhow Ġto Ġavoid Ġgraph Ġis Ġnot Ġfit Ġthe Ġcontent ĊĠĠĠĠĠĠĠ Ġ/* Application Manager . getApplication (). execute On P ooled Thread { ĊĠĠĠĠĠĠĠĠĠĠĠ ĠApplication Manager . getApplication (). invoke Later Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate DataModel () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}*/ ĊĊĠĠĠĠĠĠĠ Ġ// Ġthis Ġis Ġnot Ġworking ĊĠĠĠĠĠĠĠ Ġ/* Progress Manager . getInstance (). run Process With Progress S ynchronously ({ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠApplication Manager . getApplication (). invoke And Wait Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate DataModel () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}, Ġ" lo ding Ġnx - dep graph ...", Ġfalse , Ġmy Project ) */ ĊĊĠĠĠĠĠĠĠ Ġupdate DataModel () ĊĊĠĠĠĠĠĠĠ Ġ/* object Ġ: ĠTask . Background able ( my Project , Ġ" lo ding Ġnx - dep graph ...", Ġfalse Ġ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġrun ( indicator : ĠProgress Indicator ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Application Manager . getApplication (). run Read Action { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠApplication Manager . getApplication (). invoke Later Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate DataModel () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}. queue () */ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate DataModel () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdep Graph Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkotlin . run Catch ing Ġ{ ĠFile ( File ( nx Json File . parent !!. virtual File . path ), Ġ". nx deps . json ") Ġ}. get OrNull () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġ// Ġprintln ( grab CommandOutput ) ĊĠĠĠĠĠĠĠ Ġ// ĠTODO Ġtemp Ġfile ĊĠĠĠĠĠĠĠ Ġ// Ġval Ġdep Graph Json File Ġ= Ġcreate TempFile . read Text () ĊĠĠĠĠĠĠĠ Ġ// Ġcreate TempFile . delete On Exit () ĊĠĠĠĠĠĠĠ Ġval Ġdep Graph Json File Ġ= Ġdep Graph . read Text () ĊĠĠĠĠĠĠĠ Ġval Ġlist Person Type Ġ= Ġobject Ġ: ĠType Token < Map < String , ĠAny >>() Ġ{} . type ĊĠĠĠĠĠĠĠ Ġval Ġgraph : ĠMap < String , ĠAny > Ġ= ĠGson (). fromJson ( dep Graph Json File , Ġlist Person Type ) ĊĠĠĠĠĠĠĠ Ġval Ġaffected Projects Property Ġ= Ġgraph [" affected Projects "] Ġas ? ĠList < String > Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġval Ġgraph Property Ġ= Ġgraph [" graph "] Ġas ? ĠMap < *, Ġ*> Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġ( graph Property [" nodes "] Ġas ĠMap < *, Ġ*> ). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġval Ġfind File By Url Ġ= ĠVirtual FileManager . getInstance (). find File By Url ( nx Json File . parent ?. virtual File ?. path Ġ+ Ġ"/ apps / api ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġval Ġfind Directory Ġ= ĠPsi Manager . getInstance ( nx Json File . project ). find Directory ( find File By Io File !! )?. create Smart Pointer () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmap Ġ= Ġit . value Ġas ĠMap < *, Ġ*> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġmap [" data "] Ġas ĠMap < *, Ġ* >? ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfind File By Io File Ġ= Ġdata ?. get (" root ") ?. let Ġ{ Ġroot Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLocal FileSystem . getInstance () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. find File By Io File ( File ( nx Json File . parent ?. virtual File ?. path Ġ+ Ġ"/" Ġ+ Ġroot )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaffected Ġ= Ġif Ġ( Nx Graph Configuration . getInstance ( project Ġ= Ġnx Json File . project ). NX _ SHOW _ AFF ECT ED ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaffected Projects Property . contains ( it . key ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( map [" type "] Ġas ĠString Ġin ĠlistOf (" e 2 e ", Ġ" app ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Node ( App Node ( it . key Ġas ĠString , Ġaffected , Ġfind File By Io File )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Node ( Lib Node ( it . key Ġas ĠString , Ġaffected , Ġfind File By Io File )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ( graph Property [" dependencies "] Ġas ĠMap < *, Ġ*> ). forEach Ġ{ Ġentry Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdeps Ġ= Ġentry . value Ġas ĠList < Map < *, Ġ* >> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdeps . forEach Ġ{ Ġx Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsource Ġ= Ġmy Nodes . first OrNull Ġ{ Ġit . name Ġ== Ġx [" source "] Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtarget Ġ= Ġmy Nodes . first OrNull Ġ{ Ġit . name Ġ== Ġx [" target "] Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( source Ġ!= Ġnull Ġ&& Ġtarget Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Edge ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBasic Nx Edge ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsource , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtarget , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( x [" type "] Ġas ĠString ? Ġ== Ġ" implicit ") Ġ" implicit " Ġelse Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġx [" type "] Ġas ĠString ? ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġadd Node ( node : ĠBasic Nx Node ) Ġ{ ĊĠĠĠĠĠĠĠ Ġmy Nodes . add ( node ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġadd Edge ( edge : ĠBasic Nx Edge ) Ġ{ ĊĠĠĠĠĠĠĠ Ġmy Edges . add ( edge ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ var Ġmy Log Errors : ĠThread Local < Boolean > Ġ= ĠThread Local . with Initial Ġ{ Ġtrue Ġ} Ċ fun Ġgrab CommandOutput ( project : ĠProject , Ġcommand Line : ĠGeneral CommandLine , Ġworking Dir : ĠString ?): ĠString Ġ{ ĊĠĠĠ Ġif Ġ( working Dir Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcommand Line . with Work Directory ( working Dir ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġhandler Ġ= ĠCapt uring Process Handler ( command Line ) ĊĠĠĠ Ġval Ġpromise Ġ= ĠAsync Promise < String >() ĊĠĠĠ Ġobject Ġ: ĠTask . Background able ( project , Ġ" exec uting Ġnx Ġdep - graph ...") Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġrun ( progress : ĠProgress Indicator ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoutput Ġ= Ġhandler . run Process () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( output . exit Code Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( output . stderr . trim (). isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( my Log Errors . get ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLOG . error ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Error Ġwhile Ġloading Ġsche matic s Ġinfo .\ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshort en Output ( output . stderr ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAttachment (" err - output ", Ġoutput . stderr ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLOG . info ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Error Ġwhile Ġloading Ġsche matic s Ġinfo .\ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshort en Output ( output . stderr ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġpromise . set Result ( output . stdout ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( my Log Errors . get ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLOG . error ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Failed Ġto Ġload Ġsche matic s Ġinfo .\ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshort en Output ( output . stderr ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAttachment (" err - output ", Ġoutput . stderr ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAttachment (" std - output ", Ġoutput . stdout ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLOG . info ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Error Ġwhile Ġloading Ġsche matic s Ġinfo .\ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshort en Output ( output . stderr ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpromise . set Result ("") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( t : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpromise . setError ( t ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ}. queue () ĊĊĠĠĠ Ġreturn Ġpromise . blocking Get ( 5 0 0 0 , ĠTimeUnit . MILLISECONDS ) ĊĠĠĠĠĠĠĠ Ġ?: Ġerror (" Failed Ġto Ġfetch Ġlist Ġof Ġprocesses .") Ċ } Ċ Ċ private Ġfun Ġshort en Output ( output : ĠString ): ĠString Ġ{ ĊĠĠĠ Ġreturn ĠString Util . short en Text With El lipsis ( ĊĠĠĠĠĠĠĠ Ġoutput . replace ('\\ ', Ġ'/') ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. replace (" (/ [^ () /: ]+ )+ (/ [^ () /: ]+ )( / [^ () /: ]+) ". to Regex (), Ġ"/ ... $ 1 $ 2 $ 3 "), ĊĠĠĠĠĠĠĠĠ 7 5 0 , ĊĠĠĠĠĠĠĠĠ 0 ĊĠĠĠ Ġ) Ċ } Ċ