/* Ċ Ġ* ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠMIT Ġlicense Ġthat Ġcan Ġbe Ċ Ġ* Ġfound Ġin Ġthe ĠLICENSE Ġfile . Ċ Ġ*/ Ċ Ċ package Ġorg . rust . ide . refactor ing Ċ Ċ import Ġcom . intellij . lang . Import Optimizer Ċ import Ġcom . intellij . psi . Psi Document Manager Ċ import Ġcom . intellij . psi . Psi Element Ċ import Ġcom . intellij . psi . Psi File Ċ import Ġcom . intellij . psi . Psi WhiteSpace Ċ import Ġorg . rust . cargo . project . workspace . Package Origin Ċ import Ġorg . rust . ide . formatter . processors . as T rivial Ċ import Ġorg . rust . lang . core . psi .* Ċ import Ġorg . rust . lang . core . psi . ext .* Ċ Ċ class ĠRs Import Optimizer Ġ: ĠImport Optimizer Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġsupports ( file : ĠPsi File ): ĠBoolean Ġ= Ġfile Ġis ĠRs File ĊĊĠĠĠ Ġoverride Ġfun Ġprocess File ( file : ĠPsi File ) Ġ= ĠRunnable Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdocument Manager Ġ= ĠPsi Document Manager . getInstance ( file . project ) ĊĠĠĠĠĠĠĠ Ġval Ġdocument Ġ= Ġdocument Manager . getDocument ( file ) ĊĠĠĠĠĠĠĠ Ġif Ġ( document Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdocument Manager . commit Document ( document ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġexecute For Use Item ( file Ġas ĠRs File ) ĊĠĠĠĠĠĠĠ Ġexecute For Ex tern C rate ( file ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġexecute For Ex tern C rate ( file : ĠRs File ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfirst Ġ= Ġfile . children OfType < Rs Element >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. first OrNull Ġ{ Ġit Ġ! is ĠRs Inner Attr Ġ} Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġval Ġextern C rate Items Ġ= Ġfile . children OfType < Rs Ex tern C rate Item >() ĊĠĠĠĠĠĠĠ Ġextern C rate Items ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. sorted By Ġ{ Ġit . reference Name Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map NotNull Ġ{ Ġit . copy () Ġas ? ĠRs Ex tern C rate Item Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Ġ{ Ġfile . add Before ( it , Ġfirst ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġextern C rate Items . forEach Ġ{ Ġit . delete () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġexecute For Use Item ( mod : ĠRs Mod ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġuses Ġ= Ġmod . children OfType < Rs Use Item >() ĊĠĠĠĠĠĠĠ Ġif Ġ( uses . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreplace Order Of Use Items ( mod , Ġuses ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġmods Ġ= Ġmod . children OfType < Rs Mod >() ĊĠĠĠĠĠĠĠ Ġmods . forEach Ġ{ Ġexecute For Use Item ( it ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġoptimize Use Spe ck ( psi Factory : ĠRs Psi Factory , Ġuse Spe ck : ĠRs Use Spe ck ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( remove Cur ly Br aces ( psi Factory , Ġuse Spe ck )) Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuse Spe ck List Ġ= Ġuse Spe ck . use Group ?. use Spe ck List Ġ?: Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( use Spe ck List . size Ġ< Ġ 2 ) Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġuse Spe ck List . forEach Ġ{ Ġoptimize Use Spe ck ( psi Factory , Ġit ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsorted List Ġ= Ġuse Spe ck List ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. sorted With ( compare By < Rs Use Spe ck > Ġ{ Ġit . path ?. self Ġ== Ġnull Ġ}. then By Ġ{ Ġit . path Text Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . copy () Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġuse Spe ck List . zip ( sort edList ). forEach Ġ{ Ġit . first . replace ( it . second ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġremove Cur ly Br aces ( psi Factory : ĠRs Psi Factory , Ġuse Spe ck : ĠRs Use Spe ck ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġuse Spe ck . use Group ?. as T rivial ?. text Ġ?: Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpath Ġ= Ġuse Spe ck . path ?. text ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtemp Path Ġ= Ġ"${ if Ġ( path Ġ!= Ġnull ) Ġ"$ path :: " Ġelse Ġ"" }$ name " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Use Spe ck Ġ= Ġpsi Factory . create Use Spe ck ( temp Path ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġuse Spe ck . replace ( new Use Spe ck ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġreplace Order Of Use Items ( mod : ĠRs Mod , Ġuses : ĠCollection < Rs Use Item >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWe Ġshould Ġignore Ġall Ġitems Ġbefore Ġ`{ ` Ġin Ġinline Ġmodules ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoffset Ġ= Ġif Ġ( mod Ġis ĠRs Mod Item ) Ġmod . l brace . text Offset Ġ+ Ġ 1 Ġelse Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfirst Ġ= Ġmod . children OfType < Rs Element >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. first OrNull Ġ{ Ġit . text Offset Ġ>= Ġoffset Ġ&& Ġit Ġ! is ĠRs Ex tern C rate Item Ġ&& Ġit Ġ! is ĠRs Attr Ġ} Ġ?: Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpsi Factory Ġ= ĠRs Psi Factory ( mod . project ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsorted Uses Groups Ġ= Ġuses ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĠUse Item Wrapper ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. groupBy ({ Ġit . package Group Level Ġ}, Ġ{ Ġit Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġ( group Level , Ġuse Item Wrapper ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuse Items Ġ= Ġuse Item Wrapper ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. sorted By Ġ{ Ġit . use Spe ck Text Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map NotNull Ġ{ Ġit . use Item . copy () Ġas ? ĠRs Use Item Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgroup Level Ġto Ġuse Items ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. sorted By Ġ{ Ġit . first Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsorted Uses Groups . forEach Ġ{ Ġ(_, Ġgroup ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgroup ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map NotNull Ġ{ Ġit . use Spe ck Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Ġ{ Ġoptimize Use Spe ck ( psi Factory , Ġit ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ(( _, Ġsorted Uses ) Ġin Ġsorted Uses Groups ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġlast Added Use Item : ĠPsi Element ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( import Path Ġin Ġsorted Uses ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Added Use Item Ġ= Ġmod . add Before ( import Path , Ġfirst ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmod . add After ( psi Factory . createNew line (), Ġlast Added Use Item ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmod . add After ( psi Factory . createNew line (), Ġlast Added Use Item ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġuses . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( it . next Sibling Ġas ? ĠPsi WhiteSpace )?. delete () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . delete () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġval ĠRs Use Spe ck . path Text Ġget () Ġ= Ġpath ?. text ?. toLowerCase () Ċ Ċ private Ġclass ĠUse Item Wrapper ( val Ġuse Item : ĠRs Use Item ) Ġ{ ĊĠĠĠ Ġprivate Ġval ĠbasePath : ĠRs Path ? Ġ= Ġuse Item . use Spe ck ?. path ?. basePath () ĊĊĠĠĠ Ġval Ġuse Spe ck Text : ĠString ? Ġ= Ġuse Item . use Spe ck ?. path Text ĊĊĠĠĠ Ġ// Ġ` use ` Ġorder : ĊĠĠĠ Ġ// Ġ 1 . ĠStandard Ġlibrary Ġ( stdlib ) ĊĠĠĠ Ġ// Ġ 2 . ĠRelated Ġthird Ġparty Ġ( extern Ġcrate ) ĊĠĠĠ Ġ// Ġ 3 . ĠLocal ĊĠĠĠ Ġ// ĠĠĠ Ġ- Ġotherwise ĊĠĠĠ Ġ// ĠĠĠ Ġ- Ġcrate :: ĊĠĠĠ Ġ// ĠĠĠ Ġ- Ġsuper :: ĊĠĠĠ Ġ// ĠĠĠ Ġ- Ġself :: ĊĠĠĠ Ġval Ġpackage Group Level : ĠInt Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠ ĠbasePath ?. self Ġ!= Ġnull Ġ-> Ġ 6 ĊĠĠĠĠĠĠĠ ĠbasePath ?. ` super ` Ġ!= Ġnull Ġ-> Ġ 5 ĊĠĠĠĠĠĠĠ ĠbasePath ?. crate Ġ!= Ġnull Ġ-> Ġ 4 ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġwhen Ġ( basePath ?. reference ?. resolve ()?. containing Cargo Package ?. origin ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPackage Origin . WORK SPACE Ġ-> Ġ 3 ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPackage Origin . TRANS ITIVE _ DEPEND ENCY Ġ-> Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPackage Origin . DEPEND ENCY Ġ-> Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPackage Origin . STD LIB Ġ-> Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ 3 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ