package Ġj on asm ayer . bird view Ċ Ċ import Ġcom . github . jav ap ar ser . Parser Configuration Ċ import Ġcom . github . jav ap ar ser . Static Java Parser Ċ import Ġcom . github . jav ap ar ser . ast . body . Class Or Interface Declaration Ċ import Ġcom . github . jav ap ar ser . ast . expr . MethodCall Expr Ċ import Ġcom . github . jav ap ar ser . symbols olver . Java Symbol Solver Ċ import Ġcom . github . jav ap ar ser . symbols olver . resolution . types olver s . Combined Type Solver Ċ import Ġcom . github . jav ap ar ser . symbols olver . resolution . types olver s . Java Parser Type Solver Ċ import Ġcom . github . jav ap ar ser . symbols olver . resolution . types olver s . Reflection Type Solver Ċ import Ġcom . xen om ach ina . arg parser . Arg Parser Ċ import Ġcom . xen om ach ina . arg parser . main Body Ċ import Ġorg . j gr ap ht . graph . Default Direct ed Graph Ċ import Ġjava . io . File Ċ import Ġjava . awt . Desktop ĊĊĊ Ċ val ĠOUTPUT _ DIR Ġ= Ġ"${ System . getProperty (" user . home ") }/. B ir ds View /" Ċ val Ġres Files Ġ= ĠarrayOf (" d 3 v 4 - brush - lite . js ", Ġ" d 3 v 4 - selectable - force - directed - graph . js ", ĊĠĠĠ Ġ" d 3 v 4 - selectable - zoom able - force - directed - graph . css ", Ġ" index . html ") Ċ const Ġval ĠGRAPH _ JSON Ġ= Ġ" graph . js " Ċ const Ġval ĠINDEX _ HTML Ġ= Ġ" index . html " Ċ Ċ fun Ġmain ( args : ĠArray < String >) Ġ= Ġmain Body Ġ{ ĊĊĠĠĠ Ġval Ġparsed Args Ġ= ĠArg Parser ( args ). parse Into (:: Args ) ĊĊĠĠĠ Ġsetup Output Dir ( OUTPUT _ DIR ) ĊĊĠĠĠ Ġinit Parser And Symbol Solver ( parsed Args . source Dir ) ĊĊĠĠĠ Ġval Ġsrc Files Ġ= Ġfind Java Files In Dir ( parsed Args . source Dir ) ĊĠĠĠ Ġval Ġcompilation Units Ġ= Ġsrc Files . map Ġ{ ĠStatic Java Parser . parse ( it ) Ġ} ĊĊĠĠĠ Ġval Ġgraph Ġ= ĠDefault Direct ed Graph < String , ĠType Edge >( Type Edge :: class . java ) ĊĊĠĠĠ Ġcompilation Units . forEach Ġ{ Ġcompilation Unit Ġ-> ĊĠĠĠĠĠĠĠ Ġcompilation Unit . findAll ( Class Or Interface Declaration :: class . java ). forEach Ġ{ Ġclass Or Interface Declaration Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgraph . add Vertex ( class Or Interface Declaration . resolve (). qualified Name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġprintln (" Number Ġof Ġresolved Ġclasses Ġand Ġinterfaces : Ġ${ graph . vertex Set (). size }") ĊĊĊĠĠĠ Ġcompilation Units . forEach Ġ{ Ġcompilation Unit Ġ-> ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcompilation Unit . findAll ( MethodCall Expr :: class . java ). forEach Ġ{ Ġmethod Call Expr Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcalling Type Ġ= Ġmethod Call Expr . get En closing Type (). resolve (). qualified Name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcalled Type Ġ= Ġmethod Call Expr . resolve (). decl aring Type (). qualified Name ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġskip Edge Ġ= Ġ! graph . contains Vertex ( called Type ) Ġ// ĠCalled Ġtype Ġis Ġnot Ġpart Ġof Ġsources ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ|| Ġcalling Type Ġ== Ġcalled Type ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif (! skip Edge ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocess New Method Invocation ( graph , Ġcalling Type , Ġcalled Type , Ġpoint Edge To Called Type Ġ= Ġparsed Args . reverse Edges ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( e Ġis ĠUn solved Symbol Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Un solved ĠSymbol : Ġ${ e . name }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġscoring Algorithm Ġ= Ġparsed Args . vertex Sc oring Algorithm . get Algorithm ( graph ) ĊĠĠĠ Ġval Ġscore Scale Ġ= Ġparsed Args . vertex Score Scale Ġ?: Ġscoring Algorithm . getDefault Score Scale () ĊĊĠĠĠ Ġgenerate Graph Json ( graph , Ġscoring Algorithm , Ġscore Scale , ĠFile ( OUTPUT _ DIR , ĠGRAPH _ JSON )) ĊĠĠĠ Ġopen Visualization In Browser ( OUTPUT _ DIR Ġ+ ĠINDEX _ HTML ) Ċ } Ċ Ċ fun Ġopen Visualization In Browser ( url : ĠString ) Ġ{ ĊĠĠĠ Ġval Ġhtml File Ġ= ĠFile ( url ) ĊĠĠĠ ĠDesktop . get Desktop (). browse ( html File . to URI ()) Ċ } Ċ Ċ fun Ġprocess New Method Invocation ( graph : ĠDefault Direct ed Graph < String , ĠType Edge >, Ġcalling Type : ĠString , Ġcalled Type : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpoint Edge To Called Type : ĠBoolean ) Ġ{ ĊĠĠĠ Ġval Ġ( from , Ġto ) Ġ= Ġif ( point Edge To Called Type ) ĠarrayOf ( calling Type , Ġcalled Type ) Ġelse ĠarrayOf ( called Type , Ġcalling Type ) ĊĠĠĠ Ġif (! graph . add Edge ( from , Ġto , ĠType Edge ())) Ġ{ ĊĠĠĠĠĠĠĠ Ġgraph . get Edge ( from , Ġto ). method Inv ocations ++ ĊĠĠĠ Ġ} Ċ } ĊĊ Ċ fun Ġinit Parser And Symbol Solver ( src Dir : ĠString ) Ġ{ ĊĠĠĠ Ġval Ġtype Solver Ġ= ĠCom bined Type Solver () ĊĠĠĠ Ġtype Solver . add ( Reflection Type Solver ()) ĊĠĠĠ Ġtype Solver . add ( Java Parser Type Solver ( src Dir , ĠParser Configuration ())) ĊĊĠĠĠ Ġval Ġsymbol Solver Ġ= ĠJava Symbol Solver ( type Solver ) ĊĊĠĠĠ ĠStatic Java Parser . getConfiguration (). set Symbol Resolver ( symbol Solver ) Ċ }