package Ġorg . jetbrains . research . l up a . kotlin Analysis . util . python Ċ Ċ import Ġcom . intellij . openapi . project . Project Ċ import Ġcom . intellij . openapi . roots . Module Root Manager Ċ import Ġcom . intellij . openapi . roots . Project File Index Ċ import Ġcom . intellij . openapi . roots . Project Root Manager Ċ import Ġcom . intellij . openapi . vfs . V fs Util Core Ċ import Ġcom . intellij . openapi . vfs . Virtual File Ċ import Ġcom . intellij . openapi . vfs . Virtual File Visitor Ċ import Ġcom . jetbrains . python . statistics . modules Ċ Ċ /** Ċ Ġ* ĠA Ġset Ġof Ġfunctions Ġfor Ġworking Ġwith Ġpackages Ġin Ġpython Ġprojects . Ċ Ġ*/ Ċ object ĠPy Package Util Ġ{ ĊĠĠĠ Ġprivate Ġconst Ġval ĠINIT _ DOT _ PY Ġ= Ġ"__ init __. py " ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġa Ġlist Ġof Ġpaths Ġto Ġall Ġfound Ġpackages Ġin Ġthe Ġ[ project ]. ĊĠĠĠĠ Ġ* ĠThe Ġpath Ġstarts Ġwith Ġthe Ġpackage Ġroot Ġand Ġis Ġseparated Ġby Ġa Ġdot . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġgather Package Names ( project : ĠProject ): ĠSet < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcontent Roots Ġ= Ġproject . modules . flatMap Ġ{ ĠModule Root Manager . getInstance ( it ). content Roots . toList () Ġ}. toSet () ĊĠĠĠĠĠĠĠ Ġval Ġpackage Roots Ġ= Ġcontent Roots . flatMap Ġ{ Ġcollect Package Roots ( project , Ġit ) Ġ}. toSet () ĊĠĠĠĠĠĠĠ Ġreturn Ġpackage Roots . flatMap Ġ{ Ġcollect Package Names ( project , Ġit ) Ġ}. toSet () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠChecks Ġif Ġthe Ġ[ file ] Ġis Ġa Ġpackage . ĠThe Ġpackage Ġis Ġthe Ġdirectory Ġin Ġwhich Ġthe Ġfile Ġ`__ init __. py ` Ġis Ġlocated . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġis Package ( file : ĠVirtual File , Ġfile Index : ĠProject File Index ): ĠBoolean Ġ= ĊĠĠĠĠĠĠĠ Ġ! file Index . is Excluded ( file ) Ġ&& Ġfile . isDirectory Ġ&& Ġfile . find Child ( INIT _ DOT _ PY ) Ġ!= Ġnull ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠFinds Ġthe Ġpackages Ġthat Ġare Ġclosest Ġto Ġthe Ġ[ content Ġroot ][ content Root ] Ġin Ġthe Ġ[ project ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġcollect Package Roots ( project : ĠProject , Ġcontent Root : ĠVirtual File ): ĠList < Virtual File > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpackage Roots Ġ= Ġmutable ListOf < Virtual File >() ĊĊĠĠĠĠĠĠĠ Ġval Ġfile Index Ġ= ĠProject Root Manager . getInstance ( project ). file Index ĊĠĠĠĠĠĠĠ ĠV fs Util Core . visit Children Re cursively ( content Root , Ġobject Ġ: ĠVirtual File Visitor < Unit >() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit File ( file : ĠVirtual File ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( is Package ( file , Ġfile Index ) Ġ&& Ġfile Ġ!= Ġcontent Root ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpackage Roots . add ( file ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġpackage Roots ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠFinds Ġthe Ġpackages Ġthat Ġare Ġcontained Ġinside Ġthe Ġ[ package Ġroot ][ package Root ] Ġin Ġthe Ġ[ project ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġcollect Package Names ( project : ĠProject , Ġpackage Root : ĠVirtual File ): ĠList < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpackage Names Ġ= Ġmutable ListOf < String >() ĊĊĠĠĠĠĠĠĠ Ġval Ġfile Index Ġ= ĠProject Root Manager . getInstance ( project ). file Index ĊĠĠĠĠĠĠĠ ĠV fs Util Core . visit Children Re cursively ( package Root , Ġobject Ġ: ĠVirtual File Visitor < Unit >() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit File ( file : ĠVirtual File ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( file Ġ== Ġpackage Root ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( is Package ( file , Ġfile Index )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠV fs Util Core . get RelativePath ( file , Ġpackage Root , Ġ'.') ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . let Ġ{ Ġpackage Names . add ("${ package Root . name }. $ it ") Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġpackage Names . add ( package Root . name ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġpackage Names ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠChecks Ġif Ġthe Ġ[ fully Ġqualified Ġname ][ fq Name ] Ġstarts Ġwith Ġthe Ġ[ fully Ġqualified Ġname Ġof Ġany Ġpackage ][ package Names ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġis Fq Name In Any Package ( fq Name : ĠString , Ġpackage Names : ĠIterable < String >): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠAdd Ġa Ġdot Ġat Ġthe Ġend Ġof Ġthe Ġfully Ġqualified Ġname Ġand Ġat Ġthe Ġend Ġof Ġthe Ġpackage Ġnames . ĊĠĠĠĠĠĠĠ Ġ// ĠThis Ġis Ġnecessary Ġto Ġcorrectly Ġdetermine Ġwhether Ġthe Ġfully Ġqualified Ġname Ġis Ġcontained Ġin Ġthe Ġpackage Ġor Ġnot . ĊĠĠĠĠĠĠĠ Ġ// ĠFor Ġexample , Ġif Ġwe Ġhave Ġa Ġpackage Ġnamed Ġ' plot ' Ġand Ġthe Ġfully Ġqualified Ġname Ġ' plot ly ', ĊĠĠĠĠĠĠĠ Ġ// Ġthen Ġthis Ġname Ġis Ġnot Ġcontained Ġin Ġthis Ġpackage , Ġand Ġwe Ġshould Ġreturn Ġfalse . ĊĠĠĠĠĠĠĠ Ġval Ġimport Name With Dot Ġ= Ġ"$ fq Name ." ĊĠĠĠĠĠĠĠ Ġval Ġpackage Names With Dot Ġ= Ġpackage Names . map Ġ{ Ġ"$ it ." Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġpackage Names With Dot . any Ġ{ ĠpackageName With Dot Ġ-> Ġimport Name With Dot . startsWith ( packageName With Dot ) Ġ} ĊĠĠĠ Ġ} Ċ } Ċ