package Ġcom . mist ral tech . smo gen . utils Ċ Ċ import Ġcom . intellij . openapi . action System . An ActionEvent Ċ import Ġcom . intellij . openapi . action System . Common Data Keys Ċ import Ġcom . intellij . openapi . action System . DataContext Ċ import Ġcom . intellij . openapi . editor . Editor Ċ import Ġcom . intellij . openapi . project . Project Ċ import Ġcom . intellij . psi . Psi Anonymous Class Ċ import Ġcom . intellij . psi . Psi Class Ċ import Ġcom . intellij . psi . Psi Directory Ċ import Ġcom . intellij . psi . Psi Element Ċ import Ġcom . intellij . psi . Psi File Ċ import Ġcom . intellij . psi . Psi Java File Ċ import Ġcom . intellij . psi . Psi Modifier Ċ import Ġcom . intellij . psi . Psi Type Parameter Ċ import Ġcom . intellij . psi . util . Psi Tree Util Ċ import Ġcom . intellij . psi . util . Psi Util Base Ċ Ċ @ Suppress (" unused ") Ċ object ĠPsi Utils Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠFor Ġa Ġgiven Ġelement , Ġdetermines Ġthe Ġclass Ġelement Ġthat Ġis Ġthe Ġthe Ġnearest ĊĠĠĠĠ Ġ* Ġen closing Ġclass Ġelement , Ġexcluding Ġtype Ġparameters Ġand Ġanonymous Ġinner Ġclasses . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġpsi Element Ġthe Ġinput Ġelement ĊĠĠĠĠ Ġ* Ġ@ return Ġthe Ġnearest Ġen closing Ġqual ifying Ġclass Ġelement , Ġor Ġnull ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġfun Ġfind Class From Element ( psi Element : ĠPsi Element ): ĠPsi Class ? Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġcontaining Class : ĠPsi Class ? Ġ= ĠPsi Tree Util . getParent OfType ( psi Element , ĠPsi Class :: class . java , Ġfalse ) ĊĊĠĠĠĠĠĠĠ Ġwhile Ġ( containing Class Ġis ĠPsi Type Parameter Ġ|| Ġcontaining Class Ġis ĠPsi Anonymous Class ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontaining Class Ġ= ĠPsi Tree Util . getParent OfType ( containing Class , ĠPsi Class :: class . java ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġcontaining Class ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠFor Ġa Ġgiven Ġfile Ġelement , Ġgets Ġthe Ġen closed Ġclass Ġthat Ġis Ġpublicly Ġaccessible . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġfile Ġthe Ġfile ĊĠĠĠĠ Ġ* Ġ@ return Ġthe Ġen closed Ġpublic Ġclass Ġif Ġfound ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġfun Ġget Public Class FromFile ( file : ĠPsi File ): ĠPsi Class ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġjava File : ĠPsi Java File ? Ġ= Ġif Ġ( file Ġis ĠPsi Java File ) Ġfile Ġelse Ġnull ĊĊĠĠĠĠĠĠĠ Ġval Ġchild Classes : ĠList < Psi Class >? Ġ= Ġjava File ?. children ?. filter Is Instance < Psi Class >() ĊĊĠĠĠĠĠĠĠ Ġreturn Ġchild Classes ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . filter Ġ{ Ġpsi Class Ġ-> Ġpsi Class . has Modifier Property (" public ") Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . get OrNull ( 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSearch ing Ġfrom Ġthe Ġsupplied Ġbase Ġdirectory , Ġfinds Ġthe Ġdirectory Ġthat Ġrepresents Ġa Ġgiven Ġpackage Ġname . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġbase Dir Ġthe Ġbase Ġdirectory ĊĠĠĠĠ Ġ* Ġ@ param ĠpackageName Ġthe Ġpackage Ġname ĊĠĠĠĠ Ġ* Ġ@ return Ġthe Ġdirectory Ġrel ating Ġto Ġthe Ġpackage , Ġor Ġnull Ġif Ġthe Ġdirectory Ġdoes Ġnot Ġexist ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġfun Ġfind Directory For Package ( base Dir : ĠPsi Directory , ĠpackageName : ĠString ): ĠPsi Directory ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġprocess Packages Optional ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbase Dir , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġdir : ĠPsi Directory , Ġname : ĠString Ġ-> Ġdir . find Sub directory ( name ) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Package As Components ( packageName ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠFor Ġa Ġgiven Ġbase Ġdirectory Ġand Ġpackage Ġname , Ġensures Ġthat Ġthe Ġrelated Ġpackage Ġdirectory Ġexists . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġbase Dir Ġthe Ġbase Ġdirectory ĊĠĠĠĠ Ġ* Ġ@ param ĠpackageName Ġthe Ġpackage Ġname ĊĠĠĠĠ Ġ* Ġ@ return Ġthe Ġdirectory Ġrel ating Ġto Ġthe Ġpackage ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġfun Ġcreate Missing Directories For Package ( base Dir : ĠPsi Directory , ĠpackageName : ĠString ): ĠPsi Directory Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġprocess Packages ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbase Dir , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġdir : ĠPsi Directory , Ġname : ĠString Ġ-> Ġfind OrCreate Sub directory ( dir , Ġname ) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Package As Components ( packageName ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfind OrCreate Sub directory ( base Dir : ĠPsi Directory , Ġname : ĠString ): ĠPsi Directory Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġbase Dir . find Sub directory ( name ) Ġ?: Ġbase Dir . create Sub directory ( name ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprocess Packages ( ĊĠĠĠĠĠĠĠ Ġbase Dir : ĠPsi Directory , ĊĠĠĠĠĠĠĠ Ġfunction : Ġ( base Dir : ĠPsi Directory , ĠpackageName : ĠString ) Ġ-> ĠPsi Directory , ĊĠĠĠĠĠĠĠ Ġpackage Names : ĠList < String > ĊĠĠĠ Ġ): ĠPsi Directory Ġ{ ĊĊĠĠĠĠĠĠĠ Ġif Ġ( package Names . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġbase Dir ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġpackage Names Head Ġ= Ġpackage Names [ 0 ] ĊĠĠĠĠĠĠĠ Ġval Ġpackage Names Tail Ġ= Ġpackage Names . sub List ( 1 , Ġpackage Names . size ) ĊĠĠĠĠĠĠĠ Ġval Ġsubdirectory : ĠPsi Directory Ġ= Ġfunction ( base Dir , Ġpackage Names Head ) ĊĠĠĠĠĠĠĠ Ġreturn Ġprocess Packages ( sub directory , Ġfunction , Ġpackage Names Tail ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprocess Packages Optional ( ĊĠĠĠĠĠĠĠ Ġbase Dir : ĠPsi Directory , ĊĠĠĠĠĠĠĠ Ġfunction : Ġ( base Dir : ĠPsi Directory , ĠpackageName : ĠString ) Ġ-> ĠPsi Directory ?, ĊĠĠĠĠĠĠĠ Ġpackage Names : ĠList < String > ĊĠĠĠ Ġ): ĠPsi Directory ? Ġ{ ĊĊĠĠĠĠĠĠĠ Ġif Ġ( package Names . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġbase Dir ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġpackage Names Head Ġ= Ġpackage Names [ 0 ] ĊĠĠĠĠĠĠĠ Ġval Ġpackage Names Tail Ġ= Ġpackage Names . sub List ( 1 , Ġpackage Names . size ) ĊĠĠĠĠĠĠĠ Ġval Ġsubdirectory : ĠPsi Directory ? Ġ= Ġfunction ( base Dir , Ġpackage Names Head ) ĊĠĠĠĠĠĠĠ Ġreturn Ġsubdirectory ?. let Ġ{ Ġprocess Packages Optional ( it , Ġfunction , Ġpackage Names Tail ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Package As Components ( packageName : ĠString ): ĠList < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( packageName . isEmpty ()) Ġempty List () Ġelse ĠpackageName . split ("\\ .". to Regex ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDetermine Ġif Ġthe Ġsupplied Ġclass Ġis Ġabstract . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġpsi Class Ġthe Ġclass ĊĠĠĠĠ Ġ* Ġ@ return Ġtrue Ġif Ġpsi Class Ġis Ġabstract ; Ġfalse Ġotherwise ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġfun Ġis Abstract ( psi Class : ĠPsi Class ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġpsi Class . has Modifier Property ( Psi Modifier . AB STR ACT ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGets Ġthe Ġselected Ġclass Ġfor Ġthe Ġevent Ġif Ġavailable . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠIf Ġthere Ġis Ġa Ġcurrent Ġeditor Ġand Ġthe Ġcaret Ġis Ġover Ġa Ġclass , Ġuses Ġthat Ġclass . ĊĠĠĠĠ Ġ* ĠElse Ġif Ġthere Ġis Ġa Ġselected Ġelement Ġin Ġthe Ġdata Ġcontext Ġthat Ġcan Ġbe Ġmapped Ġto Ġa Ġclass , Ġuses Ġthat Ġclass . ĊĠĠĠĠ Ġ* ĠElse Ġattempts Ġto Ġget Ġa Ġpublic Ġclass Ġfrom Ġthe Ġcurrent Ġselected Ġfile . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġevent Ġan Ġevent Ġthat Ġhas Ġbeen Ġtriggered ĊĠĠĠĠ Ġ* Ġ@ return Ġthe Ġmost Ġappropriate Ġclass Ġselection Ġfor Ġthat Ġevent , Ġor Ġnull ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġfun Ġget Selected Class ( event : ĠAn ActionEvent ): ĠPsi Class ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfile : ĠPsi File Ġ= ĠAction Event Utils . getTarget File ( event ) ĊĠĠĠĠĠĠĠ Ġval Ġproject : ĠProject Ġ= ĠAction Event Utils . getTarget Project ( event ) ĊĠĠĠĠĠĠĠ Ġval Ġeditor : ĠEditor ? Ġ= ĠAction Event Utils . get Optional Target Editor ( event ) ĊĊĠĠĠĠĠĠĠ Ġvar Ġtarget Class : ĠPsi Class ? Ġ= Ġeditor ?. let Ġ{ Ġget Selected Class From Editor ( project , Ġeditor ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( target Class Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtarget Class Ġ= Ġget Selected Element ( event . data Context )?. let Ġ{ Ġelement Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfind Class From Element ( element ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( target Class Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtarget Class Ġ= Ġget Public Class FromFile ( file ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtarget Class ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGets Ġthe Ġclass Ġthat Ġwraps Ġthe Ġelement Ġunder Ġthe Ġcaret Ġin Ġthe Ġeditor , Ġif Ġavailable . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġproject Ġthe Ġproject ĊĠĠĠĠ Ġ* Ġ@ param Ġeditor Ġthe Ġeditor ĊĠĠĠĠ Ġ* Ġ@ return Ġthe Ġclass Ġcontaining Ġthe Ġelement Ġunder Ġthe Ġcaret , Ġor Ġnull ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġget Selected Class From Editor ( project : ĠProject , Ġeditor : ĠEditor ): ĠPsi Class ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcurrent Element In Editor Ġ= ĠgetCurrent Element In Editor ( project , Ġeditor ) ĊĠĠĠĠĠĠĠ Ġreturn Ġcurrent Element In Editor ?. let Ġ{ Ġfind Class From Element ( current Element In Editor ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGets Ġthe Ġelement Ġunder Ġthe Ġcaret Ġof Ġthe Ġgiven Ġeditor , Ġif Ġavailable . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġproject Ġthe Ġproject ĊĠĠĠĠ Ġ* Ġ@ param Ġeditor Ġthe Ġeditor ĊĠĠĠĠ Ġ* Ġ@ return Ġthe Ġelement Ġunder Ġthe Ġcaret , Ġor Ġnull ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun ĠgetCurrent Element In Editor ( project : ĠProject , Ġeditor : ĠEditor ): ĠPsi Element ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠPsi Util Base . get Psi File In Editor ( editor , Ġproject )?. findElement At ( editor . caret Model . offset ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGets Ġthe Ġcurrently Ġselected Ġelement , Ġif Ġavailable . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġdata Context Ġdata Ġcontext ĊĠĠĠĠ Ġ* Ġ@ return Ġthe Ġcurrently Ġselected Ġelement , Ġor Ġnull ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġget Selected Element ( data Context : ĠData Context ): ĠPsi Element ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠCommon Data Keys . P SI _ ELEMENT . getData ( data Context ) ĊĠĠĠ Ġ} Ċ } Ċ