/* Ċ Ġ* ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠMIT Ġlicense Ġthat Ġcan Ġbe Ċ Ġ* Ġfound Ġin Ġthe ĠLICENSE Ġfile . Ċ Ġ*/ Ċ Ċ package Ġorg . rust . ide . intent ions Ċ Ċ import Ġcom . intellij . openapi . editor . Editor Ċ import Ġcom . intellij . openapi . project . Project Ċ import Ġcom . intellij . psi . Psi Element Ċ import Ġcom . intellij . psi . search . Local Search Scope Ċ import Ġcom . intellij . psi . search . sear ches . References Search Ċ import Ġcom . intellij . psi . util . parent OfType Ċ import Ġorg . rust . ide . utils . import . Import Candidate Ċ import Ġorg . rust . ide . utils . import . Import Info Ċ import Ġorg . rust . ide . utils . import . import Ċ import Ġorg . rust . lang . core . psi .* Ċ import Ġorg . rust . lang . core . psi . ext .* Ċ import Ġorg . rust . lang . core . resolve . namespaces Ċ Ċ class ĠAdd Import Int ention Ġ: ĠRs Element Base Int ention Action < Add Import Int ention . Context >() Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġget Family Name () Ġ= Ġ" Add Ġimport " ĊĊĠĠĠ Ġclass ĠContext ( val Ġpath : ĠRs Path , Ġval Ġneeds Import : ĠBoolean ) ĊĊĠĠĠ Ġoverride Ġfun Ġfind Applicable Context ( project : ĠProject , Ġeditor : ĠEditor , Ġelement : ĠPsi Element ): ĠContext ? Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġignore Ġpaths Ġin Ġuse Ġitems ĊĠĠĠĠĠĠĠ Ġif Ġ( element . parent OfType < Rs Use Item >() Ġ!= Ġnull ) Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠ Ġval Ġpath Ġ= Ġelement . parent OfType < Rs Path >() Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġimport able Path Ġ= Ġpath . find Import able Path () Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġif Ġ( import able Path . kind Ġ!= ĠPath Kind . IDENTIFIER Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠ Ġimport able Path . reference Ġ== Ġnull Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠ Ġimport able Path . is Un resolved ) Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠ Ġ// Ġignore Ġpaths Ġthat Ġcannot Ġbe Ġshort ened ĊĠĠĠĠĠĠĠ Ġif Ġ( import able Path . path Ġ== Ġnull ) Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠ Ġval Ġtarget Ġ= Ġimport able Path . reference ?. resolve () Ġas ? ĠRs Qualified Named Element Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġnamespace Ġ= Ġtarget . namespaces ĊĊĠĠĠĠĠĠĠ Ġ// Ġcheck Ġif Ġthe Ġname Ġis Ġalready Ġin Ġscope Ġin Ġthe Ġsame Ġnamespace ĊĠĠĠĠĠĠĠ Ġval Ġexisting Item Ġ= Ġimport able Path . find In Scope ( import able Path . reference Name , Ġnamespace ) ĊĠĠĠĠĠĠĠ Ġval Ġsame Reference Ġ= Ġtarget Ġ== Ġexisting Item ĊĊĠĠĠĠĠĠĠ Ġ// Ġif Ġname Ġexists , Ġbut Ġis Ġa Ġdifferent Ġtype , Ġexit ĊĠĠĠĠĠĠĠ Ġif Ġ( existing Item Ġ!= Ġnull Ġ&& Ġ! same Reference ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġtext Ġ= Ġ" Add Ġimport Ġfor Ġ`${ import able Path . text }` " ĊĠĠĠĠĠĠĠ Ġreturn ĠContext ( import able Path , Ġexisting Item Ġ== Ġnull ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġinvoke ( project : ĠProject , Ġeditor : ĠEditor , Ġctx : ĠContext ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpath Ġ= Ġctx . path ĊĊĠĠĠĠĠĠĠ Ġif Ġ( ctx . needs Import ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtarget Item Ġ= Ġpath . reference ?. resolve () Ġas ? ĠRs Qualified Named Element Ġ?: Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuse Path Ġ= Ġpath . generate Use Path () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcandidate Ġ= ĠImport Candidate ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠQual ified Named Item . Explicit Item ( target Item ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠImport Info . Local Import Info ( use Path ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcandidate . import ( ctx . path ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġtarget Ġ= Ġctx . path . reference ?. resolve () Ġas ? ĠRs Qualified Named Element Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ ĠReferences Search . search ( target , ĠLocal Search Scope ( path . containing Mod )). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . element . parent OfType < Rs Use Item >() Ġ!= Ġnull ) Ġreturn @ forEach ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpath Reference Ġ= Ġit . element Ġas ? ĠRs Path Ġ?: Ġreturn @ forEach ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpath Reference . short en ( target ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠShort ens Ġthe Ġpath Ġso Ġthat Ġit Ġresolves Ġto Ġ` target ` Ġwithout Ġany Ġadditional Ġqual ification . Ċ Ġ* Ġa :: b :: Foo . short en ( Foo ) Ġ-> ĠFoo Ċ Ġ* Ġa :: b :: Foo . short en ( b ) Ġ-> Ġb :: Foo Ċ Ġ*/ Ċ private Ġfun ĠRs Path . short en ( target : ĠRs Qualified Named Element ) Ġ{ ĊĠĠĠ Ġval Ġresolved Ġ= Ġreference ?. resolve () Ġas ? ĠRs Qualified Named Element ĊĠĠĠ Ġif Ġ( resolved Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( resolved Ġ== Ġtarget ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpath ?. delete () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcolon colon ?. delete () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġpath ?. short en ( target ) Ċ } Ċ Ċ /** Ċ Ġ* ĠFinds Ġthe Ġfirst Ġpart Ġof Ġthe Ġpath Ġthat Ġis Ġpossibly Ġimport able Ċ Ġ* Ġa :: b :: Struct :: function Ġ-> Ġa :: b :: Struct Ċ Ġ*/ Ċ private Ġfun ĠRs Path . find Import able Path (): ĠRs Path ? Ġ{ ĊĠĠĠ Ġval Ġtarget Ġ= Ġreference ?. resolve () Ġas ? ĠRs Qualified Named Element Ġ?: Ġreturn Ġpath ?. find Import able Path () ĊĊĠĠĠ Ġval Ġcan Be Imported Ġ= Ġwhen Ġ( target ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠRs Struct Or Enum Item Element , ĊĠĠĠĠĠĠĠ Ġis ĠRs Mod , ĊĠĠĠĠĠĠĠ Ġis ĠRs Trait Alias , ĊĠĠĠĠĠĠĠ Ġis ĠRs Trait Item , ĊĠĠĠĠĠĠĠ Ġis ĠR sType Alias , ĊĠĠĠĠĠĠĠ Ġis ĠRs Enum Variant , ĊĠĠĠĠĠĠĠ Ġis ĠRs Macro Ġ-> Ġtrue ĊĠĠĠĠĠĠĠ Ġis ĠRs Abstract able Ġ-> Ġ! target . owner . is Impl Or Trait ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġfalse ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ( can Be Imported ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġpath ?. find Import able Path () Ċ } Ċ Ċ private Ġfun ĠRs Path . generate Use Path (): ĠString Ġ= Ġgenerate Sequence ( this ) Ġ{ Ġit . path Ġ} ĊĠĠĠ Ġ. map Ġ{ Ġit . reference Name Ġ} ĊĠĠĠ Ġ. toList () ĊĠĠĠ Ġ. as Re versed () ĊĠĠĠ Ġ. join ToString (" :: ") Ċ