/* Ċ Ġ* ĠCopyright Ġ 2 0 1 0 - 2 0 1 7 ĠJetBrains Ġs . r . o . Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġorg . jetbrains . kotlin . idea . refactor ing . move . move Classes Or Packages Ċ Ċ import Ġcom . intellij . openapi . progress . Progress Manager Ċ import Ġcom . intellij . psi . Psi Directory Ċ import Ġcom . intellij . psi . Psi Element Ċ import Ġcom . intellij . psi . Psi Package Ċ import Ġcom . intellij . psi . Psi Recursive Element Walk ing Visitor Ċ import Ġcom . intellij . psi . search . sear ches . References Search Ċ import Ġcom . intellij . refactor ing . Move Destination Ċ import Ġcom . intellij . usage View . Usage Info Ċ import Ġcom . intellij . util . containers . Multi Map Ċ import Ġorg . jetbrains . kotlin . idea . refactor ing . move . create Move Usage Info If Possible Ċ import Ġorg . jetbrains . kotlin . idea . refactor ing . move . move Declarations . Kotlin Directory Move Target Ċ import Ġorg . jetbrains . kotlin . idea . refactor ing . move . move Declarations . analyze Conflict s In File Ċ import Ġorg . jetbrains . kotlin . idea . search . project Scope Ċ import Ġorg . jetbrains . kotlin . idea . stub index . Kotlin Exact Packages Index Ċ import Ġorg . jetbrains . kotlin . lexer . Kt Tokens Ċ import Ġorg . jetbrains . kotlin . name . Fq Name Ċ import Ġorg . jetbrains . kotlin . psi . Kt File Ċ import Ġorg . jetbrains . kotlin . psi . Kt Named Declaration Ċ import Ġorg . jetbrains . kotlin . psi . psi Util . parent sWith Self Ċ Ċ class ĠKotlin Aware Delegating Move Destination ( ĊĠĠĠ Ġprivate Ġval Ġdelegate : ĠMove Destination , ĊĠĠĠ Ġprivate Ġval Ġtarget Package : ĠPsi Package ?, ĊĠĠĠ Ġprivate Ġval Ġtarget Directory : ĠPsi Directory ? Ċ ) Ġ: ĠMove Destination Ġby Ġdelegate Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġanalyze Module Conflict s ( ĊĠĠĠĠĠĠĠ Ġelements : ĠMutable Collection < Psi Element >, ĊĠĠĠĠĠĠĠ Ġconflicts : ĠMulti Map < Psi Element , ĠString >, ĊĠĠĠĠĠĠĠ Ġusage s : ĠArray < out ĠUsage Info > ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdelegate . analyze Module Conflict s ( elements , Ġconflicts , Ġusage s ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( target Package Ġ== Ġnull Ġ|| Ġtarget Directory Ġ== Ġnull ) Ġreturn ĊĊĠĠĠĠĠĠĠ Ġval Ġproject Ġ= Ġtarget Directory . project ĊĠĠĠĠĠĠĠ Ġval Ġmove Target Ġ= ĠKotlin Directory Move Target ( Fq Name ( target Package . qualified Name ), Ġtarget Directory ) ĊĠĠĠĠĠĠĠ Ġval Ġpackages Index Ġ= ĠKotlin Exact Packages Index . getInstance () ĊĠĠĠĠĠĠĠ Ġval Ġdirectories To Move Ġ= Ġelements . flatMap To ( Linked HashSet < Psi Directory >()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( it Ġas ? ĠPsi Package )?. directories ?. toList () Ġ?: Ġempty List () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġproject Scope Ġ= Ġproject . project Scope () ĊĠĠĠĠĠĠĠ Ġval Ġfiles To Process Ġ= Ġelements . flatMap To ( Linked HashSet < Kt File >()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it Ġis ĠPsi Package ) Ġpackages Index [ it . qualified Name , Ġproject , Ġproject Scope ] Ġelse Ġempty List () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġextra Elements For Reference Search Ġ= ĠLinked HashSet < Psi Element >() ĊĠĠĠĠĠĠĠ Ġval Ġextra Element Collector Ġ= Ġobject Ġ: ĠPsi Recursive Element Walk ing Visitor () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Element ( element : ĠPsi Element ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( element Ġis ĠK t Named Declaration Ġ&& Ġelement . has Modifier ( Kt Tokens . INTERNAL _ KEYWORD )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelement . parent sWith Self . last OrNull Ġ{ Ġit Ġis ĠK t Named Declaration Ġ} ?. let Ġ{ Ġextra Elements For Reference Search Ġ+= Ġit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstop Walk ing () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . visit Element ( element ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfiles To Process . flatMap Ġ{ Ġit . declarations Ġ}. forEach Ġ{ Ġit . accept ( extra Element Collector ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġprogress Indicator Ġ= ĠProgress Manager . getInstance (). progress Indicator !! ĊĠĠĠĠĠĠĠ Ġprogress Indicator . push State () ĊĊĠĠĠĠĠĠĠ Ġval Ġextra Usage s Ġ= ĠArrayList < Usage Info >() ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprogress Indicator . text Ġ= Ġ" Looking Ġfor ĠUs ages " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ(( index , Ġelement ) Ġin Ġextra Elements For Reference Search . with Index ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprogress Indicator . fraction Ġ= Ġ( index Ġ+ Ġ 1 ) Ġ/ Ġextra Elements For Reference Search . size . toDouble () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠReferences Search . search ( element , Ġproject Scope ). map NotNull To ( extra Usage s ) Ġ{ Ġref Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Move Usage Info If Possible ( ref , Ġelement , Ġadd Import To Original File Ġ= Ġtrue , Ġis Internal Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprogress Indicator . pop State () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfiles To Process . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġanalyze Conflict s In File ( it , Ġextra Usage s , Ġmove Target , Ġdirectories To Move , Ġconflicts ) Ġ{} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }