package Ġcom . m arch erd ie go . events . navigator Ċ Ċ import Ġcom . intellij . openapi . module . Module Manager Ċ import Ġcom . intellij . openapi . project . Project Ċ import Ġcom . intellij . openapi . project . root Manager Ċ import Ġcom . intellij . openapi . vfs . Virtual File Ċ import Ġcom . intellij . psi . Psi Element Ċ import Ġcom . intellij . psi . Psi Manager Ċ import Ġcom . intellij . psi . Psi Recursive Element Walk ing Visitor Ċ import Ġcom . m arch erd ie go . events . navigator . extensions . add Singleton Edge Ċ import Ġcom . m arch erd ie go . events . navigator . extensions . add Singleton Vertex Ċ import Ġcom . m arch erd ie go . events . navigator . extensions . read Action Ċ import Ġcom . m arch erd ie go . events . navigator . extensions . remove Extension Ċ import Ġcom . m arch erd ie go . events . navigator . graph . layout . Extended Compact Tree Layout Ċ import Ġcom . m arch erd ie go . events . navigator . graph . styles . Graph Styles Ċ import Ġcom . mx graph . model . mx Cell Ċ import Ġcom . mx graph . swing . mx Graph Component Ċ import Ġcom . mx graph . swing . view . mx IC ell Editor Ċ import Ġcom . mx graph . view . mx Graph Ċ import Ġjava . awt . Color Ċ import Ġjava . awt . Toolkit Ċ import Ġjava . util . Event Object Ċ import Ġjavax . swing . J Frame Ċ Ċ class ĠProject Architecture Graph ( private Ġvar Ġstatus Listener : ĠStatus Listener ? Ġ= Ġnull ) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġvalid Source Extensions Ġ= ĠlistOf (" kt ", Ġ" java ") ĊĊĠĠĠ Ġfun Ġshow ( project : ĠProject ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġgraph Ġ= Ġmx Graph () ĊĠĠĠĠĠĠĠ Ġgraph . model . begin Update () ĊĠĠĠĠĠĠĠ Ġgraph . is AutoSize Cells Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġgraph . stylesheet . put CellStyle ( Constants . APPLICATION , ĠGraph Styles . getApplication Node Style ()) ĊĠĠĠĠĠĠĠ Ġgraph . stylesheet . put CellStyle ( Constants . NODE , ĠGraph Styles . getNode Styles ()) ĊĠĠĠĠĠĠĠ Ġgraph . stylesheet . put CellStyle ( Constants . MODEL , ĠGraph Styles . getModel Node Styles ()) ĊĠĠĠĠĠĠĠ Ġgraph . stylesheet . put CellStyle ( Constants . VIEW , ĠGraph Styles . getView Node Styles ()) ĊĠĠĠĠĠĠĠ Ġgraph . stylesheet . put CellStyle ( Constants . PRES ENTER , ĠGraph Styles . get Presenter Node Styles ()) ĊĊĠĠĠĠĠĠĠ Ġgraph . stylesheet . put CellStyle ( Constants . EDGE , ĠGraph Styles . get Edge Style ()) ĊĠĠĠĠĠĠĠ Ġgraph . stylesheet . put CellStyle ( Constants . RE VER SED _ EDGE , ĠGraph Styles . get Re versed Edge Style ()) ĊĠĠĠĠĠĠĠ Ġgraph . stylesheet . put CellStyle ( Constants . APPLICATION _ EDGE , ĠGraph Styles . getApplication Edge Style ()) ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparent Ġ= Ġgraph . default Parent ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġapp Vertex Ġ= Ġgraph . add Singleton Vertex ( parent , Ġ" Application ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapp Vertex . style Ġ= ĠConstants . APPLICATION ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpopulate Graph ( project , Ġparent , Ġapp Vertex , Ġgraph ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠExtended Compact Tree Layout ( graph ). execute ( parent ) ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgraph . model . end Update () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġframe Ġ= ĠJ Frame () ĊĠĠĠĠĠĠĠ Ġval Ġsize Ġ= ĠToolkit . getDefault Toolkit (). screen Size ĊĠĠĠĠĠĠĠ Ġframe . setSize ( size . width , Ġsize . height ) ĊĠĠĠĠĠĠĠ Ġval Ġgraph Component Ġ= Ġmx Graph Component ( graph ) ĊĠĠĠĠĠĠĠ Ġgraph Component . viewport . is Opaque Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġgraph Component . viewport . background Ġ= ĠColor . decode ( Graph Styles . BACKGROUND _ COLOR ) ĊĠĠĠĠĠĠĠ Ġgraph Component . is Connect able Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġgraph Component . is Drag Enabled Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġgraph Component . cell Editor Ġ= Ġobject Ġ: Ġmx IC ell Editor Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Editing Cell () Ġ= Ġnull ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġstart Editing ( cell : ĠAny ?, Ġtrigger : ĠEvent Object ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġstop Editing ( cancel : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġgraph Component . add Mouse Wheel Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . wheel Rotation Ġ< Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgraph Component . zoom In () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( it . wheel Rotation Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgraph Component . zoom Out () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġframe . content Pane . add ( graph Component ) ĊĠĠĠĠĠĠĠ Ġframe . setLocation Relative To ( null ) ĊĠĠĠĠĠĠĠ Ġframe . isVisible Ġ= Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġpopulate Graph ( project : ĠProject , Ġparent : ĠAny , Ġroot Vertex : Ġmx Cell , Ġgraph : Ġmx Graph ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmodules Ġ= ĠModule Manager . getInstance ( project ). modules ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmodules . forEach Indexed Ġ{ Ġmodule Index , Ġmodule Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodule . root Manager . content Roots . forEach Ġ{ Ġroot Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġall Source Files Ġ= ĠgetAll Source Files ( root ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtotal Files Ġ= Ġall Source Files . size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġall Source Files . forEach Indexed Ġ{ Ġfile Index , Ġsource File Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpsi File Ġ= Ġread Action Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPsi Manager . getInstance ( project ). find File ( source File ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpsi File ?. accept ( object Ġ: ĠPsi Recursive Element Walk ing Visitor () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Element ( element : ĠPsi Element ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstatus Listener ?. notify Status Update ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodule . name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodule Index Ġ+ Ġ 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodules . size , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( file Index Ġ+ Ġ 1 ). toFloat () Ġ/ Ġtotal Files . toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġread Action Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Graph Tree For Component ( parent , Ġroot Vertex , Ġgraph , Ġelement ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . visit Element ( element ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġclean Up Unused Nodes ( parent , Ġgraph ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstatus Listener ?. on Completed () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstatus Listener ?. on Failed () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġclean Up Unused Nodes ( parent : ĠAny , Ġgraph : Ġmx Graph ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġunused Nodes Ġ= Ġgraph ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. getChild Vertices ( parent ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( it Ġas Ġmx Cell ). edge Count Ġ== Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġgraph . remove Cells ( unused Nodes . to Typed Array ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġbuild Graph Tree For Component ( parent : ĠAny , Ġroot Vertex : Ġmx Cell , Ġgraph : Ġmx Graph , Ġelement : ĠPsi Element ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfind M vp Components ( element )?. let Ġ{ Ġm vp Components Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Ġ= Ġelement . containing File ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠfileName Ġ= Ġfile . name . remove Extension () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Vertex Ġ= Ġgraph . add Singleton Vertex ( parent , ĠfileName ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcomponents Ġ= Ġm vp Components . first ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis Post Ġ= Ġm vp Components . second ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfind Activity References ( graph , Ġparent , Ġroot Vertex , Ġelement ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcomponents . forEach Ġ{ Ġreference Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreference File Ġ= Ġreference . containing File ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreference Name Ġ= Ġreference File . name . remove Extension () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreference Vertex Ġ= Ġgraph . add Singleton Vertex ( parent , Ġreference Name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( from , Ġto ) Ġ= Ġif Ġ( is Post ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPair ( reference Vertex , Ġfile Vertex ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPair ( file Vertex , Ġreference Vertex ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgraph . add Singleton Edge ( parent , Ġ"${ from . value }${ to . value }", Ġfrom , Ġto , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfind Activity References ( graph : Ġmx Graph , Ġparent : ĠAny , Ġroot : Ġmx Cell , Ġelement : ĠPsi Element ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠfileName Ġ= Ġelement . containing File . name . remove Extension () ĊĠĠĠĠĠĠĠ Ġif Ġ( fileName . contains ( Constants . PRES ENTER , Ġtrue ). not ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġconstructor Ġ= ĠPsi Utils . getClass ByName ( fileName ) Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġval Ġactivity Elements Ġ= ĠPsi Utils . find Usage s ( constructor ) ĊĠĠĠĠĠĠĠ Ġif Ġ( activity Elements . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Vertex Ġ= Ġgraph . add Singleton Vertex ( parent , ĠfileName ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġactivity Elements . forEach Ġ{ Ġactivity Element Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġactivity File Ġ= Ġactivity Element . containing File ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġactivity Name Ġ= Ġactivity File . name . remove Extension () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġactivity Vertex Ġ= Ġgraph . add Singleton Vertex ( parent , Ġactivity Name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgraph . add Singleton Edge ( parent , Ġ"$ activity Name $ fileName ", Ġactivity Vertex , Ġfile Vertex ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgraph . add Singleton Edge ( parent , Ġ" root -$ activity Name ", Ġroot , Ġactivity Vertex ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstyle Ġ= ĠConstants . APPLICATION _ EDGE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfind M vp Components ( psi Element : ĠPsi Element ): ĠPair < Set < Psi Element >, ĠBoolean >? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPsi Utils . is Subscription Method ( psi Element ) Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsubscriber Method Ġ= ĠPsi Utils . find Annotated Method ( psi Element ) Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġusage s Ġ= ĠPsi Utils . find Method Parameter Usage s ( subscriber Method ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPair ( us ages , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPsi Utils . is EventBus Post ( psi Element ) Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconstructor Ġ= ĠPsi Utils . getClass ByName ( psi Element . text ) Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġusage s Ġ= ĠPsi Utils . find Usage s ( constructor ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPair ( us ages , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠgetAll Source Files ( file : ĠVirtual File ): ĠList < Virtual File > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġchildren Ġ= Ġmutable ListOf < Virtual File >() ĊĠĠĠĠĠĠĠ Ġif Ġ( file . isDirectory . not () Ġ&& Ġfile . extension ?. toLowerCase () Ġin Ġvalid Source Extensions ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchildren . add ( file ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfile . children . forEach Ġ{ Ġchild Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchildren . addAll ( getAll Source Files ( child )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġchildren ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinterface ĠStatus Listener Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġnotify Status Update ( module : ĠString , Ġmodule Index : ĠInt , Ġmodules Count : ĠInt , Ġcompleted : ĠFloat ) ĊĠĠĠĠĠĠĠ Ġfun Ġon Completed () ĊĠĠĠĠĠĠĠ Ġfun Ġon Failed () ĊĠĠĠ Ġ} Ċ } Ċ