package Ġcom . step an ov . bbf . red uk tor . util . dependency Tree Ċ Ċ import Ġcom . step an ov . bbf . red uk tor . util . getAll P SI Children OfType Ċ import Ġcom . step an ov . bbf . red uk tor . util . getAll Parent sWith out Node Ċ import Ġcom . step an ov . bbf . red uk tor . util . getClass WithName Ċ import Ġorg . jetbrains . kotlin . psi . Kt Class Ċ import Ġorg . jetbrains . kotlin . psi . Kt File Ċ import Ġorg . jetbrains . kotlin . psi . Kt Type Reference Ċ import Ġorg . jetbrains . kotlin . psi . psi Util . getParent OfType Ċ Ċ class ĠClass Dependency Tree Ġ: ĠDependency Tree < Kt Class >() Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġconstruct Tree ( project Files : ĠList < Kt File >) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġclasses Ġ= Ġmutable ListOf < Kt Class >() ĊĠĠĠĠĠĠĠ Ġfor Ġ( f Ġin Ġproject Files ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġf . getAll P SI Children OfType < Kt Class >(). forEach Ġ{ Ġclasses . add ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfor Ġ( c Ġin Ġclasses ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġclass File Ġ= Ġc . getParent OfType < Kt File >( true ) Ġ?: Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( c . super TypeList Entries . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Or Add Node ( c ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġc . super TypeList Entries . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Try Ġto Ġfind Ġin Ġimports ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġname Ġ= Ġit . getAll P SI Children OfType < Kt Type Reference >(). first (). text ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġin Import Ġ= Ġclass File . import Directives . find Ġ{ Ġimport Ġ-> Ġimport . imported Fq Name ?. short Name ()?. asString () Ġ== Ġname Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( in Import Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġin Import . import Path ?. path Str ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! class File . package Fq Name . is Root ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( name . contains ('. ')) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġname . substring ( name . lastIndexOf ('.') Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar ĠfullName Ġ= Ġclass File . package Fq Name . asString () Ġ+ Ġ"." ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc . node . getAll Parent sWith out Node () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . psi Ġis ĠK t Class Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . psi Ġas ĠK t Class Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. as Re versed () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Suppress (" LABEL _ NAME _ CL ASH ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . name Ġ== Ġname ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ forEach ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠfullName Ġ+= Ġit . name Ġ+ Ġ"." ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠfullName Ġ+= Ġname ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= ĠfullName ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfound Class Ġ= ĠgetClass WithName ( project Files , Ġname ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( found Class Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Try Ġto Ġfind Ġclass Ġon Ġprev Ġlevel ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsplit Ġ= Ġname . split ('.') ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( split . contains ("") Ġ|| Ġsplit . size Ġ< Ġ 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġsplit . sub List ( 0 , Ġsplit . size Ġ- Ġ 2 ). join ToString (".", Ġpostfix Ġ= Ġ". ") Ġ+ Ġsplit . last () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( name . first () Ġ== Ġ'.') Ġname Ġ= Ġname . drop ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Parent To Class Node ( c , Ġfound Class ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Child To Class Node ( found Class , Ġc ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ