/* Ċ Ġ* ĠCopyright Ġ 2 0 1 0 - 2 0 1 4 Ġ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 . jet . plugin . quick fix Ċ Ċ import Ġcom . intellij . code Insight . daemon . impl . Show Auto Import Pass Ċ import Ġcom . intellij . code Insight . hint . Hint Manager Ċ import Ġcom . intellij . code Insight . int ention . High Priority Action Ċ import Ġcom . intellij . openapi . application . Application Manager Ċ import Ġcom . intellij . openapi . command . Command Processor Ċ import Ġcom . intellij . openapi . editor . Editor Ċ import Ġcom . intellij . openapi . project . Project Ċ import Ġcom . intellij . psi . Psi File Ċ import Ġcom . intellij . psi . search . Global Search Scope Ċ import Ġcom . intellij . psi . search . Psi Short Names Cache Ċ import Ġorg . jetbrains . jet . lang . diagnostics . Diagnostic Ċ import Ġorg . jetbrains . jet . lang . psi . Jet Expression Ċ import Ġorg . jetbrains . jet . lang . psi . Jet File Ċ import Ġorg . jetbrains . jet . lang . psi . Jet Psi Util Ċ import Ġorg . jetbrains . jet . lang . psi . Jet Simple Name Expression Ċ import Ġorg . jetbrains . jet . lang . psi . psi Util .* Ċ import Ġorg . jetbrains . jet . lang . resolve . Descriptor Utils Ċ import Ġorg . jetbrains . jet . lang . resolve . Import Path Ċ import Ġorg . jetbrains . jet . lang . resolve . name . Fq Name Ċ import Ġorg . jetbrains . jet . plugin . Jet Bundle Ċ import Ġorg . jetbrains . jet . plugin . actions . Jet Add Import Action Ċ import Ġorg . jetbrains . jet . plugin . cache s . Jet Short Names Cache Ċ import Ġorg . jetbrains . jet . plugin . cache s . Kotlin Indices Helper Ċ import Ġorg . jetbrains . jet . plugin . cache s . resolve .* Ċ import Ġorg . jetbrains . jet . plugin . project . Project Structure Util Ċ import Ġorg . jetbrains . jet . plugin . project . Resolve Session For B odies Ċ import Ġorg . jetbrains . jet . plugin . util . Jet Psi He ur istics Util Ċ import Ġjava . util . ArrayList Ċ import Ġorg . jetbrains . jet . lang . descriptors . Declaration Descriptor Ċ import Ġcom . intellij . psi . Psi Element Ċ import Ġorg . jetbrains . jet . plugin . code Insight . Descriptor To Declaration Util Ċ import Ġcom . intellij . openapi . module . Module Util Core Ċ import Ġorg . jetbrains . jet . plugin . Project Roots Util Ċ import Ġorg . jetbrains . jet . as Java . un wrapped Ċ import Ġorg . jetbrains . jet . plugin . search . search Scope For Source Element Dependencies Ċ Ċ /** Ċ Ġ* ĠCheck Ġpossibility Ġand Ġperform Ġfix Ġfor Ġun resolved Ġreferences . Ċ Ġ*/ Ċ public Ġclass ĠAuto Import Fix ( element : ĠJet Simple Name Expression ) Ġ: ĠJet Hint Action < Jet Simple Name Expression >( element ), ĠHigh Priority Action Ġ{ ĊĠĠĠ Ġprivate Ġval Ġmodule Ġ= ĠModule Util Core . find Module For Psi Element ( element ) ĊĊĠĠĠ Ġprivate Ġval Ġsuggestions : ĠCollection < Fq Name > Ġ= Ġcompute Suggestions ( element ) ĊĊĠĠĠ Ġoverride Ġfun Ġshow Hint ( editor : ĠEditor ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( suggestions . isEmpty ()) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġval Ġproject Ġ= Ġeditor . getProject () Ġ?: Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġif Ġ( Hint Manager . getInstance (). has Shown Hints That Will Hide By Other Hint ( true )) Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! Application Manager . getApplication () !!. is UnitTest Mode ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhint Text Ġ= ĠShow Auto Import Pass . getMessage ( suggestions . size () Ġ> Ġ 1 , Ġsuggestions . first (). asString ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠHint Manager . getInstance (). show Question Hint ( editor , Ġhint Text , Ġelement . getText Offset (), Ġelement . getText Range () !!. getEnd Offset (), Ġcreate Action ( project , Ġeditor )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠgetText () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ= ĠJet Bundle . message (" import . fix ") ĊĊĠĠĠ Ġoverride Ġfun Ġget Family Name () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ= ĠJet Bundle . message (" import . fix ") ĊĊĠĠĠ Ġoverride Ġfun Ġis Available ( project : ĠProject , Ġeditor : ĠEditor , Ġfile : ĠPsi File ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ= Ġsuper < ĠJet Hint Action >. is Available ( project , Ġeditor , Ġfile ) Ġ&& Ġ! suggestions . isEmpty () ĊĊĠĠĠ Ġoverride Ġfun Ġinvoke ( project : ĠProject , Ġeditor : ĠEditor ?, Ġfile : ĠJet File ?) Ġ{ ĊĠĠĠĠĠĠĠ ĠCommand Processor . getInstance (). run Undo Transparent Action Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Action ( project , Ġeditor !! ). execute () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġstart In Write Action () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ= Ġtrue ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Action ( project : ĠProject , Ġeditor : ĠEditor ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ= ĠJet Add Import Action ( project , Ġeditor , Ġelement , Ġsuggestions ) ĊĊĠĠĠ Ġprivate Ġfun Ġcompute Suggestions ( element : ĠJet Simple Name Expression ): ĠCollection < Fq Name > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= Ġelement . get Containing File () Ġas ? ĠJet File Ġ?: Ġreturn ĠlistOf () ĊĊĠĠĠĠĠĠĠ Ġvar Ġreference Name Ġ= Ġelement . get Referenced Name () ĊĠĠĠĠĠĠĠ Ġif Ġ( element . getIdentifier () Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconvention Name Ġ= ĠJet Psi Util . get Convention Name ( element ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( convention Name Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreference Name Ġ= Ġconvention Name . asString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( reference Name . isEmpty ()) Ġreturn ĠlistOf () ĊĊĠĠĠĠĠĠĠ Ġval Ġresolve Session Ġ= Ġelement . get Lazy Resolve Session () ĊĊĠĠĠĠĠĠĠ Ġval Ġsearch Scope Ġ= Ġsearch Scope For Source Element Dependencies ( file ) Ġ?: Ġreturn ĠlistOf () ĊĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠArrayList < Prior it ized Fq Name >() ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! element . is Import Directive Expression () Ġ&& Ġ! Jet Psi Util . is Selector In Qualified ( element )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult . addAll ( getClass Names ( reference Name , Ġfile , Ġsearch Scope )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult . addAll ( get TopLevel Call ables ( reference Name , Ġelement , Ġsearch Scope , Ġresolve Session , Ġfile . getProject ())) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġresult . addAll ( get Extensions ( reference Name , Ġelement , Ġsearch Scope , Ġresolve Session , Ġfile . getProject ())) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ ĠImport Insert Helper . need Import ( Import Path ( it . fq Name , Ġfalse ), Ġfile ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. sortBy Ġ{ Ġit . priority . ordinal () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . fq Name Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget TopLevel Call ables ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġname : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext : ĠJet Expression , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsearch Scope : ĠGlobal Search Scope , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresolve Session : ĠResolve Session For B odies , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproject : ĠProject ĊĠĠĠ Ġ): ĠCollection < Prior it ized Fq Name > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ= ĠKotlin Indices Helper ( project ). get TopLevel Call ables ByName ( name , Ġcontext , Ġresolve Session , Ġsearch Scope ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĠPri or it ized Fq Name ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. toSet () ĊĊĠĠĠ Ġprivate Ġfun Ġget Extensions ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġname : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpression : ĠJet Simple Name Expression , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsearch Scope : ĠGlobal Search Scope , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresolve Session : ĠResolve Session For B odies , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproject : ĠProject ĊĠĠĠ Ġ): ĠCollection < Prior it ized Fq Name > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ= ĠKotlin Indices Helper ( project ). get Callable Extensions ({ Ġit Ġ== Ġname Ġ}, Ġexpression , Ġresolve Session , Ġsearch Scope ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĠPri or it ized Fq Name ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. toSet () ĊĊĠĠĠ Ġprivate Ġfun ĠgetClass Names ( name : ĠString , Ġfile : ĠJet File , Ġsearch Scope : ĠGlobal Search Scope ): ĠCollection < Prior it ized Fq Name > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ= Ġget Short Names Cache ( file ). get Classes ByName ( name , Ġsearch Scope ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ ĠJet Psi He ur istics Util . is Accessible ( it , Ġfile ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĠPri or it ized Fq Name ( it . un wrapped , ĠF q Name ( it . get QualifiedName () !! )) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. toSet () ĊĊĠĠĠ Ġprivate Ġfun Ġget Short Names Cache ( jet File : ĠJet File ): ĠPsi Short Names Cache Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġif Ġwe Ġare Ġin ĠJS Ġmodule , Ġdo Ġnot Ġinclude Ġnon - kotlin Ġclasses ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( Project Structure Util . is Js Kotlin Module ( jet File )) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠJet Short Names Cache . get Kotlin Instance ( jet File . getProject ()) ĊĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPsi Short Names Cache . getInstance ( jet File . getProject ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġenum Ġclass ĠPriority Ġ{ ĊĠĠĠĠĠĠĠ ĠMODULE ĊĠĠĠĠĠĠĠ ĠPROJECT ĊĠĠĠĠĠĠĠ ĠOTHER ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġdata Ġclass ĠPri or it ized Fq Name ( val Ġfq Name : ĠF q Name , Ġval Ġpriority : ĠPriority ) ĊĊĠĠĠ Ġprivate Ġfun ĠPri or it ized Fq Name ( declaration : ĠPsi Element ?, Ġfq Name : ĠF q Name ): ĠPri or it ized Fq Name Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpriority Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdeclaration Ġ== Ġnull Ġ-> ĠPriority . OTHER ĊĠĠĠĠĠĠĠĠĠĠĠ ĠModule Util Core . find Module For Psi Element ( declaration ) Ġ== Ġmodule Ġ-> ĠPriority . MODULE ĊĠĠĠĠĠĠĠĠĠĠĠ ĠProject Roots Util . isIn Source ( declaration , Ġfalse ) Ġ-> ĠPriority . PROJECT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠPriority . OTHER ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠPri or it ized Fq Name ( fq Name , Ġpriority ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠPri or it ized Fq Name ( descriptor : ĠDeclaration Descriptor ): ĠPri or it ized Fq Name Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠPri or it ized Fq Name ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDescriptor To Declaration Util . get Declaration ( element . get Containing Jet File (), Ġdescriptor ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDescriptor Utils . getF q Name Safe ( descriptor ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġpublic Ġfun Ġcreate Factory (): ĠJet Single Int ention Action Factory Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġobject Ġ: ĠJet Single Int ention Action Factory () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcreate Action ( diagnostic : ĠDiagnostic ): ĠJet Int ention Action < Jet Simple Name Expression >? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThere Ġcould Ġbe Ġdifferent Ġpsi Ġelements Ġ( i . e . ĠJet Array Access Expression ), Ġbut Ġwe Ġcan Ġfix Ġonly ĠJet Simple Name Expression Ġcase ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpsi Element Ġ= Ġdiagnostic . get Psi Element () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( psi Element Ġis ĠJet Simple Name Expression ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠAuto Import Fix ( psi Element ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġis Applicable For Code Fragment () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ